]> git.mxchange.org Git - friendica.git/commitdiff
Merge pull request #7541 from vinzv/patch-2
authorPhilipp <admin+Github@philipp.info>
Mon, 19 Aug 2019 22:00:41 +0000 (00:00 +0200)
committerGitHub <noreply@github.com>
Mon, 19 Aug 2019 22:00:41 +0000 (00:00 +0200)
Update Install.md

363 files changed:
CHANGELOG
INSTALL.md [deleted file]
README.md
VERSION
bin/auth_ejabberd.php
bin/console.php
bin/daemon.php
bin/worker.php
boot.php
composer.json
composer.lock
config/dbstructure.config.php [deleted file]
config/defaults.config.php [deleted file]
config/local-sample.config.php
config/settings.config.php [deleted file]
database.sql
doc/Config.md
doc/Install.md
doc/SSL.md
doc/Two-Factor-Authentication.md
doc/Update.md
doc/api.md
include/api.php
include/conversation.php
include/dba.php
include/text.php
index.php
mod/acl.php
mod/cal.php
mod/community.php
mod/crepair.php
mod/dfrn_notify.php
mod/follow.php
mod/item.php
mod/lockview.php
mod/message.php
mod/network.php
mod/photos.php
mod/ping.php
mod/profile_photo.php
mod/pubsub.php
mod/receive.php
mod/redir.php
mod/salmon.php
mod/search.php
mod/settings.php
src/App.php
src/App/Arguments.php [new file with mode: 0644]
src/App/BaseURL.php [new file with mode: 0644]
src/App/Mode.php
src/App/Module.php [new file with mode: 0644]
src/App/Page.php [new file with mode: 0644]
src/App/Router.php
src/BaseObject.php
src/Console/ArchiveContact.php
src/Console/AutomaticInstallation.php
src/Console/Cache.php
src/Console/Config.php
src/Console/DatabaseStructure.php
src/Console/GlobalCommunityBlock.php
src/Console/GlobalCommunitySilence.php
src/Console/Lock.php [new file with mode: 0644]
src/Console/Maintenance.php
src/Console/NewPassword.php
src/Console/PostUpdate.php
src/Console/ServerBlock.php
src/Console/Typo.php
src/Content/ContactSelector.php
src/Content/Feature.php
src/Content/ForumManager.php
src/Content/Nav.php
src/Content/Smilies.php
src/Content/Text/BBCode.php
src/Content/Text/HTML.php
src/Content/Widget.php
src/Content/Widget/CalendarExport.php
src/Content/Widget/ContactBlock.php
src/Content/Widget/TrendingTags.php [new file with mode: 0644]
src/Core/Authentication.php
src/Core/Cache.php
src/Core/Cache/APCuCache.php
src/Core/Cache/AbstractCacheDriver.php [deleted file]
src/Core/Cache/ArrayCache.php
src/Core/Cache/Cache.php [new file with mode: 0644]
src/Core/Cache/DatabaseCache.php [new file with mode: 0644]
src/Core/Cache/DatabaseCacheDriver.php [deleted file]
src/Core/Cache/ICache.php [new file with mode: 0644]
src/Core/Cache/ICacheDriver.php [deleted file]
src/Core/Cache/IMemoryCache.php [new file with mode: 0644]
src/Core/Cache/IMemoryCacheDriver.php [deleted file]
src/Core/Cache/MemcacheCache.php [new file with mode: 0644]
src/Core/Cache/MemcacheCacheDriver.php [deleted file]
src/Core/Cache/MemcachedCache.php [new file with mode: 0644]
src/Core/Cache/MemcachedCacheDriver.php [deleted file]
src/Core/Cache/ProfilerCache.php [new file with mode: 0644]
src/Core/Cache/RedisCache.php [new file with mode: 0644]
src/Core/Cache/RedisCacheDriver.php [deleted file]
src/Core/Cache/TraitCompareDelete.php
src/Core/Cache/TraitCompareSet.php
src/Core/Config.php
src/Core/Config/Adapter/AbstractDbaConfigAdapter.php [deleted file]
src/Core/Config/Adapter/IConfigAdapter.php [deleted file]
src/Core/Config/Adapter/IPConfigAdapter.php [deleted file]
src/Core/Config/Adapter/JITConfigAdapter.php [deleted file]
src/Core/Config/Adapter/JITPConfigAdapter.php [deleted file]
src/Core/Config/Adapter/PreloadConfigAdapter.php [deleted file]
src/Core/Config/Adapter/PreloadPConfigAdapter.php [deleted file]
src/Core/Config/Cache/ConfigCache.php
src/Core/Config/Cache/IConfigCache.php [deleted file]
src/Core/Config/Cache/IPConfigCache.php [deleted file]
src/Core/Config/Cache/PConfigCache.php [new file with mode: 0644]
src/Core/Config/Configuration.php
src/Core/Config/JitConfiguration.php [new file with mode: 0644]
src/Core/Config/JitPConfiguration.php [new file with mode: 0644]
src/Core/Config/PConfiguration.php
src/Core/Config/PreloadConfiguration.php [new file with mode: 0644]
src/Core/Config/PreloadPConfiguration.php [new file with mode: 0644]
src/Core/Console.php
src/Core/Installer.php
src/Core/L10n.php
src/Core/L10n/L10n.php [new file with mode: 0644]
src/Core/Lock.php
src/Core/Lock/AbstractLockDriver.php [deleted file]
src/Core/Lock/CacheLock.php [new file with mode: 0644]
src/Core/Lock/CacheLockDriver.php [deleted file]
src/Core/Lock/DatabaseLock.php [new file with mode: 0644]
src/Core/Lock/DatabaseLockDriver.php [deleted file]
src/Core/Lock/ILock.php [new file with mode: 0644]
src/Core/Lock/ILockDriver.php [deleted file]
src/Core/Lock/Lock.php [new file with mode: 0644]
src/Core/Lock/SemaphoreLock.php [new file with mode: 0644]
src/Core/Lock/SemaphoreLockDriver.php [deleted file]
src/Core/Logger.php
src/Core/NotificationsManager.php
src/Core/PConfig.php
src/Core/Process.php [new file with mode: 0644]
src/Core/Protocol.php
src/Core/Search.php
src/Core/Session.php
src/Core/System.php
src/Core/Worker.php
src/Database/DBA.php
src/Database/DBStructure.php
src/Database/Database.php [new file with mode: 0644]
src/Factory/CacheDriverFactory.php [deleted file]
src/Factory/CacheFactory.php [new file with mode: 0644]
src/Factory/ConfigFactory.php
src/Factory/DBFactory.php [deleted file]
src/Factory/DependencyFactory.php [deleted file]
src/Factory/LockFactory.php [new file with mode: 0644]
src/Factory/LoggerFactory.php
src/Factory/ProfilerFactory.php [deleted file]
src/Model/APContact.php
src/Model/Attach.php
src/Model/Config/Config.php [new file with mode: 0644]
src/Model/Config/DbaConfig.php [new file with mode: 0644]
src/Model/Config/PConfig.php [new file with mode: 0644]
src/Model/Contact.php
src/Model/GContact.php
src/Model/Group.php
src/Model/Item.php
src/Model/ItemDeliveryData.php
src/Model/Photo.php
src/Model/Profile.php
src/Model/Term.php
src/Model/TwoFactor/AppSpecificPassword.php [new file with mode: 0644]
src/Model/TwoFactor/RecoveryCode.php [new file with mode: 0644]
src/Model/TwoFactorRecoveryCode.php [deleted file]
src/Model/User.php
src/Module/Admin/Blocklist/Contact.php
src/Module/Admin/Blocklist/Server.php
src/Module/Admin/Item/Source.php
src/Module/Admin/Queue.php
src/Module/Admin/Site.php
src/Module/Admin/Summary.php
src/Module/Admin/Themes/Embed.php
src/Module/Admin/Themes/Index.php
src/Module/Contact.php
src/Module/Debug/Babel.php
src/Module/Inbox.php
src/Module/Install.php
src/Module/Item/Compose.php [new file with mode: 0644]
src/Module/Login.php
src/Module/Photo.php
src/Module/Profile.php
src/Module/Register.php
src/Module/Search/Directory.php
src/Module/Settings/TwoFactor/AppSpecific.php [new file with mode: 0644]
src/Module/Settings/TwoFactor/Index.php
src/Module/Settings/TwoFactor/Recovery.php
src/Module/TwoFactor/Recovery.php
src/Module/TwoFactor/Verify.php
src/Network/Probe.php
src/Object/Post.php
src/Protocol/ActivityPub.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/Feed.php
src/Protocol/OStatus.php
src/Util/BasePath.php
src/Util/BaseURL.php [deleted file]
src/Util/Config/ConfigFileLoader.php [deleted file]
src/Util/Config/ConfigFileManager.php [deleted file]
src/Util/ConfigFileLoader.php [new file with mode: 0644]
src/Util/ExAuth.php
src/Util/Logger/WorkerLogger.php
src/Util/Network.php
src/Util/Profiler.php
src/Worker/APDelivery.php
src/Worker/Cron.php
src/Worker/Delivery.php
src/Worker/Notifier.php
src/Worker/OnePoll.php
src/Worker/UpdateContact.php
src/Worker/UpdateGContact.php
static/dbstructure.config.php [new file with mode: 0755]
static/defaults.config.php [new file with mode: 0644]
static/dependencies.config.php [new file with mode: 0644]
static/settings.config.php [new file with mode: 0644]
tests/DatabaseTest.php
tests/DatabaseTestTrait.php [new file with mode: 0644]
tests/Util/AppMockTrait.php
tests/Util/Database/ExtendedPDO.php [new file with mode: 0644]
tests/Util/Database/StaticDatabase.php [new file with mode: 0644]
tests/Util/DbaCacheMockTrait.php
tests/Util/DbaLockMockTrait.php
tests/Util/L10nMockTrait.php [deleted file]
tests/Util/VFSTrait.php
tests/datasets/api.fixture.php [new file with mode: 0644]
tests/datasets/api.yml [deleted file]
tests/datasets/config/A.config.php [new file with mode: 0644]
tests/datasets/config/A.ini.php [new file with mode: 0644]
tests/datasets/config/B.config.php [new file with mode: 0644]
tests/datasets/config/B.ini.php [new file with mode: 0644]
tests/datasets/config/local.config.php [deleted file]
tests/datasets/config/local.ini.php [deleted file]
tests/datasets/content/text/html/bug-7457.html [new file with mode: 0644]
tests/datasets/content/text/html/bug-7457.txt [new file with mode: 0644]
tests/datasets/content/text/html/bug-7474.html [new file with mode: 0644]
tests/datasets/content/text/html/bug-7474.txt [new file with mode: 0644]
tests/datasets/content/text/html/bug-7488.html [new file with mode: 0644]
tests/datasets/content/text/html/bug-7488.txt [new file with mode: 0644]
tests/functional/DependencyCheckTest.php [new file with mode: 0644]
tests/include/ApiTest.php
tests/include/TextTest.php
tests/src/App/ArgumentsTest.php [new file with mode: 0644]
tests/src/App/ModeTest.php
tests/src/App/ModuleTest.php [new file with mode: 0644]
tests/src/BaseObjectTest.php
tests/src/Console/AutomaticInstallationConsoleTest.php
tests/src/Console/ConfigConsoleTest.php
tests/src/Console/ConsoleTest.php
tests/src/Console/LockConsoleTest.php [new file with mode: 0644]
tests/src/Console/ServerBlockConsoleTest.php
tests/src/Content/SmiliesTest.php
tests/src/Content/Text/BBCodeTest.php
tests/src/Content/Text/HTMLTest.php [new file with mode: 0644]
tests/src/Content/Text/MarkdownTest.php
tests/src/Core/Cache/APCuCacheDriverTest.php [deleted file]
tests/src/Core/Cache/APCuCacheTest.php [new file with mode: 0644]
tests/src/Core/Cache/ArrayCacheDriverTest.php [deleted file]
tests/src/Core/Cache/ArrayCacheTest.php [new file with mode: 0644]
tests/src/Core/Cache/CacheTest.php
tests/src/Core/Cache/DatabaseCacheDriverTest.php [deleted file]
tests/src/Core/Cache/DatabaseCacheTest.php [new file with mode: 0644]
tests/src/Core/Cache/MemcacheCacheDriverTest.php [deleted file]
tests/src/Core/Cache/MemcacheCacheTest.php [new file with mode: 0644]
tests/src/Core/Cache/MemcachedCacheDriverTest.php [deleted file]
tests/src/Core/Cache/MemcachedCacheTest.php [new file with mode: 0644]
tests/src/Core/Cache/MemoryCacheTest.php
tests/src/Core/Cache/RedisCacheDriverTest.php [deleted file]
tests/src/Core/Cache/RedisCacheTest.php [new file with mode: 0644]
tests/src/Core/Config/Cache/ConfigCacheTest.php
tests/src/Core/Config/Cache/PConfigCacheTest.php [new file with mode: 0644]
tests/src/Core/Config/ConfigurationTest.php
tests/src/Core/Config/JitConfigurationTest.php [new file with mode: 0644]
tests/src/Core/Config/JitPConfigurationTest.php [new file with mode: 0644]
tests/src/Core/Config/PConfigurationTest.php
tests/src/Core/Config/PreloadConfigurationTest.php [new file with mode: 0644]
tests/src/Core/Config/PreloadPConfigurationTest.php [new file with mode: 0644]
tests/src/Core/InstallerTest.php
tests/src/Core/Lock/APCuCacheLockDriverTest.php [deleted file]
tests/src/Core/Lock/APCuCacheLockTest.php [new file with mode: 0644]
tests/src/Core/Lock/ArrayCacheLockDriverTest.php [deleted file]
tests/src/Core/Lock/ArrayCacheLockTest.php [new file with mode: 0644]
tests/src/Core/Lock/DatabaseLockDriverTest.php [deleted file]
tests/src/Core/Lock/DatabaseLockTest.php [new file with mode: 0644]
tests/src/Core/Lock/LockTest.php
tests/src/Core/Lock/MemcacheCacheLockDriverTest.php [deleted file]
tests/src/Core/Lock/MemcacheCacheLockTest.php [new file with mode: 0644]
tests/src/Core/Lock/MemcachedCacheLockDriverTest.php [deleted file]
tests/src/Core/Lock/MemcachedCacheLockTest.php [new file with mode: 0644]
tests/src/Core/Lock/RedisCacheLockDriverTest.php [deleted file]
tests/src/Core/Lock/RedisCacheLockTest.php [new file with mode: 0644]
tests/src/Core/Lock/SemaphoreLockDriverTest.php [deleted file]
tests/src/Core/Lock/SemaphoreLockTest.php [new file with mode: 0644]
tests/src/Core/SystemTest.php
tests/src/Database/DBATest.php
tests/src/Database/DBStructureTest.php
tests/src/Network/CurlResultTest.php
tests/src/Util/BasePathTest.php
tests/src/Util/BaseURLTest.php
tests/src/Util/Config/ConfigFileLoaderTest.php
tests/src/Util/ProfilerTest.php
update.php
view/js/filebrowser.js
view/js/linkPreview.js
view/js/main.js
view/lang/C/messages.po
view/lang/de/messages.po
view/lang/de/strings.php
view/lang/fr/messages.po
view/lang/fr/strings.php
view/lang/nl/messages.po
view/lang/nl/strings.php
view/lang/pl/messages.po
view/lang/pl/strings.php
view/templates/admin/blocklist/server.tpl
view/templates/admin/site.tpl
view/templates/comment_item.tpl
view/templates/event_stream_item.tpl
view/templates/item/compose-footer.tpl [new file with mode: 0644]
view/templates/item/compose.tpl [new file with mode: 0644]
view/templates/local.config.tpl
view/templates/moderated_comment.tpl
view/templates/profile_advanced.tpl
view/templates/settings/connectors.tpl
view/templates/settings/twofactor/app_specific.tpl [new file with mode: 0644]
view/templates/settings/twofactor/index.tpl
view/templates/twofactor/verify.tpl
view/templates/widget/trending_tags.tpl [new file with mode: 0644]
view/theme/duepuntozero/templates/comment_item.tpl
view/theme/duepuntozero/templates/moderated_comment.tpl
view/theme/frio/config.php
view/theme/frio/css/style.css
view/theme/frio/frameworks/friendica-tagsinput/LICENSE [new file with mode: 0644]
view/theme/frio/frameworks/friendica-tagsinput/friendica-tagsinput-typeahead.css [new file with mode: 0644]
view/theme/frio/frameworks/friendica-tagsinput/friendica-tagsinput.css [new file with mode: 0644]
view/theme/frio/frameworks/friendica-tagsinput/friendica-tagsinput.js [new file with mode: 0644]
view/theme/frio/img/none.png [new file with mode: 0644]
view/theme/frio/js/filebrowser.js
view/theme/frio/js/theme.js
view/theme/frio/php/default.php
view/theme/frio/style.php
view/theme/frio/templates/admin/blocklist/contact.tpl
view/theme/frio/templates/admin/site.tpl
view/theme/frio/templates/comment_item.tpl
view/theme/frio/templates/jot.tpl
view/theme/frio/templates/nav.tpl
view/theme/frio/templates/photo_view.tpl
view/theme/frio/templates/profile_advanced.tpl
view/theme/frio/templates/profile_vcard.tpl
view/theme/frio/templates/settings/connectors.tpl
view/theme/frio/templates/sub/delivery_count.tpl
view/theme/frio/templates/theme_settings.tpl
view/theme/frio/templates/wall_thread.tpl
view/theme/frio/theme.php
view/theme/quattro/templates/comment_item.tpl
view/theme/vier/mobile.css
view/theme/vier/templates/comment_item.tpl

index 1fa98ee870834a15ff5b2477fdf2db744a5e634a..df15f41ebff0d03c70d70fffcb311e954758fc19 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,5 @@
+Version 2019.09-dev (UNRELEASED)
+
 Version 2019.06 (2019-06-23)
   Friendica Core:
     Update to the tranlation (CS, DE, EN-GB, EN-US, ET, FR, IT, PL, PT-BR, SV) [translation teams]
diff --git a/INSTALL.md b/INSTALL.md
deleted file mode 100644 (file)
index 50e86e2..0000000
+++ /dev/null
@@ -1,347 +0,0 @@
-# Friendica Installation
-
-We've tried very hard to ensure that Friendica will run on commodity hosting
-platforms - such as those used to host Wordpress blogs and Drupal websites.
-But be aware that Friendica is more than a simple web application. It is a
-complex communications system which more closely resembles an email server than
-a web server. For reliability and performance, messages are delivered in the
-background and are queued for later delivery when sites are down. This kind of
-functionality requires a bit more of the host system than the typical blog.
-Not every PHP/MySQL hosting provider will be able to support Friendica. Many will.
-But please review the requirements and confirm these with your hosting provider
-prior to installation.
-
-Before you begin: Choose a domain name or subdomain name for your server.
-Put some thought into this - because changing it is currently not-supported.
-Things will break, and some of your friends may have difficulty communicating with you.
-We plan to address this limitation in a future release. Also decide if you wish
-to connect with members of the Diaspora network, as this will impact the
-installation requirements.
-
-Decide if you will use SSL and obtain an SSL cert. Communications with the
-Diaspora network MAY require both SSL AND an SSL cert signed by a CA which is
-recognized by major browsers. Friendica will work with self-signed certs but
-Diaspora communication may not. For best results, install your cert PRIOR to
-installing Friendica and when visiting your site for the initial installation in
-step 5, please use the https: link. (Use the http: or non-SSL link if your cert
-is self-signed).
-
-## 1. Requirements
-
-- Apache with mod-rewrite enabled and "Options All" so you can use a local .htaccess file
-- PHP 7+ (PHP 7.1+ recommended for performance and official support).
-       - PHP *command line* with `register_argc_argv = true` in php.ini
-       - curl, gd (with at least jpeg support), mysql, mbstring, xml, zip and openssl extensions
-       - Some form of email server or email gateway such that PHP mail() works
-       - The POSIX module of PHP needs to be activated (e.g. RHEL, CentOS have disabled it)
-       - Composer for a Git install
-
-- Mysql 5.6+ or an equivalent alternative for MySQL (MariaDB 10.0.5+, Percona Server etc.)
-- Ability to schedule jobs with cron (Linux/Mac) or Scheduled Tasks (Windows)
-- Installation into a top-level domain or sub-domain (without a directory/path 
-  component in the URL) is preferred. This is REQUIRED if you wish to communicate
-  with the Diaspora network.
-- For alternative server configurations (such as Nginx server and MariaDB database
-  engine), refer to the [Friendica wiki](https://github.com/friendica/friendica/wiki).
-
-This guide will walk you through the manual installation process of Friendica.
-If this is nothing for you, you might be interested in:
-* the Friendica Docker image (https://github.com/friendica/docker) or
-* how install Friendica with YunoHost (https://github.com/YunoHost-Apps/friendica_ynh).
-
-## 2. Install Friendica sources
-
-Unpack the Friendica files into the root of your web server document area.
-
-If you copy the directory tree to your webserver, make sure that you also copy 
-`.htaccess-dist` - as "dot" files are often hidden and aren't normally copied.
-
-OR
-
-Clone the friendica/friendica GitHub repository and import dependencies
-
-       git clone https://github.com/friendica/friendica -b master [web server folder]
-       cd [web server folder]
-       bin/composer.phar install --no-dev
-
-Make sure the folder view/smarty3 exists and is writable by the webserver user,
-in this case `www-data`
-
-    mkdir view/smarty3
-    chown www-data:www-data view/smarty3
-    chmod 775 view/smarty3
-
-Get the addons by going into your website folder.
-
-    cd mywebsite
-
-Clone the addon repository (separately):
-
-    git clone https://github.com/friendica/friendica-addons.git -b master addon
-
-If you want to use the development version of Friendica you can switch to the 
-develop branch in the repository by running
-
-    git checkout develop
-    bin/composer.phar install
-    cd addon
-    git checkout develop
-
-Please be aware that the develop branch is unstable.
-Exercise caution when pulling.
-If you encounter a bug, please let us know.
-
-Either way, if you use Apache, copy `.htaccess-dist` to `.htaccess` to enable 
-URL rewriting.
-
-## 3. Database
-
-Create an empty database and note the access details (hostname, username, password,
-database name).
-
-- Friendica needs the permission to create and delete fields and tables in its 
-  own database.
-- Please check the additional notes if running on MySQ 5.7.17 or newer
-
-## 4. Config 
-
-If you know in advance that it will be impossible for the web server to write or
-create files in the `config/` directory, please create an empty file called 
-`local.config.php` in it and make it writable by the web server.
-
-## 5a. Install Wizard
-
-Visit your website with a web browser and follow the instructions.
-Please note any error messages and correct these before continuing.
-
-If you are using SSL with a known signature authority (recommended), use the
-https: link to your website. If you are using a self-signed cert or no cert,
-use the http: link.
-
-If you need to specify a port for the connection to the database, you can do so
-in the host name setting for the database.
-
-## 5b. Manual install
-
-*If* the automated installation fails for any reason, please check the following:
-
-- `config/local.config.php` exists
-       - If not, copy `config/local-sample.config.php` to `config/local.config.php`
-         and edit it with your settings.
-- Database is populated.
-       - If not, import the contents of `database.sql` with phpMyAdmin or the mysql
-         command line tool.
-
-## 6. Register the admin account
-
-At this point visit your website again, and register your personal account with
-the same email as in the `config.admin_email` config value.
-Registration errors should all be recoverable automatically.
-
-If you get any *critical* failure at this point, it generally indicates the
-database was not installed correctly. You might wish to delete/rename 
-`config/local.config.php` to another name and drop all the database tables so
-that you can start fresh.
-
-## 7. Background tasks (IMPORTANT)
-
-Set up a cron job or scheduled task to run the worker once every 5-10 minutes to
-pick up the recent "public" postings of your friends. Example:
-
-       cd /base/directory; /path/to/php bin/worker.php
-
-Change "/base/directory", and "/path/to/php" as appropriate for your situation.
-
-If you are using a Linux server, run "crontab -e" and add a line like the one
-shown, substituting for your unique paths and settings:
-
-       */10 * * * *    cd /home/myname/mywebsite; /usr/bin/php bin/worker.php
-
-You can generally find the location of PHP by executing "which php".
-If you have troubles with this section please contact your hosting provider for assistance.
-Friendica will not work correctly if you cannot perform this step.
-
-You should also be sure that `config.php_path` is set correctly, it should look
-like this: (changing it to the correct PHP location)
-
-       'config' => [
-       'php_path' => '/usr/local/php56/bin/php',
-    ]
-
-Alternative: If you cannot use a cron job as described above, you can use the
-frontend worker and an external cron service to trigger the execution of the worker script.
-You can enable the frontend worker after the installation from the admin panel
-of your node and call:
-        https://example.com/worker
-
-with the service of your choice.
-
-## 8. (Recommended) Set up a backup plan
-
-Bad things will happen.
-Let there be a hardware failure, a corrupted database or whatever you can think of.
-So once the installation of your Friendica node is done, you should make yourself
-a backup plan.
-
-The most important file is the `config/local.config.php` file in the base directory.
-As it stores all your data, you should also have a recent dump of your Friendica
-database at hand, should you have to recover your node.
-
-## 9. (Optional) Reverse-proxying and HTTPS
-
-Friendica looks for some well-known HTTP headers indicating a reverse-proxy
-terminating an HTTPS connection.
-While the standard from RFC 7239 specifies the use of the `Forwaded` header.
-
-    Forwarded: for=192.0.2.1; proto=https; by=192.0.2.2
-
-Friendica also supports a number on non-standard headers in common use.
-
-    X-Forwarded-Proto: https
-
-    Front-End-Https: on
-
-    X-Forwarded-Ssl: on
-
-It is however preferable to use the standard approach if configuring a new server.
-
-## Troubleshooting
-
-### "System is currently unavailable. Please try again later"
-
-Check your database settings.
-It usually means your database could not be opened or accessed.
-If the database resides on the same machine, check that the database server name
-is "localhost".
-
-### 500 Internal Error
-
-This could be the result of one of our Apache directives not being supported by
-your version of Apache. Examine your apache server logs.
-You might remove the line "Options -Indexes" from the .htaccess file if you are
-using a Windows server as this has been known to cause problems.
-Also check your file permissions. Your website and all contents must generally
-be world-readable.
-
-It is likely that your web server reported the source of the problem in its error log files.
-Please review these system error logs to determine what caused the problem.
-Often this will need to be resolved with your hosting provider or (if self-hosted)
-your web server configuration.
-
-### 400 and 4xx "File not found" errors
-
-First check your file permissions.
-Your website and all contents must generally be world-readable.
-
-Ensure that mod-rewite is installed and working, and that your `.htaccess` file
-is being used. To verify the latter, create a file `test.out` containing the
-word "test" in the top directory of Friendica, make it world readable and point
-your web browser to
-
-       http://yoursitenamehere.com/test.out
-
-This file should be blocked. You should get a permission denied message.
-
-If you see the word "test" your Apache configuration is not allowing your
-`.htaccess` file to be used (there are rules in this file to block access to any
-file with .out at the end, as these are typically used for system logs).
-
-Make certain the `.htaccess` file exists and is readable by everybody, then look
-for the existence of "AllowOverride None" in the Apache server configuration for your site.
-This will need to be changed to "AllowOverride All".
-
-If you do not see the word "test", your `.htaccess` is working, but it is likely
-that mod-rewrite is not installed in your web server or is not working.
-
-On most Linux flavors:
-
-       % a2enmod rewrite
-       % /etc/init.d/apache2 restart
-
-Consult your hosting provider, experts on your particular Linux distribution or
-(if Windows) the provider of your Apache server software if you need to change
-either of these and can not figure out how. There is a lot of help available on
-the web. Search "mod-rewrite" along with the name of your operating system
-distribution or Apache package (if using Windows).
-
-### Unable to write the file config/local.config.php due to permissions issues
-
-Create an empty `config/local.config.php`file with that name and give it
-world-write permission.
-
-On Linux:
-
-       % touch config/local.config.php
-       % chmod 664 config/local.config.php
-
-Retry the installation. As soon as the database has been created,
-
-******* this is important *********
-
-       % chmod 644 config/local.config.php
-
-### Suhosin issues
-
-Some configurations with "suhosin" security are configured without an ability to
-run external processes. Friendica requires this ability. Following are some notes
-provided by one of our members.
-
-> On my server I use the php protection system Suhosin [http://www.hardened-php.net/suhosin/].
-> One of the things it does is to block certain functions like proc_open, as
-> configured in `/etc/php5/conf.d/suhosin.ini`:
-> 
->     suhosin.executor.func.blacklist = proc_open, ...
->
-> For those sites like Friendica that really need these functions they can be
-> enabled, e.g. in `/etc/apache2/sites-available/friendica`:
->
->      <Directory /var/www/friendica/>
->        php_admin_value suhosin.executor.func.blacklist none
->        php_admin_value suhosin.executor.eval.blacklist none
->      </Directory>
-> 
-> This enables every function for Friendica if accessed via browser, but not for
-> the cronjob that is called via php command line. I attempted to enable it for
-> cron by using something like:
-> 
->      */10 * * * * cd /var/www/friendica/friendica/ && sudo -u www-data /usr/bin/php \
->       -d suhosin.executor.func.blacklist=none \
->       -d suhosin.executor.eval.blacklist=none -f bin/worker.php
-> 
-> This worked well for simple test cases, but the friendica-cron still failed
-> with a fatal error:
-> 
->      suhosin[22962]: ALERT - function within blacklist called: proc_open()
->     (attacker 'REMOTE_ADDR not set', file '/var/www/friendica/friendica/boot.php',
->     line 1341)
-> 
-> After a while I noticed, that `bin/worker.php` calls further PHP script via `proc_open`.
-> These scripts themselves also use `proc_open` and fail, because they are NOT
-> called with `-d suhosin.executor.func.blacklist=none`.
-> 
->  So the simple solution is to put the correct parameters into `config/local.config.php`:
-> 
->      'config' => [
->              //Location of PHP command line processor
->              'php_path' => '/usr/bin/php -d suhosin.executor.func.blacklist=none \
->               -d suhosin.executor.eval.blacklist=none',
->      ],
-> 
-> This is obvious as soon as you notice that the friendica-cron uses `proc_open`
-> to execute PHP scripts that also use `proc_open`, but it took me quite some time to find that out.
-> I hope this saves some time for other people using suhosin with function blacklists.
-
-### Unable to create all mysql tables on MySQL 5.7.17 or newer
-
-If the setup fails to create all the database tables and/or manual creation from
-the command line fails, with this error:
-
-       ERROR 1067 (42000) at line XX: Invalid default value for 'created'
-
-You need to adjust your my.cnf and add the following setting under the [mysqld]
-section:
-
-       sql_mode = '';
-
-After that, restart mysql and try again.
index d849a43952a56406f27f5da447e219d857d7a80e..1406678be89cb9b4f613a0966ae982c83c866193 100644 (file)
--- a/README.md
+++ b/README.md
@@ -13,6 +13,7 @@ With Friendica, you can also fully interact with anyone on Twitter, post on Face
 
 Join today and [get your Friendica profile!](https://dir.friendica.social/servers 'Join Friendica today!')
 
+Have a look at the [installation documentation](doc/Install.md) for further information about installing and using Friendica.
 
 ### Friendica Screenshots
 
diff --git a/VERSION b/VERSION
index 4eda9a567ded4295908effd825009f4489279e84..3193eddcdaf16b7896a168386a38853a2f72423f 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2019.06
+2019.09-rc
index bf6d069d12bb58f1507f9d9ee6e0c14763c6e08e..206e484470058bff0aa98c3625f2f47b4f29e0e4 100755 (executable)
@@ -32,7 +32,9 @@
  *
  */
 
-use Friendica\Factory;
+use Dice\Dice;
+use Friendica\App\Mode;
+use Friendica\BaseObject;
 use Friendica\Util\ExAuth;
 
 if (sizeof($_SERVER["argv"]) == 0) {
@@ -51,9 +53,12 @@ chdir($directory);
 
 require dirname(__DIR__) . '/vendor/autoload.php';
 
-$a = Factory\DependencyFactory::setUp('auth_ejabbered', dirname(__DIR__));
+$dice = (new Dice())->addRules(include __DIR__ . '/../static/dependencies.config.php');
+BaseObject::setDependencyInjection($dice);
 
-if ($a->getMode()->isNormal()) {
+$appMode = $dice->create(Mode::class);
+
+if ($appMode->isNormal()) {
        $oAuth = new ExAuth();
        $oAuth->readStdin();
 }
index 410eabda094639db0d3d06a9a8eb41ec92220464..4c396854dc09c06564f5c4e86b01c645f49dfc5c 100755 (executable)
@@ -1,11 +1,10 @@
 #!/usr/bin/env php
 <?php
 
-require dirname(__DIR__) . '/vendor/autoload.php';
+use Dice\Dice;
 
-use Friendica\Factory;
+require dirname(__DIR__) . '/vendor/autoload.php';
 
-$a = Factory\DependencyFactory::setUp('console', dirname(__DIR__));
-\Friendica\BaseObject::setApp($a);
+$dice = (new Dice())->addRules(include __DIR__ . '/../static/dependencies.config.php');
 
-(new Friendica\Core\Console($argv))->execute();
+(new Friendica\Core\Console($dice, $argv))->execute();
index 047bf71be77b4ac31dbea889098e5dd52dce8b5b..8ea60fa9ac79b86f247f30325e222de011c8df5c 100755 (executable)
@@ -7,11 +7,11 @@
  * This script was taken from http://php.net/manual/en/function.pcntl-fork.php
  */
 
+use Dice\Dice;
 use Friendica\Core\Config;
 use Friendica\Core\Logger;
 use Friendica\Core\Worker;
 use Friendica\Database\DBA;
-use Friendica\Factory;
 
 // Get options
 $shortopts = 'f';
@@ -32,7 +32,10 @@ if (!file_exists("boot.php") && (sizeof($_SERVER["argv"]) != 0)) {
 
 require dirname(__DIR__) . '/vendor/autoload.php';
 
-$a = Factory\DependencyFactory::setUp('daemon', dirname(__DIR__));
+$dice = (new Dice())->addRules(include __DIR__ . '/../static/dependencies.config.php');
+
+\Friendica\BaseObject::setDependencyInjection($dice);
+$a = \Friendica\BaseObject::getApp();
 
 if ($a->getMode()->isInstall()) {
        die("Friendica isn't properly installed yet.\n");
@@ -144,7 +147,7 @@ if (!$foreground) {
        file_put_contents($pidfile, $pid);
 
        // We lose the database connection upon forking
-       Factory\DBFactory::init($a->getConfigCache(), $a->getProfiler(), $_SERVER);
+       DBA::reconnect();
 }
 
 Config::set('system', 'worker_daemon_mode', true);
index 2b5915f471d4fc76b9fdfdee1bad2ff42318cea0..f6b2d90a59313ab088f2653e8a61417a62e67465 100755 (executable)
@@ -5,11 +5,12 @@
  * @brief Starts the background processing
  */
 
+use Dice\Dice;
 use Friendica\App;
+use Friendica\BaseObject;
 use Friendica\Core\Config;
 use Friendica\Core\Update;
 use Friendica\Core\Worker;
-use Friendica\Factory;
 
 // Get options
 $shortopts = 'sn';
@@ -30,7 +31,10 @@ if (!file_exists("boot.php") && (sizeof($_SERVER["argv"]) != 0)) {
 
 require dirname(__DIR__) . '/vendor/autoload.php';
 
-$a = Factory\DependencyFactory::setUp('worker', dirname(__DIR__));
+$dice = (new Dice())->addRules(include __DIR__ . '/../static/dependencies.config.php');
+
+BaseObject::setDependencyInjection($dice);
+$a = BaseObject::getApp();
 
 // Check the database structure and possibly fixes it
 Update::check($a->getBasePath(), true, $a->getMode());
index 4ade9eb1450a93bcbedf95311e8f32bcd9525af3..028ba1e829f400c35710daa98dfa67610b61ffdc 100644 (file)
--- a/boot.php
+++ b/boot.php
@@ -31,7 +31,7 @@ use Friendica\Util\DateTimeFormat;
 
 define('FRIENDICA_PLATFORM',     'Friendica');
 define('FRIENDICA_CODENAME',     'Dalmatian Bellflower');
-define('FRIENDICA_VERSION',      '2019.06');
+define('FRIENDICA_VERSION',      '2019.09-rc');
 define('DFRN_PROTOCOL_VERSION',  '2.23');
 define('NEW_UPDATE_ROUTINE_VERSION', 1170);
 
@@ -334,6 +334,7 @@ function get_app()
  * @param array $args
  * @brief Returns a defaut value if the provided variable or array key is falsy
  * @return mixed
+ * @deprecated since version 2019.06, use native coalesce operator (??) instead
  */
 function defaults(...$args)
 {
index feac6c61f77ea248b48370da1426d85a7db53959..7f4e0a9b882f0dcd5a9c4ad71d302e1e0389e984 100644 (file)
                "ezyang/htmlpurifier": "~4.7.0",
                "friendica/json-ld": "^1.0",
                "league/html-to-markdown": "~4.8.0",
+               "level-2/dice": ">1.0",
                "lightopenid/lightopenid": "dev-master",
                "michelf/php-markdown": "^1.7",
                "mobiledetect/mobiledetectlib": "2.8.*",
                "monolog/monolog": "^1.24",
                "nikic/fast-route": "^1.3",
                "paragonie/hidden-string": "^1.0",
+               "pear/console_table": "^1.3",
                "pear/text_languagedetect": "1.*",
                "pragmarx/google2fa": "^5.0",
                "pragmarx/recovery": "^0.1.0",
@@ -58,7 +60,7 @@
                "npm-asset/fullcalendar": "^3.0.1",
                "npm-asset/cropperjs": "1.2.2",
                "npm-asset/imagesloaded": "4.1.4",
-               "pear/console_table": "^1.3"
+               "npm-asset/typeahead.js": "^0.11.1"
        },
        "repositories": [
                {
                ]
        },
        "require-dev": {
-               "phpunit/dbunit": "^2.0",
                "phpdocumentor/reflection-docblock": "^3.0.2",
                "phpunit/php-token-stream": "^1.4.2",
                "mikey179/vfsstream": "^1.6",
index af51b6dfe7ef7c9ca4ba2de0e4cad4ea3501ae96..5b9013a0cc528dbe2e3ebea884247b6c3593ce4b 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": "eb985236d64ed0b0fe1fc2e4ac6616e2",
+    "content-hash": "8c88c86ebce0bbf672356d65fadc0008",
     "packages": [
         {
             "name": "asika/simple-console",
             ],
             "time": "2018-09-18T12:18:08+00:00"
         },
+        {
+            "name": "level-2/dice",
+            "version": "4.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Level-2/Dice.git",
+                "reference": "e631f110f0520294fec902814c61cac26566023c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Level-2/Dice/zipball/e631f110f0520294fec902814c61cac26566023c",
+                "reference": "e631f110f0520294fec902814c61cac26566023c",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.0.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^6.5"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Dice\\": "./"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-2-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Tom Butler",
+                    "email": "tom@r.je"
+                }
+            ],
+            "description": "A minimalist Dependency injection container (DIC) for PHP. Please note: 3.0+ is only compatible with PHP 7.0. The 2.0 branch is compatbile with PHP 5.6.",
+            "homepage": "http://r.je/dice.html",
+            "keywords": [
+                "dependency injection",
+                "dependency injection container",
+                "di",
+                "ioc"
+            ],
+            "time": "2019-05-01T12:55:36+00:00"
+        },
         {
             "name": "lightopenid/lightopenid",
             "version": "dev-master",
             "dist": {
                 "type": "tar",
                 "url": "https://registry.npmjs.org/cropperjs/-/cropperjs-1.2.2.tgz",
-                "reference": null,
                 "shasum": "30dc7a7ce872155b23a33bd10ad4c76c0d613f55"
             },
             "require-dev": {
             "dist": {
                 "type": "tar",
                 "url": "https://registry.npmjs.org/ev-emitter/-/ev-emitter-1.1.1.tgz",
-                "reference": null,
                 "shasum": "8f18b0ce5c76a5d18017f71c0a795c65b9138f2a"
             },
             "type": "npm-asset-library",
             "dist": {
                 "type": "tar",
                 "url": "https://registry.npmjs.org/fullcalendar/-/fullcalendar-3.10.0.tgz",
-                "reference": null,
                 "shasum": "cc5e87d518fd6550e142816a31dd191664847919"
             },
             "type": "npm-asset-library",
             "dist": {
                 "type": "tar",
                 "url": "https://registry.npmjs.org/imagesloaded/-/imagesloaded-4.1.4.tgz",
-                "reference": null,
                 "shasum": "1376efcd162bb768c34c3727ac89cc04051f3cc7"
             },
             "require": {
                 "npm-asset/ev-emitter": ">=1.0.0,<2.0.0"
             },
-            "require-dev": {
-                "npm-asset/chalk": ">=1.1.1,<2.0.0",
-                "npm-asset/cheerio": ">=0.19.0,<0.20.0",
-                "npm-asset/gulp": ">=3.9.0,<4.0.0",
-                "npm-asset/gulp-jshint": ">=1.11.2,<2.0.0",
-                "npm-asset/gulp-json-lint": ">=0.1.0,<0.2.0",
-                "npm-asset/gulp-rename": ">=1.2.2,<2.0.0",
-                "npm-asset/gulp-replace": ">=0.5.4,<0.6.0",
-                "npm-asset/gulp-requirejs-optimize": "dev-github:metafizzy/gulp-requirejs-optimize",
-                "npm-asset/gulp-uglify": ">=1.4.2,<2.0.0",
-                "npm-asset/gulp-util": ">=3.0.7,<4.0.0",
-                "npm-asset/highlight.js": ">=8.9.1,<9.0.0",
-                "npm-asset/marked": ">=0.3.5,<0.4.0",
-                "npm-asset/minimist": ">=1.2.0,<2.0.0",
-                "npm-asset/transfob": ">=1.0.0,<2.0.0"
-            },
             "type": "npm-asset-library",
             "extra": {
                 "npm-asset-bugs": {
             "dist": {
                 "type": "tar",
                 "url": "https://registry.npmjs.org/jgrowl/-/jgrowl-1.4.6.tgz",
-                "reference": null,
                 "shasum": "2736e332aaee73ccf0a14a5f0066391a0a13f4a3"
             },
-            "require-dev": {
-                "npm-asset/grunt": "~0.4.2",
-                "npm-asset/grunt-contrib-cssmin": "~0.9.0",
-                "npm-asset/grunt-contrib-jshint": "~0.6.3",
-                "npm-asset/grunt-contrib-less": "~0.11.0",
-                "npm-asset/grunt-contrib-uglify": "~0.4.0",
-                "npm-asset/grunt-contrib-watch": "~0.6.1"
-            },
             "type": "npm-asset-library",
             "extra": {
                 "npm-asset-bugs": {
             "dist": {
                 "type": "tar",
                 "url": "https://registry.npmjs.org/jquery/-/jquery-2.2.4.tgz",
-                "reference": null,
                 "shasum": "2c89d6889b5eac522a7eea32c14521559c6cbf02"
             },
-            "require-dev": {
-                "npm-asset/commitplease": "2.0.0",
-                "npm-asset/core-js": "0.9.17",
-                "npm-asset/grunt": "0.4.5",
-                "npm-asset/grunt-babel": "5.0.1",
-                "npm-asset/grunt-cli": "0.1.13",
-                "npm-asset/grunt-compare-size": "0.4.0",
-                "npm-asset/grunt-contrib-jshint": "0.11.2",
-                "npm-asset/grunt-contrib-uglify": "0.9.2",
-                "npm-asset/grunt-contrib-watch": "0.6.1",
-                "npm-asset/grunt-git-authors": "2.0.1",
-                "npm-asset/grunt-jscs": "2.1.0",
-                "npm-asset/grunt-jsonlint": "1.0.4",
-                "npm-asset/grunt-npmcopy": "0.1.0",
-                "npm-asset/gzip-js": "0.3.2",
-                "npm-asset/jsdom": "5.6.1",
-                "npm-asset/load-grunt-tasks": "1.0.0",
-                "npm-asset/qunit-assert-step": "1.0.3",
-                "npm-asset/qunitjs": "1.17.1",
-                "npm-asset/requirejs": "2.1.17",
-                "npm-asset/sinon": "1.10.3",
-                "npm-asset/sizzle": "2.2.1",
-                "npm-asset/strip-json-comments": "1.0.3",
-                "npm-asset/testswarm": "1.1.0",
-                "npm-asset/win-spawn": "2.0.0"
-            },
             "type": "npm-asset-library",
             "extra": {
                 "npm-asset-bugs": {
             "dist": {
                 "type": "tar",
                 "url": "https://registry.npmjs.org/jquery-colorbox/-/jquery-colorbox-1.6.4.tgz",
-                "reference": null,
                 "shasum": "799452523a6c494839224ef702e807deb9c06cc5"
             },
             "require": {
             "dist": {
                 "type": "tar",
                 "url": "https://registry.npmjs.org/jquery-datetimepicker/-/jquery-datetimepicker-2.5.20.tgz",
-                "reference": null,
                 "shasum": "687d6204b90b03dc93f725f8df036e1d061f37ac"
             },
             "require": {
             "dist": {
                 "type": "tar",
                 "url": "https://registry.npmjs.org/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz",
-                "reference": null,
                 "shasum": "06f0335f16e353a695e7206bf50503cb523a6ee5"
             },
-            "require-dev": {
-                "npm-asset/grunt": "~0.4.1",
-                "npm-asset/grunt-contrib-connect": "~0.5.0",
-                "npm-asset/grunt-contrib-jshint": "~0.7.1",
-                "npm-asset/grunt-contrib-uglify": "~0.2.7"
-            },
             "type": "npm-asset-library",
             "extra": {
                 "npm-asset-bugs": {
             "dist": {
                 "type": "tar",
                 "url": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz",
-                "reference": null,
                 "shasum": "3c257f9839fc0e93ff53149632239eb90783ff66"
             },
             "type": "npm-asset-library",
             "homepage": "https://github.com/kartik-v/php-date-formatter",
             "time": "2018-07-13T06:56:46+00:00"
         },
+        {
+            "name": "npm-asset/typeahead.js",
+            "version": "0.11.1",
+            "dist": {
+                "type": "tar",
+                "url": "https://registry.npmjs.org/typeahead.js/-/typeahead.js-0.11.1.tgz",
+                "shasum": "4e64e671b22310a8606f4aec805924ba84b015b8"
+            },
+            "require": {
+                "npm-asset/jquery": ">=1.7"
+            },
+            "type": "npm-asset-library",
+            "extra": {
+                "npm-asset-bugs": {
+                    "url": "https://github.com/twitter/typeahead.js/issues"
+                },
+                "npm-asset-main": "dist/typeahead.bundle.js",
+                "npm-asset-directories": [],
+                "npm-asset-repository": {
+                    "type": "git",
+                    "url": "https://github.com/twitter/typeahead.js.git"
+                },
+                "npm-asset-scripts": {
+                    "test": "./node_modules/karma/bin/karma start --single-run --browsers PhantomJS"
+                }
+            },
+            "authors": [
+                {
+                    "name": "Twitter, Inc.",
+                    "url": "https://twitter.com/twitteross"
+                },
+                {
+                    "name": "Jake Harding",
+                    "url": "https://twitter.com/JakeHarding"
+                },
+                {
+                    "name": "Tim Trueman",
+                    "url": "https://twitter.com/timtrueman"
+                },
+                {
+                    "name": "Veljko Skarich",
+                    "url": "https://twitter.com/vskarich"
+                }
+            ],
+            "description": "fast and fully-featured autocomplete library",
+            "homepage": "http://twitter.github.com/typeahead.js",
+            "keywords": [
+                "autocomplete",
+                "typeahead"
+            ],
+            "time": "2015-04-27T04:03:42+00:00"
+        },
         {
             "name": "paragonie/certainty",
             "version": "v1.0.4",
             "time": "2017-03-25T17:14:26+00:00"
         },
         {
-            "name": "mikey179/vfsStream",
+            "name": "mikey179/vfsstream",
             "version": "v1.6.5",
             "source": {
                 "type": "git",
             "authors": [
                 {
                     "name": "Frank Kleine",
-                    "homepage": "http://frankkleine.de/",
-                    "role": "Developer"
+                    "role": "Developer",
+                    "homepage": "http://frankkleine.de/"
                 }
             ],
             "description": "Virtual file system to mock the real file system in unit tests.",
             "authors": [
                 {
                     "name": "Sebastian Bergmann",
-                    "email": "sb@sebastian-bergmann.de",
-                    "role": "lead"
+                    "role": "lead",
+                    "email": "sb@sebastian-bergmann.de"
                 }
             ],
             "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
             "authors": [
                 {
                     "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de",
-                    "role": "lead"
+                    "role": "lead",
+                    "email": "sebastian@phpunit.de"
                 }
             ],
             "description": "The PHP Unit Testing framework.",
                 }
             ],
             "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"
         },
         {
diff --git a/config/dbstructure.config.php b/config/dbstructure.config.php
deleted file mode 100755 (executable)
index 57e4378..0000000
+++ /dev/null
@@ -1,1411 +0,0 @@
-<?php
-
-/* Main database structure configuration file.
- *
- * Here are described all the tables, fields and indexes Friendica needs to work.
- *
- * Syntax (braces indicate optionale values):
- * "<table name>" => [
- *     "comment" => "Description of the table",
- *     "fields" => [
- *             "<field name>" => [
- *                     "type" => "<field type>{(<field size>)} <unsigned>",
- *                     "not null" => 0|1,
- *                     {"extra" => "auto_increment",}
- *                     {"default" => "<default value>",}
- *                     {"default" => NULL_DATE,} (for datetime fields)
- *                     {"primary" => "1",}
- *                     {"relation" => ["<foreign key table name>" => "<foreign key field name>"],}
- *                     "comment" => "Description of the fields"
- *             ],
- *             ...
- *     ],
- *     "indexes" => [
- *             "PRIMARY" => ["<primary key field name>", ...],
- *             "<index name>" => [{"UNIQUE",} "<field name>{(<key size>)}", ...]
- *             ...
- *     ],
- * ],
- *
- * If you need to make any change, make sure to increment the DB_UPDATE_VERSION constant value below.
- *
- */
-
-use Friendica\Database\DBA;
-
-if (!defined('DB_UPDATE_VERSION')) {
-       define('DB_UPDATE_VERSION', 1313);
-}
-
-return [
-       "2fa_recovery_codes" => [
-               "comment" => "Two-factor authentication recovery codes",
-               "fields" => [
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "primary" => "1", "relation" => ["user" => "uid"], "comment" => "User ID"],
-                       "code" => ["type" => "varchar(50)", "not null" => "1", "primary" => "1", "comment" => "Recovery code string"],
-                       "generated" => ["type" => "datetime", "not null" => "1", "comment" => "Datetime the code was generated"],
-                       "used" => ["type" => "datetime", "comment" => "Datetime the code was used"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["uid", "code"]
-               ]
-       ],
-       "addon" => [
-               "comment" => "registered addons",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => ""],
-                       "name" => ["type" => "varchar(50)", "not null" => "1", "default" => "", "comment" => "addon base (file)name"],
-                       "version" => ["type" => "varchar(50)", "not null" => "1", "default" => "", "comment" => "currently unused"],
-                       "installed" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "currently always 1"],
-                       "hidden" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "currently unused"],
-                       "timestamp" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => "file timestamp to check for reloads"],
-                       "plugin_admin" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 = has admin config, 0 = has no admin config"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "name" => ["UNIQUE", "name"],
-               ]
-       ],
-       "apcontact" => [
-               "comment" => "ActivityPub compatible contacts - used in the ActivityPub implementation",
-               "fields" => [
-                       "url" => ["type" => "varbinary(255)", "not null" => "1", "primary" => "1", "comment" => "URL of the contact"],
-                       "uuid" => ["type" => "varchar(255)", "comment" => ""],
-                       "type" => ["type" => "varchar(20)", "not null" => "1", "comment" => ""],
-                       "following" => ["type" => "varchar(255)", "comment" => ""],
-                       "followers" => ["type" => "varchar(255)", "comment" => ""],
-                       "inbox" => ["type" => "varchar(255)", "not null" => "1", "comment" => ""],
-                       "outbox" => ["type" => "varchar(255)", "comment" => ""],
-                       "sharedinbox" => ["type" => "varchar(255)", "comment" => ""],
-                       "manually-approve" => ["type" => "boolean", "comment" => ""],
-                       "nick" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "name" => ["type" => "varchar(255)", "comment" => ""],
-                       "about" => ["type" => "text", "comment" => ""],
-                       "photo" => ["type" => "varchar(255)", "comment" => ""],
-                       "addr" => ["type" => "varchar(255)", "comment" => ""],
-                       "alias" => ["type" => "varchar(255)", "comment" => ""],
-                       "pubkey" => ["type" => "text", "comment" => ""],
-                       "baseurl" => ["type" => "varchar(255)", "comment" => "baseurl of the ap contact"],
-                       "generator" => ["type" => "varchar(255)", "comment" => "Name of the contact's system"],
-                       "updated" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""]
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["url"],
-                       "addr" => ["addr(32)"],
-                       "alias" => ["alias(190)"],
-                       "url" => ["followers(190)"]
-               ]
-       ],
-       "attach" => [
-               "comment" => "file attachments",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "generated index"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
-                       "hash" => ["type" => "varchar(64)", "not null" => "1", "default" => "", "comment" => "hash"],
-                       "filename" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "filename of original"],
-                       "filetype" => ["type" => "varchar(64)", "not null" => "1", "default" => "", "comment" => "mimetype"],
-                       "filesize" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => "size in bytes"],
-                       "data" => ["type" => "longblob", "not null" => "1", "comment" => "file data"],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "creation time"],
-                       "edited" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "last edit time"],
-                       "allow_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed contact.id '<19><78>"],
-                       "allow_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed groups"],
-                       "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"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-               ]
-       ],
-       "auth_codes" => [
-               "comment" => "OAuth usage",
-               "fields" => [
-                       "id" => ["type" => "varchar(40)", "not null" => "1", "primary" => "1", "comment" => ""],
-                       "client_id" => ["type" => "varchar(20)", "not null" => "1", "default" => "", "relation" => ["clients" => "client_id"],
-                               "comment" => ""],
-                       "redirect_uri" => ["type" => "varchar(200)", "not null" => "1", "default" => "", "comment" => ""],
-                       "expires" => ["type" => "int", "not null" => "1", "default" => "0", "comment" => ""],
-                       "scope" => ["type" => "varchar(250)", "not null" => "1", "default" => "", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-               ]
-       ],
-       "cache" => [
-               "comment" => "Stores temporary data",
-               "fields" => [
-                       "k" => ["type" => "varbinary(255)", "not null" => "1", "primary" => "1", "comment" => "cache key"],
-                       "v" => ["type" => "mediumtext", "comment" => "cached serialized value"],
-                       "expires" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "datetime of cache expiration"],
-                       "updated" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "datetime of cache insertion"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["k"],
-                       "k_expires" => ["k", "expires"],
-               ]
-       ],
-       "challenge" => [
-               "comment" => "",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "challenge" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "dfrn-id" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "expire" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "type" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "last_update" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-               ]
-       ],
-       "clients" => [
-               "comment" => "OAuth usage",
-               "fields" => [
-                       "client_id" => ["type" => "varchar(20)", "not null" => "1", "primary" => "1", "comment" => ""],
-                       "pw" => ["type" => "varchar(20)", "not null" => "1", "default" => "", "comment" => ""],
-                       "redirect_uri" => ["type" => "varchar(200)", "not null" => "1", "default" => "", "comment" => ""],
-                       "name" => ["type" => "text", "comment" => ""],
-                       "icon" => ["type" => "text", "comment" => ""],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["client_id"],
-               ]
-       ],
-       "config" => [
-               "comment" => "main configuration storage",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => ""],
-                       "cat" => ["type" => "varbinary(50)", "not null" => "1", "default" => "", "comment" => ""],
-                       "k" => ["type" => "varbinary(50)", "not null" => "1", "default" => "", "comment" => ""],
-                       "v" => ["type" => "mediumtext", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "cat_k" => ["UNIQUE", "cat", "k"],
-               ]
-       ],
-       "contact" => [
-               "comment" => "contact table",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "updated" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => "Date of last contact update"],
-                       "self" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 if the contact is the user him/her self"],
-                       "remote_self" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "rel" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => "The kind of the relation between the user and the contact"],
-                       "duplex" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "network" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => "Network of the contact"],
-                       "protocol" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => "Protocol of the contact"],
-                       "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Name that this contact is known by"],
-                       "nick" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Nick- and user name of the contact"],
-                       "location" => ["type" => "varchar(255)", "default" => "", "comment" => ""],
-                       "about" => ["type" => "text", "comment" => ""],
-                       "keywords" => ["type" => "text", "comment" => "public keywords (interests) of the contact"],
-                       "gender" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => ""],
-                       "xmpp" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "attag" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "avatar" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "photo" => ["type" => "varchar(255)", "default" => "", "comment" => "Link to the profile photo of the contact"],
-                       "thumb" => ["type" => "varchar(255)", "default" => "", "comment" => "Link to the profile photo (thumb size)"],
-                       "micro" => ["type" => "varchar(255)", "default" => "", "comment" => "Link to the profile photo (micro size)"],
-                       "site-pubkey" => ["type" => "text", "comment" => ""],
-                       "issued-id" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "dfrn-id" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "nurl" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "addr" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "alias" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "pubkey" => ["type" => "text", "comment" => "RSA public key 4096 bit"],
-                       "prvkey" => ["type" => "text", "comment" => "RSA private key 4096 bit"],
-                       "batch" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "request" => ["type" => "varchar(255)", "comment" => ""],
-                       "notify" => ["type" => "varchar(255)", "comment" => ""],
-                       "poll" => ["type" => "varchar(255)", "comment" => ""],
-                       "confirm" => ["type" => "varchar(255)", "comment" => ""],
-                       "poco" => ["type" => "varchar(255)", "comment" => ""],
-                       "aes_allow" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "ret-aes" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "usehub" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "subhub" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "hub-verify" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "last-update" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of the last try to update the contact info"],
-                       "success_update" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of the last successful contact update"],
-                       "failure_update" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of the last failed update"],
-                       "name-date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "uri-date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "avatar-date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "term-date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "last-item" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "date of the last post"],
-                       "priority" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "blocked" => ["type" => "boolean", "not null" => "1", "default" => "1", "comment" => "Node-wide block status"],
-                       "block_reason" => ["type" => "text", "comment" => "Node-wide block reason"],
-                       "readonly" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "posts of the contact are readonly"],
-                       "writable" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "forum" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "contact is a forum"],
-                       "prv" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "contact is a private group"],
-                       "contact-type" => ["type" => "tinyint", "not null" => "1", "default" => "0", "comment" => ""],
-                       "hidden" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "archive" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "pending" => ["type" => "boolean", "not null" => "1", "default" => "1", "comment" => ""],
-                       "deleted" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Contact has been deleted"],
-                       "rating" => ["type" => "tinyint", "not null" => "1", "default" => "0", "comment" => ""],
-                       "reason" => ["type" => "text", "comment" => ""],
-                       "closeness" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "99", "comment" => ""],
-                       "info" => ["type" => "mediumtext", "comment" => ""],
-                       "profile-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "bdyear" => ["type" => "varchar(4)", "not null" => "1", "default" => "", "comment" => ""],
-                       "bd" => ["type" => "date", "not null" => "1", "default" => DBA::NULL_DATE, "comment" => ""],
-                       "notify_new_posts" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "fetch_further_information" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "ffi_keyword_blacklist" => ["type" => "text", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uid_name" => ["uid", "name(190)"],
-                       "self_uid" => ["self", "uid"],
-                       "alias_uid" => ["alias(32)", "uid"],
-                       "pending_uid" => ["pending", "uid"],
-                       "blocked_uid" => ["blocked", "uid"],
-                       "uid_rel_network_poll" => ["uid", "rel", "network", "poll(64)", "archive"],
-                       "uid_network_batch" => ["uid", "network", "batch(64)"],
-                       "addr_uid" => ["addr(32)", "uid"],
-                       "nurl_uid" => ["nurl(32)", "uid"],
-                       "nick_uid" => ["nick(32)", "uid"],
-                       "dfrn-id" => ["dfrn-id(64)"],
-                       "issued-id" => ["issued-id(64)"],
-               ]
-       ],
-       "conv" => [
-               "comment" => "private messages",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "guid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "A unique identifier for this conversation"],
-                       "recips" => ["type" => "text", "comment" => "sender_handle;recipient_handle"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
-                       "creator" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "handle of creator"],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "creation timestamp"],
-                       "updated" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "edited timestamp"],
-                       "subject" => ["type" => "text", "comment" => "subject of initial message"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uid" => ["uid"],
-               ]
-       ],
-       "conversation" => [
-               "comment" => "Raw data and structure information for messages",
-               "fields" => [
-                       "item-uri" => ["type" => "varbinary(255)", "not null" => "1", "primary" => "1", "comment" => "Original URI of the item - unrelated to the table with the same name"],
-                       "reply-to-uri" => ["type" => "varbinary(255)", "not null" => "1", "default" => "", "comment" => "URI to which this item is a reply"],
-                       "conversation-uri" => ["type" => "varbinary(255)", "not null" => "1", "default" => "", "comment" => "GNU Social conversation URI"],
-                       "conversation-href" => ["type" => "varbinary(255)", "not null" => "1", "default" => "", "comment" => "GNU Social conversation link"],
-                       "protocol" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "255", "comment" => "The protocol of the item"],
-                       "source" => ["type" => "mediumtext", "comment" => "Original source"],
-                       "received" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Receiving date"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["item-uri"],
-                       "conversation-uri" => ["conversation-uri"],
-                       "received" => ["received"],
-               ]
-       ],
-       "diaspora-interaction" => [
-               "comment" => "Signed Diaspora Interaction",
-               "fields" => [
-                       "uri-id" => ["type" => "int unsigned", "not null" => "1", "primary" => "1", "relation" => ["item-uri" => "id"], "comment" => "Id of the item-uri table entry that contains the item uri"],
-                       "interaction" => ["type" => "mediumtext", "comment" => "The Diaspora interaction"]
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["uri-id"]
-               ]
-       ],
-       "event" => [
-               "comment" => "Events",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "guid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
-                       "cid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "contact_id (ID of the contact in contact table)"],
-                       "uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "creation time"],
-                       "edited" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "last edit time"],
-                       "start" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "event start time"],
-                       "finish" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "event end time"],
-                       "summary" => ["type" => "text", "comment" => "short description or title of the event"],
-                       "desc" => ["type" => "text", "comment" => "event description"],
-                       "location" => ["type" => "text", "comment" => "event location"],
-                       "type" => ["type" => "varchar(20)", "not null" => "1", "default" => "", "comment" => "event or birthday"],
-                       "nofinish" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "if event does have no end this is 1"],
-                       "adjust" => ["type" => "boolean", "not null" => "1", "default" => "1", "comment" => "adjust to timezone of the recipient (0 or 1)"],
-                       "ignore" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "0 or 1"],
-                       "allow_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed contact.id '<19><78>'"],
-                       "allow_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed groups"],
-                       "deny_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied contact.id"],
-                       "deny_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied groups"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uid_start" => ["uid", "start"],
-               ]
-       ],
-       "fcontact" => [
-               "comment" => "Diaspora compatible contacts - used in the Diaspora implementation",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "guid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "unique id"],
-                       "url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "photo" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "request" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "nick" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "addr" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "batch" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "notify" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "poll" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "confirm" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "priority" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "network" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => ""],
-                       "alias" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "pubkey" => ["type" => "text", "comment" => ""],
-                       "updated" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "addr" => ["addr(32)"],
-                       "url" => ["UNIQUE", "url(190)"],
-               ]
-       ],
-       "fsuggest" => [
-               "comment" => "friend suggestion stuff",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => ""],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "cid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => ""],
-                       "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "request" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "photo" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "note" => ["type" => "text", "comment" => ""],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-               ]
-       ],
-       "gcign" => [
-               "comment" => "contacts ignored by friend suggestions",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Local User id"],
-                       "gcid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["gcontact" => "id"], "comment" => "gcontact.id of ignored contact"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uid" => ["uid"],
-                       "gcid" => ["gcid"],
-               ]
-       ],
-       "gcontact" => [
-               "comment" => "global contacts",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Name that this contact is known by"],
-                       "nick" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Nick- and user name of the contact"],
-                       "url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Link to the contacts profile page"],
-                       "nurl" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "photo" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Link to the profile photo"],
-                       "connect" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "updated" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "last_contact" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "last_failure" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "location" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "about" => ["type" => "text", "comment" => ""],
-                       "keywords" => ["type" => "text", "comment" => "puplic keywords (interests)"],
-                       "gender" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => ""],
-                       "birthday" => ["type" => "varchar(32)", "not null" => "1", "default" => DBA::NULL_DATE, "comment" => ""],
-                       "community" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 if contact is forum account"],
-                       "contact-type" => ["type" => "tinyint", "not null" => "1", "default" => "-1", "comment" => ""],
-                       "hide" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 = should be hidden from search"],
-                       "nsfw" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 = contact posts nsfw content"],
-                       "network" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => "social network protocol"],
-                       "addr" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "notify" => ["type" => "varchar(255)", "comment" => ""],
-                       "alias" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "generation" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "server_url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "baseurl of the contacts server"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "nurl" => ["UNIQUE", "nurl(190)"],
-                       "name" => ["name(64)"],
-                       "nick" => ["nick(32)"],
-                       "addr" => ["addr(64)"],
-                       "hide_network_updated" => ["hide", "network", "updated"],
-                       "updated" => ["updated"],
-               ]
-       ],
-       "glink" => [
-               "comment" => "'friends of friends' linkages derived from poco",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "cid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => ""],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "gcid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["gcontact" => "id"], "comment" => ""],
-                       "zcid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["gcontact" => "id"], "comment" => ""],
-                       "updated" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "cid_uid_gcid_zcid" => ["UNIQUE", "cid", "uid", "gcid", "zcid"],
-                       "gcid" => ["gcid"],
-               ]
-       ],
-       "group" => [
-               "comment" => "privacy groups, group info",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
-                       "visible" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 indicates the member list is not private"],
-                       "deleted" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 indicates the group has been deleted"],
-                       "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "human readable name of group"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uid" => ["uid"],
-               ]
-       ],
-       "group_member" => [
-               "comment" => "privacy groups, member info",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "gid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["group" => "id"], "comment" => "groups.id of the associated group"],
-                       "contact-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "contact.id of the member assigned to the associated group"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "contactid" => ["contact-id"],
-                       "gid_contactid" => ["UNIQUE", "gid", "contact-id"],
-               ]
-       ],
-       "gserver" => [
-               "comment" => "Global servers",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "nurl" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "version" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "site_name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "info" => ["type" => "text", "comment" => ""],
-                       "register_policy" => ["type" => "tinyint", "not null" => "1", "default" => "0", "comment" => ""],
-                       "registered-users" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => "Number of registered users"],
-                       "poco" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "noscrape" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "network" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => ""],
-                       "platform" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "relay-subscribe" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Has the server subscribed to the relay system"],
-                       "relay-scope" => ["type" => "varchar(10)", "not null" => "1", "default" => "", "comment" => "The scope of messages that the server wants to get"],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "last_poco_query" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "last_contact" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "last_failure" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "nurl" => ["UNIQUE", "nurl(190)"],
-               ]
-       ],
-       "gserver-tag" => [
-               "comment" => "Tags that the server has subscribed",
-               "fields" => [
-                       "gserver-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["gserver" => "id"], "primary" => "1",
-                               "comment" => "The id of the gserver"],
-                       "tag" => ["type" => "varchar(100)", "not null" => "1", "default" => "", "primary" => "1", "comment" => "Tag that the server has subscribed"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["gserver-id", "tag"],
-                       "tag" => ["tag"],
-               ]
-       ],
-       "hook" => [
-               "comment" => "addon hook registry",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "hook" => ["type" => "varbinary(100)", "not null" => "1", "default" => "", "comment" => "name of hook"],
-                       "file" => ["type" => "varbinary(200)", "not null" => "1", "default" => "", "comment" => "relative filename of hook handler"],
-                       "function" => ["type" => "varbinary(200)", "not null" => "1", "default" => "", "comment" => "function name of hook handler"],
-                       "priority" => ["type" => "smallint unsigned", "not null" => "1", "default" => "0", "comment" => "not yet implemented - can be used to sort conflicts in hook handling by calling handlers in priority order"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "hook_file_function" => ["UNIQUE", "hook", "file", "function"],
-               ]
-       ],
-       "inbox-status" => [
-               "comment" => "Status of ActivityPub inboxes",
-               "fields" => [
-                       "url" => ["type" => "varbinary(255)", "not null" => "1", "primary" => "1", "comment" => "URL of the inbox"],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Creation date of this entry"],
-                       "success" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of the last successful delivery"],
-                       "failure" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of the last failed delivery"],
-                       "previous" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Previous delivery date"],
-                       "archive" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Is the inbox archived?"],
-                       "shared" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Is it a shared inbox?"]
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["url"]
-               ]
-       ],
-       "intro" => [
-               "comment" => "",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "fid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["fcontact" => "id"], "comment" => ""],
-                       "contact-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => ""],
-                       "knowyou" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "duplex" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "note" => ["type" => "text", "comment" => ""],
-                       "hash" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "datetime" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "blocked" => ["type" => "boolean", "not null" => "1", "default" => "1", "comment" => ""],
-                       "ignore" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-               ]
-       ],
-       "item" => [
-               "comment" => "Structure for all posts",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "relation" => ["thread" => "iid"]],
-                       "guid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "A unique identifier for this item"],
-                       "uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "uri-id" => ["type" => "int unsigned", "relation" => ["item-uri" => "id"], "comment" => "Id of the item-uri table entry that contains the item uri"],
-                       "uri-hash" => ["type" => "varchar(80)", "not null" => "1", "default" => "", "comment" => "RIPEMD-128 hash from uri"],
-                       "parent" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["item" => "id"], "comment" => "item.id of the parent to this item if it is a reply of some form; otherwise this must be set to the id of this item"],
-                       "parent-uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "uri of the parent to this item"],
-                       "parent-uri-id" => ["type" => "int unsigned", "relation" => ["item-uri" => "id"], "comment" => "Id of the item-uri table that contains the parent uri"],
-                       "thr-parent" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "If the parent of this item is not the top-level item in the conversation, the uri of the immediate parent; otherwise set to parent-uri"],
-                       "thr-parent-id" => ["type" => "int unsigned", "relation" => ["item-uri" => "id"], "comment" => "Id of the item-uri table that contains the thread parent uri"],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Creation timestamp."],
-                       "edited" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of last edit (default is created)"],
-                       "commented" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of last comment/reply to this item"],
-                       "received" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "datetime"],
-                       "changed" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date that something in the conversation changed, indicating clients should fetch the conversation again"],
-                       "gravity" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "network" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => "Network from where the item comes from"],
-                       "owner-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "Link to the contact table with uid=0 of the owner of this item"],
-                       "author-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "Link to the contact table with uid=0 of the author of this item"],
-                       "icid" => ["type" => "int unsigned", "relation" => ["item-content" => "id"], "comment" => "Id of the item-content table entry that contains the whole item content"],
-                       "iaid" => ["type" => "int unsigned", "relation" => ["item-activity" => "id"], "comment" => "Id of the item-activity table entry that contains the activity data"],
-                       "extid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "post-type" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => "Post type (personal note, bookmark, ...)"],
-                       "global" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "private" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "distribution is restricted"],
-                       "visible" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "moderated" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "deleted" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "item has been deleted"],
-                       // User specific fields. Eventually they will move to user-item
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner id which owns this copy of the item"],
-                       "contact-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "contact.id"],
-                       "wall" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "This item was posted to the wall of uid"],
-                       "origin" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "item originated at this site"],
-                       "pubmail" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "starred" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "item has been favourited"],
-                       "unseen" => ["type" => "boolean", "not null" => "1", "default" => "1", "comment" => "item has not been seen"],
-                       "mention" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "The owner of this item was mentioned in it"],
-                       "forum_mode" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "psid" => ["type" => "int unsigned", "relation" => ["permissionset" => "id"], "comment" => "ID of the permission set of this post"],
-                       // It has to be decided whether these fields belong to the user or the structure
-                       "resource-id" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => "Used to link other tables to items, it identifies the linked resource (e.g. photo) and if set must also set resource_type"],
-                       "event-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["event" => "id"], "comment" => "Used to link to the event.id"],
-                       // Could possibly be replaced by the "attach" table?
-                       "attach" => ["type" => "mediumtext", "comment" => "JSON structure representing attachments to this item"],
-                       // Deprecated fields. Will be removed in upcoming versions
-                       "allow_cid" => ["type" => "mediumtext", "comment" => "Deprecated"],
-                       "allow_gid" => ["type" => "mediumtext", "comment" => "Deprecated"],
-                       "deny_cid" => ["type" => "mediumtext", "comment" => "Deprecated"],
-                       "deny_gid" => ["type" => "mediumtext", "comment" => "Deprecated"],
-                       "postopts" => ["type" => "text", "comment" => "Deprecated"],
-                       "inform" => ["type" => "mediumtext", "comment" => "Deprecated"],
-                       "type" => ["type" => "varchar(20)", "comment" => "Deprecated"],
-                       "bookmark" => ["type" => "boolean", "comment" => "Deprecated"],
-                       "file" => ["type" => "mediumtext", "comment" => "Deprecated"],
-                       "location" => ["type" => "varchar(255)", "comment" => "Deprecated"],
-                       "coord" => ["type" => "varchar(255)", "comment" => "Deprecated"],
-                       "tag" => ["type" => "mediumtext", "comment" => "Deprecated"],
-                       "plink" => ["type" => "varchar(255)", "comment" => "Deprecated"],
-                       "title" => ["type" => "varchar(255)", "comment" => "Deprecated"],
-                       "content-warning" => ["type" => "varchar(255)", "comment" => "Deprecated"],
-                       "body" => ["type" => "mediumtext", "comment" => "Deprecated"],
-                       "app" => ["type" => "varchar(255)", "comment" => "Deprecated"],
-                       "verb" => ["type" => "varchar(100)", "comment" => "Deprecated"],
-                       "object-type" => ["type" => "varchar(100)", "comment" => "Deprecated"],
-                       "object" => ["type" => "text", "comment" => "Deprecated"],
-                       "target-type" => ["type" => "varchar(100)", "comment" => "Deprecated"],
-                       "target" => ["type" => "text", "comment" => "Deprecated"],
-                       "author-name" => ["type" => "varchar(255)", "comment" => "Deprecated"],
-                       "author-link" => ["type" => "varchar(255)", "comment" => "Deprecated"],
-                       "author-avatar" => ["type" => "varchar(255)", "comment" => "Deprecated"],
-                       "owner-name" => ["type" => "varchar(255)", "comment" => "Deprecated"],
-                       "owner-link" => ["type" => "varchar(255)", "comment" => "Deprecated"],
-                       "owner-avatar" => ["type" => "varchar(255)", "comment" => "Deprecated"],
-                       "rendered-hash" => ["type" => "varchar(32)", "comment" => "Deprecated"],
-                       "rendered-html" => ["type" => "mediumtext", "comment" => "Deprecated"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "guid" => ["guid(191)"],
-                       "uri" => ["uri(191)"],
-                       "parent" => ["parent"],
-                       "parent-uri" => ["parent-uri(191)"],
-                       "extid" => ["extid(191)"],
-                       "uid_id" => ["uid", "id"],
-                       "uid_contactid_id" => ["uid", "contact-id", "id"],
-                       "uid_created" => ["uid", "created"],
-                       "uid_commented" => ["uid", "commented"],
-                       "uid_unseen_contactid" => ["uid", "unseen", "contact-id"],
-                       "uid_network_received" => ["uid", "network", "received"],
-                       "uid_network_commented" => ["uid", "network", "commented"],
-                       "uid_thrparent" => ["uid", "thr-parent(190)"],
-                       "uid_parenturi" => ["uid", "parent-uri(190)"],
-                       "uid_contactid_created" => ["uid", "contact-id", "created"],
-                       "authorid_created" => ["author-id", "created"],
-                       "ownerid" => ["owner-id"],
-                       "contact-id" => ["contact-id"],
-                       "uid_uri" => ["uid", "uri(190)"],
-                       "resource-id" => ["resource-id"],
-                       "deleted_changed" => ["deleted", "changed"],
-                       "uid_wall_changed" => ["uid", "wall", "changed"],
-                       "uid_eventid" => ["uid", "event-id"],
-                       "icid" => ["icid"],
-                       "iaid" => ["iaid"],
-                       "psid_wall" => ["psid", "wall"],
-               ]
-       ],
-       "item-activity" => [
-               "comment" => "Activities for items",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "relation" => ["thread" => "iid"]],
-                       "uri" => ["type" => "varchar(255)", "comment" => ""],
-                       "uri-id" => ["type" => "int unsigned", "relation" => ["item-uri" => "id"], "comment" => "Id of the item-uri table entry that contains the item uri"],
-                       "uri-hash" => ["type" => "varchar(80)", "not null" => "1", "default" => "", "comment" => "RIPEMD-128 hash from uri"],
-                       "activity" => ["type" => "smallint unsigned", "not null" => "1", "default" => "0", "comment" => ""]
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uri-hash" => ["UNIQUE", "uri-hash"],
-                       "uri" => ["uri(191)"],
-                       "uri-id" => ["uri-id"]
-               ]
-       ],
-       "item-content" => [
-               "comment" => "Content for all posts",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "relation" => ["thread" => "iid"]],
-                       "uri" => ["type" => "varchar(255)", "comment" => ""],
-                       "uri-id" => ["type" => "int unsigned", "relation" => ["item-uri" => "id"], "comment" => "Id of the item-uri table entry that contains the item uri"],
-                       "uri-plink-hash" => ["type" => "varchar(80)", "not null" => "1", "default" => "", "comment" => "RIPEMD-128 hash from uri"],
-                       "title" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "item title"],
-                       "content-warning" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "body" => ["type" => "mediumtext", "comment" => "item body content"],
-                       "location" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "text location where this item originated"],
-                       "coord" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "longitude/latitude pair representing location where this item originated"],
-                       "language" => ["type" => "text", "comment" => "Language information about this post"],
-                       "app" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "application which generated this item"],
-                       "rendered-hash" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => ""],
-                       "rendered-html" => ["type" => "mediumtext", "comment" => "item.body converted to html"],
-                       "object-type" => ["type" => "varchar(100)", "not null" => "1", "default" => "", "comment" => "ActivityStreams object type"],
-                       "object" => ["type" => "text", "comment" => "JSON encoded object structure unless it is an implied object (normal post)"],
-                       "target-type" => ["type" => "varchar(100)", "not null" => "1", "default" => "", "comment" => "ActivityStreams target type if applicable (URI)"],
-                       "target" => ["type" => "text", "comment" => "JSON encoded target structure if used"],
-                       "plink" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "permalink or URL to a displayable copy of the message at its source"],
-                       "verb" => ["type" => "varchar(100)", "not null" => "1", "default" => "", "comment" => "ActivityStreams verb"]
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uri-plink-hash" => ["UNIQUE", "uri-plink-hash"],
-                       "uri" => ["uri(191)"],
-                       "uri-id" => ["uri-id"]
-               ]
-       ],
-       "item-delivery-data" => [
-               "comment" => "Delivery data for items",
-               "fields" => [
-                       "iid" => ["type" => "int unsigned", "not null" => "1", "primary" => "1", "relation" => ["item" => "id"], "comment" => "Item id"],
-                       "postopts" => ["type" => "text", "comment" => "External post connectors add their network name to this comma-separated string to identify that they should be delivered to these networks during delivery"],
-                       "inform" => ["type" => "mediumtext", "comment" => "Additional receivers of the linked item"],
-                       "queue_count" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Initial number of delivery recipients, used as item.delivery_queue_count"],
-                       "queue_done" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Number of successful deliveries, used as item.delivery_queue_done"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["iid"],
-               ]
-       ],
-       "item-uri" => [
-               "comment" => "URI and GUID for items",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1"],
-                       "uri" => ["type" => "varbinary(255)", "not null" => "1", "comment" => "URI of an item"],
-                       "guid" => ["type" => "varbinary(255)", "comment" => "A unique identifier for an item"]
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uri" => ["UNIQUE", "uri"],
-                       "guid" => ["guid"]
-               ]
-       ],
-       "locks" => [
-               "comment" => "",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "name" => ["type" => "varchar(128)", "not null" => "1", "default" => "", "comment" => ""],
-                       "locked" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "pid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => "Process ID"],
-                       "expires" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "datetime of cache expiration"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "name_expires" => ["name", "expires"]
-               ]
-       ],
-       "mail" => [
-               "comment" => "private messages",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
-                       "guid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "A unique identifier for this private message"],
-                       "from-name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "name of the sender"],
-                       "from-photo" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "contact photo link of the sender"],
-                       "from-url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "profile linke of the sender"],
-                       "contact-id" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "relation" => ["contact" => "id"], "comment" => "contact.id"],
-                       "convid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["conv" => "id"], "comment" => "conv.id"],
-                       "title" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "body" => ["type" => "mediumtext", "comment" => ""],
-                       "seen" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "if message visited it is 1"],
-                       "reply" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "replied" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "unknown" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "if sender not in the contact table this is 1"],
-                       "uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "parent-uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "creation time of the private message"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uid_seen" => ["uid", "seen"],
-                       "convid" => ["convid"],
-                       "uri" => ["uri(64)"],
-                       "parent-uri" => ["parent-uri(64)"],
-                       "contactid" => ["contact-id(32)"],
-               ]
-       ],
-       "mailacct" => [
-               "comment" => "Mail account data for fetching mails",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "server" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "port" => ["type" => "smallint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "ssltype" => ["type" => "varchar(16)", "not null" => "1", "default" => "", "comment" => ""],
-                       "mailbox" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "user" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "pass" => ["type" => "text", "comment" => ""],
-                       "reply_to" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "action" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "movetofolder" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "pubmail" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "last_check" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-               ]
-       ],
-       "manage" => [
-               "comment" => "table of accounts that can manage each other",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "mid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uid_mid" => ["UNIQUE", "uid", "mid"],
-               ]
-       ],
-       "notify" => [
-               "comment" => "notifications",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "hash" => ["type" => "varchar(64)", "not null" => "1", "default" => "", "comment" => ""],
-                       "type" => ["type" => "smallint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "photo" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "msg" => ["type" => "mediumtext", "comment" => ""],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
-                       "link" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "iid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["item" => "id"], "comment" => "item.id"],
-                       "parent" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["item" => "id"], "comment" => ""],
-                       "seen" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "verb" => ["type" => "varchar(100)", "not null" => "1", "default" => "", "comment" => ""],
-                       "otype" => ["type" => "varchar(10)", "not null" => "1", "default" => "", "comment" => ""],
-                       "name_cache" => ["type" => "tinytext", "comment" => "Cached bbcode parsing of name"],
-                       "msg_cache" => ["type" => "mediumtext", "comment" => "Cached bbcode parsing of msg"]
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "hash_uid" => ["hash", "uid"],
-                       "seen_uid_date" => ["seen", "uid", "date"],
-                       "uid_date" => ["uid", "date"],
-                       "uid_type_link" => ["uid", "type", "link(190)"],
-               ]
-       ],
-       "notify-threads" => [
-               "comment" => "",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "notify-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["notify" => "id"], "comment" => ""],
-                       "master-parent-item" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["item" => "id"],
-                               "comment" => ""],
-                       "parent-item" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "receiver-uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"],
-                               "comment" => "User id"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-               ]
-       ],
-       "oembed" => [
-               "comment" => "cache for OEmbed queries",
-               "fields" => [
-                       "url" => ["type" => "varbinary(255)", "not null" => "1", "primary" => "1", "comment" => "page url"],
-                       "maxwidth" => ["type" => "mediumint unsigned", "not null" => "1", "primary" => "1", "comment" => "Maximum width passed to Oembed"],
-                       "content" => ["type" => "mediumtext", "comment" => "OEmbed data of the page"],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "datetime of creation"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["url", "maxwidth"],
-                       "created" => ["created"],
-               ]
-       ],
-       "openwebauth-token" => [
-               "comment" => "Store OpenWebAuth token to verify contacts",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "type" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => "Verify type"],
-                       "token" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "A generated token"],
-                       "meta" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "datetime of creation"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-               ]
-       ],
-       "parsed_url" => [
-               "comment" => "cache for 'parse_url' queries",
-               "fields" => [
-                       "url" => ["type" => "varbinary(255)", "not null" => "1", "primary" => "1", "comment" => "page url"],
-                       "guessing" => ["type" => "boolean", "not null" => "1", "default" => "0", "primary" => "1", "comment" => "is the 'guessing' mode active?"],
-                       "oembed" => ["type" => "boolean", "not null" => "1", "default" => "0", "primary" => "1", "comment" => "is the data the result of oembed?"],
-                       "content" => ["type" => "mediumtext", "comment" => "page data"],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "datetime of creation"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["url", "guessing", "oembed"],
-                       "created" => ["created"],
-               ]
-       ],
-       "participation" => [
-               "comment" => "Storage for participation messages from Diaspora",
-               "fields" => [
-                       "iid" => ["type" => "int unsigned", "not null" => "1", "primary" => "1", "relation" => ["item" => "id"], "comment" => ""],
-                       "server" => ["type" => "varchar(60)", "not null" => "1", "primary" => "1", "comment" => ""],
-                       "cid" => ["type" => "int unsigned", "not null" => "1", "relation" => ["contact" => "id"], "comment" => ""],
-                       "fid" => ["type" => "int unsigned", "not null" => "1", "relation" => ["fcontact" => "id"], "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["iid", "server"],
-                       "cid" => ["cid"],
-                       "fid" => ["fid"]
-               ]
-       ],
-       "pconfig" => [
-               "comment" => "personal (per user) configuration storage",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => ""],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "cat" => ["type" => "varbinary(50)", "not null" => "1", "default" => "", "comment" => ""],
-                       "k" => ["type" => "varbinary(100)", "not null" => "1", "default" => "", "comment" => ""],
-                       "v" => ["type" => "mediumtext", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uid_cat_k" => ["UNIQUE", "uid", "cat", "k"],
-               ]
-       ],
-       "permissionset" => [
-               "comment" => "",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner id of this permission set"],
-                       "allow_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed contact.id '<19><78>'"],
-                       "allow_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed groups"],
-                       "deny_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied contact.id"],
-                       "deny_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied groups"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uid_allow_cid_allow_gid_deny_cid_deny_gid" => ["allow_cid(50)", "allow_gid(30)", "deny_cid(50)", "deny_gid(30)"],
-               ]
-       ],
-       "photo" => [
-               "comment" => "photo storage",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
-                       "contact-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "contact.id"],
-                       "guid" => ["type" => "char(16)", "not null" => "1", "default" => "", "comment" => "A unique identifier for this photo"],
-                       "resource-id" => ["type" => "char(32)", "not null" => "1", "default" => "", "comment" => ""],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "creation date"],
-                       "edited" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "last edited date"],
-                       "title" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "desc" => ["type" => "text", "comment" => ""],
-                       "album" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "The name of the album to which the photo belongs"],
-                       "filename" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "type" => ["type" => "varchar(30)", "not null" => "1", "default" => "image/jpeg"],
-                       "height" => ["type" => "smallint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "width" => ["type" => "smallint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "datasize" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "data" => ["type" => "mediumblob", "not null" => "1", "comment" => ""],
-                       "scale" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "profile" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "allow_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed contact.id '<19><78>'"],
-                       "allow_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed groups"],
-                       "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"],
-                       "updated" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""]
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "contactid" => ["contact-id"],
-                       "uid_contactid" => ["uid", "contact-id"],
-                       "uid_profile" => ["uid", "profile"],
-                       "uid_album_scale_created" => ["uid", "album(32)", "scale", "created"],
-                       "uid_album_resource-id_created" => ["uid", "album(32)", "resource-id", "created"],
-                       "resource-id" => ["resource-id"],
-               ]
-       ],
-       "poll" => [
-               "comment" => "Currently unused table for storing poll results",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => ""],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "q0" => ["type" => "text", "comment" => ""],
-                       "q1" => ["type" => "text", "comment" => ""],
-                       "q2" => ["type" => "text", "comment" => ""],
-                       "q3" => ["type" => "text", "comment" => ""],
-                       "q4" => ["type" => "text", "comment" => ""],
-                       "q5" => ["type" => "text", "comment" => ""],
-                       "q6" => ["type" => "text", "comment" => ""],
-                       "q7" => ["type" => "text", "comment" => ""],
-                       "q8" => ["type" => "text", "comment" => ""],
-                       "q9" => ["type" => "text", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uid" => ["uid"],
-               ]
-       ],
-       "poll_result" => [
-               "comment" => "data for polls - currently unused",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "poll_id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["poll" => "id"]],
-                       "choice" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "poll_id" => ["poll_id"],
-               ]
-       ],
-       "process" => [
-               "comment" => "Currently running system processes",
-               "fields" => [
-                       "pid" => ["type" => "int unsigned", "not null" => "1", "primary" => "1", "comment" => ""],
-                       "command" => ["type" => "varbinary(32)", "not null" => "1", "default" => "", "comment" => ""],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["pid"],
-                       "command" => ["command"],
-               ]
-       ],
-       "profile" => [
-               "comment" => "user profiles data",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
-                       "profile-name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Name of the profile"],
-                       "is-default" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Mark this profile as default profile"],
-                       "hide-friends" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Hide friend list from viewers of this profile"],
-                       "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "pdesc" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Title or description"],
-                       "dob" => ["type" => "varchar(32)", "not null" => "1", "default" => "0000-00-00", "comment" => "Day of birth"],
-                       "address" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "locality" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "region" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "postal-code" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => ""],
-                       "country-name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "hometown" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "gender" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => ""],
-                       "marital" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "with" => ["type" => "text", "comment" => ""],
-                       "howlong" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "sexual" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "politic" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "religion" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "pub_keywords" => ["type" => "text", "comment" => ""],
-                       "prv_keywords" => ["type" => "text", "comment" => ""],
-                       "likes" => ["type" => "text", "comment" => ""],
-                       "dislikes" => ["type" => "text", "comment" => ""],
-                       "about" => ["type" => "text", "comment" => ""],
-                       "summary" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "music" => ["type" => "text", "comment" => ""],
-                       "book" => ["type" => "text", "comment" => ""],
-                       "tv" => ["type" => "text", "comment" => ""],
-                       "film" => ["type" => "text", "comment" => ""],
-                       "interest" => ["type" => "text", "comment" => ""],
-                       "romance" => ["type" => "text", "comment" => ""],
-                       "work" => ["type" => "text", "comment" => ""],
-                       "education" => ["type" => "text", "comment" => ""],
-                       "contact" => ["type" => "text", "comment" => ""],
-                       "homepage" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "xmpp" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "photo" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "thumb" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "publish" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "publish default profile in local directory"],
-                       "net-publish" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "publish profile in global directory"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uid_is-default" => ["uid", "is-default"],
-                       "pub_keywords" => ["FULLTEXT", "pub_keywords"],
-               ]
-       ],
-       "profile_check" => [
-               "comment" => "DFRN remote auth use",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "cid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "contact.id"],
-                       "dfrn_id" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "sec" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "expire" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-               ]
-       ],
-       "push_subscriber" => [
-               "comment" => "Used for OStatus: Contains feed subscribers",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "callback_url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "topic" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "nickname" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "push" => ["type" => "tinyint", "not null" => "1", "default" => "0", "comment" => "Retrial counter"],
-                       "last_update" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of last successful trial"],
-                       "next_try" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Next retrial date"],
-                       "renewed" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of last subscription renewal"],
-                       "secret" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "next_try" => ["next_try"],
-               ]
-       ],
-       "register" => [
-               "comment" => "registrations requiring admin approval",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "hash" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "password" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "language" => ["type" => "varchar(16)", "not null" => "1", "default" => "", "comment" => ""],
-                       "note" => ["type" => "text", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-               ]
-       ],
-       "search" => [
-               "comment" => "",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "term" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uid" => ["uid"],
-               ]
-       ],
-       "session" => [
-               "comment" => "web session storage",
-               "fields" => [
-                       "id" => ["type" => "bigint unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "sid" => ["type" => "varbinary(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "data" => ["type" => "text", "comment" => ""],
-                       "expire" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "sid" => ["sid(64)"],
-                       "expire" => ["expire"],
-               ]
-       ],
-       "sign" => [
-               "comment" => "Diaspora signatures",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "iid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["item" => "id"], "comment" => "item.id"],
-                       "signed_text" => ["type" => "mediumtext", "comment" => ""],
-                       "signature" => ["type" => "text", "comment" => ""],
-                       "signer" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "iid" => ["UNIQUE", "iid"],
-               ]
-       ],
-       "term" => [
-               "comment" => "item taxonomy (categories, tags, etc.) table",
-               "fields" => [
-                       "tid" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => ""],
-                       "oid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["item" => "id"], "comment" => ""],
-                       "otype" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "type" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "term" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "guid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "received" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "global" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["tid"],
-                       "term_type" => ["term(64)", "type"],
-                       "oid_otype_type_term" => ["oid", "otype", "type", "term(32)"],
-                       "uid_otype_type_term_global_created" => ["uid", "otype", "type", "term(32)", "global", "created"],
-                       "uid_otype_type_url" => ["uid", "otype", "type", "url(64)"],
-                       "guid" => ["guid(64)"],
-               ]
-       ],
-       "thread" => [
-               "comment" => "Thread related data",
-               "fields" => [
-                       "iid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "primary" => "1", "relation" => ["item" => "id"],
-                               "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "contact-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => ""],
-                       "owner-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "Item owner"],
-                       "author-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "Item author"],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "edited" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "commented" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "received" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "changed" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "wall" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "private" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "pubmail" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "moderated" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "visible" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "starred" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "ignored" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "post-type" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => "Post type (personal note, bookmark, ...)"],
-                       "unseen" => ["type" => "boolean", "not null" => "1", "default" => "1", "comment" => ""],
-                       "deleted" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "origin" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "forum_mode" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "mention" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "network" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => ""],
-                       "bookmark" => ["type" => "boolean", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["iid"],
-                       "uid_network_commented" => ["uid", "network", "commented"],
-                       "uid_network_created" => ["uid", "network", "created"],
-                       "uid_contactid_commented" => ["uid", "contact-id", "commented"],
-                       "uid_contactid_created" => ["uid", "contact-id", "created"],
-                       "contactid" => ["contact-id"],
-                       "ownerid" => ["owner-id"],
-                       "authorid" => ["author-id"],
-                       "uid_created" => ["uid", "created"],
-                       "uid_commented" => ["uid", "commented"],
-                       "uid_wall_created" => ["uid", "wall", "created"],
-                       "private_wall_origin_commented" => ["private", "wall", "origin", "commented"],
-               ]
-       ],
-       "tokens" => [
-               "comment" => "OAuth usage",
-               "fields" => [
-                       "id" => ["type" => "varchar(40)", "not null" => "1", "primary" => "1", "comment" => ""],
-                       "secret" => ["type" => "text", "comment" => ""],
-                       "client_id" => ["type" => "varchar(20)", "not null" => "1", "default" => "", "relation" => ["clients" => "client_id"]],
-                       "expires" => ["type" => "int", "not null" => "1", "default" => "0", "comment" => ""],
-                       "scope" => ["type" => "varchar(200)", "not null" => "1", "default" => "", "comment" => ""],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-               ]
-       ],
-       "user" => [
-               "comment" => "The local users",
-               "fields" => [
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "parent-uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"],
-                               "comment" => "The parent user that has full control about this user"],
-                       "guid" => ["type" => "varchar(64)", "not null" => "1", "default" => "", "comment" => "A unique identifier for this user"],
-                       "username" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Name that this user is known by"],
-                       "password" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "encrypted password"],
-                       "legacy_password" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Is the password hash double-hashed?"],
-                       "nickname" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "nick- and user name"],
-                       "email" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "the users email address"],
-                       "openid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "timezone" => ["type" => "varchar(128)", "not null" => "1", "default" => "", "comment" => "PHP-legal timezone"],
-                       "language" => ["type" => "varchar(32)", "not null" => "1", "default" => "en", "comment" => "default language"],
-                       "register_date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "timestamp of registration"],
-                       "login_date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "timestamp of last login"],
-                       "default-location" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Default for item.location"],
-                       "allow_location" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 allows to display the location"],
-                       "theme" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "user theme preference"],
-                       "pubkey" => ["type" => "text", "comment" => "RSA public key 4096 bit"],
-                       "prvkey" => ["type" => "text", "comment" => "RSA private key 4096 bit"],
-                       "spubkey" => ["type" => "text", "comment" => ""],
-                       "sprvkey" => ["type" => "text", "comment" => ""],
-                       "verified" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "user is verified through email"],
-                       "blocked" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 for user is blocked"],
-                       "blockwall" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Prohibit contacts to post to the profile page of the user"],
-                       "hidewall" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Hide profile details from unkown viewers"],
-                       "blocktags" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Prohibit contacts to tag the post of this user"],
-                       "unkmail" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Permit unknown people to send private mails to this user"],
-                       "cntunkmail" => ["type" => "int unsigned", "not null" => "1", "default" => "10", "comment" => ""],
-                       "notify-flags" => ["type" => "smallint unsigned", "not null" => "1", "default" => "65535", "comment" => "email notification options"],
-                       "page-flags" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => "page/profile type"],
-                       "account-type" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "prvnets" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "pwdreset" => ["type" => "varchar(255)", "comment" => "Password reset request token"],
-                       "pwdreset_time" => ["type" => "datetime", "comment" => "Timestamp of the last password reset request"],
-                       "maxreq" => ["type" => "int unsigned", "not null" => "1", "default" => "10", "comment" => ""],
-                       "expire" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "account_removed" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "if 1 the account is removed"],
-                       "account_expired" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "account_expires_on" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "timestamp when account expires and will be deleted"],
-                       "expire_notification_sent" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "timestamp of last warning of account expiration"],
-                       "def_gid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "allow_cid" => ["type" => "mediumtext", "comment" => "default permission for this user"],
-                       "allow_gid" => ["type" => "mediumtext", "comment" => "default permission for this user"],
-                       "deny_cid" => ["type" => "mediumtext", "comment" => "default permission for this user"],
-                       "deny_gid" => ["type" => "mediumtext", "comment" => "default permission for this user"],
-                       "openidserver" => ["type" => "text", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["uid"],
-                       "nickname" => ["nickname(32)"],
-               ]
-       ],
-       "userd" => [
-               "comment" => "Deleted usernames",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "username" => ["type" => "varchar(255)", "not null" => "1", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "username" => ["username(32)"],
-               ]
-       ],
-       "user-contact" => [
-               "comment" => "User specific public contact data",
-               "fields" => [
-                       "cid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "primary" => "1", "relation" => ["contact" => "id"], "comment" => "Contact id of the linked public contact"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "primary" => "1", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "blocked" => ["type" => "boolean", "comment" => "Contact is completely blocked for this user"],
-                       "ignored" => ["type" => "boolean", "comment" => "Posts from this contact are ignored"],
-                       "collapsed" => ["type" => "boolean", "comment" => "Posts from this contact are collapsed"]
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["uid", "cid"]
-               ]
-       ],
-       "user-item" => [
-               "comment" => "User specific item data",
-               "fields" => [
-                       "iid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "primary" => "1", "relation" => ["item" => "id"], "comment" => "Item id"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "primary" => "1", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "hidden" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Marker to hide an item from the user"],
-                       "ignored" => ["type" => "boolean", "comment" => "Ignore this thread if set"]
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["uid", "iid"]
-               ]
-       ],
-       "worker-ipc" => [
-               "comment" => "Inter process communication between the frontend and the worker",
-               "fields" => [
-                       "key" => ["type" => "int", "not null" => "1", "primary" => "1", "comment" => ""],
-                       "jobs" => ["type" => "boolean", "comment" => "Flag for outstanding jobs"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["key"],
-               ],
-               "engine" => "MEMORY",
-       ],
-       "workerqueue" => [
-               "comment" => "Background tasks queue entries",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "Auto incremented worker task id"],
-                       "parameter" => ["type" => "mediumtext", "comment" => "Task command"],
-                       "priority" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => "Task priority"],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Creation date"],
-                       "pid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => "Process id of the worker"],
-                       "executed" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Execution date"],
-                       "next_try" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Next retrial date"],
-                       "retrial" => ["type" => "tinyint", "not null" => "1", "default" => "0", "comment" => "Retrial counter"],
-                       "done" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Marked 1 when the task was done - will be deleted later"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "done_parameter" => ["done", "parameter(64)"],
-                       "done_executed" => ["done", "executed"],
-                       "done_priority_created" => ["done", "priority", "created"],
-                       "done_priority_next_try" => ["done", "priority", "next_try"],
-                       "done_pid_next_try" => ["done", "pid", "next_try"],
-                       "done_pid_priority_created" => ["done", "pid", "priority", "created"]
-               ]
-       ],
-       "storage" => [
-               "comment" => "Data stored by Database storage backend",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "Auto incremented image data id"],
-                       "data" => ["type" => "longblob", "not null" => "1", "comment" => "file data"]
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"]
-               ]
-       ]
-];
-
diff --git a/config/defaults.config.php b/config/defaults.config.php
deleted file mode 100644 (file)
index b4471af..0000000
+++ /dev/null
@@ -1,461 +0,0 @@
-<?php
-
-// CONFIG.PHP
-
-/* This file declares the default values for the base config of Friendica.
- *
- * These configuration values aren't accessible from the admin settings page and custom values must be set in config/local.config.php
- *
- * Please don't edit this file directly as its content may change in the upcoming versions.
- */
-
-return [
-       'database' => [
-               // host (String)
-               // Hostname or IP address of the database server.
-               // Can contain the port number with the syntax "hostname:port".
-               'hostname' => '',
-
-               // user (String)
-               // Database user name. Please don't use "root".
-               'username' => '',
-
-               // pass (String)
-               // Database user password. Please don't use empty passwords.
-               'password' => '',
-
-               // base (String)
-               // Database name.
-               'database' => '',
-
-               // charset (String)
-               // Database connexion charset. Changing this value will likely corrupt special characters.
-               'charset' => 'utf8mb4',
-       ],
-       'config' => [
-               // admin_email (Comma-separated list)
-               // In order to perform system administration via the admin panel,
-               // this must precisely match the email address of the person logged in.
-               'admin_email' => '',
-
-               // admin_nickname (String)
-               // Nickname of the main admin user, used if there are more than one admin user defined in config => admin_email.
-               'admin_nickname' => '',
-
-               // max_import_size (Integer)
-               // Maximum body size of DFRN and Mail messages in characters. 0 is unlimited.
-               'max_import_size' => 200000,
-
-               // php_path (String)
-               // Location of PHP command line processor.
-               'php_path' => 'php',
-       ],
-       'system' => [
-               // allowed_link_protocols (Array)
-               // Allowed protocols in links URLs, add at your own risk. http is always allowed.
-               'allowed_link_protocols' => ['ftp', 'ftps', 'mailto', 'cid', 'gopher'],
-
-               // always_show_preview (Boolean)
-               // Only show small preview pictures.
-               'always_show_preview' => false,
-
-               // archival_days (Integer)
-               // Number of days that we try to deliver content before we archive a contact.
-               'archival_days' => 32,
-
-               // auth_cookie_lifetime (Integer)
-               // Number of days that should pass without any activity before a user who
-               // chose "Remember me" when logging in is considered logged out.
-               'auth_cookie_lifetime' => 7,
-
-               // block_local_dir (Boolean)
-               // Deny public access to the local user directory.
-               'block_local_dir' => false,
-
-               // cron_interval (Integer)
-               // Minimal period in minutes between two calls of the "Cron" worker job.
-               'cron_interval' => 5,
-
-               // cache_driver (database|memcache|memcached|redis)
-               // Whether to use Memcache or Memcached or Redis to store temporary cache.
-               'cache_driver' => 'database',
-
-               // config_adapter (jit|preload)
-               // Allow to switch the configuration adapter to improve performances at the cost of memory consumption.
-               'config_adapter' => 'jit',
-
-               // curl_range_bytes (Integer)
-               // Maximum number of bytes that should be fetched. Default is 0, which mean "no limit".
-               'curl_range_bytes' => 0,
-
-               // crawl_permit_period (Integer)
-               // Period in seconds between allowed searches when the number of free searches is reached and "permit_crawling" is activated.
-               'crawl_permit_period' => 60,
-
-               // db_log (Path)
-               // Name of a logfile to log slow database queries.
-               'db_log' => '',
-
-               // db_log_index (Path)
-               // Name of a logfile to log queries with bad indexes.
-               'db_log_index' => '',
-
-               // db_log_index_watch (Comma-separated list)
-               // Watchlist of indexes to watch.
-               'db_log_index_watch' => '',
-
-               // db_log_index_blacklist (Comma-separated list)
-               // Blacklist of indexes that shouldn't be watched.
-               'db_log_index_blacklist' => '',
-
-               // db_loglimit (Integer)
-               // If a database call lasts longer than this value in seconds it is logged.
-               // Inactive if system => db_log is empty.
-               'db_loglimit' => 10,
-
-               // db_loglimit_index (Integer)
-               // Number of index rows needed to be logged for indexes on the watchlist. 0 to disable.
-               'db_loglimit_index' => 0,
-
-               // db_loglimit_index_high (Integer)
-               // Number of index rows to be logged anyway (for any index). 0 to disable.
-               'db_loglimit_index_high' => 0,
-
-               // dbclean_expire_conversation (Integer)
-               // When DBClean is enabled, any entry in the conversation table will be deleted after this many days.
-               // This data is used for ActivityPub, so it shouldn't be lower than the average duration of a discussion.
-               'dbclean_expire_conversation' => 90,
-
-               // dbclean-expire-limit (Integer)
-               // This defines the number of items that are to be deleted in a single call.
-               // Reduce this value when you are getting memory issues.
-               'dbclean-expire-limit' => 1000,
-
-               // diaspora_test (Boolean)
-               // For development only. Disables the message transfer.
-               'diaspora_test' => false,
-
-               // disable_email_validation (Boolean)
-               // Disables the check if a mail address is in a valid format and can be resolved via DNS.
-               'disable_email_validation' => 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.
-               'disable_url_validation' => false,
-
-               // disable_password_exposed (Boolean)
-               // Disable the exposition check against the remote haveibeenpwned API on password change.
-               'disable_password_exposed' => false,
-
-               // disable_polling (Boolean)
-               // Disable the polling of DFRN and OStatus contacts through onepoll.php.
-               'disable_polling' => false,
-
-               // dlogfile (Path)
-               // location of the developer log file.
-               'dlogfile' => '',
-
-               // dlogip (String)
-               // restricts develop log writes to requests originating from this IP address.
-               'dlogip' => '',
-
-               // free_crawls (Integer)
-               // Number of "free" searches when system => permit_crawling is enabled.
-               'free_crawls' => 10,
-
-               // frontend_worker_timeout (Integer)
-               // Value in minutes after we think that a frontend task was killed by the webserver.
-               'frontend_worker_timeout' => 10,
-
-               // groupedit_image_limit (Integer)
-               // Number of contacts at which the group editor should switch from display the profile pictures of the contacts to only display the names.
-               // This can alternatively be set on a per account basis in the pconfig table.
-               'groupedit_image_limit' => 400,
-
-               // hsts (Boolean)
-               // Enables the sending of HTTP Strict Transport Security headers.
-               'hsts' => false,
-
-               // ignore_cache (Boolean)
-               // For development only. Disables the item cache.
-               'ignore_cache' => false,
-
-               // instances_social_key (String)
-               // Key to the API of https://instances.social which retrieves data about mastodon servers.
-               // See https://instances.social/api/token to get an API key.
-               'instances_social_key' => '',
-
-               // ipv4_resolve (Boolean)
-               // Resolve IPV4 addresses only. Don't resolve to IPV6.
-               'ipv4_resolve' => false,
-
-               // invitation_only (Boolean)
-               // If set true registration is only possible after a current member of the node has send an invitation.
-               'invitation_only' => false,
-
-               // like_no_comment (Boolean)
-               // Don't update the "commented" value of an item when it is liked.
-               'like_no_comment' => false,
-
-               // local_block (Boolean)
-               // Used in conjunction with "block_public".
-               'local_block' => false,
-
-               // local_search (Boolean)
-               // Blocks search for users who are not logged in to prevent crawlers from blocking your system.
-               'local_search' => false,
-
-               // local_tags (Boolean)
-               // If activated, all hashtags will point to the local server.
-               'local_tags' => false,
-
-               // logger_config (String)
-               // Sets the logging adapter of Friendica globally (monolog, syslog, stream)
-               'logger_config' => 'stream',
-
-               // max_batch_queue (Integer)
-               // Maximum number of batched queue items for a single contact before subsequent messages are discarded.
-               'max_batch_queue' => 1000,
-
-               // max_connections (Integer)
-               // The maximum number of database connections which can be in use before the worker process is deferred to its next interval.
-               // When the system can't detect the maximum numbers of connection then this value can be used. Use 0 for auto-detection.
-               'max_connections' => 0,
-
-               // max_connections_level (Integer 0-100)
-               // The maximum percentage of connections that are allowed to let the worker start.
-               'max_connections_level' => 75,
-
-               // max_contact_queue (Integer)
-               // Maximum number of queue items for a single contact before subsequent messages are discarded.
-               'max_contact_queue' => 500,
-
-               // max_image_length (Integer)
-               // An alternate way of limiting picture upload sizes.
-               // Specify the maximum pixel  length that pictures are allowed to be (for non-square pictures, it will apply to the longest side).
-               // Pictures longer than this length will be resized to be this length (on the longest side, the other side will be scaled appropriately).
-               // If you don't want to set a maximum length, set to -1.
-               'max_image_length' => -1,
-
-               // max_processes_backend (Integer)
-               // Maximum number of concurrent database processes for background tasks.
-               'max_processes_backend' => 5,
-
-               // max_processes_frontend (Integer)
-               // Maximum number of concurrent database processes for foreground tasks.
-               'max_processes_frontend' => 20,
-
-               // maximagesize (Integer)
-               // Maximum size in bytes of an uploaded photo.
-               'maximagesize' => 800000,
-
-               // memcache_host (String)
-               // Host name of the memcache daemon.
-               'memcache_host' => '127.0.0.1',
-
-               // memcache_port (Integer)
-               // Port number of the memcache daemon.
-               'memcache_port' => 11211,
-
-               // memcached_hosts (Array)
-               // Array of Memcached servers info [host, port(, weight)], see Memcached::addServers.
-               'memcached_hosts' => [
-                       ['127.0.0.1', '11211'],
-               ],
-
-               // min_poll_interval (Integer)
-               // minimal distance in minutes between two polls for a contact. Reasonable values are between 1 and 59.
-               'min_poll_interval' => 1,
-
-               // no_count (Boolean)
-               // Don't do count calculations (currently only when showing photo albums).
-               'no_count' => false,
-
-               // no_oembed (Boolean)
-               // Don't use OEmbed to fetch more information about a link.
-               'no_oembed' => false,
-
-               // no_smilies (Boolean)
-               // Don't show smilies.
-               'no_smilies' => false,
-
-               // no_view_full_size (Boolean)
-               // Don't add the link "View full size" under a resized image.
-               'no_view_full_size' => false,
-
-               // optimize_items (Boolean)
-               // Triggers an SQL command to optimize the item table before expiring items.
-               'optimize_items' => false,
-
-               // paranoia (Boolean)
-               // Log out users if their IP address changed.
-               'paranoia' => false,
-
-               // permit_crawling (Boolean)
-               // Restricts the search for not logged in users to one search per minute.
-               'permit_crawling' => false,
-
-               // pidfile (Path)
-               // Daemon pid file path. For example: pidfile = /path/to/daemon.pid
-               'pidfile' => '',
-
-               // png_quality (Integer)
-               // Sets the ImageMagick compression level for PNG images. Values ranges from 0 (uncompressed) to 9 (most compressed).
-               'png_quality' => 8,
-
-               // profiler (Boolean)
-               // Enable internal timings to help optimize code. Needed for "rendertime" addon.
-               'profiler' => false,
-
-               // proxy_cache_time (Integer)
-               // Period in seconds after which the cache is cleared.
-               'proxy_cache_time' => 86400,
-
-               // pushpoll_frequency (Integer)
-               // Frequency of contact poll for subhub contact using the DFRM or OStatus network.
-               // Available values:
-               // - 5 = every month
-               // - 4 = every week
-               // - 3 = every day
-               // - 2 = twice a day
-               // - 1 = every hour
-               // - 0 = every minute
-               'pushpoll_frequency' => 3,
-
-               // queue_no_dead_check (Boolean)
-               // Ignore if the target contact or server seems to be dead during queue delivery.
-               'queue_no_dead_check' => false,
-
-               // redis_host (String)
-               // Host name of the redis daemon.
-               'redis_host' => '127.0.0.1',
-
-               // redis_port (String)
-               // Port number of the redis daemon.
-               'redis_port' => 6379,
-
-               // redis_db (Integer)
-               // The sub-database of redis (0 - 15 possible sub-databases)
-               'redis_db' => 0,
-
-               // redis_password (String)
-               // The authentication password for the redis database
-               'redis_password' => null,
-
-               // session_handler (database|cache|native)
-               // Whether to use Cache to store session data or to use PHP native session storage.
-               'session_handler' => 'database',
-
-               // remove_multiplicated_lines (Boolean)
-               // If enabled, multiple linefeeds in items are stripped to a single one.
-               'remove_multiplicated_lines' => false,
-
-               // sendmail_params (Boolean)
-               // Normal sendmail command parameters will be added when the PHP mail() function is called for sending e-mails.
-               // This ensures the Sender Email address setting is applied to the message envelope rather than the host's default address.
-               // Set to false if your non-sendmail agent is incompatible, or to restore old behavior of using the host address.
-               'sendmail_params' => true,
-
-               // show_global_community_hint (Boolean)
-               // When the global community page is enabled, use this option to display a hint above the stream, that this is a collection of all public top-level postings that arrive on your node.
-               'show_global_community_hint' => false,
-
-               // show_unsupported_addons (Boolean)
-               // Show all addons including the unsupported ones.
-               'show_unsupported_addons' => false,
-
-               // show_unsupported_themes (Boolean)
-               // Show all themes including the unsupported ones.
-               'show_unsupported_themes' => false,
-
-               // throttle_limit_day (Integer)
-               // Maximum number of posts that a user can send per day with the API. 0 to disable daily throttling.
-               'throttle_limit_day' => 0,
-
-               // throttle_limit_week (Integer)
-               // Maximum number of posts that a user can send per week with the API. 0 to disable weekly throttling.
-               'throttle_limit_week' => 0,
-
-               // throttle_limit_month (Integer)
-               // Maximum number of posts that a user can send per month with the API. 0 to disable monthly throttling.
-               'throttle_limit_month' => 0,
-
-               // username_min_length (Integer)
-               // The minimum character length a username can be.
-               // This length is check once the username has been trimmed and multiple spaces have been collapsed into one.
-               // Minimum for this config value is 1. Maximum is 64 as the resulting profile URL mustn't be longer than 255 chars.
-               'username_min_length' => 3,
-
-               // username_max_length (Integer)
-               // The maximum character length a username can be.
-               // This length is check once the username has been trimmed and multiple spaces have been collapsed into one.
-               // Minimum for this config value is 1. Maximum is 64 as the resulting profile URL mustn't be longer than 255 chars.
-               'username_max_length' => 48,
-
-               // worker_cooldown (Integer)
-               // Cooldown period in seconds after each worker function call.
-               'worker_cooldown' => 0,
-
-               // worker_debug (Boolean)
-               // If enabled, it prints out the number of running processes split by priority.
-               'worker_debug' => false,
-
-               // worker_fetch_limit (Integer)
-               // Number of worker tasks that are fetched in a single query.
-               'worker_fetch_limit' => 1,
-
-               // worker_jpm (Boolean)
-               // If enabled, it prints out the jobs per minute.
-               'worker_jpm' => false,
-
-               // worker_jpm_range (String)
-               // List of minutes for the jobs per minute (JPM) calculation
-               'worker_jpm_range' => '1, 10, 60',
-
-               // worker_load_exponent (Integer)
-               // Default 3, which allows only 25% of the maximum worker queues when server load reaches around 37% of maximum load.
-               // For a linear response where 25% of worker queues are allowed at 75% of maximum load, set this to 1.
-               // Setting 0 would allow maximum worker queues at all times, which is not recommended.
-               'worker_load_exponent' => 3,
-
-               // xrd_timeout (Integer)
-               // Timeout in seconds for fetching the XRD links.
-               'xrd_timeout' => 20,
-       ],
-       'experimental' => [
-               // exp_themes (Boolean)
-               // Show experimental themes in user settings.
-               'exp_themes' => false,
-       ],
-       'theme' => [
-               // hide_eventlist (Boolean)
-               // Don't show the birthdays and events on the profile and network page.
-               'hide_eventlist' => false,
-       ],
-       'jabber' => [
-               // debug (Boolean)
-               // Enable debug level for the jabber account synchronisation.
-               'debug' => false,
-               // lockpath (Path)
-               // Must be writable by the ejabberd process. if set then it will prevent the running of multiple processes.
-               'lockpath' => '',
-       ],
-       'debug' => [
-               // ap_inbox_log (Boolean)
-               // Logs every call to /inbox as a JSON file in Friendica's temporary directory
-               'ap_inbox_log' => false,
-
-               // total_ap_delivery (Boolean)
-               // Deliver via AP to every possible receiver and we suppress the delivery to these contacts with other protocols
-               'total_ap_delivery' => false,
-       ]
-];
index 9b977ff53f4a49b721d9b77f36fb5578b12910be..9bf073df1d99dffc03198d23589f33baf4fd262d 100644 (file)
@@ -12,7 +12,7 @@
  *
  * Then set the following for your MySQL installation
  *
- * If you're unsure about what any of the config keys below do, please check the config/defaults.config.php file for
+ * If you're unsure about what any of the config keys below do, please check the static/defaults.config.php file for
  * detailed documentation of their data type and behavior.
  */
 
diff --git a/config/settings.config.php b/config/settings.config.php
deleted file mode 100644 (file)
index bf8b62f..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-<?php
-
-// SETTINGS.PHP
-
-/* This file declares the default values for the admin settings of Friendica.
- *
- * These values will be overridden by the admin settings page.
- *
- * Please don't edit this file directly as its content may change in the upcoming versions.
- */
-
-return [
-       'config' => [
-               // info (String)
-               // Plaintext description of this node, used in the /friendica module.
-               'info' => '',
-
-               // register_policy (Constant)
-               // Your choices are OPEN, APPROVE, or CLOSED.
-               // Be certain to create your own personal account before setting CLOSED.
-               // APPROVE requires you set system.admin_email to the email address of an
-               // already registered person who can authorize and/or approve/deny the request.
-               'register_policy' => \Friendica\Module\Register::CLOSED,
-
-               // register_text (String)
-               // Will be displayed prominently on the registration page.
-               'register_text' => '',
-
-               // sitename (String)
-               // Displayed server name.
-               'sitename' => 'Friendica Social Network',
-       ],
-       'system' => [
-               // account_abandon_days (Integer)
-               // Will not waste system resources polling external sites for abandonded accounts.
-               // Enter 0 for no time limit.
-               'account_abandon_days' => 0,
-
-               // addon (Comma-separated list)
-               // Manual list of addons which are enabled on this system.
-               'addon' => '',
-
-               // allowed_themes (Comma-separated list)
-               // Themes users can change to in their settings.
-               'allowed_themes' => 'quattro,vier,duepuntozero,smoothly',
-
-               // debugging (boolean)
-               // Enable/Disable Debugging (logging)
-               'debugging' => false,
-
-               // default_timezone (String)
-               // Choose a default timezone. See https://secure.php.net/manual/en/timezones.php
-               // It only applies to timestamps for anonymous viewers.
-               'default_timezone' => 'UTC',
-
-               // directory (String)
-               // URL of the global directory.
-               'directory' => 'https://dir.friendica.social',
-
-               // forbidden_nicknames (Comma-separated list)
-               // Prevents users from registering the specified nicknames on this node.
-               // Default value comprises classic role names from RFC 2142.
-               'forbidden_nicknames' => 'info, marketing, sales, support, abuse, noc, security, postmaster, hostmaster, usenet, news, webmaster, www, uucp, ftp, root, sysop',
-
-               // jpeg_quality (Integer)
-               // Sets the ImageMagick quality level for JPEG images. Values ranges from 50 (awful) to 100 (near perfect).
-               'jpeg_quality' => 100,
-
-               // language (String)
-               // System default languague, inluding admin-created user default language.
-               // Two-letters ISO 639-1 code.
-               'language' => 'en',
-
-               // logfile (String)
-               // The logfile for storing logs.
-               // Can be a full path or a relative path to the Friendica home directory
-               'logfile' => 'log/friendica.log',
-
-               // loglevel (String)
-               // The loglevel for all logs.
-               // Has to be one of these values: emergency, alert, critical, error, warning, notice, info, debug
-               'loglevel' => 'notice',
-
-               // max_image_length (Integer)
-               // An alternate way of limiting picture upload sizes.
-               // Specify the maximum pixel  length that pictures are allowed to be (for non-square pictures, it will apply to the longest side).
-               // Pictures longer than this length will be resized to be this length (on the longest side, the other side will be scaled appropriately).
-               // If you don't want to set a maximum length, set to -1.
-               'max_image_length' => -1,
-
-               // maximagesize (Integer)
-               // Maximum size in bytes of an uploaded photo.
-               'maximagesize' => 800000,
-
-               // no_regfullname (Boolean)
-               // Allow pseudonyms (true) or enforce a space between first name and last name in Full name, as an anti spam measure (false).
-               'no_regfullname' => true,
-
-               // optimize_max_tablesize (Integer)
-               // Maximum table size (in MB) for the automatic optimization.
-               // -1 to disable automatic optimization.
-               //  0 to use internal default (100MB)
-               'optimize_max_tablesize' => -1,
-
-               // maxloadavg (Integer)
-               // Maximum system load before delivery and poll processes are deferred.
-               'maxloadavg' => 20,
-
-               // rino_encrypt (Integer)
-               // Server-to-server private message encryption (RINO).
-               // Encryption will only be provided if this setting is set to a non zero value on both servers.
-               // Set to 0 to disable, 2 to enable, 1 is deprecated but won't need mcrypt.
-               'rino_encrypt' => 2,
-
-               // temppath (String)
-               // Custom temporary file directory
-               'temppath' => '',
-
-               // theme (String)
-               // System theme name.
-               'theme' => 'vier',
-
-               // url (String)
-               // The fully-qualified URL of this Friendica node.
-               // Used by the worker in a non-HTTP execution environment.
-               'url' => '',
-       ],
-
-       // Used in the admin settings to lock certain features
-       'featurelock' => [
-       ],
-];
index dde37cd3762bc8a49e2b61d6d7a88d9881fb3732..deaec5a24b2423af3b100a7f2f22acab2a7b8a1a 100644 (file)
@@ -1,9 +1,20 @@
 -- ------------------------------------------
--- Friendica 2019.06-dev (Dalmatian Bellflower)
--- DB_UPDATE_VERSION 1311
+-- Friendica 2019.09-dev (Dalmatian Bellflower)
+-- DB_UPDATE_VERSION 1319
 -- ------------------------------------------
 
 
+--
+-- TABLE 2fa_recovery_codes
+--
+CREATE TABLE IF NOT EXISTS `2fa_recovery_codes` (
+       `uid` mediumint unsigned NOT NULL COMMENT 'User ID',
+       `code` varchar(50) NOT NULL COMMENT 'Recovery code string',
+       `generated` datetime NOT NULL COMMENT 'Datetime the code was generated',
+       `used` datetime COMMENT 'Datetime the code was used',
+        PRIMARY KEY(`uid`,`code`)
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Two-factor authentication recovery codes';
+
 --
 -- TABLE addon
 --
@@ -187,7 +198,8 @@ CREATE TABLE IF NOT EXISTS `contact` (
        `term-date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '',
        `last-item` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'date of the last post',
        `priority` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '',
-       `blocked` boolean NOT NULL DEFAULT '1' COMMENT '',
+       `blocked` boolean NOT NULL DEFAULT '1' COMMENT 'Node-wide block status',
+       `block_reason` text COMMENT 'Node-wide block reason',
        `readonly` boolean NOT NULL DEFAULT '0' COMMENT 'posts of the contact are readonly',
        `writable` boolean NOT NULL DEFAULT '0' COMMENT '',
        `forum` boolean NOT NULL DEFAULT '0' COMMENT 'contact is a forum',
@@ -198,6 +210,9 @@ CREATE TABLE IF NOT EXISTS `contact` (
        `pending` boolean NOT NULL DEFAULT '1' COMMENT '',
        `deleted` boolean NOT NULL DEFAULT '0' COMMENT 'Contact has been deleted',
        `rating` tinyint NOT NULL DEFAULT 0 COMMENT '',
+       `unsearchable` boolean NOT NULL DEFAULT '0' COMMENT 'Contact prefers to not be searchable',
+       `sensitive` boolean NOT NULL DEFAULT '0' COMMENT 'Contact posts sensitive content',
+       `baseurl` varchar(255) DEFAULT '' COMMENT 'baseurl of the contact',
        `reason` text COMMENT '',
        `closeness` tinyint unsigned NOT NULL DEFAULT 99 COMMENT '',
        `info` mediumtext COMMENT '',
@@ -360,6 +375,8 @@ CREATE TABLE IF NOT EXISTS `gcontact` (
        `updated` datetime DEFAULT '0001-01-01 00:00:00' COMMENT '',
        `last_contact` datetime DEFAULT '0001-01-01 00:00:00' COMMENT '',
        `last_failure` datetime DEFAULT '0001-01-01 00:00:00' COMMENT '',
+       `archive_date` datetime DEFAULT '0001-01-01 00:00:00' COMMENT '',
+       `archived` boolean NOT NULL DEFAULT '0' COMMENT '',
        `location` varchar(255) NOT NULL DEFAULT '' COMMENT '',
        `about` text COMMENT '',
        `keywords` text COMMENT 'puplic keywords (interests)',
@@ -588,15 +605,15 @@ CREATE TABLE IF NOT EXISTS `item` (
         INDEX `extid` (`extid`(191)),
         INDEX `uid_id` (`uid`,`id`),
         INDEX `uid_contactid_id` (`uid`,`contact-id`,`id`),
-        INDEX `uid_created` (`uid`,`created`),
+        INDEX `uid_received` (`uid`,`received`),
         INDEX `uid_commented` (`uid`,`commented`),
         INDEX `uid_unseen_contactid` (`uid`,`unseen`,`contact-id`),
         INDEX `uid_network_received` (`uid`,`network`,`received`),
         INDEX `uid_network_commented` (`uid`,`network`,`commented`),
         INDEX `uid_thrparent` (`uid`,`thr-parent`(190)),
         INDEX `uid_parenturi` (`uid`,`parent-uri`(190)),
-        INDEX `uid_contactid_created` (`uid`,`contact-id`,`created`),
-        INDEX `authorid_created` (`author-id`,`created`),
+        INDEX `uid_contactid_received` (`uid`,`contact-id`,`received`),
+        INDEX `authorid_received` (`author-id`,`received`),
         INDEX `ownerid` (`owner-id`),
         INDEX `contact-id` (`contact-id`),
         INDEX `uid_uri` (`uid`,`uri`(190)),
@@ -650,6 +667,7 @@ CREATE TABLE IF NOT EXISTS `item-content` (
         PRIMARY KEY(`id`),
         UNIQUE INDEX `uri-plink-hash` (`uri-plink-hash`),
         INDEX `uri` (`uri`(191)),
+        INDEX `plink` (`plink`(191)),
         INDEX `uri-id` (`uri-id`)
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Content for all posts';
 
@@ -662,6 +680,11 @@ CREATE TABLE IF NOT EXISTS `item-delivery-data` (
        `inform` mediumtext COMMENT 'Additional receivers of the linked item',
        `queue_count` mediumint NOT NULL DEFAULT 0 COMMENT 'Initial number of delivery recipients, used as item.delivery_queue_count',
        `queue_done` mediumint NOT NULL DEFAULT 0 COMMENT 'Number of successful deliveries, used as item.delivery_queue_done',
+       `activitypub` mediumint NOT NULL DEFAULT 0 COMMENT 'Number of successful deliveries via ActivityPub',
+       `dfrn` mediumint NOT NULL DEFAULT 0 COMMENT 'Number of successful deliveries via DFRN',
+       `legacy_dfrn` mediumint NOT NULL DEFAULT 0 COMMENT 'Number of successful deliveries via legacy DFRN',
+       `diaspora` mediumint NOT NULL DEFAULT 0 COMMENT 'Number of successful deliveries via Diaspora',
+       `ostatus` mediumint NOT NULL DEFAULT 0 COMMENT 'Number of successful deliveries via OStatus',
         PRIMARY KEY(`iid`)
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Delivery data for items';
 
@@ -1135,15 +1158,15 @@ CREATE TABLE IF NOT EXISTS `thread` (
        `bookmark` boolean COMMENT '',
         PRIMARY KEY(`iid`),
         INDEX `uid_network_commented` (`uid`,`network`,`commented`),
-        INDEX `uid_network_created` (`uid`,`network`,`created`),
+        INDEX `uid_network_received` (`uid`,`network`,`received`),
         INDEX `uid_contactid_commented` (`uid`,`contact-id`,`commented`),
-        INDEX `uid_contactid_created` (`uid`,`contact-id`,`created`),
+        INDEX `uid_contactid_received` (`uid`,`contact-id`,`received`),
         INDEX `contactid` (`contact-id`),
         INDEX `ownerid` (`owner-id`),
         INDEX `authorid` (`author-id`),
-        INDEX `uid_created` (`uid`,`created`),
+        INDEX `uid_received` (`uid`,`received`),
         INDEX `uid_commented` (`uid`,`commented`),
-        INDEX `uid_wall_created` (`uid`,`wall`,`created`),
+        INDEX `uid_wall_received` (`uid`,`wall`,`received`),
         INDEX `private_wall_origin_commented` (`private`,`wall`,`origin`,`commented`)
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Thread related data';
 
index 7eae371c285a9dca8c90d639e315c60569d71081..f2224f5de7f2d573791e32dc642c441b8376ce09 100644 (file)
@@ -33,15 +33,24 @@ return [
 
 ### Configuration location
 
-The `config` directory holds key configuration files:
+The `config` directory holds key configuration files and can have different config files.
+All of them have to end with `.config.php` and must not include `-sample` in their name.
 
-- `defaults.config.php` holds the default values for all the configuration keys that can only be set in `local.config.php`.
-- `settings.config.php` holds the default values for some configuration keys that are set through the admin settings page.
+Some examples of common known configuration files:
 - `local.config.php` holds the current node custom configuration.
 - `addon.config.php` is optional and holds the custom configuration for specific addons.
 
 Addons can define their own default configuration values in `addon/[addon]/config/[addon].config.php` which is loaded when the addon is activated.
 
+### Static Configuration location
+
+The `static` directory holds the codebase default configurations files.
+They must not be changed by users, because they can get changed from release to release.
+
+Currently, the following configurations are included:
+- `defaults.config.php` holds the default values for all the configuration keys that can only be set in `local.config.php`.
+- `settings.config.php` holds the default values for some configuration keys that are set through the admin settings page.
+
 #### Migrating from .htconfig.php to config/local.config.php
 
 The legacy `.htconfig.php` configuration file is still supported, but is deprecated and will be removed in a subsequent Friendica release.
@@ -292,7 +301,7 @@ Or it is for testing purposes only.
 **Attention:** Please be warned that you shouldn't use one of these values without the knowledge what it could trigger.
 Especially don't do that with undocumented values.
 
-These configurations keys and their default value are listed in `config/defaults.config.php` and should be overwritten in `config/local.config.php`.
+These configurations keys and their default value are listed in `static/defaults.config.php` and should be overwritten in `config/local.config.php`.
 
 ## Administrator Options
 
index c65093ebe98a58f4c26149fc7fb12a7e2b1095ea..0634a5eb99c2927fdb6e785a119883416d264bbf 100644 (file)
@@ -1,28 +1,34 @@
-Friendica Installation
-===============
+Friendica Installation
+
 
 We've tried very hard to ensure that Friendica will run on commodity hosting platforms - such as those used to host Wordpress blogs and Drupal websites.
 We offer a manual and an automatic installation.
 But be aware that Friendica is more than a simple web application.
+
 It is a complex communications system which more closely resembles an email server than a web server.
 For reliability and performance, messages are delivered in the background and are queued for later delivery when sites are down.
 This kind of functionality requires a bit more of the host system than the typical blog.
+
 Not every PHP/MySQL hosting provider will be able to support Friendica.
 Many will.
-But **please** review the requirements and confirm these with your hosting provider prior to installation.
 
-Also if you encounter installation issues, please let us know via the [helper](http://forum.friendi.ca/profile/helpers) or the [developer](https://forum.friendi.ca/profile/developers) forum or [file an issue](https://github.com/friendica/friendica/issues).
+But **please** review the [requirements](#1_2_1) and confirm these with your hosting provider prior to installation.
+
+## Support
+If you encounter installation issues, please let us know via the [helper](http://forum.friendi.ca/profile/helpers) or the [developer](https://forum.friendi.ca/profile/developers) forum or [file an issue](https://github.com/friendica/friendica/issues).
+
 Please be as clear as you can about your operating environment and provide as much detail as possible about any error messages you may see, so that we can prevent it from happening in the future.
 Due to the large variety of operating systems and PHP platforms in existence we may have only limited ability to debug your PHP installation or acquire any missing modules - but we will do our best to solve any general code issues.
+
 If you do not have a Friendica account yet, you can register a temporary one at [tryfriendica.de](https://tryfriendica.de) and join the forums mentioned above from there.
 The account will expire after 7 days, but you can ask the server admin to keep your account longer, should the problem not be resolved after that.
 
-Before you begin: Choose a domain name or subdomain name for your server.
-Put some thought into this.
-While changing it after installation is supported, things still might break.
+## Prerequisites
 
-Requirements
----
+* Choose a domain name or subdomain name for your server. Put some thought into this. While changing it after installation is supported, things still might break.
+* Setup HTTPS on your domain. 
+
+### Requirements
 
 * Apache with mod-rewrite enabled and "Options All" so you can use a local .htaccess file
 * PHP 7+ (PHP 7.1+ is recommended for performance and official support)
@@ -30,18 +36,20 @@ Requirements
   * Curl, GD, PDO, MySQLi, hash, xml, zip and OpenSSL extensions
   * The POSIX module of PHP needs to be activated (e.g. [RHEL, CentOS](http://www.bigsoft.co.uk/blog/index.php/2014/12/08/posix-php-commands-not-working-under-centos-7) have disabled it)
   * some form of email server or email gateway such that PHP mail() works
-* Mysql 5.6+ or an equivalent alternative for MySQL (MariaDB, Percona Server etc.)
-* the ability to schedule jobs with cron (Linux/Mac) or Scheduled Tasks (Windows) (Note: other options are presented in Section 7 of this document.)
-* Installation into a top-level domain or sub-domain (without a directory/path component in the URL) is preferred. Directory paths will not be as convenient to use and have not been thoroughly tested.
-* If your hosting provider doesn't allow Unix shell access, you might have trouble getting everything to work.
+* MySQL 5.6+ or an equivalent alternative for MySQL (MariaDB, Percona Server etc.)
+* ability to schedule jobs with cron (Linux/Mac) or Scheduled Tasks (Windows)
+* installation into a top-level domain or sub-domain (without a directory/path component in the URL) is RECOMMENDED. Directory paths will not be as convenient to use and have not been thoroughly tested. This is REQUIRED if you wish to communicate with the Diaspora network.
+
+**If your hosting provider doesn't allow Unix shell access, you might have trouble getting everything to work.**
 
-Optional
----
+For alternative server configurations (such as Nginx server and MariaDB database engine), refer to the [Friendica wiki](https://github.com/friendica/friendica/wiki).
+
+### Optional 
 
 * PHP ImageMagick extension (php-imagick) for animated GIF support.
+* [Composer](https://getcomposer.org/) for a git install
 
-Installation procedure
----
+## Installation procedure
 
 ### Alternative Installation Methods
 
@@ -49,20 +57,27 @@ This guide will walk you through the manual installation process of Friendica.
 If this is nothing for you, you might be interested in
 
 * the [Friendica Docker image](https://github.com/friendica/docker) or
-* how [install Friendica with YunoHost](https://github.com/YunoHost-Apps/friendica_ynh).
+* how to [install Friendica with YunoHost](https://github.com/YunoHost-Apps/friendica_ynh).
 
 ### Get Friendica
 
 Unpack the Friendica files into the root of your web server document area.
-If you are able to do so, we recommend using git to clone the source repository rather than to use a packaged tar or zip file.
+
+If you copy the directory tree to your webserver, make sure that you also copy 
+`.htaccess-dist` - as "dot" files are often hidden and aren't normally copied.
+
+**OR**
+
+Clone the [friendica/friendica GitHub repository](https://github.com/friendica/friendica) and import dependencies.
 This makes the software much easier to update.
+
 The Linux commands to clone the repository into a directory "mywebsite" would be
 
     git clone https://github.com/friendica/friendica.git -b master mywebsite
     cd mywebsite
     bin/composer.phar install --no-dev
 
-Make sure the folder *view/smarty3* exists and is writable by the webserver user, in this case `www-data`
+Make sure the folder *view/smarty3* exists and is writable by the webserver user, in this case *www-data*
 
     mkdir view/smarty3
     chown www-data:www-data view/smarty3
@@ -76,8 +91,6 @@ Clone the addon repository (separately):
 
     git clone https://github.com/friendica/friendica-addons.git -b master addon
 
-If you copy the directory tree to your webserver, make sure that you also copy .htaccess - as "dot" files are often hidden and aren't normally copied.
-
 If you want to use the development version of Friendica you can switch to the develop branch in the repository by running
 
     git checkout develop
@@ -85,7 +98,8 @@ If you want to use the development version of Friendica you can switch to the de
     cd addon
     git checkout develop
 
-please be aware that the develop branch may break your Friendica node at any time.
+**Be aware that the develop branch is unstable and may break your Friendica node at any time.**
+You should have a recent backup before updating.
 If you encounter a bug, please let us know.
 
 ### Create a database
@@ -94,15 +108,9 @@ Create an empty database and note the access details (hostname, username, passwo
 
 Friendica needs the permission to create and delete fields and tables in its own database.
 
-With newer releases of MySQL (5.7.17 or newer), you might need to set the sql_mode to '' (blank).
-Use this setting when the installer is unable to create all the needed tables due to a timestamp format problem.
-In this case find the [mysqld] section in your my.cnf file and add the line :
-
-    sql_mode = ''
-
-Restart mysql and you should be fine.
+Please check the [troubleshooting](#1_6) section if running on MySQL 5.7.17 or newer.
 
-### Option A: Run the manual installer
+### Option A: Run the installer
 
 Point your web browser to the new site and follow the instructions.
 Please note any error messages and correct these before continuing.
@@ -111,9 +119,9 @@ If you need to specify a port for the connection to the database, you can do so
 
 *If* the manual installation fails for any reason, check the following:
 
-* Does "config/local.config.php" exist? If not, edit config/local-sample.config.php and change the system settings.
+* Does `config/local.config.php` exist? If not, edit `config/local-sample.config.php` and change the system settings.
 * Rename to `config/local.config.php`.
-* Is the database is populated? If not, import the contents of `database.sql` with phpmyadmin or the mysql command line.
+* Is the database populated? If not, import the contents of `database.sql` with phpmyadmin or the mysql command line.
 
 At this point visit your website again, and register your personal account.
 Registration errors should all be recoverable automatically.
@@ -206,18 +214,18 @@ Navigate to the main Friendica directory and execute the following command:
 
 ### Prepare .htaccess file
 
-Copy .htaccess-dist to .htaccess (be careful under Windows) to have working mod-rewrite again. If you have installed Friendica into a sub directory, like /friendica/ set this path in RewriteBase accordingly.
+Copy `.htaccess-dist` to `.htaccess` (be careful under Windows) to have working mod-rewrite again. If you have installed Friendica into a sub directory, like */friendica/* set this path in `RewriteBase` accordingly.
 
 Example:
 
     cp .htacces-dist .htaccess
 
-*Note*: Do **not** rename the .htaccess-dist file as it is tracked by GIT and renaming will cause a dirty working directory.
+*Note*: Do **not** rename the `.htaccess-dist` file as it is tracked by GIT and renaming will cause a dirty working directory.
 
 ### Verify the "host-meta" page is working
 
-Friendica should respond automatically to important addresses under the /.well-known/ rewrite path.
-One critical URL would look like, for example, https://example.com/.well-known/host-meta
+Friendica should respond automatically to important addresses under the */.well-known/* rewrite path.
+One critical URL would look like, for example: https://example.com/.well-known/host-meta   
 It must be visible to the public and must respond with an XML file that is automatically customized to your site.
 
 If that URL is not working, it is possible that some other software is using the /.well-known/ path.
@@ -225,13 +233,23 @@ Other symptoms may include an error message in the Admin settings that says "hos
 This is a severe configuration issue that prevents server to server communication."
 Another common error related to host-meta is the "Invalid profile URL."
 
-Check for a .well-known directory that did not come with Friendica.
+Check for a `.well-known` directory that did not come with Friendica.
 The preferred configuration is to remove the directory, however this is not always possible.
 If there is any /.well-known/.htaccess file, it could interfere with this Friendica core requirement.
 You should remove any RewriteRules from that file, or remove that whole file if appropriate.
 It may be necessary to chmod the /.well-known/.htaccess file if you were not given write permissions by default.
 
-### Set up the worker
+## Register the admin account
+
+At this point visit your website again, and register your personal account with the same email as in the `config.admin_email` config value.
+Registration errors should all be recoverable automatically.
+
+If you get any *critical* failure at this point, it generally indicates the database was not installed correctly. 
+You might wish to delete/rename `config/local.config.php` to another name and drop all the database tables so that you can start fresh.
+
+## Post Install Configuration
+
+### (REQUIRED) Background tasks
 
 Set up a cron job or scheduled task to run the worker once every 5-10 minutes in order to perform background processing.
 Example:
@@ -240,6 +258,8 @@ Example:
 
 Change "/base/directory", and "/path/to/php" as appropriate for your situation.
 
+#### cron job for worker
+
 If you are using a Linux server, run "crontab -e" and add a line like the
 one shown, substituting for your unique paths and settings:
 
@@ -253,10 +273,24 @@ If it is not possible to set up a cron job then please activate the "frontend wo
 
 Once you have installed Friendica and created an admin account as part of the process, you can access the admin panel of your installation and do most of the server wide configuration from there.
 
+#### worker alternative: daemon
+Otherwise, you’ll need to use the command line on your remote server and start the Friendica daemon (background task) using the following command:
+
+    cd /path/to/friendica; php bin/daemon.php start
+
+Once started, you can check the daemon status using the following command:
+
+    cd /path/to/friendica; php bin/daemon.php status
+
+After a server restart or any other failure, the daemon needs to be restarted. 
+This could be achieved by a cronjob.
+
+### (RECOMMENDED) Logging & Log Rotation
+
 At this point it is recommended that you set up logging and logrotation.
 To do so please visit [Settings](help/Settings) and search the 'Logs' section for more information.
 
-### Set up a backup plan
+### (RECOMMENDED) Set up a backup plan
 
 Bad things will happen.
 Let there be a hardware failure, a corrupted database or whatever you can think of.
@@ -264,3 +298,155 @@ So once the installation of your Friendica node is done, you should make yoursel
 
 The most important file is the `config/local.config.php` file.
 As it stores all your data, you should also have a recent dump of your Friendica database at hand, should you have to recover your node.
+
+### (OPTIONAL) Reverse-proxying and HTTPS
+
+Friendica looks for some well-known HTTP headers indicating a reverse-proxy
+terminating an HTTPS connection.
+While the standard from RFC 7239 specifies the use of the `Forwarded` header.
+
+    Forwarded: for=192.0.2.1; proto=https; by=192.0.2.2
+
+Friendica also supports a number on non-standard headers in common use.
+
+    X-Forwarded-Proto: https
+
+    Front-End-Https: on
+
+    X-Forwarded-Ssl: on
+
+It is however preferable to use the standard approach if configuring a new server.
+
+## Troubleshooting
+
+### "System is currently unavailable. Please try again later"
+
+Check your database settings.
+It usually means your database could not be opened or accessed.
+If the database resides on the same machine, check that the database server name is "localhost".
+
+### 500 Internal Error
+
+This could be the result of one of our Apache directives not being supported by your version of Apache. Examine your apache server logs.
+You might remove the line "Options -Indexes" from the .htaccess file if you are using a Windows server as this has been known to cause problems.
+Also check your file permissions. Your website and all contents must generally be world-readable.
+
+It is likely that your web server reported the source of the problem in its error log files.
+Please review these system error logs to determine what caused the problem.
+Often this will need to be resolved with your hosting provider or (if self-hosted) your web server configuration.
+
+### 400 and 4xx "File not found" errors
+
+First check your file permissions.
+Your website and all contents must generally be world-readable.
+
+Ensure that mod-rewite is installed and working, and that your `.htaccess` file
+is being used. To verify the latter, create a file `test.out` containing the
+word "test" in the top directory of Friendica, make it world readable and point
+your web browser to
+
+       http://yoursitenamehere.com/test.out
+
+This file should be blocked. You should get a permission denied message.
+
+If you see the word "test" your Apache configuration is not allowing your
+`.htaccess` file to be used (there are rules in this file to block access to any
+file with .out at the end, as these are typically used for system logs).
+
+Make certain the `.htaccess` file exists and is readable by everybody, then look
+for the existence of "AllowOverride None" in the Apache server configuration for your site.
+This will need to be changed to "AllowOverride All".
+
+If you do not see the word "test", your `.htaccess` is working, but it is likely
+that mod-rewrite is not installed in your web server or is not working.
+
+On most Linux flavors:
+
+       % a2enmod rewrite
+       % /etc/init.d/apache2 restart
+
+Consult your hosting provider, experts on your particular Linux distribution or
+(if Windows) the provider of your Apache server software if you need to change
+either of these and can not figure out how. There is a lot of help available on
+the web. Search "mod-rewrite" along with the name of your operating system
+distribution or Apache package (if using Windows).
+
+### Unable to write the file config/local.config.php due to permissions issues
+
+Create an empty `config/local.config.php`file and apply world-write permission.
+
+On Linux:
+
+       % touch config/local.config.php
+       % chmod 664 config/local.config.php
+
+Retry the installation. As soon as the database has been created,
+
+******* this is important *********
+
+       % chmod 644 config/local.config.php
+
+### Suhosin issues
+
+Some configurations with "suhosin" security are configured without an ability to
+run external processes. Friendica requires this ability. Following are some notes
+provided by one of our members.
+
+> On my server I use the php protection system Suhosin [http://www.hardened-php.net/suhosin/].
+> One of the things it does is to block certain functions like proc_open, as
+> configured in `/etc/php5/conf.d/suhosin.ini`:
+> 
+>     suhosin.executor.func.blacklist = proc_open, ...
+>
+> For those sites like Friendica that really need these functions they can be
+> enabled, e.g. in `/etc/apache2/sites-available/friendica`:
+>
+>      <Directory /var/www/friendica/>
+>        php_admin_value suhosin.executor.func.blacklist none
+>        php_admin_value suhosin.executor.eval.blacklist none
+>      </Directory>
+> 
+> This enables every function for Friendica if accessed via browser, but not for
+> the cronjob that is called via php command line. I attempted to enable it for
+> cron by using something like:
+> 
+>      */10 * * * * cd /var/www/friendica/friendica/ && sudo -u www-data /usr/bin/php \
+>       -d suhosin.executor.func.blacklist=none \
+>       -d suhosin.executor.eval.blacklist=none -f bin/worker.php
+> 
+> This worked well for simple test cases, but the friendica-cron still failed
+> with a fatal error:
+> 
+>      suhosin[22962]: ALERT - function within blacklist called: proc_open()
+>     (attacker 'REMOTE_ADDR not set', file '/var/www/friendica/friendica/boot.php',
+>     line 1341)
+> 
+> After a while I noticed, that `bin/worker.php` calls further PHP script via `proc_open`.
+> These scripts themselves also use `proc_open` and fail, because they are NOT
+> called with `-d suhosin.executor.func.blacklist=none`.
+> 
+>  So the simple solution is to put the correct parameters into `config/local.config.php`:
+> 
+>      'config' => [
+>              //Location of PHP command line processor
+>              'php_path' => '/usr/bin/php -d suhosin.executor.func.blacklist=none \
+>               -d suhosin.executor.eval.blacklist=none',
+>      ],
+> 
+> This is obvious as soon as you notice that the friendica-cron uses `proc_open`
+> to execute PHP scripts that also use `proc_open`, but it took me quite some time to find that out.
+> I hope this saves some time for other people using suhosin with function blacklists.
+
+### Unable to create all mysql tables on MySQL 5.7.17 or newer
+
+If the setup fails to create all the database tables and/or manual creation from
+the command line fails, with this error:
+
+       ERROR 1067 (42000) at line XX: Invalid default value for 'created'
+
+You need to adjust your my.cnf and add the following setting under the [mysqld]
+section:
+
+       sql_mode = '';
+
+After that, restart mysql and try again.
index 90ff1e59184e540c94facd2b673d25ff76b074e7..d3f5ecc895afb528e6de3ecb60341e91b4765091 100644 (file)
@@ -73,7 +73,7 @@ With Apache, enable the modules rewrite and ssl (with a shared hosting provider,
 
         sudo a2enmod rewrite ssl
 
-Add the following lines to the .htaccess file in the root folder of your Friendica instance (thanks to [url=https://github.com/AlfredSK]AlfredSK[/url]):
+Add the following lines to the .htaccess file in the root folder of your Friendica instance (thanks to [AlfredSK](https://github.com/AlfredSK)):
 
         RewriteEngine On
         RewriteCond %{SERVER_PORT} 80
index 32aa7308a357ae826138637ed08e0fce0212fb74..eca6f598c9f847f782894989125e4e693081cedf 100644 (file)
@@ -58,3 +58,17 @@ In this case you will have to configure your authenticator app again using the p
 When two-factor authentication is enabled, you can show your recovery codes, including the ones you've already used.
 
 You can freely regenerate a new set of fresh recovery codes, just be sure to replace the previous ones where you saved them as they won't be active anymore.
+
+## Third-party applications and API
+
+Third-party applications using the Friendica API can't accept two-factor time-based authentication codes.
+Instead, if you enabled two-factor authentication, you have to generate app-specific randomly generated long passwords to use in your apps instead of your regular account password.
+
+**Note**: Your regular password won't work at all when prompted in third-party apps if you enabled two-factor authentication.
+
+You can generate as many app-specific passwords as you want, they will be shown once to you just after you generated it.
+Just copy and paste it in your third-party app in the Friendica account password input field at this point.
+We recommend generating a single app-specific password for each separate third-party app you are using, using a meaningul description of the target app (like "Frienqa on my Fairphone 2").
+
+You can also revoke any and all app-specific password you generated this way.
+This may log you out of the third-party application(s) you used the revoked app-specific password to log in with.
\ No newline at end of file
index 7b7ccf7bbd82a7d4375e134c13169951205cdc62..1fca48ac1b5f95bd962571f8ac21323069a6ac3f 100644 (file)
@@ -6,6 +6,7 @@ Updating Friendica
 ## Using a Friendica archive
 
 If you installed Friendica in the ``path/to/friendica`` folder:
+
 1. Unpack the new Friendica archive in ``path/to/friendica_new``.
 2. Copy ``config/local.config.php``, ``photo/`` and ``proxy/`` from ``path/to/friendica`` to ``path/to/friendica_new``.
 3. Rename the ``path/to/friendica`` folder to ``path/to/friendica_old``.
index ccd2e7a7ee9490dbf60d852485256da157344bc8..d522767fd80b294fd93da04345a9dafb5a8a0b4c 100644 (file)
@@ -393,6 +393,27 @@ Object of:
 
 ---
 
+### media/metadata/create (POST,PUT; AUTH)
+
+#### Parameters
+
+Parameters are sent as JSON object:
+
+```
+{
+       "media_id":"1234",
+       "alt_text": {
+               "text":"Here comes the description"
+       }
+}
+```
+
+#### Return values
+
+None
+
+---
+
 ### oauth/request_token (*)
 
 #### Parameters
index 0fab1f47c164e02a64e944494827ae2c6d8467c5..4be0ff24afb9707959cfe1371d19ce6af4ca7640 100644 (file)
@@ -27,6 +27,7 @@ use Friendica\Model\Group;
 use Friendica\Model\Item;
 use Friendica\Model\Mail;
 use Friendica\Model\Photo;
+use Friendica\Model\Profile;
 use Friendica\Model\User;
 use Friendica\Network\FKOAuth1;
 use Friendica\Network\HTTPException;
@@ -236,7 +237,7 @@ function api_login(App $a)
        if ($addon_auth['authenticated'] && count($addon_auth['user_record'])) {
                $record = $addon_auth['user_record'];
        } else {
-               $user_id = User::authenticate(trim($user), trim($password));
+               $user_id = User::authenticate(trim($user), trim($password), true);
                if ($user_id !== false) {
                        $record = DBA::selectFirst('user', [], ['uid' => $user_id]);
                }
@@ -342,11 +343,13 @@ function api_call(App $a)
                                                break;
                                        case "json":
                                                header("Content-Type: application/json");
-                                               $json = json_encode(end($return));
-                                               if (!empty($_GET['callback'])) {
-                                                       $json = $_GET['callback'] . "(" . $json . ")";
+                                               if (!empty($return)) {
+                                                       $json = json_encode(end($return));
+                                                       if (!empty($_GET['callback'])) {
+                                                               $json = $_GET['callback'] . "(" . $json . ")";
+                                                       }
+                                                       $return = $json;
                                                }
-                                               $return = $json;
                                                break;
                                        case "rss":
                                                header("Content-Type: application/rss+xml");
@@ -611,7 +614,7 @@ function api_get_user(App $a, $contact_id = null)
                                'name' => $contact["name"],
                                'screen_name' => (($contact['nick']) ? $contact['nick'] : $contact['name']),
                                'location' => ($contact["location"] != "") ? $contact["location"] : ContactSelector::networkToName($contact['network'], $contact['url']),
-                               'description' => HTML::toPlaintext(BBCode::toPlaintext($contact["about"])),
+                               'description' => BBCode::toPlaintext($contact["about"]),
                                'profile_image_url' => $contact["micro"],
                                'profile_image_url_https' => $contact["micro"],
                                'profile_image_url_profile_size' => $contact["thumb"],
@@ -690,7 +693,7 @@ function api_get_user(App $a, $contact_id = null)
                'name' => (($uinfo[0]['name']) ? $uinfo[0]['name'] : $uinfo[0]['nick']),
                'screen_name' => (($uinfo[0]['nick']) ? $uinfo[0]['nick'] : $uinfo[0]['name']),
                'location' => $location,
-               'description' => HTML::toPlaintext(BBCode::toPlaintext($description)),
+               'description' => BBCode::toPlaintext($description),
                'profile_image_url' => $uinfo[0]['micro'],
                'profile_image_url_https' => $uinfo[0]['micro'],
                'profile_image_url_profile_size' => $uinfo[0]["thumb"],
@@ -1107,7 +1110,7 @@ function api_statuses_update($type)
                if ($throttle_day > 0) {
                        $datefrom = date(DateTimeFormat::MYSQL, time() - 24*60*60);
 
-                       $condition = ["`uid` = ? AND `wall` AND `created` > ?", api_user(), $datefrom];
+                       $condition = ["`uid` = ? AND `wall` AND `received` > ?", api_user(), $datefrom];
                        $posts_day = DBA::count('thread', $condition);
 
                        if ($posts_day > $throttle_day) {
@@ -1121,7 +1124,7 @@ function api_statuses_update($type)
                if ($throttle_week > 0) {
                        $datefrom = date(DateTimeFormat::MYSQL, time() - 24*60*60*7);
 
-                       $condition = ["`uid` = ? AND `wall` AND `created` > ?", api_user(), $datefrom];
+                       $condition = ["`uid` = ? AND `wall` AND `received` > ?", api_user(), $datefrom];
                        $posts_week = DBA::count('thread', $condition);
 
                        if ($posts_week > $throttle_week) {
@@ -1135,7 +1138,7 @@ function api_statuses_update($type)
                if ($throttle_month > 0) {
                        $datefrom = date(DateTimeFormat::MYSQL, time() - 24*60*60*30);
 
-                       $condition = ["`uid` = ? AND `wall` AND `created` > ?", api_user(), $datefrom];
+                       $condition = ["`uid` = ? AND `wall` AND `received` > ?", api_user(), $datefrom];
                        $posts_month = DBA::count('thread', $condition);
 
                        if ($posts_month > $throttle_month) {
@@ -1154,18 +1157,21 @@ function api_statuses_update($type)
                }
        }
 
-       // To-Do: Multiple IDs
        if (requestdata('media_ids')) {
-               $r = q(
-                       "SELECT `resource-id`, `scale`, `nickname`, `type` FROM `photo` INNER JOIN `user` ON `user`.`uid` = `photo`.`uid` WHERE `resource-id` IN (SELECT `resource-id` FROM `photo` WHERE `id` = %d) AND `scale` > 0 AND `photo`.`uid` = %d ORDER BY `photo`.`width` DESC LIMIT 1",
-                       intval(requestdata('media_ids')),
-                       api_user()
-               );
-               if (DBA::isResult($r)) {
-                       $phototypes = Image::supportedTypes();
-                       $ext = $phototypes[$r[0]['type']];
-                       $_REQUEST['body'] .= "\n\n" . '[url=' . System::baseUrl() . '/photos/' . $r[0]['nickname'] . '/image/' . $r[0]['resource-id'] . ']';
-                       $_REQUEST['body'] .= '[img]' . System::baseUrl() . '/photo/' . $r[0]['resource-id'] . '-' . $r[0]['scale'] . '.' . $ext . '[/img][/url]';
+               $ids = explode(',', requestdata('media_ids'));
+               foreach ($ids as $id) {
+                       $r = q(
+                               "SELECT `resource-id`, `scale`, `nickname`, `type`, `desc` FROM `photo` INNER JOIN `user` ON `user`.`uid` = `photo`.`uid` WHERE `resource-id` IN (SELECT `resource-id` FROM `photo` WHERE `id` = %d) AND `scale` > 0 AND `photo`.`uid` = %d ORDER BY `photo`.`width` DESC LIMIT 1",
+                               intval($id),
+                               api_user()
+                       );
+                       if (DBA::isResult($r)) {
+                               $phototypes = Image::supportedTypes();
+                               $ext = $phototypes[$r[0]['type']];
+                               $description = $r[0]['desc'] ?? '';
+                               $_REQUEST['body'] .= "\n\n" . '[url=' . System::baseUrl() . '/photos/' . $r[0]['nickname'] . '/image/' . $r[0]['resource-id'] . ']';
+                               $_REQUEST['body'] .= '[img=' . System::baseUrl() . '/photo/' . $r[0]['resource-id'] . '-' . $r[0]['scale'] . '.' . $ext . ']' . $description . '[/img][/url]';
+                       }
                }
        }
 
@@ -1238,6 +1244,65 @@ function api_media_upload()
 /// @TODO move to top of file or somewhere better
 api_register_func('api/media/upload', 'api_media_upload', true, API_METHOD_POST);
 
+/**
+ * Updates media meta data (picture descriptions)
+ *
+ * @param string $type Return type (atom, rss, xml, json)
+ *
+ * @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws TooManyRequestsException
+ * @throws UnauthorizedException
+ * @see https://developer.twitter.com/en/docs/tweets/post-and-engage/api-reference/post-statuses-update
+ *
+ * @todo Compare the corresponding Twitter function for correct return values
+ */
+function api_media_metadata_create($type)
+{
+       $a = \get_app();
+
+       if (api_user() === false) {
+               Logger::info('no user');
+               throw new ForbiddenException();
+       }
+
+       api_get_user($a);
+
+       $postdata = Network::postdata();
+
+       if (empty($postdata)) {
+               throw new BadRequestException("No post data");
+       }
+
+       $data = json_decode($postdata, true);
+       if (empty($data)) {
+               throw new BadRequestException("Invalid post data");
+       }
+
+       if (empty($data['media_id']) || empty($data['alt_text'])) {
+               throw new BadRequestException("Missing post data values");
+       }
+
+       if (empty($data['alt_text']['text'])) {
+               throw new BadRequestException("No alt text.");
+       }
+
+       Logger::info('Updating metadata', ['media_id' => $data['media_id']]);
+
+       $condition =  ['id' => $data['media_id'], 'uid' => api_user()];
+       $photo = DBA::selectFirst('photo', ['resource-id'], $condition);
+       if (!DBA::isResult($photo)) {
+               throw new BadRequestException("Metadata not found.");
+       }
+
+       DBA::update('photo', ['desc' => $data['alt_text']['text']], ['resource-id' => $photo['resource-id']]);
+}
+
+api_register_func('api/media/metadata/create', 'api_media_metadata_create', true, API_METHOD_POST);
+
 /**
  * @param string $type    Return format (atom, rss, xml, json)
  * @param int    $item_id
@@ -2444,8 +2509,8 @@ function api_convert_item($item)
                $statustext = trim($statustitle."\n\n".$statusbody);
        }
 
-       if ((defaults($item, 'network', Protocol::PHANTOM) == Protocol::FEED) && (strlen($statustext)> 1000)) {
-               $statustext = substr($statustext, 0, 1000) . "... \n" . defaults($item, 'plink', '');
+       if ((defaults($item, 'network', Protocol::PHANTOM) == Protocol::FEED) && (mb_strlen($statustext)> 1000)) {
+               $statustext = mb_substr($statustext, 0, 1000) . "... \n" . defaults($item, 'plink', '');
        }
 
        $statushtml = BBCode::convert(api_clean_attachments($body), false);
@@ -2630,19 +2695,29 @@ function api_get_entitities(&$text, $bbcode)
                }
        }
 
-       preg_match_all("/\[img](.*?)\[\/img\]/ism", $bbcode, $images);
+       preg_match_all("/\[img\=(.*?)\](.*?)\[\/img\]/ism", $bbcode, $images, PREG_SET_ORDER);
        $ordered_images = [];
+       foreach ($images as $image) {
+               $start = iconv_strpos($text, $image[1], 0, "UTF-8");
+               if (!($start === false)) {
+                       $ordered_images[$start] = ['url' => $image[1], 'alt' => $image[2]];
+               }
+       }
+
+       preg_match_all("/\[img](.*?)\[\/img\]/ism", $bbcode, $images);
        foreach ($images[1] as $image) {
-               //$start = strpos($text, $url, $offset);
                $start = iconv_strpos($text, $image, 0, "UTF-8");
                if (!($start === false)) {
-                       $ordered_images[$start] = $image;
+                       $ordered_images[$start] = ['url' => $image, 'alt' => ''];
                }
        }
        //$entities["media"] = array();
        $offset = 0;
 
-       foreach ($ordered_images as $url) {
+       foreach ($ordered_images as $image) {
+               $url = $image['url'];
+               $ext_alt_text = $image['alt'];
+
                $display_url = str_replace(["http://www.", "https://www."], ["", ""], $url);
                $display_url = str_replace(["http://", "https://"], ["", ""], $display_url);
 
@@ -2689,6 +2764,7 @@ function api_get_entitities(&$text, $bbcode)
                                                        "url" => $url,
                                                        "display_url" => $display_url,
                                                        "expanded_url" => $url,
+                                                       "ext_alt_text" => $ext_alt_text,
                                                        "type" => "photo",
                                                        "sizes" => $sizes];
                        }
@@ -4207,7 +4283,7 @@ function api_fr_photos_list($type)
        $r = q(
                "SELECT `resource-id`, MAX(scale) AS `scale`, `album`, `filename`, `type`, MAX(`created`) AS `created`,
                MAX(`edited`) AS `edited`, MAX(`desc`) AS `desc` FROM `photo`
-               WHERE `uid` = %d AND `album` != 'Contact Photos' GROUP BY `resource-id`",
+               WHERE `uid` = %d AND `album` != 'Contact Photos' GROUP BY `resource-id`, `album`, `filename`, `type`",
                intval(local_user())
        );
        $typetoext = [
@@ -4888,7 +4964,9 @@ function prepare_photo_data($type, $scale, $photo_id)
                "SELECT %s `resource-id`, `created`, `edited`, `title`, `desc`, `album`, `filename`,
                                        `type`, `height`, `width`, `datasize`, `profile`, `allow_cid`, `deny_cid`, `allow_gid`, `deny_gid`,
                                        MIN(`scale`) AS `minscale`, MAX(`scale`) AS `maxscale`
-                       FROM `photo` WHERE `uid` = %d AND `resource-id` = '%s' %s GROUP BY `resource-id`",
+                       FROM `photo` WHERE `uid` = %d AND `resource-id` = '%s' %s GROUP BY 
+                              `resource-id`, `created`, `edited`, `title`, `desc`, `album`, `filename`,
+                              `type`, `height`, `width`, `datasize`, `profile`, `allow_cid`, `deny_cid`, `allow_gid`, `deny_gid`",
                $data_sql,
                intval(local_user()),
                DBA::escape($photo_id),
@@ -5057,7 +5135,7 @@ function api_get_announce($item)
        $fields = ['author-id', 'author-name', 'author-link', 'author-avatar'];
        $activity = Item::activityToIndex(ACTIVITY2_ANNOUNCE);
        $condition = ['parent-uri' => $item['uri'], 'gravity' => GRAVITY_ACTIVITY, 'uid' => [0, $item['uid']], 'activity' => $activity];
-       $announce = Item::selectFirstForUser($item['uid'], $fields, $condition, ['order' => ['created' => true]]);
+       $announce = Item::selectFirstForUser($item['uid'], $fields, $condition, ['order' => ['received' => true]]);
        if (!DBA::isResult($announce)) {
                return [];
        }
@@ -5160,17 +5238,22 @@ function api_share_as_retweet(&$item)
                $posted = $matches[1];
        }
 
-       $pre_body = trim(preg_replace("/(.*?)\[share.*?\]\s?.*?\s?\[\/share\]\s?/ism", "$1", $body));
+       if (!preg_match("/(.*?)\[share.*?\]\s?(.*?)\s?\[\/share\]\s?(.*?)/ism", $body, $matches)) {
+               return false;
+       }
+
+       $pre_body = trim($matches[1]);
        if ($pre_body != '') {
                $item['body'] = $pre_body;
        }
 
-       $shared_body = trim(preg_replace("/(.*?)\[share.*?\]\s?(.*?)\s?\[\/share\]\s?/ism", "$2", $body));
+       $shared_body = trim($matches[2]);
 
        if (($shared_body == "") || ($profile == "") || ($author == "") || ($avatar == "") || ($posted == "")) {
                return false;
        }
 
+       $reshared_item["share-pre-body"] = $pre_body;
        $reshared_item["body"] = $shared_body;
        $reshared_item["author-id"] = Contact::getIdForURL($profile, 0, true);
        $reshared_item["author-name"] = $author;
@@ -6198,47 +6281,36 @@ function api_friendica_profile_show($type)
 
        // get data of the specified profile id or all profiles of the user if not specified
        if ($profile_id != 0) {
-               $r = q(
-                       "SELECT * FROM `profile` WHERE `uid` = %d AND `id` = %d",
-                       intval(api_user()),
-                       intval($profile_id)
-               );
-
+               $r = Profile::getById(api_user(), $profile_id);
                // error message if specified gid is not in database
                if (!DBA::isResult($r)) {
                        throw new BadRequestException("profile_id not available");
                }
        } else {
-               $r = q(
-                       "SELECT * FROM `profile` WHERE `uid` = %d",
-                       intval(api_user())
-               );
+               $r = Profile::getListByUser(api_user());
        }
        // loop through all returned profiles and retrieve data and users
        $k = 0;
        $profiles = [];
-       foreach ($r as $rr) {
-               $profile = api_format_items_profiles($rr);
-
-               // select all users from contact table, loop and prepare standard return for user data
-               $users = [];
-               $nurls = q(
-                       "SELECT `id`, `nurl` FROM `contact` WHERE `uid`= %d AND `profile-id` = %d",
-                       intval(api_user()),
-                       intval($rr['id'])
-               );
-
-               foreach ($nurls as $nurl) {
-                       $user = api_get_user($a, $nurl['nurl']);
-                       ($type == "xml") ? $users[$k++ . ":user"] = $user : $users[] = $user;
-               }
-               $profile['users'] = $users;
+       if (DBA::isResult($r)) {
+               foreach ($r as $rr) {
+                       $profile = api_format_items_profiles($rr);
+
+                       // select all users from contact table, loop and prepare standard return for user data
+                       $users = [];
+                       $nurls = Contact::selectToArray(['id', 'nurl'], ['uid' => api_user(), 'profile-id' => $rr['id']]);
+                       foreach ($nurls as $nurl) {
+                               $user = api_get_user($a, $nurl['nurl']);
+                               ($type == "xml") ? $users[$k++ . ":user"] = $user : $users[] = $user;
+                       }
+                       $profile['users'] = $users;
 
-               // add prepared profile data to array for final return
-               if ($type == "xml") {
-                       $profiles[$k++ . ":profile"] = $profile;
-               } else {
-                       $profiles[] = $profile;
+                       // add prepared profile data to array for final return
+                       if ($type == "xml") {
+                               $profiles[$k++ . ":profile"] = $profile;
+                       } else {
+                               $profiles[] = $profile;
+                       }
                }
        }
 
@@ -6268,7 +6340,7 @@ function api_saved_searches_list($type)
        $terms = DBA::select('search', ['id', 'term'], ['uid' => local_user()]);
 
        $result = [];
-       while ($term = $terms->fetch()) {
+       while ($term = DBA::fetch($terms)) {
                $result[] = [
                        'created_at' => api_date(time()),
                        'id' => intval($term['id']),
index 85938ca0f0d6316e542a5bdb5daf829a7c8ae30c..798a224016c911bf72d8284ad5a053ce8a6ee9db 100644 (file)
@@ -15,6 +15,7 @@ use Friendica\Core\Logger;
 use Friendica\Core\PConfig;
 use Friendica\Core\Protocol;
 use Friendica\Core\Renderer;
+use Friendica\Core\Session;
 use Friendica\Core\System;
 use Friendica\Database\DBA;
 use Friendica\Model\Contact;
@@ -528,7 +529,7 @@ function conversation(App $a, array $items, Pager $pager, $mode, $update, $previ
 
                if (!$update) {
                        $live_update_div = '<div id="live-display"></div>' . "\r\n"
-                               . "<script> var profile_uid = " . defaults($_SESSION, 'uid', 0) . ";"
+                               . "<script> var profile_uid = " . Session::get('uid', 0) . ";"
                                . " var profile_page = 1; </script>";
                }
        } elseif ($mode === 'community') {
@@ -583,7 +584,7 @@ function conversation(App $a, array $items, Pager $pager, $mode, $update, $previ
                if (in_array($mode, ['community', 'contacts'])) {
                        $writable = true;
                } else {
-                       $writable = ($items[0]['uid'] == 0) && in_array($items[0]['network'], [Protocol::ACTIVITYPUB, Protocol::OSTATUS, Protocol::DIASPORA, Protocol::DFRN]);
+                       $writable = ($items[0]['uid'] == 0) && in_array($items[0]['network'], Protocol::FEDERATED);
                }
 
                if (!local_user()) {
@@ -799,12 +800,12 @@ function conversation_fetch_comments($thread_items) {
        $parentlines = [];
        $lineno = 0;
        $actor = [];
-       $created = '';
+       $received = '';
 
        while ($row = Item::fetch($thread_items)) {
-               if (($row['verb'] == ACTIVITY2_ANNOUNCE) && !empty($row['contact-uid']) && ($row['created'] > $created) && ($row['thr-parent'] == $row['parent-uri'])) {
+               if (($row['verb'] == ACTIVITY2_ANNOUNCE) && !empty($row['contact-uid']) && ($row['received'] > $received) && ($row['thr-parent'] == $row['parent-uri'])) {
                        $actor = ['link' => $row['author-link'], 'avatar' => $row['author-avatar'], 'name' => $row['author-name']];
-                       $created = $row['created'];
+                       $received = $row['received'];
                }
 
                if ((($row['gravity'] == GRAVITY_PARENT) && !$row['origin'] && !in_array($row['network'], [Protocol::DIASPORA])) &&
@@ -871,7 +872,7 @@ function conversation_add_children(array $parents, $block_authors, $order, $uid)
 
        foreach ($items as $index => $item) {
                if ($item['uid'] == 0) {
-                       $items[$index]['writable'] = in_array($item['network'], [Protocol::ACTIVITYPUB, Protocol::OSTATUS, Protocol::DIASPORA, Protocol::DFRN]);
+                       $items[$index]['writable'] = in_array($item['network'], Protocol::FEDERATED);
                }
        }
 
@@ -930,7 +931,7 @@ function item_photo_menu($item) {
                $contact_url = 'contact/' . $cid;
                $posts_link = 'contact/' . $cid . '/posts';
 
-               if (in_array($network, [Protocol::DFRN, Protocol::DIASPORA])) {
+               if (in_array($network, [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA])) {
                        $pm_url = 'message/new/' . $cid;
                }
        }
@@ -953,7 +954,7 @@ function item_photo_menu($item) {
                }
 
                if ((($cid == 0) || ($rel == Contact::FOLLOWER)) &&
-                       in_array($item['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::OSTATUS, Protocol::DIASPORA])) {
+                       in_array($item['network'], Protocol::FEDERATED)) {
                        $menu[L10n::t('Connect/Follow')] = 'follow?url=' . urlencode($item['author-link']);
                }
        } else {
@@ -1315,7 +1316,7 @@ function get_item_children(array &$item_list, array $parent, $recursive = true)
 function sort_item_children(array $items)
 {
        $result = $items;
-       usort($result, 'sort_thr_created_rev');
+       usort($result, 'sort_thr_received_rev');
        foreach ($result as $k => $i) {
                if (isset($result[$k]['children'])) {
                        $result[$k]['children'] = sort_item_children($result[$k]['children']);
@@ -1400,13 +1401,13 @@ function smart_flatten_conversation(array $parent)
 
 /**
  * Expands a flat list of items into corresponding tree-like conversation structures,
- * sort the top-level posts either on "created" or "commented", and finally
+ * sort the top-level posts either on "received" or "commented", and finally
  * append all the items at the top level (???)
  *
  * @brief Expands a flat item list into a conversation array for display
  *
  * @param array  $item_list A list of items belonging to one or more conversations
- * @param string $order     Either on "created" or "commented"
+ * @param string $order     Either on "received" or "commented"
  * @return array
  * @throws \Friendica\Network\HTTPException\InternalServerErrorException
  */
@@ -1438,8 +1439,8 @@ function conv_sort(array $item_list, $order)
                }
        }
 
-       if (stristr($order, 'created')) {
-               usort($parents, 'sort_thr_created');
+       if (stristr($order, 'received')) {
+               usort($parents, 'sort_thr_received');
        } elseif (stristr($order, 'commented')) {
                usort($parents, 'sort_thr_commented');
        }
@@ -1476,27 +1477,27 @@ function conv_sort(array $item_list, $order)
 }
 
 /**
- * @brief usort() callback to sort item arrays by the created key
+ * @brief usort() callback to sort item arrays by the received key
  *
  * @param array $a
  * @param array $b
  * @return int
  */
-function sort_thr_created(array $a, array $b)
+function sort_thr_received(array $a, array $b)
 {
-       return strcmp($b['created'], $a['created']);
+       return strcmp($b['received'], $a['received']);
 }
 
 /**
- * @brief usort() callback to reverse sort item arrays by the created key
+ * @brief usort() callback to reverse sort item arrays by the received key
  *
  * @param array $a
  * @param array $b
  * @return int
  */
-function sort_thr_created_rev(array $a, array $b)
+function sort_thr_received_rev(array $a, array $b)
 {
-       return strcmp($a['created'], $b['created']);
+       return strcmp($a['received'], $b['received']);
 }
 
 /**
index 2d26a9472091626e6e064f1f6808823cb8a0271d..c56f63a84b444ecb425d0232931b8f65435d7f63 100644 (file)
@@ -18,7 +18,7 @@ function q($sql) {
        $args = func_get_args();
        unset($args[0]);
 
-       if (!DBA::$connected) {
+       if (!DBA::connected()) {
                return false;
        }
 
index e4227cd7d09f57632043bae8dda3cf4282c71450..3d6bf6a5638943a23bae3245033bb21f766ad171 100644 (file)
@@ -4,11 +4,11 @@
  */
 
 use Friendica\App;
-use Friendica\Content\Smilies;
 use Friendica\Content\Text\BBCode;
 use Friendica\Core\Protocol;
 use Friendica\Model\Contact;
 use Friendica\Model\FileTag;
+use Friendica\Model\Group;
 use Friendica\Util\Strings;
 
 /**
@@ -20,18 +20,9 @@ use Friendica\Util\Strings;
 function expand_acl($s) {
        // turn string array of angle-bracketed elements into numeric array
        // e.g. "<1><2><3>" => array(1,2,3);
-       $ret = [];
+       preg_match_all('/<(' . Group::FOLLOWERS . '|'. Group::MUTUALS . '|[0-9]+)>/', $s, $matches, PREG_PATTERN_ORDER);
 
-       if (strlen($s)) {
-               $t = str_replace('<', '', $s);
-               $a = explode('>', $t);
-               foreach ($a as $aa) {
-                       if (intval($aa)) {
-                               $ret[] = intval($aa);
-                       }
-               }
-       }
-       return $ret;
+       return $matches[1];
 }
 
 
@@ -42,6 +33,8 @@ function expand_acl($s) {
 function sanitise_acl(&$item) {
        if (intval($item)) {
                $item = '<' . intval(Strings::escapeTags(trim($item))) . '>';
+       } elseif (in_array($item, [Group::FOLLOWERS, Group::MUTUALS])) {
+               $item = '<' . $item . '>';
        } else {
                unset($item);
        }
@@ -140,16 +133,12 @@ function redir_private_images($a, &$item)
  * @brief Given a text string, convert from bbcode to html and add smilie icons.
  *
  * @param string $text String with bbcode.
- * @return string Formattet HTML.
+ * @return string Formatted HTML
  * @throws \Friendica\Network\HTTPException\InternalServerErrorException
  */
-function prepare_text($text) {
-       if (stristr($text, '[nosmile]')) {
-               $s = BBCode::convert($text);
-       } else {
-               $s = Smilies::replace(BBCode::convert($text));
-       }
-
+function prepare_text($text)
+{
+       $s = BBCode::convert($text);
        return trim($s);
 }
 
index ddc851cd4e36654e02d6f3d73cf6e68270ffeef1..1e6439e0383cb22d20d80c91af4bbbeef393b116 100644 (file)
--- a/index.php
+++ b/index.php
@@ -4,7 +4,7 @@
  * Friendica
  */
 
-use Friendica\Factory;
+use Dice\Dice;
 
 if (!file_exists(__DIR__ . '/vendor/autoload.php')) {
        die('Vendor path not found. Please execute "bin/composer.phar --no-dev install" on the command line in the web root.');
@@ -12,7 +12,14 @@ if (!file_exists(__DIR__ . '/vendor/autoload.php')) {
 
 require __DIR__ . '/vendor/autoload.php';
 
-$a = Factory\DependencyFactory::setUp('index', __DIR__, false);
+$dice = (new Dice())->addRules(include __DIR__ . '/static/dependencies.config.php');
 
-$a->runFrontend();
+\Friendica\BaseObject::setDependencyInjection($dice);
 
+$a = \Friendica\BaseObject::getApp();
+
+$a->runFrontend(
+       $dice->create(\Friendica\App\Module::class),
+       $dice->create(\Friendica\App\Router::class),
+       $dice->create(\Friendica\Core\Config\PConfiguration::class)
+);
index 03cb1ad63e294f2e58232079ea693d471e07e0eb..3649b03a39b7451642ffe3ad487364b8275799d4 100644 (file)
@@ -61,7 +61,6 @@ function acl_content(App $a)
                $r = q("SELECT COUNT(*) AS c FROM `contact`
                                WHERE `uid` = %d AND NOT `self` AND NOT `deleted`
                                AND NOT `blocked` AND NOT `pending` AND NOT `archive`
-                               AND `success_update` >= `failure_update`
                                AND `notify` != '' $sql_extra2",
                        intval(local_user())
                );
@@ -72,7 +71,6 @@ function acl_content(App $a)
                                WHERE `uid` = %d AND NOT `self` AND NOT `deleted`
                                AND NOT `blocked` AND NOT `pending` AND NOT `archive`
                                AND (`forum` OR `prv`)
-                               AND `success_update` >= `failure_update`
                                AND `notify` != '' $sql_extra2",
                        intval(local_user())
                );
@@ -82,7 +80,6 @@ function acl_content(App $a)
                $r = q("SELECT COUNT(*) AS c FROM `contact`
                                WHERE `uid` = %d AND NOT `self` AND NOT `deleted`
                                AND NOT `blocked` AND NOT `pending` AND NOT `archive`
-                               AND `success_update` >= `failure_update`
                                AND `network` IN ('%s', '%s', '%s') $sql_extra2",
                        intval(local_user()),
                        DBA::escape(Protocol::ACTIVITYPUB),
@@ -141,7 +138,7 @@ function acl_content(App $a)
        if ($type == '') {
                $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr`, `forum`, `prv`, (`prv` OR `forum`) AS `frm` FROM `contact`
                                WHERE `uid` = %d AND NOT `self` AND NOT `deleted` AND NOT `blocked` AND NOT `pending` AND NOT `archive` AND `notify` != ''
-                               AND `success_update` >= `failure_update` AND NOT (`network` IN ('%s', '%s'))
+                               AND NOT (`network` IN ('%s', '%s'))
                                $sql_extra2
                                ORDER BY `name` ASC ",
                        intval(local_user()),
@@ -151,7 +148,7 @@ function acl_content(App $a)
        } elseif ($type == 'c') {
                $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr`, `forum`, `prv` FROM `contact`
                                WHERE `uid` = %d AND NOT `self` AND NOT `deleted` AND NOT `blocked` AND NOT `pending` AND NOT `archive` AND `notify` != ''
-                               AND `success_update` >= `failure_update` AND NOT (`network` IN ('%s'))
+                               AND NOT (`network` IN ('%s'))
                                $sql_extra2
                                ORDER BY `name` ASC ",
                        intval(local_user()),
@@ -160,7 +157,7 @@ function acl_content(App $a)
        } elseif ($type == 'f') {
                $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr`, `forum`, `prv` FROM `contact`
                                WHERE `uid` = %d AND NOT `self` AND NOT `deleted` AND NOT `blocked` AND NOT `pending` AND NOT `archive` AND `notify` != ''
-                               AND `success_update` >= `failure_update` AND NOT (`network` IN ('%s'))
+                               AND NOT (`network` IN ('%s'))
                                AND (`forum` OR `prv`)
                                $sql_extra2
                                ORDER BY `name` ASC ",
@@ -170,7 +167,7 @@ function acl_content(App $a)
        } elseif ($type == 'm') {
                $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr` FROM `contact`
                                WHERE `uid` = %d AND NOT `self` AND NOT `deleted` AND NOT `blocked` AND NOT `pending` AND NOT `archive`
-                               AND `success_update` >= `failure_update` AND `network` IN ('%s', '%s', '%s')
+                               AND `network` IN ('%s', '%s', '%s')
                                $sql_extra2
                                ORDER BY `name` ASC ",
                        intval(local_user()),
@@ -180,7 +177,7 @@ function acl_content(App $a)
                );
        } elseif ($type == 'a') {
                $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr`, `forum`, `prv` FROM `contact`
-                               WHERE `uid` = %d AND NOT `deleted` AND NOT `pending` AND `success_update` >= `failure_update`
+                               WHERE `uid` = %d AND NOT `deleted` AND NOT `pending` AND NOT `archive`
                                $sql_extra2
                                ORDER BY `name` ASC ",
                        intval(local_user())
index 0a2a02e53c49e1613b8c02c6702c34aeb3f6afe6..05ad314b039a351dc2a790cbac33a34882542364 100644 (file)
@@ -110,7 +110,7 @@ function cal_content(App $a)
        $remote_contact = false;
        $contact_id = 0;
 
-       $owner_uid = $a->data['user']['uid'];
+       $owner_uid = intval($a->data['user']['uid']);
        $nick = $a->data['user']['nickname'];
 
        if (!empty($_SESSION['remote']) && is_array($_SESSION['remote'])) {
@@ -290,14 +290,14 @@ function cal_content(App $a)
        }
 
        if ($mode == 'export') {
-               if (!intval($owner_uid)) {
+               if (!$owner_uid) {
                        notice(L10n::t('User not found'));
                        return;
                }
 
                // Test permissions
                // Respect the export feature setting for all other /cal pages if it's not the own profile
-               if ((local_user() !== intval($owner_uid)) && !Feature::isEnabled($owner_uid, "export_calendar")) {
+               if ((local_user() !== $owner_uid) && !Feature::isEnabled($owner_uid, "export_calendar")) {
                        notice(L10n::t('Permission denied.') . EOL);
                        $a->internalRedirect('cal/' . $nick);
                }
@@ -314,7 +314,7 @@ function cal_content(App $a)
 
                        // If it the own calendar return to the events page
                        // otherwise to the profile calendar page
-                       if (local_user() === intval($owner_uid)) {
+                       if (local_user() === $owner_uid) {
                                $return_path = "events";
                        } else {
                                $return_path = "cal/" . $nick;
index 79f3ae9c3ae64a3a2ee96535ba9807a60b8e9ea6..5ffb00729fd8aa8a33aebc037174aea275795080 100644 (file)
@@ -4,15 +4,16 @@
  */
 
 use Friendica\App;
+use Friendica\Content\Feature;
 use Friendica\Content\Nav;
 use Friendica\Content\Pager;
+use Friendica\Content\Widget\TrendingTags;
 use Friendica\Core\ACL;
 use Friendica\Core\Config;
 use Friendica\Core\L10n;
 use Friendica\Core\PConfig;
 use Friendica\Core\Renderer;
 use Friendica\Database\DBA;
-use Friendica\Model\Contact;
 use Friendica\Model\Item;
 use Friendica\Model\User;
 
@@ -198,6 +199,14 @@ function community_content(App $a, $update = 0)
                $o .= $pager->renderMinimal(count($r));
        }
 
+       if (empty($a->page['aside'])) {
+               $a->page['aside'] = '';
+       }
+
+       if (Feature::isEnabled(local_user(), 'trending_tags')) {
+               $a->page['aside'] .= TrendingTags::getHTML($content);
+       }
+
        $t = Renderer::getMarkupTemplate("community.tpl");
        return Renderer::replaceMacros($t, [
                '$content' => $o,
index 7e10b2ff2b6955923b4587c5f82ac670d7a46a88..ce27b44982a26a295dd68d75ea2bdaa76b339b02 100644 (file)
@@ -132,7 +132,7 @@ function crepair_content(App $a)
                $remote_self_options = ['0' => L10n::t('No mirroring'), '2' => L10n::t('Mirror as my own posting')];
        }
 
-       $update_profile = in_array($contact['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS]);
+       $update_profile = in_array($contact['network'], Protocol::FEDERATED);
 
        $tab_str = Module\Contact::getTabsHTML($a, $contact, 5);
 
index e75d975a826890d9c2b9ae0958766bce8fa50f3c..3f0ecba005e8e8333ee97dee626ff61c45dac13a 100644 (file)
@@ -16,11 +16,12 @@ use Friendica\Model\User;
 use Friendica\Protocol\DFRN;
 use Friendica\Protocol\Diaspora;
 use Friendica\Util\Strings;
+use Friendica\Util\Network;
 
 function dfrn_notify_post(App $a) {
        Logger::log(__function__, Logger::TRACE);
 
-       $postdata = file_get_contents('php://input');
+       $postdata = Network::postdata();
 
        if (empty($_POST) || !empty($postdata)) {
                $data = json_decode($postdata);
index 8a00e0559ce3d4132dca07cc3f8084638e981dc7..c7a96f734f6a01ad7dd9b0449618eee1e95787d3 100644 (file)
@@ -60,7 +60,9 @@ function follow_content(App $a)
        }
 
        $uid = local_user();
-       $url = Strings::escapeTags(trim(defaults($_REQUEST, 'url', '')));
+
+       // Issue 4815: Silently removing a prefixing @
+       $url = ltrim(Strings::escapeTags(trim(defaults($_REQUEST, 'url', ''))), '@!');
 
        // Issue 6874: Allow remote following from Peertube
        if (strpos($url, 'acct:') === 0) {
index 20dc9dfdae892a94a22da257dff8f9b235d28f60..51bbc76e7270b54151ba3dbc567c0439864c4540 100644 (file)
@@ -163,7 +163,7 @@ function item_post(App $a) {
        }
 
        // Allow commenting if it is an answer to a public post
-       $allow_comment = local_user() && ($profile_uid == 0) && $toplevel_item_id && in_array($toplevel_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::FEDERATED);
 
        // Now check that valid personal details have been provided
        if (!Security::canWriteToUserWall($profile_uid) && !$allow_comment) {
@@ -469,43 +469,10 @@ function item_post(App $a) {
 
        $match = null;
 
-       /// @todo these lines should be moved to Model/Photo
-       if (!$preview && preg_match_all("/\[img([\=0-9x]*?)\](.*?)\[\/img\]/",$body,$match)) {
-               $images = $match[2];
-               if (count($images)) {
-
-                       $objecttype = ACTIVITY_OBJ_IMAGE;
-
-                       foreach ($images as $image) {
-                               if (!stristr($image, System::baseUrl() . '/photo/')) {
-                                       continue;
-                               }
-                               $image_uri = substr($image,strrpos($image,'/') + 1);
-                               $image_uri = substr($image_uri,0, strpos($image_uri,'-'));
-                               if (!strlen($image_uri)) {
-                                       continue;
-                               }
-
-                               // Ensure to only modify photos that you own
-                               $srch = '<' . intval($original_contact_id) . '>';
-
-                               $condition = [
-                                       'allow_cid' => $srch, 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => '',
-                                       'resource-id' => $image_uri, 'uid' => $profile_uid
-                               ];
-                               if (!Photo::exists($condition)) {
-                                       continue;
-                               }
-
-                               $fields = ['allow_cid' => $str_contact_allow, 'allow_gid' => $str_group_allow,
-                                               'deny_cid' => $str_contact_deny, 'deny_gid' => $str_group_deny];
-                               $condition = ['resource-id' => $image_uri, 'uid' => $profile_uid];
-                               Photo::update($fields, $condition);
-                       }
-               }
+       if (!$preview && Photo::setPermissionFromBody($body, $profile_uid, $original_contact_id, $str_contact_allow, $str_group_allow, $str_contact_deny, $str_group_deny)) {
+               $objecttype = ACTIVITY_OBJ_IMAGE;
        }
 
-
        /*
         * Next link in any attachment references we find in the post.
         */
@@ -868,7 +835,7 @@ function item_post(App $a) {
        // When we are doing some forum posting via ! we have to start the notifier manually.
        // These kind of posts don't initiate the notifier call in the item class.
        if ($only_to_forum) {
-               Worker::add(PRIORITY_HIGH, "Notifier", Delivery::POST, $post_id);
+               Worker::add(['priority' => PRIORITY_HIGH, 'dont_fork' => false], "Notifier", Delivery::POST, $post_id);
        }
 
        Logger::log('post_complete');
index 35c4b043329ae4284250d95a398636407a3d5d8e..eede1b6a0dac4eca34d039a470b3d22f7e5dcdfa 100644 (file)
@@ -6,6 +6,7 @@ use Friendica\App;
 use Friendica\Core\Hook;
 use Friendica\Core\L10n;
 use Friendica\Database\DBA;
+use Friendica\Model\Group;
 use Friendica\Model\Item;
 
 function lockview_content(App $a)
@@ -67,6 +68,19 @@ function lockview_content(App $a)
        $l = [];
 
        if (count($allowed_groups)) {
+               $key = array_search(Group::FOLLOWERS, $allowed_groups);
+               if ($key !== false) {
+                       $l[] = '<b>' . L10n::t('Followers') . '</b>';
+                       unset($allowed_groups[$key]);
+               }
+
+               $key = array_search(Group::MUTUALS, $allowed_groups);
+               if ($key !== false) {
+                       $l[] = '<b>' . L10n::t('Mutuals') . '</b>';
+                       unset($allowed_groups[$key]);
+               }
+
+
                $r = q("SELECT `name` FROM `group` WHERE `id` IN ( %s )",
                        DBA::escape(implode(', ', $allowed_groups))
                );
@@ -89,6 +103,18 @@ function lockview_content(App $a)
        }
 
        if (count($deny_groups)) {
+               $key = array_search(Group::FOLLOWERS, $deny_groups);
+               if ($key !== false) {
+                       $l[] = '<b><strike>' . L10n::t('Followers') . '</strike></b>';
+                       unset($deny_groups[$key]);
+               }
+
+               $key = array_search(Group::MUTUALS, $deny_groups);
+               if ($key !== false) {
+                       $l[] = '<b><strike>' . L10n::t('Mutuals') . '</strike></b>';
+                       unset($deny_groups[$key]);
+               }
+
                $r = q("SELECT `name` FROM `group` WHERE `id` IN ( %s )",
                        DBA::escape(implode(', ', $deny_groups))
                );
index 3ff84a1e6684478b2200d2c552451aad2d2401c3..fe4429e0008b8bf8741d5edde312e52e03be1015 100644 (file)
@@ -384,7 +384,7 @@ function message_content(App $a)
 
                        $from_name_e = $message['from-name'];
                        $subject_e = $message['title'];
-                       $body_e = Smilies::replace(BBCode::convert($message['body']));
+                       $body_e = BBCode::convert($message['body']);
                        $to_name_e = $message['name'];
 
                        $contact = Contact::getDetailsByURL($message['from-url']);
index 7753ba2ca4f1373e3e09a750f48e17c8ced43e0c..fddec60c8dc86457e1273d551adb2d766e63babb 100644 (file)
@@ -19,6 +19,7 @@ use Friendica\Core\Logger;
 use Friendica\Core\PConfig;
 use Friendica\Core\Protocol;
 use Friendica\Core\Renderer;
+use Friendica\Core\Session;
 use Friendica\Database\DBA;
 use Friendica\Model\Contact;
 use Friendica\Model\Group;
@@ -642,7 +643,7 @@ function networkThreadedView(App $a, $update, $parent)
                        // NOTREACHED
                }
 
-               $contacts = Group::expand([$gid]);
+               $contacts = Group::expand(local_user(), [$gid]);
 
                if ((is_array($contacts)) && count($contacts)) {
                        $contact_str_self = '';
@@ -703,11 +704,11 @@ function networkThreadedView(App $a, $update, $parent)
        }
 
        if ($datequery) {
-               $sql_extra3 .= Strings::protectSprintf(sprintf(" AND $sql_table.created <= '%s' ",
+               $sql_extra3 .= Strings::protectSprintf(sprintf(" AND $sql_table.received <= '%s' ",
                                DBA::escape(DateTimeFormat::convert($datequery, 'UTC', date_default_timezone_get()))));
        }
        if ($datequery2) {
-               $sql_extra3 .= Strings::protectSprintf(sprintf(" AND $sql_table.created >= '%s' ",
+               $sql_extra3 .= Strings::protectSprintf(sprintf(" AND $sql_table.received >= '%s' ",
                                DBA::escape(DateTimeFormat::convert($datequery2, 'UTC', date_default_timezone_get()))));
        }
 
@@ -717,8 +718,8 @@ function networkThreadedView(App $a, $update, $parent)
 
        // Normal conversation view
        if ($order === 'post') {
-               $ordering = '`created`';
-               $order_mode = 'created';
+               $ordering = '`received`';
+               $order_mode = 'received';
        } else {
                $ordering = '`commented`';
                $order_mode = 'commented';
@@ -852,7 +853,7 @@ function networkThreadedView(App $a, $update, $parent)
                        ((time() - $_SESSION['network_last_date_timestamp']) < ($browser_update * 10))) {
                        $bottom_limit = $_SESSION['network_last_date'];
                }
-               $_SESSION['network_last_date'] = defaults($_SESSION, 'network_last_top_limit', $top_limit);
+               $_SESSION['network_last_date'] = Session::get('network_last_top_limit', $top_limit);
                $_SESSION['network_last_date_timestamp'] = time();
 
                if ($last_date > $top_limit) {
@@ -867,10 +868,10 @@ function networkThreadedView(App $a, $update, $parent)
                                (SELECT SUBSTR(`term`, 2) FROM `search` WHERE `uid` = ? AND `term` LIKE '#%') AND `otype` = ? AND `type` = ? AND `uid` = 0) AS `term`
                        ON `item`.`id` = `term`.`oid`
                        STRAIGHT_JOIN `contact` AS `author` ON `author`.`id` = `item`.`author-id`
-                       WHERE `item`.`uid` = 0 AND `item`.$ordering < ? AND `item`.$ordering > ?
+                       WHERE `item`.`uid` = 0 AND `item`.$ordering < ? AND `item`.$ordering > ? AND `item`.`gravity` = ?
                                AND NOT `author`.`hidden` AND NOT `author`.`blocked`" . $sql_tag_nets,
                        local_user(), TERM_OBJ_POST, TERM_HASHTAG,
-                       $top_limit, $bottom_limit);
+                       $top_limit, $bottom_limit, GRAVITY_PARENT);
 
                $data = DBA::toArray($items);
 
index b904abe311da1f428c22182dd36b89b6a6033430..fb43619b6e085d450fc9cc4a4ce57fff70873347 100644 (file)
@@ -149,7 +149,7 @@ function photos_post(App $a)
        $can_post  = false;
        $visitor   = 0;
 
-       $page_owner_uid = $a->data['user']['uid'];
+       $page_owner_uid = intval($a->data['user']['uid']);
        $community_page = $a->data['user']['page-flags'] == User::PAGE_FLAGS_COMMUNITY;
 
        if (local_user() && (local_user() == $page_owner_uid)) {
@@ -635,7 +635,7 @@ function photos_post(App $a)
         * they acquire comments, likes, dislikes, and/or tags
         */
 
-       $r = Photo::select([], ['`album` = ? AND `uid` = ? AND `created` > UTC_TIMESTAMP() - INTERVAL 3 HOUR', $album, $page_owner_uid]);
+       $r = Photo::selectToArray([], ['`album` = ? AND `uid` = ? AND `created` > UTC_TIMESTAMP() - INTERVAL 3 HOUR', $album, $page_owner_uid]);
 
        if (!DBA::isResult($r) || ($album == L10n::t('Profile Photos'))) {
                $visible = 1;
@@ -1301,6 +1301,10 @@ function photos_content(App $a)
                        'filename' => $hires['filename'],
                ];
 
+               $map = null;
+               $link_item = [];
+               $total = 0;
+
                // Do we have an item for this photo?
 
                // FIXME! - replace following code to display the conversation with our normal
@@ -1313,15 +1317,12 @@ function photos_content(App $a)
                $linked_items = q("SELECT `id` FROM `item` WHERE `resource-id` = '%s' $sql_extra LIMIT 1",
                        DBA::escape($datum)
                );
-
-               $map = null;
-               $link_item = [];
-               $total = 0;
-
                if (DBA::isResult($linked_items)) {
                        // This is a workaround to not being forced to rewrite the while $sql_extra handling
                        $link_item = Item::selectFirst([], ['id' => $linked_items[0]['id']]);
+               }
 
+               if (!empty($link_item['parent']) && !empty($link_item['uid'])) {
                        $condition = ["`parent` = ? AND `parent` != `id`",  $link_item['parent']];
                        $total = DBA::count('item', $condition);
 
@@ -1331,25 +1332,25 @@ function photos_content(App $a)
                        $result = Item::selectForUser($link_item['uid'], Item::ITEM_FIELDLIST, $condition, $params);
                        $items = Item::inArray($result);
 
-                       if (local_user() && (local_user() == $link_item['uid'])) {
+                       if (local_user() == $link_item['uid']) {
                                Item::update(['unseen' => false], ['parent' => $link_item['parent']]);
                        }
+               }
 
-                       if ($link_item['coord']) {
-                               $map = Map::byCoordinates($link_item['coord']);
-                       }
+               if (!empty($link_item['coord'])) {
+                       $map = Map::byCoordinates($link_item['coord']);
                }
 
                $tags = null;
 
-               if (count($linked_items) && strlen($link_item['tag'])) {
+               if (!empty($link_item['id']) && !empty($link_item['tag'])) {
                        $arr = explode(',', $link_item['tag']);
                        // parse tags and add links
                        $tag_arr = [];
                        foreach ($arr as $tag) {
                                $tag_arr[] = [
                                        'name' => BBCode::convert($tag),
-                                       'removeurl' => '/tagrm/'.$link_item['id'] . '/' . bin2hex($tag)
+                                       'removeurl' => '/tagrm/' . $link_item['id'] . '/' . bin2hex($tag)
                                ];
                        }
                        $tags = ['title' => L10n::t('Tags: '), 'tags' => $tag_arr];
@@ -1382,7 +1383,7 @@ function photos_content(App $a)
                                '$permissions' => L10n::t('Permissions'),
                                '$aclselect' => $aclselect_e,
 
-                               '$item_id' => defaults($link_item, 'id', 0),
+                               '$item_id' => $link_item['id'] ?? 0,
                                '$submit' => L10n::t('Submit'),
                                '$delete' => L10n::t('Delete Photo'),
 
@@ -1400,7 +1401,7 @@ function photos_content(App $a)
                $paginate = '';
                $responses = '';
 
-               if (count($linked_items)) {
+               if (!empty($link_item['id']) && !empty($link_item['uri'])) {
                        $cmnt_tpl = Renderer::getMarkupTemplate('comment_item.tpl');
                        $tpl = Renderer::getMarkupTemplate('photo_item.tpl');
                        $return_path = $a->cmd;
@@ -1566,7 +1567,7 @@ function photos_content(App $a)
 
                $a->page['htmlhead'] .= "\n" . '<meta name="twitter:card" content="summary_large_image" />' . "\n";
                $a->page['htmlhead'] .= '<meta name="twitter:title" content="' . $photo["album"] . '" />' . "\n";
-               $a->page['htmlhead'] .= '<meta name="twitter:image" content="' . $photo["href"] . '" />' . "\n";
+               $a->page['htmlhead'] .= '<meta name="twitter:image" content="' . System::baseUrl() . "/" . $photo["href"] . '" />' . "\n";
                $a->page['htmlhead'] .= '<meta name="twitter:image:width" content="' . $photo["width"] . '" />' . "\n";
                $a->page['htmlhead'] .= '<meta name="twitter:image:height" content="' . $photo["height"] . '" />' . "\n";
 
index 9b844cc48ddc02ad7ce52f3753e20f3d74cd08ce..f30d1a61b9da5175af37a86a91406f537fe641b6 100644 (file)
@@ -123,7 +123,7 @@ function ping_init(App $a)
                $condition = ["`unseen` AND `uid` = ? AND `contact-id` != ?", local_user(), local_user()];
                $fields = ['id', 'parent', 'verb', 'author-name', 'unseen', 'author-link', 'author-avatar', 'contact-avatar',
                        'network', 'created', 'object', 'parent-author-name', 'parent-author-link', 'parent-guid', 'wall'];
-               $params = ['order' => ['created' => true]];
+               $params = ['order' => ['received' => true]];
                $items = Item::selectForUser(local_user(), $fields, $condition, $params);
 
                if (DBA::isResult($items)) {
index a0faa40cf588134fdd8ba1db6e3e88bad1f05b66..97d2da349c88bd72955596f3cf4cabd4fae6b0b7 100644 (file)
@@ -192,14 +192,7 @@ function profile_photo_content(App $a)
                $resource_id = $a->argv[2];
                //die(":".local_user());
 
-               $r = Photo::select([], ["resource-id" => $resource_id, "uid" => local_user()], ["order" => ["scale"=>false]]);
-
-               /*
-               $r = q("SELECT * FROM `photo` WHERE `uid` = %d AND `resource-id` = '%s' ORDER BY `scale` ASC", intval(local_user()),
-                       DBA::escape($resource_id)
-               );
-               */
-
+               $r = Photo::selectToArray([], ["resource-id" => $resource_id, "uid" => local_user()], ["order" => ["scale" => false]]);
                if (!DBA::isResult($r)) {
                        notice(L10n::t('Permission denied.') . EOL);
                        return;
index e5ede6c80a3792da91512c2d95f8db61d52dd51d..d10d7031d6e203507817288afed647e69a47ecc6 100644 (file)
@@ -7,6 +7,7 @@ use Friendica\Database\DBA;
 use Friendica\Model\Contact;
 use Friendica\Protocol\OStatus;
 use Friendica\Util\Strings;
+use Friendica\Util\Network;
 use Friendica\Core\System;
 
 function hub_return($valid, $body)
@@ -83,7 +84,7 @@ function pubsub_init(App $a)
 
 function pubsub_post(App $a)
 {
-       $xml = file_get_contents('php://input');
+       $xml = Network::postdata();
 
        Logger::log('Feed arrived from ' . $_SERVER['REMOTE_ADDR'] . ' for ' .  $a->cmd . ' with user-agent: ' . $_SERVER['HTTP_USER_AGENT']);
        Logger::log('Data: ' . $xml, Logger::DATA);
index db1287ea6f1f804a8b6b784710ce5e01409beb07..182a1df8c51c345a933be30c517aec30904f3563 100644 (file)
@@ -10,6 +10,7 @@ use Friendica\Core\Logger;
 use Friendica\Core\System;
 use Friendica\Database\DBA;
 use Friendica\Protocol\Diaspora;
+use Friendica\Util\Network;
 
 /**
  * @param App $a App
@@ -47,7 +48,7 @@ function receive_post(App $a)
        Logger::log('mod-diaspora: receiving post', Logger::DEBUG);
 
        if (empty($_POST['xml'])) {
-               $postdata = file_get_contents("php://input");
+               $postdata = Network::postdata();
                if ($postdata == '') {
                        throw new \Friendica\Network\HTTPException\InternalServerErrorException();
                }
index 233ec9b0079ff59a65d2b033eeda318f836ebd31..c99e1823c76c84f05de01e5a7a3adbe622909e34 100644 (file)
@@ -85,7 +85,7 @@ function redir_init(App $a) {
 
                // When the remote page does support OWA, then we enforce the use of it
                $basepath = Contact::getBasepath($contact_url);
-               if ($basepath == System::baseUrl()) {
+               if (Strings::compareLink($basepath, System::baseUrl())) {
                        $use_magic = true;
                } else {
                        $serverret = Network::curl($basepath . '/magic');
index ba1bc8d46513e54caf0c58be55487e5a0387b79c..67e467a73fea89ceb7c9aa1dd03c50997f386129 100644 (file)
@@ -13,11 +13,12 @@ use Friendica\Protocol\OStatus;
 use Friendica\Protocol\Salmon;
 use Friendica\Util\Crypto;
 use Friendica\Util\Strings;
+use Friendica\Util\Network;
 
 function salmon_post(App $a, $xml = '') {
 
        if (empty($xml)) {
-               $xml = file_get_contents('php://input');
+               $xml = Network::postdata();
        }
 
        Logger::log('new salmon ' . $xml, Logger::DATA);
index 4144e2608f91f6b9bb7a44b4e5c4fd6a4e3bb1bd..4a911b4fd9828a51aaf05459bdad0dfc67174c15 100644 (file)
@@ -18,7 +18,6 @@ use Friendica\Module\BaseSearchModule;
 use Friendica\Util\Strings;
 
 function search_saved_searches() {
-
        $o = '';
        $search = (!empty($_GET['search']) ? Strings::escapeTags(trim(rawurldecode($_GET['search']))) : '');
 
@@ -50,12 +49,10 @@ function search_saved_searches() {
        }
 
        return $o;
-
 }
 
 
 function search_init(App $a) {
-
        $search = (!empty($_GET['search']) ? Strings::escapeTags(trim(rawurldecode($_GET['search']))) : '');
 
        if (local_user()) {
@@ -83,13 +80,9 @@ function search_init(App $a) {
                unset($_SESSION['theme']);
                unset($_SESSION['mobile-theme']);
        }
-
-
-
 }
 
 function search_content(App $a) {
-
        if (Config::get('system','block_public') && !local_user() && !remote_user()) {
                notice(L10n::t('Public access denied.') . EOL);
                return;
@@ -154,6 +147,16 @@ function search_content(App $a) {
                return BaseSearchModule::performSearch();
        }
 
+       if (parse_url($search, PHP_URL_SCHEME) != '') {
+               $id = Item::fetchByLink($search);
+               if (!empty($id)) {
+                       $item = Item::selectFirst(['guid'], ['id' => $id]);
+                       if (DBA::isResult($item)) {
+                               $a->internalRedirect('display/' . $item['guid']);
+                       }
+               }
+       }
+
        if (!empty($_GET['search-option']))
                switch($_GET['search-option']) {
                        case 'fulltext':
@@ -186,7 +189,7 @@ function search_content(App $a) {
                $condition = ["(`uid` = 0 OR (`uid` = ? AND NOT `global`))
                        AND `otype` = ? AND `type` = ? AND `term` = ?",
                        local_user(), TERM_OBJ_POST, TERM_HASHTAG, $search];
-               $params = ['order' => ['created' => true],
+               $params = ['order' => ['received' => true],
                        'limit' => [$pager->getStart(), $pager->getItemsPerPage()]];
                $terms = DBA::select('term', ['oid'], $condition, $params);
 
index ab7586733adfe3bd014157181a226388f28950e8..af4f7e2cab5544702d2cb6700e247bb1660e8426 100644 (file)
@@ -14,6 +14,7 @@ use Friendica\Core\L10n;
 use Friendica\Core\Logger;
 use Friendica\Core\PConfig;
 use Friendica\Core\Renderer;
+use Friendica\Core\Session;
 use Friendica\Core\System;
 use Friendica\Core\Theme;
 use Friendica\Core\Worker;
@@ -233,6 +234,7 @@ function settings_post(App $a)
                BaseModule::checkFormSecurityTokenRedirectOnError('/settings/connectors', 'settings_connectors');
 
                if (!empty($_POST['general-submit'])) {
+                       PConfig::set(local_user(), 'system', 'accept_only_sharer', intval($_POST['accept_only_sharer']));
                        PConfig::set(local_user(), 'system', 'disable_cw', intval($_POST['disable_cw']));
                        PConfig::set(local_user(), 'system', 'no_intelligent_shortening', intval($_POST['no_intelligent_shortening']));
                        PConfig::set(local_user(), 'system', 'ostatus_autofriend', intval($_POST['snautofollow']));
@@ -368,19 +370,19 @@ function settings_post(App $a)
                PConfig::set(local_user(), 'system', 'bandwidth_saver'         , $bandwidth_saver);
                PConfig::set(local_user(), 'system', 'smart_threading'         , $smart_threading);
 
-               if ($theme == $a->user['theme']) {
-                       // call theme_post only if theme has not been changed
-                       if (($themeconfigfile = get_theme_config_file($theme)) !== null) {
-                               require_once $themeconfigfile;
-                               theme_post($a);
+               if (in_array($theme, Theme::getAllowedList())) {
+                       if ($theme == $a->user['theme']) {
+                               // call theme_post only if theme has not been changed
+                               if (($themeconfigfile = get_theme_config_file($theme)) !== null) {
+                                       require_once $themeconfigfile;
+                                       theme_post($a);
+                               }
+                       } else {
+                               DBA::update('user', ['theme' => $theme], ['uid' => local_user()]);
                        }
+               } else {
+                       notice(L10n::t('The theme you chose isn\'t available.'));
                }
-               Theme::install($theme);
-
-               q("UPDATE `user` SET `theme` = '%s' WHERE `uid` = %d",
-                               DBA::escape($theme),
-                               intval(local_user())
-               );
 
                Hook::callAll('display_settings_post', $_POST);
                $a->internalRedirect('settings/display');
@@ -785,6 +787,7 @@ function settings_content(App $a)
        }
 
        if (($a->argc > 1) && ($a->argv[1] === 'connectors')) {
+               $accept_only_sharer        = intval(PConfig::get(local_user(), 'system', 'accept_only_sharer'));
                $disable_cw                = intval(PConfig::get(local_user(), 'system', 'disable_cw'));
                $no_intelligent_shortening = intval(PConfig::get(local_user(), 'system', 'no_intelligent_shortening'));
                $ostatus_autofriend        = intval(PConfig::get(local_user(), 'system', 'ostatus_autofriend'));
@@ -843,6 +846,7 @@ function settings_content(App $a)
                        '$ostat_enabled' => $ostat_enabled,
 
                        '$general_settings' => L10n::t('General Social Media Settings'),
+                       '$accept_only_sharer' => ['accept_only_sharer', L10n::t('Accept only top level posts by contacts you follow'), $accept_only_sharer, L10n::t('The system does an auto completion of threads when a comment arrives. This has got the side effect that you can receive posts that had been started by a non-follower but had been commented by someone you follow. This setting deactivates this behaviour. When activated, you strictly only will receive posts from people you really do follow.')],
                        '$disable_cw' => ['disable_cw', L10n::t('Disable Content Warning'), $disable_cw, L10n::t('Users on networks like Mastodon or Pleroma are able to set a content warning field which collapse their post by default. This disables the automatic collapsing and sets the content warning as the post title. Doesn\'t affect any other content filtering you eventually set up.')],
                        '$no_intelligent_shortening' => ['no_intelligent_shortening', L10n::t('Disable intelligent shortening'), $no_intelligent_shortening, L10n::t('Normally the system tries to find the best link to add to shortened posts. If this option is enabled then every shortened post will always point to the original friendica post.')],
                        '$ostatus_autofriend' => ['snautofollow', L10n::t("Automatically follow any GNU Social \x28OStatus\x29 followers/mentioners"), $ostatus_autofriend, L10n::t('If you receive a message from an unknown OStatus user, this option decides what to do. If it is checked, a new contact will be created for every unknown user.')],
@@ -911,8 +915,8 @@ function settings_content(App $a)
                        }
                }
 
-               $theme_selected        = defaults($_SESSION, 'theme'       , $default_theme);
-               $mobile_theme_selected = defaults($_SESSION, 'mobile-theme', $default_mobile_theme);
+               $theme_selected        = $a->user['theme'] ?: $default_theme;
+               $mobile_theme_selected = Session::get('mobile-theme', $default_mobile_theme);
 
                $nowarn_insecure = intval(PConfig::get(local_user(), 'system', 'nowarn_insecure'));
 
index 89d3009da04d4f72ca2afffe4e5d9d38ac24461a..c7305c8c1dd40e0abcba0ac36df862040fb41449 100644 (file)
@@ -4,19 +4,22 @@
  */
 namespace Friendica;
 
-use Detection\MobileDetect;
-use DOMDocument;
-use DOMXPath;
 use Exception;
-use Friendica\Core\Config\Cache\IConfigCache;
+use Friendica\App\Arguments;
+use Friendica\App\BaseURL;
+use Friendica\App\Page;
+use Friendica\Core\Config\Cache\ConfigCache;
 use Friendica\Core\Config\Configuration;
-use Friendica\Core\Hook;
+use Friendica\Core\Config\PConfiguration;
+use Friendica\Core\L10n\L10n;
+use Friendica\Core\System;
 use Friendica\Core\Theme;
-use Friendica\Database\DBA;
+use Friendica\Database\Database;
 use Friendica\Model\Profile;
+use Friendica\Module\Login;
+use Friendica\Module\Special\HTTPException as ModuleHTTPException;
 use Friendica\Network\HTTPException;
-use Friendica\Util\BaseURL;
-use Friendica\Util\Config\ConfigFileLoader;
+use Friendica\Util\ConfigFileLoader;
 use Friendica\Util\HTTPSignature;
 use Friendica\Util\Profiler;
 use Friendica\Util\Strings;
@@ -37,9 +40,12 @@ use Psr\Log\LoggerInterface;
  */
 class App
 {
-       public $module_class = null;
-       public $query_string = '';
-       public $page = [];
+       /** @deprecated 2019.09 - use App\Arguments->getQueryString() */
+       public $query_string;
+       /**
+        * @var Page The current page environment
+        */
+       public $page;
        public $profile;
        public $profile_uid;
        public $user;
@@ -49,28 +55,32 @@ class App
        public $page_contact;
        public $content;
        public $data = [];
+       /** @deprecated 2019.09 - use App\Arguments->getCommand() */
        public $cmd = '';
+       /** @deprecated 2019.09 - use App\Arguments->getArgv() or Arguments->get() */
        public $argv;
+       /** @deprecated 2019.09 - use App\Arguments->getArgc() */
        public $argc;
+       /** @deprecated 2019.09 - Use App\Module->getName() instead */
        public $module;
        public $timezone;
        public $interactive = true;
        public $identities;
-       public $is_mobile = false;
-       public $is_tablet = false;
+       /** @deprecated 2019.09 - Use App\Mode->isMobile() instead */
+       public $is_mobile;
+       /** @deprecated 2019.09 - Use App\Mode->isTable() instead */
+       public $is_tablet;
        public $theme_info = [];
        public $category;
        // Allow themes to control internal parameters
        // by changing App values in theme.php
 
-       public $sourcename = '';
-       public $videowidth = 425;
-       public $videoheight = 350;
-       public $force_max_items = 0;
+       public $sourcename              = '';
+       public $videowidth              = 425;
+       public $videoheight             = 350;
+       public $force_max_items         = 0;
        public $theme_events_in_profile = true;
-
-       public $stylesheets = [];
-       public $footerScripts = [];
+       public $queue;
 
        /**
         * @var App\Mode The Mode of the Application
@@ -78,54 +88,54 @@ class App
        private $mode;
 
        /**
-        * @var App\Router
+        * @var BaseURL
         */
-       private $router;
+       private $baseURL;
 
        /**
-        * @var BaseURL
+        * @var string The name of the current theme
         */
-       private $baseURL;
+       private $currentTheme;
 
        /**
-        * @var bool true, if the call is from an backend node (f.e. worker)
+        * @var Configuration The config
         */
-       private $isBackend;
+       private $config;
 
        /**
-        * @var string The name of the current theme
+        * @var LoggerInterface The logger
         */
-       private $currentTheme;
+       private $logger;
 
        /**
-        * @var bool check if request was an AJAX (xmlhttprequest) request
+        * @var Profiler The profiler of this app
         */
-       private $isAjax;
+       private $profiler;
 
        /**
-        * @var MobileDetect
+        * @var Database The Friendica database connection
         */
-       public $mobileDetect;
+       private $database;
 
        /**
-        * @var Configuration The config
+        * @var L10n The translator
         */
-       private $config;
+       private $l10n;
 
        /**
-        * @var LoggerInterface The logger
+        * @var App\Arguments
         */
-       private $logger;
+       private $args;
 
        /**
-        * @var Profiler The profiler of this app
+        * @var Core\Process The process methods
         */
-       private $profiler;
+       private $process;
 
        /**
         * Returns the current config cache of this node
         *
-        * @return IConfigCache
+        * @return ConfigCache
         */
        public function getConfigCache()
        {
@@ -184,79 +194,74 @@ class App
        }
 
        /**
-        * Returns the router of the Application
+        * Returns the Database of the Application
         *
-        * @return App\Router
+        * @return Database
         */
-       public function getRouter()
+       public function getDBA()
        {
-               return $this->router;
+               return $this->database;
        }
 
        /**
-        * Register a stylesheet file path to be included in the <head> tag of every page.
-        * Inclusion is done in App->initHead().
-        * The path can be absolute or relative to the Friendica installation base folder.
-        *
-        * @see initHead()
-        *
-        * @param string $path
+        * @deprecated 2019.09 - use Page->registerStylesheet instead
+        * @see        Page::registerStylesheet()
         */
        public function registerStylesheet($path)
        {
-               if (mb_strpos($path, $this->getBasePath() . DIRECTORY_SEPARATOR) === 0) {
-                       $path = mb_substr($path, mb_strlen($this->getBasePath() . DIRECTORY_SEPARATOR));
-               }
-
-               $this->stylesheets[] = trim($path, '/');
+               $this->page->registerStylesheet($path);
        }
 
        /**
-        * Register a javascript file path to be included in the <footer> tag of every page.
-        * Inclusion is done in App->initFooter().
-        * The path can be absolute or relative to the Friendica installation base folder.
-        *
-        * @see initFooter()
-        *
-        * @param string $path
+        * @deprecated 2019.09 - use Page->registerFooterScript instead
+        * @see        Page::registerFooterScript()
         */
        public function registerFooterScript($path)
        {
-               $url = str_replace($this->getBasePath() . DIRECTORY_SEPARATOR, '', $path);
-
-               $this->footerScripts[] = trim($url, '/');
+               $this->page->registerFooterScript($path);
        }
 
-       public $queue;
-
        /**
-        * @brief App constructor.
-        *
-        * @param Configuration    $config    The Configuration
-        * @param App\Mode         $mode      The mode of this Friendica app
-        * @param App\Router       $router    The router of this Friendica app
-        * @param BaseURL          $baseURL   The full base URL of this Friendica app
-        * @param LoggerInterface  $logger    The current app logger
-        * @param Profiler         $profiler  The profiler of this application
-        * @param bool             $isBackend Whether it is used for backend or frontend (Default true=backend)
-        *
-        * @throws Exception if the Basepath is not usable
+        * @param Database        $database The Friendica Database
+        * @param Configuration   $config   The Configuration
+        * @param App\Mode        $mode     The mode of this Friendica app
+        * @param BaseURL         $baseURL  The full base URL of this Friendica app
+        * @param LoggerInterface $logger   The current app logger
+        * @param Profiler        $profiler The profiler of this application
+        * @param L10n            $l10n     The translator instance
+        * @param App\Arguments   $args     The Friendica Arguments of the call
+        * @param Core\Process    $process  The process methods
         */
-       public function __construct(Configuration $config, App\Mode $mode, App\Router $router, BaseURL $baseURL, LoggerInterface $logger, Profiler $profiler, $isBackend = true)
+       public function __construct(Database $database, Configuration $config, App\Mode $mode, BaseURL $baseURL, LoggerInterface $logger, Profiler $profiler, L10n $l10n, Arguments $args, App\Module $module, App\Page $page, Core\Process $process)
        {
-               BaseObject::setApp($this);
-
+               $this->database = $database;
                $this->config   = $config;
                $this->mode     = $mode;
-               $this->router   = $router;
                $this->baseURL  = $baseURL;
                $this->profiler = $profiler;
                $this->logger   = $logger;
+               $this->l10n     = $l10n;
+               $this->args     = $args;
+               $this->process  = $process;
 
-               $this->profiler->reset();
+               $this->cmd          = $args->getCommand();
+               $this->argv         = $args->getArgv();
+               $this->argc         = $args->getArgc();
+               $this->query_string = $args->getQueryString();
+               $this->module       = $module->getName();
+               $this->page         = $page;
 
-               $this->reload();
+               $this->is_mobile = $mode->isMobile();
+               $this->is_tablet = $mode->isTablet();
 
+               $this->load();
+       }
+
+       /**
+        * Load the whole app instance
+        */
+       public function load()
+       {
                set_time_limit(0);
 
                // This has to be quite large to deal with embedded private photos
@@ -268,97 +273,19 @@ class App
                        . $this->getBasePath() . DIRECTORY_SEPARATOR . 'library' . PATH_SEPARATOR
                        . $this->getBasePath());
 
-               if (!empty($_SERVER['QUERY_STRING']) && strpos($_SERVER['QUERY_STRING'], 'pagename=') === 0) {
-                       $this->query_string = substr($_SERVER['QUERY_STRING'], 9);
-               } elseif (!empty($_SERVER['QUERY_STRING']) && strpos($_SERVER['QUERY_STRING'], 'q=') === 0) {
-                       $this->query_string = substr($_SERVER['QUERY_STRING'], 2);
-               }
-
-               // removing trailing / - maybe a nginx problem
-               $this->query_string = ltrim($this->query_string, '/');
-
-               if (!empty($_GET['pagename'])) {
-                       $this->cmd = trim($_GET['pagename'], '/\\');
-               } elseif (!empty($_GET['q'])) {
-                       $this->cmd = trim($_GET['q'], '/\\');
-               }
-
-               // fix query_string
-               $this->query_string = str_replace($this->cmd . '&', $this->cmd . '?', $this->query_string);
-
-               // unix style "homedir"
-               if (substr($this->cmd, 0, 1) === '~') {
-                       $this->cmd = 'profile/' . substr($this->cmd, 1);
-               }
-
-               // Diaspora style profile url
-               if (substr($this->cmd, 0, 2) === 'u/') {
-                       $this->cmd = 'profile/' . substr($this->cmd, 2);
-               }
-
-               /*
-                * Break the URL path into C style argc/argv style arguments for our
-                * modules. Given "http://example.com/module/arg1/arg2", $this->argc
-                * will be 3 (integer) and $this->argv will contain:
-                *   [0] => 'module'
-                *   [1] => 'arg1'
-                *   [2] => 'arg2'
-                *
-                *
-                * There will always be one argument. If provided a naked domain
-                * URL, $this->argv[0] is set to "home".
-                */
-
-               $this->argv = explode('/', $this->cmd);
-               $this->argc = count($this->argv);
-               if ((array_key_exists('0', $this->argv)) && strlen($this->argv[0])) {
-                       $this->module = str_replace('.', '_', $this->argv[0]);
-                       $this->module = str_replace('-', '_', $this->module);
-               } else {
-                       $this->argc = 1;
-                       $this->argv = ['home'];
-                       $this->module = 'home';
-               }
-
-               $this->isBackend = $isBackend || $this->checkBackend($this->module);
-
-               // Detect mobile devices
-               $mobile_detect = new MobileDetect();
-
-               $this->mobileDetect = $mobile_detect;
-
-               $this->is_mobile = $mobile_detect->isMobile();
-               $this->is_tablet = $mobile_detect->isTablet();
-
-               $this->isAjax = strtolower(defaults($_SERVER, 'HTTP_X_REQUESTED_WITH', '')) == 'xmlhttprequest';
-
-               // Register template engines
-               Core\Renderer::registerTemplateEngine('Friendica\Render\FriendicaSmartyEngine');
-       }
-
-       /**
-        * Reloads the whole app instance
-        */
-       public function reload()
-       {
-               $this->getMode()->determine($this->getBasePath());
-
-               if ($this->getMode()->has(App\Mode::DBAVAILABLE)) {
-                       $loader = new ConfigFileLoader($this->getBasePath(), $this->getMode());
-                       $this->config->getCache()->load($loader->loadCoreConfig('addon'), true);
+               $this->profiler->reset();
 
-                       $this->profiler->update(
-                               $this->config->get('system', 'profiler', false),
-                               $this->config->get('rendertime', 'callstack', false));
+               if ($this->mode->has(App\Mode::DBAVAILABLE)) {
+                       $this->profiler->update($this->config);
 
                        Core\Hook::loadHooks();
-                       $loader = new ConfigFileLoader($this->getBasePath(), $this->mode);
+                       $loader = new ConfigFileLoader($this->getBasePath());
                        Core\Hook::callAll('load_config', $loader);
                }
 
                $this->loadDefaultTimezone();
-
-               Core\L10n::init();
+               // Register template engines
+               Core\Renderer::registerTemplateEngine('Friendica\Render\FriendicaSmartyEngine');
        }
 
        /**
@@ -384,6 +311,7 @@ class App
 
        /**
         * Returns the scheme of the current call
+        *
         * @return string
         *
         * @deprecated 2019.06 - use BaseURL->getScheme() instead
@@ -399,6 +327,8 @@ class App
         * @param bool $ssl Whether to append http or https under BaseURL::SSL_POLICY_SELFSIGN
         *
         * @return string Friendica server base URL
+        *
+        * @deprecated 2019.09 - use BaseUrl->get($ssl) instead
         */
        public function getBaseURL($ssl = false)
        {
@@ -406,7 +336,7 @@ class App
        }
 
        /**
-        * @brief Initializes the baseurl components
+        * @brief      Initializes the baseurl components
         *
         * Clears the baseurl cache to prevent inconsistencies
         *
@@ -444,139 +374,18 @@ class App
        }
 
        /**
-        * Initializes App->page['htmlhead'].
-        *
-        * Includes:
-        * - Page title
-        * - Favicons
-        * - Registered stylesheets (through App->registerStylesheet())
-        * - Infinite scroll data
-        * - head.tpl template
-        */
-       public function initHead()
-       {
-               $interval = ((local_user()) ? Core\PConfig::get(local_user(), 'system', 'update_interval') : 40000);
-
-               // If the update is 'deactivated' set it to the highest integer number (~24 days)
-               if ($interval < 0) {
-                       $interval = 2147483647;
-               }
-
-               if ($interval < 10000) {
-                       $interval = 40000;
-               }
-
-               // Default title: current module called
-               if (empty($this->page['title']) && $this->module) {
-                       $this->page['title'] = ucfirst($this->module);
-               }
-
-               // Prepend the sitename to the page title
-               $this->page['title'] = $this->config->get('config', 'sitename', '') . (!empty($this->page['title']) ? ' | ' . $this->page['title'] : '');
-
-               if (!empty(Core\Renderer::$theme['stylesheet'])) {
-                       $stylesheet = Core\Renderer::$theme['stylesheet'];
-               } else {
-                       $stylesheet = $this->getCurrentThemeStylesheetPath();
-               }
-
-               $this->registerStylesheet($stylesheet);
-
-               $shortcut_icon = $this->config->get('system', 'shortcut_icon');
-               if ($shortcut_icon == '') {
-                       $shortcut_icon = 'images/friendica-32.png';
-               }
-
-               $touch_icon = $this->config->get('system', 'touch_icon');
-               if ($touch_icon == '') {
-                       $touch_icon = 'images/friendica-128.png';
-               }
-
-               Core\Hook::callAll('head', $this->page['htmlhead']);
-
-               $tpl = Core\Renderer::getMarkupTemplate('head.tpl');
-               /* put the head template at the beginning of page['htmlhead']
-                * since the code added by the modules frequently depends on it
-                * being first
-                */
-               $this->page['htmlhead'] = Core\Renderer::replaceMacros($tpl, [
-                       '$local_user'      => local_user(),
-                       '$generator'       => 'Friendica' . ' ' . FRIENDICA_VERSION,
-                       '$delitem'         => Core\L10n::t('Delete this item?'),
-                       '$update_interval' => $interval,
-                       '$shortcut_icon'   => $shortcut_icon,
-                       '$touch_icon'      => $touch_icon,
-                       '$block_public'    => intval($this->config->get('system', 'block_public')),
-                       '$stylesheets'     => $this->stylesheets,
-               ]) . $this->page['htmlhead'];
-       }
-
-       /**
-        * Initializes App->page['footer'].
-        *
-        * Includes:
-        * - Javascript homebase
-        * - Mobile toggle link
-        * - Registered footer scripts (through App->registerFooterScript())
-        * - footer.tpl template
-        */
-       public function initFooter()
-       {
-               // If you're just visiting, let javascript take you home
-               if (!empty($_SESSION['visitor_home'])) {
-                       $homebase = $_SESSION['visitor_home'];
-               } elseif (local_user()) {
-                       $homebase = 'profile/' . $this->user['nickname'];
-               }
-
-               if (isset($homebase)) {
-                       $this->page['footer'] .= '<script>var homebase="' . $homebase . '";</script>' . "\n";
-               }
-
-               /*
-                * Add a "toggle mobile" link if we're using a mobile device
-                */
-               if ($this->is_mobile || $this->is_tablet) {
-                       if (isset($_SESSION['show-mobile']) && !$_SESSION['show-mobile']) {
-                               $link = 'toggle_mobile?address=' . urlencode(curPageURL());
-                       } else {
-                               $link = 'toggle_mobile?off=1&address=' . urlencode(curPageURL());
-                       }
-                       $this->page['footer'] .= Core\Renderer::replaceMacros(Core\Renderer::getMarkupTemplate("toggle_mobile_footer.tpl"), [
-                               '$toggle_link' => $link,
-                               '$toggle_text' => Core\L10n::t('toggle mobile')
-                       ]);
-               }
-
-               Core\Hook::callAll('footer', $this->page['footer']);
-
-               $tpl = Core\Renderer::getMarkupTemplate('footer.tpl');
-               $this->page['footer'] = Core\Renderer::replaceMacros($tpl, [
-                       '$footerScripts' => $this->footerScripts,
-               ]) . $this->page['footer'];
-       }
-
-       /**
-        * @brief Removes the base url from an url. This avoids some mixed content problems.
+        * @brief      Removes the base url from an url. This avoids some mixed content problems.
         *
         * @param string $origURL
         *
         * @return string The cleaned url
-        * @throws HTTPException\InternalServerErrorException
+        *
+        * @deprecated 2019.09 - Use BaseURL->remove() instead
+        * @see        BaseURL::remove()
         */
        public function removeBaseURL($origURL)
        {
-               // Remove the hostname from the url if it is an internal link
-               $nurl = Util\Strings::normaliseLink($origURL);
-               $base = Util\Strings::normaliseLink($this->getBaseURL());
-               $url = str_replace($base . '/', '', $nurl);
-
-               // if it is an external link return the orignal value
-               if ($url == Util\Strings::normaliseLink($origURL)) {
-                       return $origURL;
-               } else {
-                       return $url;
-               }
+               return $this->baseURL->remove($origURL);
        }
 
        /**
@@ -596,214 +405,27 @@ class App
        }
 
        /**
-        * @brief Checks if the site is called via a backend process
-        *
-        * This isn't a perfect solution. But we need this check very early.
-        * So we cannot wait until the modules are loaded.
-        *
-        * @param string $module
-        * @return bool
-        */
-       private function checkBackend($module) {
-               static $backends = [
-                       '_well_known',
-                       'api',
-                       'dfrn_notify',
-                       'feed',
-                       'fetch',
-                       'followers',
-                       'following',
-                       'hcard',
-                       'hostxrd',
-                       'inbox',
-                       'manifest',
-                       'nodeinfo',
-                       'noscrape',
-                       'objects',
-                       'outbox',
-                       'poco',
-                       'post',
-                       'proxy',
-                       'pubsub',
-                       'pubsubhubbub',
-                       'receive',
-                       'rsd_xml',
-                       'salmon',
-                       'statistics_json',
-                       'xrd',
-               ];
-
-               // Check if current module is in backend or backend flag is set
-               return in_array($module, $backends);
-       }
-
-       /**
-        * Returns true, if the call is from a backend node (f.e. from a worker)
-        *
-        * @return bool Is it a known backend?
-        */
-       public function isBackend()
-       {
-               return $this->isBackend;
-       }
-
-       /**
-        * @brief Checks if the maximum number of database processes is reached
-        *
-        * @return bool Is the limit reached?
+        * @deprecated 2019.09 - use Core\Process->isMaxProcessesReached() instead
         */
        public function isMaxProcessesReached()
        {
-               // Deactivated, needs more investigating if this check really makes sense
-               return false;
-
-               /*
-                * Commented out to suppress static analyzer issues
-                *
-               if ($this->is_backend()) {
-                       $process = 'backend';
-                       $max_processes = $this->config->get('system', 'max_processes_backend');
-                       if (intval($max_processes) == 0) {
-                               $max_processes = 5;
-                       }
-               } else {
-                       $process = 'frontend';
-                       $max_processes = $this->config->get('system', 'max_processes_frontend');
-                       if (intval($max_processes) == 0) {
-                               $max_processes = 20;
-                       }
-               }
-
-               $processlist = DBA::processlist();
-               if ($processlist['list'] != '') {
-                       Core\Logger::log('Processcheck: Processes: ' . $processlist['amount'] . ' - Processlist: ' . $processlist['list'], Core\Logger::DEBUG);
-
-                       if ($processlist['amount'] > $max_processes) {
-                               Core\Logger::log('Processcheck: Maximum number of processes for ' . $process . ' tasks (' . $max_processes . ') reached.', Core\Logger::DEBUG);
-                               return true;
-                       }
-               }
-               return false;
-                */
+               return $this->process->isMaxProcessesReached();
        }
 
        /**
-        * @brief Checks if the minimal memory is reached
-        *
-        * @return bool Is the memory limit reached?
-        * @throws HTTPException\InternalServerErrorException
+        * @deprecated 2019.09 - use Core\Process->isMinMemoryReached() instead
         */
        public function isMinMemoryReached()
        {
-               $min_memory = $this->config->get('system', 'min_memory', 0);
-               if ($min_memory == 0) {
-                       return false;
-               }
-
-               if (!is_readable('/proc/meminfo')) {
-                       return false;
-               }
-
-               $memdata = explode("\n", file_get_contents('/proc/meminfo'));
-
-               $meminfo = [];
-               foreach ($memdata as $line) {
-                       $data = explode(':', $line);
-                       if (count($data) != 2) {
-                               continue;
-                       }
-                       list($key, $val) = $data;
-                       $meminfo[$key] = (int) trim(str_replace('kB', '', $val));
-                       $meminfo[$key] = (int) ($meminfo[$key] / 1024);
-               }
-
-               if (!isset($meminfo['MemFree'])) {
-                       return false;
-               }
-
-               $free = $meminfo['MemFree'];
-
-               $reached = ($free < $min_memory);
-
-               if ($reached) {
-                       Core\Logger::log('Minimal memory reached: ' . $free . '/' . $meminfo['MemTotal'] . ' - limit ' . $min_memory, Core\Logger::DEBUG);
-               }
-
-               return $reached;
+               return $this->process->isMinMemoryReached();
        }
 
        /**
-        * @brief Checks if the maximum load is reached
-        *
-        * @return bool Is the load reached?
-        * @throws HTTPException\InternalServerErrorException
+        * @deprecated 2019.09 - use Core\Process->isMaxLoadReached() instead
         */
        public function isMaxLoadReached()
        {
-               if ($this->isBackend()) {
-                       $process = 'backend';
-                       $maxsysload = intval($this->config->get('system', 'maxloadavg'));
-                       if ($maxsysload < 1) {
-                               $maxsysload = 50;
-                       }
-               } else {
-                       $process = 'frontend';
-                       $maxsysload = intval($this->config->get('system', 'maxloadavg_frontend'));
-                       if ($maxsysload < 1) {
-                               $maxsysload = 50;
-                       }
-               }
-
-               $load = Core\System::currentLoad();
-               if ($load) {
-                       if (intval($load) > $maxsysload) {
-                               Core\Logger::log('system: load ' . $load . ' for ' . $process . ' tasks (' . $maxsysload . ') too high.');
-                               return true;
-                       }
-               }
-               return false;
-       }
-
-       /**
-        * Executes a child process with 'proc_open'
-        *
-        * @param string $command The command to execute
-        * @param array  $args    Arguments to pass to the command ( [ 'key' => value, 'key2' => value2, ... ]
-        * @throws HTTPException\InternalServerErrorException
-        */
-       public function proc_run($command, $args)
-       {
-               if (!function_exists('proc_open')) {
-                       return;
-               }
-
-               $cmdline = $this->config->get('config', 'php_path', 'php') . ' ' . escapeshellarg($command);
-
-               foreach ($args as $key => $value) {
-                       if (!is_null($value) && is_bool($value) && !$value) {
-                               continue;
-                       }
-
-                       $cmdline .= ' --' . $key;
-                       if (!is_null($value) && !is_bool($value)) {
-                               $cmdline .= ' ' . $value;
-                       }
-               }
-
-               if ($this->isMinMemoryReached()) {
-                       return;
-               }
-
-               if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
-                       $resource = proc_open('cmd /c start /b ' . $cmdline, [], $foo, $this->getBasePath());
-               } else {
-                       $resource = proc_open($cmdline . ' &', [], $foo, $this->getBasePath());
-               }
-               if (!is_resource($resource)) {
-                       Core\Logger::log('We got no resource for command ' . $cmdline, Core\Logger::DEBUG);
-                       return;
-               }
-               proc_close($resource);
+               return $this->process->isMaxLoadReached();
        }
 
        /**
@@ -835,7 +457,7 @@ class App
         */
        public function getCurrentTheme()
        {
-               if ($this->getMode()->isInstall()) {
+               if ($this->mode->isInstall()) {
                        return '';
                }
 
@@ -860,7 +482,7 @@ class App
        {
                $system_theme = $this->config->get('system', 'theme');
                if (!$system_theme) {
-                       throw new Exception(Core\L10n::t('No system theme config value set.'));
+                       throw new Exception($this->l10n->t('No system theme config value set.'));
                }
 
                // Sane default
@@ -871,8 +493,8 @@ class App
                if ($this->profile_uid && ($this->profile_uid != local_user())) {
                        // Allow folks to override user themes and always use their own on their own site.
                        // This works only if the user is on the same server
-                       $user = DBA::selectFirst('user', ['theme'], ['uid' => $this->profile_uid]);
-                       if (DBA::isResult($user) && !Core\PConfig::get(local_user(), 'system', 'always_my_theme')) {
+                       $user = $this->database->selectFirst('user', ['theme'], ['uid' => $this->profile_uid]);
+                       if ($this->database->isResult($user) && !Core\PConfig::get(local_user(), 'system', 'always_my_theme')) {
                                $page_theme = $user['theme'];
                        }
                }
@@ -882,7 +504,7 @@ class App
                // Specific mobile theme override
                if (($this->is_mobile || $this->is_tablet) && Core\Session::get('show-mobile', true)) {
                        $system_mobile_theme = $this->config->get('system', 'mobile-theme');
-                       $user_mobile_theme = Core\Session::get('mobile-theme', $system_mobile_theme);
+                       $user_mobile_theme   = Core\Session::get('mobile-theme', $system_mobile_theme);
 
                        // --- means same mobile theme as desktop
                        if (!empty($user_mobile_theme) && $user_mobile_theme !== '---') {
@@ -898,9 +520,9 @@ class App
 
                $theme_name = Strings::sanitizeFilePathItem($theme_name);
                if ($theme_name
-                       && in_array($theme_name, Theme::getAllowedList())
-                       && (file_exists('view/theme/' . $theme_name . '/style.css')
-                       || file_exists('view/theme/' . $theme_name . '/style.php'))
+                   && in_array($theme_name, Theme::getAllowedList())
+                   && (file_exists('view/theme/' . $theme_name . '/style.css')
+                       || file_exists('view/theme/' . $theme_name . '/style.php'))
                ) {
                        $this->currentTheme = $theme_name;
                }
@@ -920,31 +542,22 @@ class App
        }
 
        /**
-        * Check if request was an AJAX (xmlhttprequest) request.
-        *
-        * @return boolean true if it was an AJAX request
+        * @deprecated 2019.09 - use App\Mode->isAjax() instead
+        * @see        App\Mode::isAjax()
         */
        public function isAjax()
        {
-               return $this->isAjax;
+               return $this->mode->isAjax();
        }
 
        /**
-        * Returns the value of a argv key
-        * TODO there are a lot of $a->argv usages in combination with defaults() which can be replaced with this method
-        *
-        * @param int $position the position of the argument
-        * @param mixed $default the default value if not found
+        * @deprecated use Arguments->get() instead
         *
-        * @return mixed returns the value of the argument
+        * @see        App\Arguments
         */
        public function getArgumentValue($position, $default = '')
        {
-               if (array_key_exists($position, $this->argv)) {
-                       return $this->argv[$position];
-               }
-
-               return $default;
+               return $this->args->get($position, $default);
        }
 
        /**
@@ -973,381 +586,160 @@ class App
         * request and a representation of the response.
         *
         * This probably should change to limit the size of this monster method.
+        *
+        * @param App\Module $module The determined module
         */
-       public function runFrontend()
+       public function runFrontend(App\Module $module, App\Router $router, PConfiguration $pconfig)
        {
-               // Missing DB connection: ERROR
-               if ($this->getMode()->has(App\Mode::LOCALCONFIGPRESENT) && !$this->getMode()->has(App\Mode::DBAVAILABLE)) {
-                       Module\Special\HTTPException::rawContent(
-                               new HTTPException\InternalServerErrorException('Apologies but the website is unavailable at the moment.')
-                       );
-               }
+               $moduleName = $module->getName();
 
-               // Max Load Average reached: ERROR
-               if ($this->isMaxProcessesReached() || $this->isMaxLoadReached()) {
-                       header('Retry-After: 120');
-                       header('Refresh: 120; url=' . $this->getBaseURL() . "/" . $this->query_string);
+               try {
+                       // Missing DB connection: ERROR
+                       if ($this->mode->has(App\Mode::LOCALCONFIGPRESENT) && !$this->mode->has(App\Mode::DBAVAILABLE)) {
+                               throw new HTTPException\InternalServerErrorException('Apologies but the website is unavailable at the moment.');
+                       }
 
-                       Module\Special\HTTPException::rawContent(
-                               new HTTPException\ServiceUnavailableException('The node is currently overloaded. Please try again later.')
-                       );
-               }
+                       // Max Load Average reached: ERROR
+                       if ($this->process->isMaxProcessesReached() || $this->process->isMaxLoadReached()) {
+                               header('Retry-After: 120');
+                               header('Refresh: 120; url=' . $this->baseURL->get() . "/" . $this->args->getQueryString());
 
-               if (!$this->getMode()->isInstall()) {
-                       // Force SSL redirection
-                       if ($this->baseURL->checkRedirectHttps()) {
-                               header('HTTP/1.1 302 Moved Temporarily');
-                               header('Location: ' . $this->getBaseURL() . '/' . $this->query_string);
-                               exit();
+                               throw new HTTPException\ServiceUnavailableException('The node is currently overloaded. Please try again later.');
                        }
 
-                       Core\Session::init();
-                       Core\Hook::callAll('init_1');
-               }
+                       if (!$this->mode->isInstall()) {
+                               // Force SSL redirection
+                               if ($this->baseURL->checkRedirectHttps()) {
+                                       System::externalRedirect($this->baseURL->get() . '/' . $this->args->getQueryString());
+                               }
 
-               // Exclude the backend processes from the session management
-               if (!$this->isBackend()) {
-                       $stamp1 = microtime(true);
-                       session_start();
-                       $this->profiler->saveTimestamp($stamp1, 'parser', Core\System::callstack());
-                       Core\L10n::setSessionVariable();
-                       Core\L10n::setLangFromSession();
-               } else {
-                       $_SESSION = [];
-                       Core\Worker::executeIfIdle();
-               }
+                               Core\Session::init();
+                               Core\Hook::callAll('init_1');
+                       }
 
-               if ($this->getMode()->isNormal()) {
-                       $requester = HTTPSignature::getSigner('', $_SERVER);
-                       if (!empty($requester)) {
-                               Profile::addVisitorCookieForHandle($requester);
+                       // Exclude the backend processes from the session management
+                       if (!$this->mode->isBackend()) {
+                               $stamp1 = microtime(true);
+                               session_start();
+                               $this->profiler->saveTimestamp($stamp1, 'parser', Core\System::callstack());
+                               $this->l10n->setSessionVariable();
+                               $this->l10n->setLangFromSession();
+                       } else {
+                               $_SESSION = [];
+                               Core\Worker::executeIfIdle();
                        }
-               }
 
-               // ZRL
-               if (!empty($_GET['zrl']) && $this->getMode()->isNormal()) {
-                       $this->query_string = Model\Profile::stripZrls($this->query_string);
-                       if (!local_user()) {
-                               // Only continue when the given profile link seems valid
-                               // Valid profile links contain a path with "/profile/" and no query parameters
-                               if ((parse_url($_GET['zrl'], PHP_URL_QUERY) == "") &&
-                                       strstr(parse_url($_GET['zrl'], PHP_URL_PATH), "/profile/")) {
-                                       if (defaults($_SESSION, "visitor_home", "") != $_GET["zrl"]) {
-                                               $_SESSION['my_url'] = $_GET['zrl'];
-                                               $_SESSION['authenticated'] = 0;
-                                       }
-                                       Model\Profile::zrlInit($this);
-                               } else {
-                                       // Someone came with an invalid parameter, maybe as a DDoS attempt
-                                       // We simply stop processing here
-                                       Core\Logger::log("Invalid ZRL parameter " . $_GET['zrl'], Core\Logger::DEBUG);
-                                       Module\Special\HTTPException::rawContent(
-                                               new HTTPException\ForbiddenException()
-                                       );
+                       if ($this->mode->isNormal()) {
+                               $requester = HTTPSignature::getSigner('', $_SERVER);
+                               if (!empty($requester)) {
+                                       Profile::addVisitorCookieForHandle($requester);
                                }
                        }
-               }
-
-               if (!empty($_GET['owt']) && $this->getMode()->isNormal()) {
-                       $token = $_GET['owt'];
-                       $this->query_string = Model\Profile::stripQueryParam($this->query_string, 'owt');
-                       Model\Profile::openWebAuthInit($token);
-               }
-
-               Module\Login::sessionAuth();
 
-               if (empty($_SESSION['authenticated'])) {
-                       header('X-Account-Management-Status: none');
-               }
-
-               $_SESSION['sysmsg']       = defaults($_SESSION, 'sysmsg'      , []);
-               $_SESSION['sysmsg_info']  = defaults($_SESSION, 'sysmsg_info' , []);
-               $_SESSION['last_updated'] = defaults($_SESSION, 'last_updated', []);
-
-               /*
-                * check_config() is responsible for running update scripts. These automatically
-                * update the DB schema whenever we push a new one out. It also checks to see if
-                * any addons have been added or removed and reacts accordingly.
-                */
-
-               // in install mode, any url loads install module
-               // but we need "view" module for stylesheet
-               if ($this->getMode()->isInstall() && $this->module !== 'install') {
-                       $this->internalRedirect('install');
-               } elseif (!$this->getMode()->isInstall() && !$this->getMode()->has(App\Mode::MAINTENANCEDISABLED) && $this->module !== 'maintenance') {
-                       $this->internalRedirect('maintenance');
-               } else {
-                       $this->checkURL();
-                       Core\Update::check($this->getBasePath(), false, $this->getMode());
-                       Core\Addon::loadAddons();
-                       Core\Hook::loadHooks();
-               }
-
-               $this->page = [
-                       'aside' => '',
-                       'bottom' => '',
-                       'content' => '',
-                       'footer' => '',
-                       'htmlhead' => '',
-                       'nav' => '',
-                       'page_title' => '',
-                       'right_aside' => '',
-                       'template' => '',
-                       'title' => ''
-               ];
-
-               // Compatibility with the Android Diaspora client
-               if ($this->module == 'stream') {
-                       $this->internalRedirect('network?order=post');
-               }
-
-               if ($this->module == 'conversations') {
-                       $this->internalRedirect('message');
-               }
-
-               if ($this->module == 'commented') {
-                       $this->internalRedirect('network?order=comment');
-               }
-
-               if ($this->module == 'liked') {
-                       $this->internalRedirect('network?order=comment');
-               }
-
-               if ($this->module == 'activity') {
-                       $this->internalRedirect('network?conv=1');
-               }
-
-               if (($this->module == 'status_messages') && ($this->cmd == 'status_messages/new')) {
-                       $this->internalRedirect('bookmarklet');
-               }
-
-               if (($this->module == 'user') && ($this->cmd == 'user/edit')) {
-                       $this->internalRedirect('settings');
-               }
-
-               if (($this->module == 'tag_followings') && ($this->cmd == 'tag_followings/manage')) {
-                       $this->internalRedirect('search');
-               }
-
-               // Compatibility with the Firefox App
-               if (($this->module == "users") && ($this->cmd == "users/sign_in")) {
-                       $this->module = "login";
-               }
-
-               /*
-                * ROUTING
-                *
-                * From the request URL, routing consists of obtaining the name of a BaseModule-extending class of which the
-                * post() and/or content() static methods can be respectively called to produce a data change or an output.
-                */
+                       // ZRL
+                       if (!empty($_GET['zrl']) && $this->mode->isNormal()) {
+                               if (!local_user()) {
+                                       // Only continue when the given profile link seems valid
+                                       // Valid profile links contain a path with "/profile/" and no query parameters
+                                       if ((parse_url($_GET['zrl'], PHP_URL_QUERY) == "") &&
+                                           strstr(parse_url($_GET['zrl'], PHP_URL_PATH), "/profile/")) {
+                                               if (Core\Session::get('visitor_home') != $_GET["zrl"]) {
+                                                       Core\Session::set('my_url', $_GET['zrl']);
+                                                       Core\Session::set('authenticated', 0);
+                                               }
+
+                                               Model\Profile::zrlInit($this);
+                                       } else {
+                                               // Someone came with an invalid parameter, maybe as a DDoS attempt
+                                               // We simply stop processing here
+                                               $this->logger->debug('Invalid ZRL parameter.', ['zrl' => $_GET['zrl']]);
+                                               throw new HTTPException\ForbiddenException();
+                                       }
+                               }
+                       }
 
-               // First we try explicit routes defined in App\Router
-               $this->router->collectRoutes();
+                       if (!empty($_GET['owt']) && $this->mode->isNormal()) {
+                               $token = $_GET['owt'];
+                               Model\Profile::openWebAuthInit($token);
+                       }
 
-               $data = $this->router->getRouteCollector();
-               Hook::callAll('route_collection', $data);
+                       Login::sessionAuth();
 
-               $this->module_class = $this->router->getModuleClass($this->cmd);
+                       if (empty($_SESSION['authenticated'])) {
+                               header('X-Account-Management-Status: none');
+                       }
 
-               // Then we try addon-provided modules that we wrap in the LegacyModule class
-               if (!$this->module_class && Core\Addon::isEnabled($this->module) && file_exists("addon/{$this->module}/{$this->module}.php")) {
-                       //Check if module is an app and if public access to apps is allowed or not
-                       $privateapps = $this->config->get('config', 'private_addons', false);
-                       if ((!local_user()) && Core\Hook::isAddonApp($this->module) && $privateapps) {
-                               info(Core\L10n::t("You must be logged in to use addons. "));
+                       $_SESSION['sysmsg']       = Core\Session::get('sysmsg', []);
+                       $_SESSION['sysmsg_info']  = Core\Session::get('sysmsg_info', []);
+                       $_SESSION['last_updated'] = Core\Session::get('last_updated', []);
+
+                       /*
+                        * check_config() is responsible for running update scripts. These automatically
+                        * update the DB schema whenever we push a new one out. It also checks to see if
+                        * any addons have been added or removed and reacts accordingly.
+                        */
+
+                       // in install mode, any url loads install module
+                       // but we need "view" module for stylesheet
+                       if ($this->mode->isInstall() && $moduleName !== 'install') {
+                               $this->internalRedirect('install');
+                       } elseif (!$this->mode->isInstall() && !$this->mode->has(App\Mode::MAINTENANCEDISABLED) && $moduleName !== 'maintenance') {
+                               $this->internalRedirect('maintenance');
                        } else {
-                               include_once "addon/{$this->module}/{$this->module}.php";
-                               if (function_exists($this->module . '_module')) {
-                                       LegacyModule::setModuleFile("addon/{$this->module}/{$this->module}.php");
-                                       $this->module_class = LegacyModule::class;
-                               }
+                               $this->checkURL();
+                               Core\Update::check($this->getBasePath(), false, $this->mode);
+                               Core\Addon::loadAddons();
+                               Core\Hook::loadHooks();
                        }
-               }
-
-               /* Finally, we look for a 'standard' program module in the 'mod' directory
-                * We emulate a Module class through the LegacyModule class
-                */
-               if (!$this->module_class && file_exists("mod/{$this->module}.php")) {
-                       LegacyModule::setModuleFile("mod/{$this->module}.php");
-                       $this->module_class = LegacyModule::class;
-               }
 
-               /* The URL provided does not resolve to a valid module.
-                *
-                * On Dreamhost sites, quite often things go wrong for no apparent reason and they send us to '/internal_error.html'.
-                * We don't like doing this, but as it occasionally accounts for 10-20% or more of all site traffic -
-                * we are going to trap this and redirect back to the requested page. As long as you don't have a critical error on your page
-                * this will often succeed and eventually do the right thing.
-                *
-                * Otherwise we are going to emit a 404 not found.
-                */
-               if (!$this->module_class) {
-                       // Stupid browser tried to pre-fetch our Javascript img template. Don't log the event or return anything - just quietly exit.
-                       if (!empty($_SERVER['QUERY_STRING']) && preg_match('/{[0-9]}/', $_SERVER['QUERY_STRING']) !== 0) {
-                               exit();
+                       // Compatibility with the Android Diaspora client
+                       if ($moduleName == 'stream') {
+                               $this->internalRedirect('network?order=post');
                        }
 
-                       if (!empty($_SERVER['QUERY_STRING']) && ($_SERVER['QUERY_STRING'] === 'q=internal_error.html') && isset($dreamhost_error_hack)) {
-                               Core\Logger::log('index.php: dreamhost_error_hack invoked. Original URI =' . $_SERVER['REQUEST_URI']);
-                               $this->internalRedirect($_SERVER['REQUEST_URI']);
+                       if ($moduleName == 'conversations') {
+                               $this->internalRedirect('message');
                        }
 
-                       Core\Logger::log('index.php: page not found: ' . $_SERVER['REQUEST_URI'] . ' ADDRESS: ' . $_SERVER['REMOTE_ADDR'] . ' QUERY: ' . $_SERVER['QUERY_STRING'], Core\Logger::DEBUG);
-
-                       $this->module_class = Module\PageNotFound::class;
-               }
-
-               // Initialize module that can set the current theme in the init() method, either directly or via App->profile_uid
-               $this->page['page_title'] = $this->module;
-               try {
-                       $placeholder = '';
-
-                       Core\Hook::callAll($this->module . '_mod_init', $placeholder);
-
-                       call_user_func([$this->module_class, 'init']);
-
-                       // "rawContent" is especially meant for technical endpoints.
-                       // This endpoint doesn't need any theme initialization or other comparable stuff.
-                       call_user_func([$this->module_class, 'rawContent']);
-
-                       // Load current theme info after module has been initialized as theme could have been set in module
-                       $theme_info_file = 'view/theme/' . $this->getCurrentTheme() . '/theme.php';
-                       if (file_exists($theme_info_file)) {
-                               require_once $theme_info_file;
+                       if ($moduleName == 'commented') {
+                               $this->internalRedirect('network?order=comment');
                        }
 
-                       if (function_exists(str_replace('-', '_', $this->getCurrentTheme()) . '_init')) {
-                               $func = str_replace('-', '_', $this->getCurrentTheme()) . '_init';
-                               $func($this);
+                       if ($moduleName == 'liked') {
+                               $this->internalRedirect('network?order=comment');
                        }
 
-                       if ($_SERVER['REQUEST_METHOD'] === 'POST') {
-                               Core\Hook::callAll($this->module . '_mod_post', $_POST);
-                               call_user_func([$this->module_class, 'post']);
+                       if ($moduleName == 'activity') {
+                               $this->internalRedirect('network?conv=1');
                        }
 
-                       Core\Hook::callAll($this->module . '_mod_afterpost', $placeholder);
-                       call_user_func([$this->module_class, 'afterpost']);
-               } catch(HTTPException $e) {
-                       Module\Special\HTTPException::rawContent($e);
-               }
-
-               $content = '';
-
-               try {
-                       $arr = ['content' => $content];
-                       Core\Hook::callAll($this->module . '_mod_content', $arr);
-                       $content = $arr['content'];
-                       $arr = ['content' => call_user_func([$this->module_class, 'content'])];
-                       Core\Hook::callAll($this->module . '_mod_aftercontent', $arr);
-                       $content .= $arr['content'];
-               } catch(HTTPException $e) {
-                       $content = Module\Special\HTTPException::content($e);
-               }
-
-               // initialise content region
-               if ($this->getMode()->isNormal()) {
-                       Core\Hook::callAll('page_content_top', $this->page['content']);
-               }
-
-               $this->page['content'] .= $content;
-
-               /* Create the page head after setting the language
-                * and getting any auth credentials.
-                *
-                * Moved initHead() and initFooter() to after
-                * all the module functions have executed so that all
-                * theme choices made by the modules can take effect.
-                */
-               $this->initHead();
-
-               /* Build the page ending -- this is stuff that goes right before
-                * the closing </body> tag
-                */
-               $this->initFooter();
-
-               if (!$this->isAjax()) {
-                       Core\Hook::callAll('page_end', $this->page['content']);
-               }
-
-               // Add the navigation (menu) template
-               if ($this->module != 'install' && $this->module != 'maintenance') {
-                       $this->page['htmlhead'] .= Core\Renderer::replaceMacros(Core\Renderer::getMarkupTemplate('nav_head.tpl'), []);
-                       $this->page['nav']       = Content\Nav::build($this);
-               }
-
-               // Build the page - now that we have all the components
-               if (isset($_GET["mode"]) && (($_GET["mode"] == "raw") || ($_GET["mode"] == "minimal"))) {
-                       $doc = new DOMDocument();
-
-                       $target = new DOMDocument();
-                       $target->loadXML("<root></root>");
-
-                       $content = mb_convert_encoding($this->page["content"], 'HTML-ENTITIES', "UTF-8");
-
-                       /// @TODO one day, kill those error-surpressing @ stuff, or PHP should ban it
-                       @$doc->loadHTML($content);
-
-                       $xpath = new DOMXPath($doc);
-
-                       $list = $xpath->query("//*[contains(@id,'tread-wrapper-')]");  /* */
-
-                       foreach ($list as $item) {
-                               $item = $target->importNode($item, true);
-
-                               // And then append it to the target
-                               $target->documentElement->appendChild($item);
+                       if (($moduleName == 'status_messages') && ($this->args->getCommand() == 'status_messages/new')) {
+                               $this->internalRedirect('bookmarklet');
                        }
 
-                       if ($_GET["mode"] == "raw") {
-                               header("Content-type: text/html; charset=utf-8");
-
-                               echo substr($target->saveHTML(), 6, -8);
-
-                               exit();
+                       if (($moduleName == 'user') && ($this->args->getCommand() == 'user/edit')) {
+                               $this->internalRedirect('settings');
                        }
-               }
 
-               $page    = $this->page;
-               $profile = $this->profile;
+                       if (($moduleName == 'tag_followings') && ($this->args->getCommand() == 'tag_followings/manage')) {
+                               $this->internalRedirect('search');
+                       }
 
-               header("X-Friendica-Version: " . FRIENDICA_VERSION);
-               header("Content-type: text/html; charset=utf-8");
+                       // Initialize module that can set the current theme in the init() method, either directly or via App->profile_uid
+                       $this->page['page_title'] = $moduleName;
 
-               if ($this->config->get('system', 'hsts') && ($this->baseURL->getSSLPolicy() == BaseUrl::SSL_POLICY_FULL)) {
-                       header("Strict-Transport-Security: max-age=31536000");
-               }
+                       // determine the module class and save it to the module instance
+                       // @todo there's an implicit dependency due SESSION::start(), so it has to be called here (yet)
+                       $module = $module->determineClass($this->args, $router, $this->config);
 
-               // Some security stuff
-               header('X-Content-Type-Options: nosniff');
-               header('X-XSS-Protection: 1; mode=block');
-               header('X-Permitted-Cross-Domain-Policies: none');
-               header('X-Frame-Options: sameorigin');
-
-               // Things like embedded OSM maps don't work, when this is enabled
-               // header("Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; connect-src 'self'; style-src 'self' 'unsafe-inline'; font-src 'self'; img-src 'self' https: data:; media-src 'self' https:; child-src 'self' https:; object-src 'none'");
-
-               /* We use $_GET["mode"] for special page templates. So we will check if we have
-                * to load another page template than the default one.
-                * The page templates are located in /view/php/ or in the theme directory.
-                */
-               if (isset($_GET["mode"])) {
-                       $template = Core\Theme::getPathForFile($_GET["mode"] . '.php');
-               }
+                       // Let the module run it's internal process (init, get, post, ...)
+                       $module->run($this->l10n, $this, $this->logger, $this->getCurrentTheme(), $_SERVER, $_POST);
 
-               // If there is no page template use the default page template
-               if (empty($template)) {
-                       $template = Core\Theme::getPathForFile("default.php");
+               } catch (HTTPException $e) {
+                       ModuleHTTPException::rawContent($e);
                }
 
-               // Theme templates expect $a as an App instance
-               $a = $this;
-
-               // Used as is in view/php/default.php
-               $lang = Core\L10n::getCurrentLang();
-
-               /// @TODO Looks unsafe (remote-inclusion), is maybe not but Core\Theme::getPathForFile() uses file_exists() but does not escape anything
-               require_once $template;
+               $this->page->run($this, $this->baseURL, $this->mode, $module, $this->l10n, $this->config, $pconfig);
        }
 
        /**
@@ -1355,7 +747,7 @@ class App
         * If you want to redirect to a external URL, use System::externalRedirectTo()
         *
         * @param string $toUrl The destination URL (Default is empty, which is the default page of the Friendica node)
-        * @param bool $ssl if true, base URL will try to get called with https:// (works just for relative paths)
+        * @param bool   $ssl   if true, base URL will try to get called with https:// (works just for relative paths)
         *
         * @throws HTTPException\InternalServerErrorException In Case the given URL is not relative to the Friendica node
         */
@@ -1365,7 +757,7 @@ class App
                        throw new HTTPException\InternalServerErrorException("'$toUrl is not a relative path, please use System::externalRedirectTo");
                }
 
-               $redirectTo = $this->getBaseURL($ssl) . '/' . ltrim($toUrl, '/');
+               $redirectTo = $this->baseURL->get($ssl) . '/' . ltrim($toUrl, '/');
                Core\System::externalRedirect($redirectTo);
        }
 
@@ -1374,6 +766,7 @@ class App
         * Should only be used if it isn't clear if the URL is either internal or external
         *
         * @param string $toUrl The target URL
+        *
         * @throws HTTPException\InternalServerErrorException
         */
        public function redirect($toUrl)
diff --git a/src/App/Arguments.php b/src/App/Arguments.php
new file mode 100644 (file)
index 0000000..8047186
--- /dev/null
@@ -0,0 +1,194 @@
+<?php
+
+namespace Friendica\App;
+
+/**
+ * Determine all arguments of the current call, including
+ * - The whole querystring (except the pagename/q parameter)
+ * - The command
+ * - The arguments (C-Style based)
+ * - The count of arguments
+ */
+class Arguments
+{
+       /**
+        * @var string The complete query string
+        */
+       private $queryString;
+       /**
+        * @var string The current Friendica command
+        */
+       private $command;
+       /**
+        * @var array The arguments of the current execution
+        */
+       private $argv;
+       /**
+        * @var int The count of arguments
+        */
+       private $argc;
+
+       public function __construct(string $queryString = '', string $command = '', array $argv = [Module::DEFAULT], int $argc = 1)
+       {
+               $this->queryString = $queryString;
+               $this->command     = $command;
+               $this->argv        = $argv;
+               $this->argc        = $argc;
+       }
+
+       /**
+        * @return string The whole query string of this call
+        */
+       public function getQueryString()
+       {
+               return $this->queryString;
+       }
+
+       /**
+        * @return string The whole command of this call
+        */
+       public function getCommand()
+       {
+               return $this->command;
+       }
+
+       /**
+        * @return array All arguments of this call
+        */
+       public function getArgv()
+       {
+               return $this->argv;
+       }
+
+       /**
+        * @return int The count of arguments of this call
+        */
+       public function getArgc()
+       {
+               return $this->argc;
+       }
+
+       /**
+        * Returns the value of a argv key
+        * @todo there are a lot of $a->argv usages in combination with defaults() which can be replaced with this method
+        *
+        * @param int   $position the position of the argument
+        * @param mixed $default  the default value if not found
+        *
+        * @return mixed returns the value of the argument
+        */
+       public function get(int $position, $default = '')
+       {
+               return $this->has($position) ? $this->argv[$position] : $default;
+       }
+
+       /**
+        * @param int $position
+        *
+        * @return bool if the argument position exists
+        */
+       public function has(int $position)
+       {
+               return array_key_exists($position, $this->argv);
+       }
+
+       /**
+        * Determine the arguments of the current call
+        *
+        * @param array $server The $_SERVER variable
+        * @param array $get    The $_GET variable
+        *
+        * @return Arguments The determined arguments
+        */
+       public function determine(array $server, array $get)
+       {
+               $queryString = '';
+
+               if (!empty($server['QUERY_STRING']) && strpos($server['QUERY_STRING'], 'pagename=') === 0) {
+                       $queryString = substr($server['QUERY_STRING'], 9);
+               } elseif (!empty($server['QUERY_STRING']) && strpos($server['QUERY_STRING'], 'q=') === 0) {
+                       $queryString = substr($server['QUERY_STRING'], 2);
+               }
+
+               // eventually strip ZRL
+               $queryString = $this->stripZRLs($queryString);
+
+               // eventually strip OWT
+               $queryString = $this->stripQueryParam($queryString, 'owt');
+
+               // removing trailing / - maybe a nginx problem
+               $queryString = ltrim($queryString, '/');
+
+               if (!empty($get['pagename'])) {
+                       $command = trim($get['pagename'], '/\\');
+               } elseif (!empty($get['q'])) {
+                       $command = trim($get['q'], '/\\');
+               } else {
+                       $command = Module::DEFAULT;
+               }
+
+
+               // fix query_string
+               if (!empty($command)) {
+                       $queryString = str_replace(
+                               $command . '&',
+                               $command . '?',
+                               $queryString
+                       );
+               }
+
+               // unix style "homedir"
+               if (substr($command, 0, 1) === '~') {
+                       $command = 'profile/' . substr($command, 1);
+               }
+
+               // Diaspora style profile url
+               if (substr($command, 0, 2) === 'u/') {
+                       $command = 'profile/' . substr($command, 2);
+               }
+
+               /*
+                * Break the URL path into C style argc/argv style arguments for our
+                * modules. Given "http://example.com/module/arg1/arg2", $this->argc
+                * will be 3 (integer) and $this->argv will contain:
+                *   [0] => 'module'
+                *   [1] => 'arg1'
+                *   [2] => 'arg2'
+                *
+                *
+                * There will always be one argument. If provided a naked domain
+                * URL, $this->argv[0] is set to "home".
+                */
+
+               $argv = explode('/', $command);
+               $argc = count($argv);
+
+
+               return new Arguments($queryString, $command, $argv, $argc);
+       }
+
+       /**
+        * Strip zrl parameter from a string.
+        *
+        * @param string $queryString The input string.
+        *
+        * @return string The zrl.
+        */
+       public function stripZRLs(string $queryString)
+       {
+               return preg_replace('/[?&]zrl=(.*?)(&|$)/ism', '$2', $queryString);
+       }
+
+       /**
+        * Strip query parameter from a string.
+        *
+        * @param string $queryString The input string.
+        * @param string $param
+        *
+        * @return string The query parameter.
+        */
+       public function stripQueryParam(string $queryString, string $param)
+       {
+               return preg_replace('/[?&]' . $param . '=(.*?)(&|$)/ism', '$2', $queryString);
+       }
+}
\ No newline at end of file
diff --git a/src/App/BaseURL.php b/src/App/BaseURL.php
new file mode 100644 (file)
index 0000000..ad5fd0d
--- /dev/null
@@ -0,0 +1,417 @@
+<?php
+
+namespace Friendica\App;
+
+use Friendica\Core\Config\Configuration;
+use Friendica\Util\Network;
+use Friendica\Util\Strings;
+
+/**
+ * A class which checks and contains the basic
+ * environment for the BaseURL (url, urlpath, ssl_policy, hostname, scheme)
+ */
+class BaseURL
+{
+       /**
+        * No SSL necessary
+        */
+       const SSL_POLICY_NONE = 0;
+
+       /**
+        * SSL is necessary
+        */
+       const SSL_POLICY_FULL = 1;
+
+       /**
+        * SSL is optional, but preferred
+        */
+       const SSL_POLICY_SELFSIGN = 2;
+
+       /**
+        * Define the Default SSL scheme
+        */
+       const DEFAULT_SSL_SCHEME = self::SSL_POLICY_SELFSIGN;
+
+       /**
+        * The Friendica Config
+        *
+        * @var Configuration
+        */
+       private $config;
+
+       /**
+        * The server side variables
+        *
+        * @var array
+        */
+       private $server;
+
+       /**
+        * The hostname of the Base URL
+        *
+        * @var string
+        */
+       private $hostname;
+
+       /**
+        * The SSL_POLICY of the Base URL
+        *
+        * @var int
+        */
+       private $sslPolicy;
+
+       /**
+        * The URL sub-path of the Base URL
+        *
+        * @var string
+        */
+       private $urlPath;
+
+       /**
+        * The full URL
+        *
+        * @var string
+        */
+       private $url;
+
+       /**
+        * The current scheme of this call
+        *
+        * @var string
+        */
+       private $scheme;
+
+       /**
+        * Returns the hostname of this node
+        *
+        * @return string
+        */
+       public function getHostname()
+       {
+               return $this->hostname;
+       }
+
+       /**
+        * Returns the current scheme of this call
+        *
+        * @return string
+        */
+       public function getScheme()
+       {
+               return $this->scheme;
+       }
+
+       /**
+        * Returns the SSL policy of this node
+        *
+        * @return int
+        */
+       public function getSSLPolicy()
+       {
+               return $this->sslPolicy;
+       }
+
+       /**
+        * Returns the sub-path of this URL
+        *
+        * @return string
+        */
+       public function getUrlPath()
+       {
+               return $this->urlPath;
+       }
+
+       /**
+        * Returns the full URL of this call
+        *
+        * Note: $ssl parameter value doesn't directly correlate with the resulting protocol
+        *
+        * @param bool $ssl True, if ssl should get used
+        *
+        * @return string
+        */
+       public function get($ssl = false)
+       {
+               if ($this->sslPolicy === self::SSL_POLICY_SELFSIGN && $ssl) {
+                       return Network::switchScheme($this->url);
+               }
+
+               return $this->url;
+       }
+
+       /**
+        * Save current parts of the base Url
+        *
+        * @param string? $hostname
+        * @param int?    $sslPolicy
+        * @param string? $urlPath
+        *
+        * @return bool true, if successful
+        */
+       public function save($hostname = null, $sslPolicy = null, $urlPath = null)
+       {
+               $currHostname  = $this->hostname;
+               $currSSLPolicy = $this->sslPolicy;
+               $currURLPath   = $this->urlPath;
+
+               if (!empty($hostname) && $hostname !== $this->hostname) {
+                       if ($this->config->set('config', 'hostname', $hostname)) {
+                               $this->hostname = $hostname;
+                       } else {
+                               return false;
+                       }
+               }
+
+               if (isset($sslPolicy) && $sslPolicy !== $this->sslPolicy) {
+                       if ($this->config->set('system', 'ssl_policy', $sslPolicy)) {
+                               $this->sslPolicy = $sslPolicy;
+                       } else {
+                               $this->hostname = $currHostname;
+                               $this->config->set('config', 'hostname', $this->hostname);
+                               return false;
+                       }
+               }
+
+               if (isset($urlPath) && $urlPath !== $this->urlPath) {
+                       if ($this->config->set('system', 'urlpath', $urlPath)) {
+                               $this->urlPath = $urlPath;
+                       } else {
+                               $this->hostname  = $currHostname;
+                               $this->sslPolicy = $currSSLPolicy;
+                               $this->config->set('config', 'hostname', $this->hostname);
+                               $this->config->set('system', 'ssl_policy', $this->sslPolicy);
+                               return false;
+                       }
+               }
+
+               $this->determineBaseUrl();
+               if (!$this->config->set('system', 'url', $this->url)) {
+                       $this->hostname  = $currHostname;
+                       $this->sslPolicy = $currSSLPolicy;
+                       $this->urlPath   = $currURLPath;
+                       $this->determineBaseUrl();
+
+                       $this->config->set('config', 'hostname', $this->hostname);
+                       $this->config->set('system', 'ssl_policy', $this->sslPolicy);
+                       $this->config->set('system', 'urlpath', $this->urlPath);
+                       return false;
+               }
+
+               return true;
+       }
+
+       /**
+        * Save the current url as base URL
+        *
+        * @param $url
+        *
+        * @return bool true, if the save was successful
+        */
+       public function saveByURL($url)
+       {
+               $parsed = @parse_url($url);
+
+               if (empty($parsed)) {
+                       return false;
+               }
+
+               $hostname = $parsed['host'];
+               if (!empty($hostname) && !empty($parsed['port'])) {
+                       $hostname .= ':' . $parsed['port'];
+               }
+
+               $urlPath = null;
+               if (!empty($parsed['path'])) {
+                       $urlPath = trim($parsed['path'], '\\/');
+               }
+
+               $sslPolicy = null;
+               if (!empty($parsed['scheme'])) {
+                       if ($parsed['scheme'] == 'https') {
+                               $sslPolicy = BaseURL::SSL_POLICY_FULL;
+                       }
+               }
+
+               return $this->save($hostname, $sslPolicy, $urlPath);
+       }
+
+       /**
+        * Checks, if a redirect to the HTTPS site would be necessary
+        *
+        * @return bool
+        */
+       public function checkRedirectHttps()
+       {
+               return $this->config->get('system', 'force_ssl') &&
+                      ($this->getScheme() == "http") &&
+                      intval($this->getSSLPolicy()) == BaseURL::SSL_POLICY_FULL &&
+                      strpos($this->get(), 'https://') === 0 &&
+                      !empty($this->server['REQUEST_METHOD']) &&
+                      $this->server['REQUEST_METHOD'] === 'GET';
+       }
+
+       /**
+        * @param Configuration $config The Friendica configuration
+        * @param array         $server The $_SERVER array
+        */
+       public function __construct(Configuration $config, array $server)
+       {
+               $this->config = $config;
+               $this->server = $server;
+
+               $this->determineSchema();
+               $this->checkConfig();
+       }
+
+       /**
+        * Check the current config during loading
+        */
+       public function checkConfig()
+       {
+               $this->hostname  = $this->config->get('config', 'hostname');
+               $this->urlPath   = $this->config->get('system', 'urlpath');
+               $this->sslPolicy = $this->config->get('system', 'ssl_policy');
+               $this->url       = $this->config->get('system', 'url');
+
+               if (empty($this->hostname)) {
+                       $this->determineHostname();
+
+                       if (!empty($this->hostname)) {
+                               $this->config->set('config', 'hostname', $this->hostname);
+                       }
+               }
+
+               if (!isset($this->urlPath)) {
+                       $this->determineURLPath();
+                       $this->config->set('system', 'urlpath', $this->urlPath);
+               }
+
+               if (!isset($this->sslPolicy)) {
+                       if ($this->scheme == 'https') {
+                               $this->sslPolicy = self::SSL_POLICY_FULL;
+                       } else {
+                               $this->sslPolicy = self::DEFAULT_SSL_SCHEME;
+                       }
+                       $this->config->set('system', 'ssl_policy', $this->sslPolicy);
+               }
+
+               if (empty($this->url)) {
+                       $this->determineBaseUrl();
+
+                       if (!empty($this->url)) {
+                               $this->config->set('system', 'url', $this->url);
+                       }
+               }
+       }
+
+       /**
+        * Determines the hostname of this node if not set already
+        */
+       private function determineHostname()
+       {
+               $this->hostname = '';
+
+               if (!empty($this->server['SERVER_NAME'])) {
+                       $this->hostname = $this->server['SERVER_NAME'];
+
+                       if (!empty($this->server['SERVER_PORT']) && $this->server['SERVER_PORT'] != 80 && $this->server['SERVER_PORT'] != 443) {
+                               $this->hostname .= ':' . $this->server['SERVER_PORT'];
+                       }
+               }
+       }
+
+       /**
+        * Figure out if we are running at the top of a domain or in a sub-directory
+        */
+       private function determineURLPath()
+       {
+               $this->urlPath = '';
+
+               /*
+                * 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($this->server, 'REDIRECT_URL', $relative_script_path);
+               $relative_script_path = defaults($this->server, 'REDIRECT_URI', $relative_script_path);
+               $relative_script_path = defaults($this->server, 'REDIRECT_SCRIPT_URL', $relative_script_path);
+               $relative_script_path = defaults($this->server, 'SCRIPT_URL', $relative_script_path);
+               $relative_script_path = defaults($this->server, 'REQUEST_URI', $relative_script_path);
+
+               /* $relative_script_path gives /relative/path/to/friendica/module/parameter
+                * QUERY_STRING gives pagename=module/parameter
+                *
+                * 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($this->server['QUERY_STRING'])) {
+                               $this->urlPath = trim(rdirname($relative_script_path, substr_count(trim($this->server['QUERY_STRING'], '/'), '/') + 1), '/');
+                       } else {
+                               // Root page
+                               $this->urlPath = trim($relative_script_path, '/');
+                       }
+               }
+       }
+
+       /**
+        * Determine the full URL based on all parts
+        */
+       private function determineBaseUrl()
+       {
+               $scheme = 'http';
+
+               if ($this->sslPolicy == self::SSL_POLICY_FULL) {
+                       $scheme = 'https';
+               }
+
+               $this->url = $scheme . '://' . $this->hostname . (!empty($this->urlPath) ? '/' . $this->urlPath : '');
+       }
+
+       /**
+        * Determine the scheme of the current used link
+        */
+       private function determineSchema()
+       {
+               $this->scheme = 'http';
+
+               if (!empty($this->server['HTTPS']) ||
+                   !empty($this->server['HTTP_FORWARDED']) && preg_match('/proto=https/', $this->server['HTTP_FORWARDED']) ||
+                   !empty($this->server['HTTP_X_FORWARDED_PROTO']) && $this->server['HTTP_X_FORWARDED_PROTO'] == 'https' ||
+                   !empty($this->server['HTTP_X_FORWARDED_SSL']) && $this->server['HTTP_X_FORWARDED_SSL'] == 'on' ||
+                   !empty($this->server['FRONT_END_HTTPS']) && $this->server['FRONT_END_HTTPS'] == 'on' ||
+                   !empty($this->server['SERVER_PORT']) && (intval($this->server['SERVER_PORT']) == 443) // XXX: reasonable assumption, but isn't this hardcoding too much?
+               ) {
+                       $this->scheme = 'https';
+               }
+       }
+
+       /**
+        * Removes the base url from an url. This avoids some mixed content problems.
+        *
+        * @param string $origURL
+        *
+        * @return string The cleaned url
+        */
+       public function remove(string $origURL)
+       {
+               // Remove the hostname from the url if it is an internal link
+               $nurl = Strings::normaliseLink($origURL);
+               $base = Strings::normaliseLink($this->get());
+               $url  = str_replace($base . '/', '', $nurl);
+
+               // if it is an external link return the orignal value
+               if ($url == Strings::normaliseLink($origURL)) {
+                       return $origURL;
+               } else {
+                       return $url;
+               }
+       }
+}
index 8d82ffc0b499ee57b24df6716d5e11bda4cde783..f3f269b87b9f8b3948556149397cb1e3613aeed1 100644 (file)
@@ -2,8 +2,10 @@
 
 namespace Friendica\App;
 
-use Friendica\Core\Config;
-use Friendica\Database\DBA;
+use Detection\MobileDetect;
+use Friendica\Core\Config\Cache\ConfigCache;
+use Friendica\Database\Database;
+use Friendica\Util\BasePath;
 
 /**
  * Mode of the current Friendica Node
@@ -12,26 +14,44 @@ use Friendica\Database\DBA;
  */
 class Mode
 {
-       const LOCALCONFIGPRESENT = 1;
-       const DBAVAILABLE = 2;
-       const DBCONFIGAVAILABLE = 4;
+       const LOCALCONFIGPRESENT  = 1;
+       const DBAVAILABLE         = 2;
+       const DBCONFIGAVAILABLE   = 4;
        const MAINTENANCEDISABLED = 8;
 
        /***
-        * @var int the mode of this Application
+        * @var int The mode of this Application
         *
         */
        private $mode;
 
        /**
-        * @var string the basepath of the application
+        * @var bool True, if the call is a backend call
         */
-       private $basepath;
+       private $isBackend;
 
-       public function __construct($basepath = '')
+       /**
+        * @var bool True, if the call is a ajax call
+        */
+       private $isAjax;
+
+       /**
+        * @var bool True, if the call is from a mobile device
+        */
+       private $isMobile;
+
+       /**
+        * @var bool True, if the call is from a tablet device
+        */
+       private $isTablet;
+
+       public function __construct(int $mode = 0, bool $isBackend = false, bool $isAjax = false, bool $isMobile = false, bool $isTablet = false)
        {
-               $this->basepath = $basepath;
-               $this->mode = 0;
+               $this->mode      = $mode;
+               $this->isBackend = $isBackend;
+               $this->isAjax    = $isAjax;
+               $this->isMobile  = $isMobile;
+               $this->isTablet  = $isTablet;
        }
 
        /**
@@ -41,42 +61,66 @@ class Mode
         * - App::MODE_MAINTENANCE: The maintenance mode has been set
         * - App::MODE_NORMAL     : Normal run with all features enabled
         *
-        * @param string $basepath the Basepath of the Application
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @return Mode returns the determined mode
+        *
+        * @throws \Exception
         */
-       public function determine($basepath = null)
+       public function determine(BasePath $basepath, Database $database, ConfigCache $configCache)
        {
-               if (!empty($basepath)) {
-                       $this->basepath = $basepath;
-               }
+               $mode = 0;
 
-               $this->mode = 0;
+               $basepathName = $basepath->getPath();
 
-               if (!file_exists($this->basepath . '/config/local.config.php')
-                       && !file_exists($this->basepath . '/config/local.ini.php')
-                       && !file_exists($this->basepath . '/.htconfig.php')) {
-                       return;
+               if (!file_exists($basepathName . '/config/local.config.php')
+                   && !file_exists($basepathName . '/config/local.ini.php')
+                   && !file_exists($basepathName . '/.htconfig.php')) {
+                       return new Mode($mode);
                }
 
-               $this->mode |= Mode::LOCALCONFIGPRESENT;
+               $mode |= Mode::LOCALCONFIGPRESENT;
 
-               if (!DBA::connected()) {
-                       return;
+               if (!$database->connected()) {
+                       return new Mode($mode);
                }
 
-               $this->mode |= Mode::DBAVAILABLE;
+               $mode |= Mode::DBAVAILABLE;
 
-               if (DBA::fetchFirst("SHOW TABLES LIKE 'config'") === false) {
-                       return;
+               if ($database->fetchFirst("SHOW TABLES LIKE 'config'") === false) {
+                       return new Mode($mode);
                }
 
-               $this->mode |= Mode::DBCONFIGAVAILABLE;
+               $mode |= Mode::DBCONFIGAVAILABLE;
 
-               if (Config::get('system', 'maintenance')) {
-                       return;
+               if (!empty($configCache->get('system', 'maintenance')) ||
+                   // Don't use Config or Configuration here because we're possibly BEFORE initializing the Configuration,
+                   // so this could lead to a dependency circle
+                   !empty($database->selectFirst('config', ['v'], ['cat' => 'system', 'k' => 'maintenance'])['v'])) {
+                       return new Mode($mode);
                }
 
-               $this->mode |= Mode::MAINTENANCEDISABLED;
+               $mode |= Mode::MAINTENANCEDISABLED;
+
+               return new Mode($mode, $this->isBackend, $this->isAjax, $this->isMobile, $this->isTablet);
+       }
+
+       /**
+        * Checks if the site is called via a backend process
+        *
+        * @param Module       $module       The pre-loaded module (just name, not class!)
+        * @param array        $server       The $_SERVER variable
+        * @param MobileDetect $mobileDetect The mobile detection library
+        *
+        * @return Mode returns the determined mode
+        */
+       public function determineRunMode(Module $module, array $server, MobileDetect $mobileDetect)
+       {
+               $isBackend = basename(($server['PHP_SELF'] ?? ''), '.php') !== 'index' ||
+                            $module->isBackend();
+               $isMobile  = $mobileDetect->isMobile();
+               $isTablet  = $mobileDetect->isTablet();
+               $isAjax    = strtolower($server['HTTP_X_REQUESTED_WITH'] ?? '') == 'xmlhttprequest';
+
+               return new Mode($this->mode, $isBackend, $isAjax, $isMobile, $isTablet);
        }
 
        /**
@@ -100,7 +144,7 @@ class Mode
        public function isInstall()
        {
                return !$this->has(Mode::LOCALCONFIGPRESENT) ||
-                       !$this->has(MODE::DBCONFIGAVAILABLE);
+                      !$this->has(MODE::DBCONFIGAVAILABLE);
        }
 
        /**
@@ -111,8 +155,48 @@ class Mode
        public function isNormal()
        {
                return $this->has(Mode::LOCALCONFIGPRESENT) &&
-                       $this->has(Mode::DBAVAILABLE) &&
-                       $this->has(Mode::DBCONFIGAVAILABLE) &&
-                       $this->has(Mode::MAINTENANCEDISABLED);
+                      $this->has(Mode::DBAVAILABLE) &&
+                      $this->has(Mode::DBCONFIGAVAILABLE) &&
+                      $this->has(Mode::MAINTENANCEDISABLED);
+       }
+
+       /**
+        * Returns true, if the call is from a backend node (f.e. from a worker)
+        *
+        * @return bool Is it a backend call
+        */
+       public function isBackend()
+       {
+               return $this->isBackend;
+       }
+
+       /**
+        * Check if request was an AJAX (xmlhttprequest) request.
+        *
+        * @return bool true if it was an AJAX request
+        */
+       public function isAjax()
+       {
+               return $this->isAjax;
+       }
+
+       /**
+        * Check if request was a mobile request.
+        *
+        * @return bool true if it was an mobile request
+        */
+       public function isMobile()
+       {
+               return $this->isMobile;
+       }
+
+       /**
+        * Check if request was a tablet request.
+        *
+        * @return bool true if it was an tablet request
+        */
+       public function isTablet()
+       {
+               return $this->isTablet;
        }
 }
diff --git a/src/App/Module.php b/src/App/Module.php
new file mode 100644 (file)
index 0000000..726c8c0
--- /dev/null
@@ -0,0 +1,261 @@
+<?php
+
+namespace Friendica\App;
+
+use Friendica\App;
+use Friendica\BaseObject;
+use Friendica\Core;
+use Friendica\LegacyModule;
+use Friendica\Module\Home;
+use Friendica\Module\PageNotFound;
+use Psr\Log\LoggerInterface;
+
+/**
+ * Holds the common context of the current, loaded module
+ */
+class Module
+{
+       const DEFAULT       = 'home';
+       const DEFAULT_CLASS = Home::class;
+       /**
+        * A list of modules, which are backend methods
+        *
+        * @var array
+        */
+       const BACKEND_MODULES = [
+               '_well_known',
+               'api',
+               'dfrn_notify',
+               'feed',
+               'fetch',
+               'followers',
+               'following',
+               'hcard',
+               'hostxrd',
+               'inbox',
+               'manifest',
+               'nodeinfo',
+               'noscrape',
+               'objects',
+               'outbox',
+               'poco',
+               'post',
+               'proxy',
+               'pubsub',
+               'pubsubhubbub',
+               'receive',
+               'rsd_xml',
+               'salmon',
+               'statistics_json',
+               'xrd',
+       ];
+
+       /**
+        * @var string The module name
+        */
+       private $module;
+
+       /**
+        * @var BaseObject The module class
+        */
+       private $module_class;
+
+       /**
+        * @var bool true, if the module is a backend module
+        */
+       private $isBackend;
+
+       /**
+        * @var bool true, if the loaded addon is private, so we have to print out not allowed
+        */
+       private $printNotAllowedAddon;
+
+       /**
+        * @return string
+        */
+       public function getName()
+       {
+               return $this->module;
+       }
+
+       /**
+        * @return string The base class name
+        */
+       public function getClassName()
+       {
+               return $this->module_class;
+       }
+
+       /**
+        * @return bool True, if the current module is a backend module
+        * @see Module::BACKEND_MODULES for a list
+        */
+       public function isBackend()
+       {
+               return $this->isBackend;
+       }
+
+       public function __construct(string $module = self::DEFAULT, string $moduleClass = self::DEFAULT_CLASS, bool $isBackend = false, bool $printNotAllowedAddon = false)
+       {
+               $this->module               = $module;
+               $this->module_class         = $moduleClass;
+               $this->isBackend            = $isBackend;
+               $this->printNotAllowedAddon = $printNotAllowedAddon;
+       }
+
+       /**
+        * Determines the current module based on the App arguments and the server variable
+        *
+        * @param Arguments $args   The Friendica arguments
+        *
+        * @return Module The module with the determined module
+        */
+       public function determineModule(Arguments $args)
+       {
+               if ($args->getArgc() > 0) {
+                       $module = str_replace('.', '_', $args->get(0));
+                       $module = str_replace('-', '_', $module);
+               } else {
+                       $module = self::DEFAULT;
+               }
+
+               // Compatibility with the Firefox App
+               if (($module == "users") && ($args->getCommand() == "users/sign_in")) {
+                       $module = "login";
+               }
+
+               $isBackend = in_array($module, Module::BACKEND_MODULES);;
+
+               return new Module($module, $this->module_class, $isBackend, $this->printNotAllowedAddon);
+       }
+
+       /**
+        * Determine the class of the current module
+        *
+        * @param Arguments                 $args   The Friendica execution arguments
+        * @param Router                    $router The Friendica routing instance
+        * @param Core\Config\Configuration $config The Friendica Configuration
+        *
+        * @return Module The determined module of this call
+        *
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        */
+       public function determineClass(Arguments $args, Router $router, Core\Config\Configuration $config)
+       {
+               $printNotAllowedAddon = false;
+
+               /**
+                * ROUTING
+                *
+                * From the request URL, routing consists of obtaining the name of a BaseModule-extending class of which the
+                * post() and/or content() static methods can be respectively called to produce a data change or an output.
+                **/
+
+               // First we try explicit routes defined in App\Router
+               $router->collectRoutes();
+
+               $data = $router->getRouteCollector();
+               Core\Hook::callAll('route_collection', $data);
+
+               $module_class = $router->getModuleClass($args->getCommand());
+
+               // Then we try addon-provided modules that we wrap in the LegacyModule class
+               if (!$module_class && Core\Addon::isEnabled($this->module) && file_exists("addon/{$this->module}/{$this->module}.php")) {
+                       //Check if module is an app and if public access to apps is allowed or not
+                       $privateapps = $config->get('config', 'private_addons', false);
+                       if ((!local_user()) && Core\Hook::isAddonApp($this->module) && $privateapps) {
+                               $printNotAllowedAddon = true;
+                       } else {
+                               include_once "addon/{$this->module}/{$this->module}.php";
+                               if (function_exists($this->module . '_module')) {
+                                       LegacyModule::setModuleFile("addon/{$this->module}/{$this->module}.php");
+                                       $module_class = LegacyModule::class;
+                               }
+                       }
+               }
+
+               /* Finally, we look for a 'standard' program module in the 'mod' directory
+                * We emulate a Module class through the LegacyModule class
+                */
+               if (!$module_class && file_exists("mod/{$this->module}.php")) {
+                       LegacyModule::setModuleFile("mod/{$this->module}.php");
+                       $module_class = LegacyModule::class;
+               }
+
+               $module_class = !isset($module_class) ? PageNotFound::class : $module_class;
+
+               return new Module($this->module, $module_class, $this->isBackend, $printNotAllowedAddon);
+       }
+
+       /**
+        * Run the determined module class and calls all hooks applied to
+        *
+        * @param Core\L10n\L10n  $l10n         The L10n instance
+        * @param App             $app          The whole Friendica app (for method arguments)
+        * @param LoggerInterface $logger       The Friendica logger
+        * @param string          $currentTheme The chosen theme
+        * @param array           $server       The $_SERVER variable
+        * @param array           $post         The $_POST variables
+        *
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        */
+       public function run(Core\L10n\L10n $l10n, App $app, LoggerInterface $logger, string $currentTheme, array $server, array $post)
+       {
+               if ($this->printNotAllowedAddon) {
+                       info($l10n->t("You must be logged in to use addons. "));
+               }
+
+               /* The URL provided does not resolve to a valid module.
+                *
+                * On Dreamhost sites, quite often things go wrong for no apparent reason and they send us to '/internal_error.html'.
+                * We don't like doing this, but as it occasionally accounts for 10-20% or more of all site traffic -
+                * we are going to trap this and redirect back to the requested page. As long as you don't have a critical error on your page
+                * this will often succeed and eventually do the right thing.
+                *
+                * Otherwise we are going to emit a 404 not found.
+                */
+               if ($this->module_class === PageNotFound::class) {
+                       $queryString = $server['QUERY_STRING'];
+                       // Stupid browser tried to pre-fetch our Javascript img template. Don't log the event or return anything - just quietly exit.
+                       if (!empty($queryString) && preg_match('/{[0-9]}/', $queryString) !== 0) {
+                               exit();
+                       }
+
+                       if (!empty($queryString) && ($queryString === 'q=internal_error.html') && isset($dreamhost_error_hack)) {
+                               $logger->info('index.php: dreamhost_error_hack invoked.', ['Original URI' => $server['REQUEST_URI']]);
+                               $app->internalRedirect($server['REQUEST_URI']);
+                       }
+
+                       $logger->debug('index.php: page not found.', ['request_uri' => $server['REQUEST_URI'], 'address' => $server['REMOTE_ADDR'], 'query' => $server['QUERY_STRING']]);
+               }
+
+               $placeholder = '';
+
+               Core\Hook::callAll($this->module . '_mod_init', $placeholder);
+
+               call_user_func([$this->module_class, 'init']);
+
+               // "rawContent" is especially meant for technical endpoints.
+               // This endpoint doesn't need any theme initialization or other comparable stuff.
+               call_user_func([$this->module_class, 'rawContent']);
+
+               // Load current theme info after module has been initialized as theme could have been set in module
+               $theme_info_file = 'view/theme/' . $currentTheme . '/theme.php';
+               if (file_exists($theme_info_file)) {
+                       require_once $theme_info_file;
+               }
+
+               if (function_exists(str_replace('-', '_', $currentTheme) . '_init')) {
+                       $func = str_replace('-', '_', $currentTheme) . '_init';
+                       $func($app);
+               }
+
+               if ($server['REQUEST_METHOD'] === 'POST') {
+                       Core\Hook::callAll($this->module . '_mod_post', $post);
+                       call_user_func([$this->module_class, 'post']);
+               }
+
+               Core\Hook::callAll($this->module . '_mod_afterpost', $placeholder);
+               call_user_func([$this->module_class, 'afterpost']);
+       }
+}
diff --git a/src/App/Page.php b/src/App/Page.php
new file mode 100644 (file)
index 0000000..0bccbd7
--- /dev/null
@@ -0,0 +1,464 @@
+<?php
+
+namespace Friendica\App;
+
+use ArrayAccess;
+use DOMDocument;
+use DOMXPath;
+use Friendica\App;
+use Friendica\Content\Nav;
+use Friendica\Core\Config\Configuration;
+use Friendica\Core\Config\PConfiguration;
+use Friendica\Core\Hook;
+use Friendica\Core\L10n\L10n;
+use Friendica\Core\Renderer;
+use Friendica\Core\Theme;
+use Friendica\Module\Special\HTTPException as ModuleHTTPException;
+use Friendica\Network\HTTPException;
+
+/**
+ * Contains the page specific environment variables for the current Page
+ * - Contains all stylesheets
+ * - Contains all footer-scripts
+ * - Contains all page specific content (header, footer, content, ...)
+ *
+ * The run() method is the single point where the page will get printed to the screen
+ */
+class Page implements ArrayAccess
+{
+       /**
+        * @var array Contains all stylesheets, which should get loaded during page
+        */
+       private $stylesheets;
+       /**
+        * @var array Contains all scripts, which are added to the footer at last
+        */
+       private $footerScripts;
+       /**
+        * @var array The page content, which are showed directly
+        */
+       private $page;
+       /**
+        * @var string The basepath of the page
+        */
+       private $basePath;
+
+       /**
+        * @param string $basepath The Page basepath
+        */
+       public function __construct(string $basepath)
+       {
+               $this->basePath = $basepath;
+
+               $this->page = [
+                       'aside'       => '',
+                       'bottom'      => '',
+                       'content'     => '',
+                       'footer'      => '',
+                       'htmlhead'    => '',
+                       'nav'         => '',
+                       'page_title'  => '',
+                       'right_aside' => '',
+                       'template'    => '',
+                       'title'       => ''
+               ];
+       }
+
+       /**
+        * Whether a offset exists
+        *
+        * @link  https://php.net/manual/en/arrayaccess.offsetexists.php
+        *
+        * @param mixed $offset <p>
+        *                      An offset to check for.
+        *                      </p>
+        *
+        * @return boolean true on success or false on failure.
+        * </p>
+        * <p>
+        * The return value will be casted to boolean if non-boolean was returned.
+        * @since 5.0.0
+        */
+       public function offsetExists($offset)
+       {
+               return isset($this->page[$offset]);
+       }
+
+       /**
+        * Offset to retrieve
+        *
+        * @link  https://php.net/manual/en/arrayaccess.offsetget.php
+        *
+        * @param mixed $offset <p>
+        *                      The offset to retrieve.
+        *                      </p>
+        *
+        * @return mixed Can return all value types.
+        * @since 5.0.0
+        */
+       public function offsetGet($offset)
+       {
+               return $this->page[$offset] ?? null;
+       }
+
+       /**
+        * Offset to set
+        *
+        * @link  https://php.net/manual/en/arrayaccess.offsetset.php
+        *
+        * @param mixed $offset <p>
+        *                      The offset to assign the value to.
+        *                      </p>
+        * @param mixed $value  <p>
+        *                      The value to set.
+        *                      </p>
+        *
+        * @return void
+        * @since 5.0.0
+        */
+       public function offsetSet($offset, $value)
+       {
+               $this->page[$offset] = $value;
+       }
+
+       /**
+        * Offset to unset
+        *
+        * @link  https://php.net/manual/en/arrayaccess.offsetunset.php
+        *
+        * @param mixed $offset <p>
+        *                      The offset to unset.
+        *                      </p>
+        *
+        * @return void
+        * @since 5.0.0
+        */
+       public function offsetUnset($offset)
+       {
+               if (isset($this->page[$offset])) {
+                       unset($this->page[$offset]);
+               }
+       }
+
+       /**
+        * Register a stylesheet file path to be included in the <head> tag of every page.
+        * Inclusion is done in App->initHead().
+        * The path can be absolute or relative to the Friendica installation base folder.
+        *
+        * @param string $path
+        *
+        * @see Page::initHead()
+        *
+        */
+       public function registerStylesheet($path)
+       {
+               if (mb_strpos($path, $this->basePath . DIRECTORY_SEPARATOR) === 0) {
+                       $path = mb_substr($path, mb_strlen($this->basePath . DIRECTORY_SEPARATOR));
+               }
+
+               $this->stylesheets[] = trim($path, '/');
+       }
+
+       /**
+        * Initializes Page->page['htmlhead'].
+        *
+        * Includes:
+        * - Page title
+        * - Favicons
+        * - Registered stylesheets (through App->registerStylesheet())
+        * - Infinite scroll data
+        * - head.tpl template
+        *
+        * @param App            $app     The Friendica App instance
+        * @param Module         $module  The loaded Friendica module
+        * @param L10n           $l10n    The l10n language instance
+        * @param Configuration  $config  The Friendica configuration
+        * @param PConfiguration $pConfig The Friendica personal configuration (for user)
+        *
+        * @throws HTTPException\InternalServerErrorException
+        */
+       private function initHead(App $app, Module $module, L10n $l10n, Configuration $config, PConfiguration $pConfig)
+       {
+               $interval = ((local_user()) ? $pConfig->get(local_user(), 'system', 'update_interval') : 40000);
+
+               // If the update is 'deactivated' set it to the highest integer number (~24 days)
+               if ($interval < 0) {
+                       $interval = 2147483647;
+               }
+
+               if ($interval < 10000) {
+                       $interval = 40000;
+               }
+
+               // Default title: current module called
+               if (empty($this->page['title']) && $module->getName()) {
+                       $this->page['title'] = ucfirst($module->getName());
+               }
+
+               // Prepend the sitename to the page title
+               $this->page['title'] = $config->get('config', 'sitename', '') . (!empty($this->page['title']) ? ' | ' . $this->page['title'] : '');
+
+               if (!empty(Renderer::$theme['stylesheet'])) {
+                       $stylesheet = Renderer::$theme['stylesheet'];
+               } else {
+                       $stylesheet = $app->getCurrentThemeStylesheetPath();
+               }
+
+               $this->registerStylesheet($stylesheet);
+
+               $shortcut_icon = $config->get('system', 'shortcut_icon');
+               if ($shortcut_icon == '') {
+                       $shortcut_icon = 'images/friendica-32.png';
+               }
+
+               $touch_icon = $config->get('system', 'touch_icon');
+               if ($touch_icon == '') {
+                       $touch_icon = 'images/friendica-128.png';
+               }
+
+               Hook::callAll('head', $this->page['htmlhead']);
+
+               $tpl = Renderer::getMarkupTemplate('head.tpl');
+               /* put the head template at the beginning of page['htmlhead']
+                * since the code added by the modules frequently depends on it
+                * being first
+                */
+               $this->page['htmlhead'] = Renderer::replaceMacros($tpl, [
+                               '$local_user'      => local_user(),
+                               '$generator'       => 'Friendica' . ' ' . FRIENDICA_VERSION,
+                               '$delitem'         => $l10n->t('Delete this item?'),
+                               '$update_interval' => $interval,
+                               '$shortcut_icon'   => $shortcut_icon,
+                               '$touch_icon'      => $touch_icon,
+                               '$block_public'    => intval($config->get('system', 'block_public')),
+                               '$stylesheets'     => $this->stylesheets,
+                       ]) . $this->page['htmlhead'];
+       }
+
+       /**
+        * Initializes Page->page['footer'].
+        *
+        * Includes:
+        * - Javascript homebase
+        * - Mobile toggle link
+        * - Registered footer scripts (through App->registerFooterScript())
+        * - footer.tpl template
+        *
+        * @param App  $app  The Friendica App instance
+        * @param Mode $mode The Friendica runtime mode
+        * @param L10n $l10n The l10n instance
+        *
+        * @throws HTTPException\InternalServerErrorException
+        */
+       private function initFooter(App $app, Mode $mode, L10n $l10n)
+       {
+               // If you're just visiting, let javascript take you home
+               if (!empty($_SESSION['visitor_home'])) {
+                       $homebase = $_SESSION['visitor_home'];
+               } elseif (local_user()) {
+                       $homebase = 'profile/' . $app->user['nickname'];
+               }
+
+               if (isset($homebase)) {
+                       $this->page['footer'] .= '<script>var homebase="' . $homebase . '";</script>' . "\n";
+               }
+
+               /*
+                * Add a "toggle mobile" link if we're using a mobile device
+                */
+               if ($mode->isMobile() || $mode->isTablet()) {
+                       if (isset($_SESSION['show-mobile']) && !$_SESSION['show-mobile']) {
+                               $link = 'toggle_mobile?address=' . urlencode(curPageURL());
+                       } else {
+                               $link = 'toggle_mobile?off=1&address=' . urlencode(curPageURL());
+                       }
+                       $this->page['footer'] .= Renderer::replaceMacros(Renderer::getMarkupTemplate("toggle_mobile_footer.tpl"), [
+                               '$toggle_link' => $link,
+                               '$toggle_text' => $l10n->t('toggle mobile')
+                       ]);
+               }
+
+               Hook::callAll('footer', $this->page['footer']);
+
+               $tpl                  = Renderer::getMarkupTemplate('footer.tpl');
+               $this->page['footer'] = Renderer::replaceMacros($tpl, [
+                               '$footerScripts' => $this->footerScripts,
+                       ]) . $this->page['footer'];
+       }
+
+       /**
+        * Initializes Page->page['content'].
+        *
+        * Includes:
+        * - module content
+        * - hooks for content
+        *
+        * @param Module $module The module
+        * @param Mode   $mode   The Friendica execution mode
+        *
+        * @throws HTTPException\InternalServerErrorException
+        */
+       private function initContent(Module $module, Mode $mode)
+       {
+               $content = '';
+
+               try {
+                       $moduleClass = $module->getClassName();
+
+                       $arr = ['content' => $content];
+                       Hook::callAll($moduleClass . '_mod_content', $arr);
+                       $content = $arr['content'];
+                       $arr     = ['content' => call_user_func([$moduleClass, 'content'])];
+                       Hook::callAll($moduleClass . '_mod_aftercontent', $arr);
+                       $content .= $arr['content'];
+               } catch (HTTPException $e) {
+                       $content = ModuleHTTPException::content($e);
+               }
+
+               // initialise content region
+               if ($mode->isNormal()) {
+                       Hook::callAll('page_content_top', $this->page['content']);
+               }
+
+               $this->page['content'] .= $content;
+       }
+
+       /**
+        * Register a javascript file path to be included in the <footer> tag of every page.
+        * Inclusion is done in App->initFooter().
+        * The path can be absolute or relative to the Friendica installation base folder.
+        *
+        * @param string $path
+        *
+        * @see Page::initFooter()
+        *
+        */
+       public function registerFooterScript($path)
+       {
+               $url = str_replace($this->basePath . DIRECTORY_SEPARATOR, '', $path);
+
+               $this->footerScripts[] = trim($url, '/');
+       }
+
+       /**
+        * Executes the creation of the current page and prints it to the screen
+        *
+        * @param App            $app     The Friendica App
+        * @param BaseURL        $baseURL The Friendica Base URL
+        * @param Mode           $mode    The current node mode
+        * @param Module         $module  The loaded Friendica module
+        * @param L10n           $l10n    The l10n language class
+        * @param Configuration  $config  The Configuration of this node
+        * @param PConfiguration $pconfig The personal/user configuration
+        *
+        * @throws HTTPException\InternalServerErrorException
+        */
+       public function run(App $app, BaseURL $baseURL, Mode $mode, Module $module, L10n $l10n, Configuration $config, PConfiguration $pconfig)
+       {
+               $moduleName = $module->getName();
+
+               /* Create the page content.
+                * Calls all hooks which are including content operations
+                *
+                * Sets the $Page->page['content'] variable
+                */
+               $this->initContent($module, $mode);
+
+               /* Create the page head after setting the language
+                * and getting any auth credentials.
+                *
+                * Moved initHead() and initFooter() to after
+                * all the module functions have executed so that all
+                * theme choices made by the modules can take effect.
+                */
+               $this->initHead($app, $module, $l10n, $config, $pconfig);
+
+               /* Build the page ending -- this is stuff that goes right before
+                * the closing </body> tag
+                */
+               $this->initFooter($app, $mode, $l10n);
+
+               if (!$mode->isAjax()) {
+                       Hook::callAll('page_end', $this->page['content']);
+               }
+
+               // Add the navigation (menu) template
+               if ($moduleName != 'install' && $moduleName != 'maintenance') {
+                       $this->page['htmlhead'] .= Renderer::replaceMacros(Renderer::getMarkupTemplate('nav_head.tpl'), []);
+                       $this->page['nav']      = Nav::build($app);
+               }
+
+               // Build the page - now that we have all the components
+               if (isset($_GET["mode"]) && (($_GET["mode"] == "raw") || ($_GET["mode"] == "minimal"))) {
+                       $doc = new DOMDocument();
+
+                       $target = new DOMDocument();
+                       $target->loadXML("<root></root>");
+
+                       $content = mb_convert_encoding($this->page["content"], 'HTML-ENTITIES', "UTF-8");
+
+                       /// @TODO one day, kill those error-surpressing @ stuff, or PHP should ban it
+                       @$doc->loadHTML($content);
+
+                       $xpath = new DOMXPath($doc);
+
+                       $list = $xpath->query("//*[contains(@id,'tread-wrapper-')]");  /* */
+
+                       foreach ($list as $item) {
+                               $item = $target->importNode($item, true);
+
+                               // And then append it to the target
+                               $target->documentElement->appendChild($item);
+                       }
+
+                       if ($_GET["mode"] == "raw") {
+                               header("Content-type: text/html; charset=utf-8");
+
+                               echo substr($target->saveHTML(), 6, -8);
+
+                               exit();
+                       }
+               }
+
+               $page    = $this->page;
+               $profile = $app->profile;
+
+               header("X-Friendica-Version: " . FRIENDICA_VERSION);
+               header("Content-type: text/html; charset=utf-8");
+
+               if ($config->get('system', 'hsts') && ($baseURL->getSSLPolicy() == BaseURL::SSL_POLICY_FULL)) {
+                       header("Strict-Transport-Security: max-age=31536000");
+               }
+
+               // Some security stuff
+               header('X-Content-Type-Options: nosniff');
+               header('X-XSS-Protection: 1; mode=block');
+               header('X-Permitted-Cross-Domain-Policies: none');
+               header('X-Frame-Options: sameorigin');
+
+               // Things like embedded OSM maps don't work, when this is enabled
+               // header("Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; connect-src 'self'; style-src 'self' 'unsafe-inline'; font-src 'self'; img-src 'self' https: data:; media-src 'self' https:; child-src 'self' https:; object-src 'none'");
+
+               /* We use $_GET["mode"] for special page templates. So we will check if we have
+                * to load another page template than the default one.
+                * The page templates are located in /view/php/ or in the theme directory.
+                */
+               if (isset($_GET["mode"])) {
+                       $template = Theme::getPathForFile($_GET["mode"] . '.php');
+               }
+
+               // If there is no page template use the default page template
+               if (empty($template)) {
+                       $template = Theme::getPathForFile("default.php");
+               }
+
+               // Theme templates expect $a as an App instance
+               $a = $app;
+
+               // Used as is in view/php/default.php
+               $lang = $l10n->getCurrentLang();
+
+               /// @TODO Looks unsafe (remote-inclusion), is maybe not but Core\Theme::getPathForFile() uses file_exists() but does not escape anything
+               require_once $template;
+       }
+}
index 6720f5443710dedbc142e881f3e5ed14fa74e3bf..50b208792b76a08d55a4734f8c31edabd861f4ea 100644 (file)
@@ -94,6 +94,7 @@ class Router
                $this->routeCollector->addRoute(['GET'],         '/attach/{item:\d+}',   Module\Attach::class);
                $this->routeCollector->addRoute(['GET'],         '/babel',               Module\Debug\Babel::class);
                $this->routeCollector->addRoute(['GET'],         '/bookmarklet',         Module\Bookmarklet::class);
+               $this->routeCollector->addRoute(['GET', 'POST'], '/compose[/{type}]',    Module\Item\Compose::class);
                $this->routeCollector->addGroup('/contact', function (RouteCollector $collector) {
                        $collector->addRoute(['GET'], '[/]',                                 Module\Contact::class);
                        $collector->addRoute(['GET', 'POST'], '/{id:\d+}[/]',                Module\Contact::class);
@@ -202,6 +203,7 @@ class Router
                        $collector->addGroup('/2fa', function (RouteCollector $collector) {
                                $collector->addRoute(['GET', 'POST'], '[/]'                    , Module\Settings\TwoFactor\Index::class);
                                $collector->addRoute(['GET', 'POST'], '/recovery'              , Module\Settings\TwoFactor\Recovery::class);
+                               $collector->addRoute(['GET', 'POST'], '/app_specific'          , Module\Settings\TwoFactor\AppSpecific::class);
                                $collector->addRoute(['GET', 'POST'], '/verify'                , Module\Settings\TwoFactor\Verify::class);
                        });
                });
@@ -220,13 +222,9 @@ class Router
                $this->routeCollector->addRoute(['GET'],         '/xrd',                 Module\Xrd::class);
        }
 
-       public function __construct(RouteCollector $routeCollector = null)
+       public function __construct()
        {
-               if (!$routeCollector) {
-                       $routeCollector = new RouteCollector(new Std(), new GroupCountBased());
-               }
-
-               $this->routeCollector = $routeCollector;
+               $this->routeCollector = new RouteCollector(new Std(), new GroupCountBased());
        }
 
        public function getRouteCollector()
index 9a2d064750b7d74ca13bc17fd2473323cf3298f8..fcec89bb4228b5f3faae23beb535b7b8aee91c79 100644 (file)
@@ -6,19 +6,32 @@ namespace Friendica;
 
 require_once __DIR__ . '/../boot.php';
 
+use Dice\Dice;
 use Friendica\Network\HTTPException\InternalServerErrorException;
 
 /**
  * Basic object
  *
  * Contains what is useful to any object
+ *
+ * Act's like a global registry for classes
  */
 class BaseObject
 {
        /**
-        * @var App
+        * @var Dice The Dependency Injection library
         */
-       private static $app = null;
+       private static $dice;
+
+       /**
+        * Set's the dependency injection library for a global usage
+        *
+        * @param Dice $dice The dependency injection library
+        */
+       public static function setDependencyInjection(Dice $dice)
+       {
+               self::$dice = $dice;
+       }
 
        /**
         * Get the app
@@ -26,26 +39,31 @@ class BaseObject
         * Same as get_app from boot.php
         *
         * @return App
-        * @throws \Exception
         */
        public static function getApp()
        {
-               if (empty(self::$app)) {
-                       throw new InternalServerErrorException('App isn\'t initialized.');
-               }
-
-               return self::$app;
+               return self::getClass(App::class);
        }
 
        /**
-        * Set the app
+        * Returns the initialized class based on it's name
+        *
+        * @param string $name The name of the class
         *
-        * @param App $app App
+        * @return object The initialized name
         *
-        * @return void
+        * @throws InternalServerErrorException
         */
-       public static function setApp(App $app)
+       protected static function getClass(string $name)
        {
-               self::$app = $app;
+               if (empty(self::$dice)) {
+                       throw new InternalServerErrorException('DICE isn\'t initialized.');
+               }
+
+               if (class_exists($name) || interface_exists($name   )) {
+                       return self::$dice->create($name);
+               } else {
+                       throw new InternalServerErrorException('Class \'' . $name . '\' isn\'t valid.');
+               }
        }
 }
index cf177cf2e2a8f7925deb0287b031e7c46d6c37c4..9250bbb36673868d304753dd105641d0c7fbbc2e 100644 (file)
@@ -2,8 +2,9 @@
 
 namespace Friendica\Console;
 
+use Friendica\App;
 use Friendica\Core\L10n;
-use Friendica\Database\DBA;
+use Friendica\Database\Database;
 use Friendica\Util\Strings;
 use RuntimeException;
 
@@ -20,6 +21,19 @@ class ArchiveContact extends \Asika\SimpleConsole\Console
 {
        protected $helpOptions = ['h', 'help', '?'];
 
+       /**
+        * @var App\Mode
+        */
+       private $appMode;
+       /**
+        * @var Database
+        */
+       private $dba;
+       /**
+        * @var L10n\L10n
+        */
+       private $l10n;
+
        protected function getHelp()
        {
                $help = <<<HELP
@@ -37,10 +51,17 @@ HELP;
                return $help;
        }
 
-       protected function doExecute()
+       public function __construct(App\Mode $appMode, Database $dba, L10n\L10n $l10n, array $argv = null)
        {
-               $a = \Friendica\BaseObject::getApp();
+               parent::__construct($argv);
+
+               $this->appMode = $appMode;
+               $this->dba = $dba;
+               $this->l10n = $l10n;
+       }
 
+       protected function doExecute()
+       {
                if ($this->getOption('v')) {
                        $this->out('Class: ' . __CLASS__);
                        $this->out('Arguments: ' . var_export($this->args, true));
@@ -56,16 +77,16 @@ HELP;
                        throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
                }
 
-               if ($a->getMode()->isInstall()) {
+               if ($this->appMode->isInstall()) {
                        throw new RuntimeException('Friendica isn\'t properly installed yet.');
                }
 
                $nurl = Strings::normaliseLink($this->getArgument(0));
-               if (!DBA::exists('contact', ['nurl' => $nurl, 'archive' => false])) {
+               if (!$this->dba->exists('contact', ['nurl' => $nurl, 'archive' => false])) {
                        throw new RuntimeException(L10n::t('Could not find any unarchived contact entry for this URL (%s)', $nurl));
                }
-               if (DBA::update('contact', ['archive' => true], ['nurl' => $nurl])) {
-                       $this->out(L10n::t('The contact entries have been archived'));
+               if ($this->dba->update('contact', ['archive' => true], ['nurl' => $nurl])) {
+                       $this->out($this->l10n->t('The contact entries have been archived'));
                } else {
                        throw new RuntimeException('The contact archival failed.');
                }
index 718573d27a80ce37cc9f116a3041623e006ea157..0f1e7a742f1864e191a75cd73144020f400fb21d 100644 (file)
@@ -3,17 +3,37 @@
 namespace Friendica\Console;
 
 use Asika\SimpleConsole\Console;
-use Friendica\BaseObject;
+use Friendica\App;
+use Friendica\App\BaseURL;
 use Friendica\Core\Config;
 use Friendica\Core\Installer;
 use Friendica\Core\Theme;
+use Friendica\Database\Database;
 use Friendica\Util\BasePath;
-use Friendica\Util\BaseURL;
-use Friendica\Util\Config\ConfigFileLoader;
+use Friendica\Util\ConfigFileLoader;
 use RuntimeException;
 
 class AutomaticInstallation extends Console
 {
+       /**
+        * @var App\Mode
+        */
+       private $appMode;
+       /**
+        * @var Config\Cache\ConfigCache
+        */
+       private $configCache;
+
+       /**
+        * @var Config\Configuration
+        */
+       private $config;
+
+       /**
+        * @var Database
+        */
+       private $dba;
+
        protected function getHelp()
        {
                return <<<HELP
@@ -69,17 +89,27 @@ Examples
 HELP;
        }
 
+       public function __construct(App\Mode $appMode, Config\Cache\ConfigCache $configCache, Config\Configuration $config, Database $dba, array $argv = null)
+       {
+               parent::__construct($argv);
+
+               $this->appMode = $appMode;
+               $this->configCache  =$configCache;
+               $this->config = $config;
+               $this->dba = $dba;
+       }
+
        protected function doExecute()
        {
                // Initialise the app
                $this->out("Initializing setup...\n");
 
-               $a = BaseObject::getApp();
-
                $installer = new Installer();
 
-               $configCache = $a->getConfigCache();
-               $installer->setUpCache($configCache, BasePath::create($a->getBasePath(), $_SERVER));
+               $configCache = $this->configCache;
+               $basePathConf = $configCache->get('system', 'basepath');
+               $basepath = new BasePath($basePathConf);
+               $installer->setUpCache($configCache, $basepath->getPath());
 
                $this->out(" Complete!\n\n");
 
@@ -102,13 +132,13 @@ HELP;
                        if ($config_file != 'config' . DIRECTORY_SEPARATOR . 'local.config.php') {
                                // Copy config file
                                $this->out("Copying config file...\n");
-                               if (!copy($a->getBasePath() . DIRECTORY_SEPARATOR . $config_file, $a->getBasePath() . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'local.config.php')) {
-                                       throw new RuntimeException("ERROR: Saving config file failed. Please copy '$config_file' to '" . $a->getBasePath() . "'" . DIRECTORY_SEPARATOR . "config" . DIRECTORY_SEPARATOR . "local.config.php' manually.\n");
+                               if (!copy($basePathConf . DIRECTORY_SEPARATOR . $config_file, $basePathConf . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'local.config.php')) {
+                                       throw new RuntimeException("ERROR: Saving config file failed. Please copy '$config_file' to '" . $basePathConf . "'" . DIRECTORY_SEPARATOR . "config" . DIRECTORY_SEPARATOR . "local.config.php' manually.\n");
                                }
                        }
 
                        //reload the config cache
-                       $loader = new ConfigFileLoader($a->getBasePath(), $a->getMode());
+                       $loader = new ConfigFileLoader($basePathConf);
                        $loader->setupCache($configCache);
 
                } else {
@@ -158,7 +188,7 @@ HELP;
                                $this->out('The Friendica URL has to be set during CLI installation.');
                                return 1;
                        } else {
-                               $baseUrl = new BaseURL($a->getConfig(), []);
+                               $baseUrl = new BaseURL($this->config, []);
                                $baseUrl->saveByURL($url);
                        }
 
@@ -172,7 +202,7 @@ HELP;
 
                $installer->resetChecks();
 
-               if (!$installer->checkDB($configCache, $a->getProfiler())) {
+               if (!$installer->checkDB($this->dba)) {
                        $errorMessage = $this->extractErrors($installer->getChecks());
                        throw new RuntimeException($errorMessage);
                }
@@ -184,7 +214,7 @@ HELP;
 
                $installer->resetChecks();
 
-               if (!$installer->installDatabase($a->getBasePath())) {
+               if (!$installer->installDatabase($basePathConf)) {
                        $errorMessage = $this->extractErrors($installer->getChecks());
                        throw new RuntimeException($errorMessage);
                }
@@ -193,8 +223,8 @@ HELP;
 
                // Install theme
                $this->out("Installing theme\n");
-               if (!empty(Config::get('system', 'theme'))) {
-                       Theme::install(Config::get('system', 'theme'));
+               if (!empty($this->config->get('system', 'theme'))) {
+                       Theme::install($this->config->get('system', 'theme'));
                        $this->out(" Complete\n\n");
                } else {
                        $this->out(" Theme setting is empty. Please check the file 'config/local.config.php'\n\n");
@@ -207,12 +237,12 @@ HELP;
 
        /**
         * @param Installer                 $installer   The Installer instance
-        * @param Config\Cache\IConfigCache $configCache The config cache
+        * @param Config\Cache\ConfigCache $configCache The config cache
         *
         * @return bool true if checks were successfully, otherwise false
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       private function runBasicChecks(Installer $installer, Config\Cache\IConfigCache $configCache)
+       private function runBasicChecks(Installer $installer, Config\Cache\ConfigCache $configCache)
        {
                $checked = true;
 
index eefb6cc60b1f422842a93c1383af399a89d620d8..afb549f4dc68733c66fa853b4ba698f8751f086a 100644 (file)
@@ -4,7 +4,8 @@ namespace Friendica\Console;
 
 use Asika\SimpleConsole\CommandArgsException;
 use Friendica\App;
-use Friendica\Core;
+use Friendica\Core\Cache\Cache as CacheClass;
+use Friendica\Core\Cache\ICache;
 use RuntimeException;
 
 /**
@@ -20,6 +21,16 @@ class Cache extends \Asika\SimpleConsole\Console
 {
        protected $helpOptions = ['h', 'help', '?'];
 
+       /**
+        * @var App\Mode
+        */
+       private $appMode;
+
+       /**
+        * @var ICache
+        */
+       private $cache;
+
        protected function getHelp()
        {
                $help = <<<HELP
@@ -54,10 +65,16 @@ HELP;
                return $help;
        }
 
-       protected function doExecute()
+       public function __construct(App\Mode $appMode, ICache $cache, array $argv = null)
        {
-               $a = \Friendica\BaseObject::getApp();
+               parent::__construct($argv);
+
+               $this->appMode = $appMode;
+               $this->cache   = $cache;
+       }
 
+       protected function doExecute()
+       {
                if ($this->getOption('v')) {
                        $this->out('Executable: ' . $this->executable);
                        $this->out('Class: ' . __CLASS__);
@@ -65,15 +82,13 @@ HELP;
                        $this->out('Options: ' . var_export($this->options, true));
                }
 
-               if ($a->getMode()->has(App\Mode::DBCONFIGAVAILABLE)) {
+               if (!$this->appMode->has(App\Mode::DBCONFIGAVAILABLE)) {
                        $this->out('Database isn\'t ready or populated yet, database cache won\'t be available');
                }
 
-               Core\Cache::init();
-
                if ($this->getOption('v')) {
-                       $this->out('Cache Driver Name: ' . Core\Cache::$driver_name);
-                       $this->out('Cache Driver Class: ' . Core\Cache::$driver_class);
+                       $this->out('Cache Driver Name: ' . $this->cache->getName());
+                       $this->out('Cache Driver Class: ' . get_class($this->cache));
                }
 
                switch ($this->getArgument(0)) {
@@ -105,7 +120,7 @@ HELP;
        private function executeList()
        {
                $prefix = $this->getArgument(1);
-               $keys = Core\Cache::getAllKeys($prefix);
+               $keys   = $this->cache->getAllKeys($prefix);
 
                if (empty($prefix)) {
                        $this->out('Listing all cache keys:');
@@ -125,8 +140,8 @@ HELP;
        private function executeGet()
        {
                if (count($this->args) >= 2) {
-                       $key = $this->getArgument(1);
-                       $value = Core\Cache::get($key);
+                       $key   = $this->getArgument(1);
+                       $value = $this->cache->get($key);
 
                        $this->out("{$key} => " . var_export($value, true));
                } else {
@@ -137,17 +152,17 @@ HELP;
        private function executeSet()
        {
                if (count($this->args) >= 3) {
-                       $key = $this->getArgument(1);
-                       $value = $this->getArgument(2);
-                       $duration = intval($this->getArgument(3, Core\Cache::FIVE_MINUTES));
+                       $key      = $this->getArgument(1);
+                       $value    = $this->getArgument(2);
+                       $duration = intval($this->getArgument(3, CacheClass::FIVE_MINUTES));
 
-                       if (is_array(Core\Cache::get($key))) {
+                       if (is_array($this->cache->get($key))) {
                                throw new RuntimeException("$key is an array and can't be set using this command.");
                        }
 
-                       $result = Core\Cache::set($key, $value, $duration);
+                       $result = $this->cache->set($key, $value, $duration);
                        if ($result) {
-                               $this->out("{$key} <= " . Core\Cache::get($key));
+                               $this->out("{$key} <= " . $this->cache->get($key));
                        } else {
                                $this->out("Unable to set {$key}");
                        }
@@ -158,7 +173,7 @@ HELP;
 
        private function executeFlush()
        {
-               $result = Core\Cache::clear();
+               $result = $this->cache->clear();
                if ($result) {
                        $this->out('Cache successfully flushed');
                } else {
@@ -168,7 +183,7 @@ HELP;
 
        private function executeClear()
        {
-               $result = Core\Cache::clear(false);
+               $result = $this->cache->clear(false);
                if ($result) {
                        $this->out('Cache successfully cleared');
                } else {
index a27ca134987e4bed9946274a727dd9e24c713e62..797f6394917586fe7d1d58f94f38a7446f02e0cc 100644 (file)
@@ -4,7 +4,7 @@ namespace Friendica\Console;
 
 use Asika\SimpleConsole\CommandArgsException;
 use Friendica\App;
-use Friendica\Core;
+use Friendica\Core\Config\Configuration;
 use RuntimeException;
 
 /**
@@ -35,6 +35,15 @@ class Config extends \Asika\SimpleConsole\Console
 {
        protected $helpOptions = ['h', 'help', '?'];
 
+       /**
+        * @var App\Mode
+        */
+       private $appMode;
+       /**
+        * @var Configuration
+        */
+       private $config;
+
        protected function getHelp()
        {
                $help = <<<HELP
@@ -69,10 +78,16 @@ HELP;
                return $help;
        }
 
-       protected function doExecute()
+       public function __construct(App\Mode $appMode, Configuration $config, array $argv = null)
        {
-               $a = \Friendica\BaseObject::getApp();
+               parent::__construct($argv);
+
+               $this->appMode = $appMode;
+               $this->config = $config;
+       }
 
+       protected function doExecute()
+       {
                if ($this->getOption('v')) {
                        $this->out('Executable: ' . $this->executable);
                        $this->out('Class: ' . __CLASS__);
@@ -84,7 +99,7 @@ HELP;
                        throw new CommandArgsException('Too many arguments');
                }
 
-               if (!$a->getMode()->has(App\Mode::DBCONFIGAVAILABLE)) {
+               if (!$this->appMode->has(App\Mode::DBCONFIGAVAILABLE)) {
                        $this->out('Database isn\'t ready or populated yet, showing file config only');
                }
 
@@ -93,14 +108,14 @@ HELP;
                        $key = $this->getArgument(1);
                        $value = $this->getArgument(2);
 
-                       if (is_array(Core\Config::get($cat, $key))) {
+                       if (is_array($this->config->get($cat, $key))) {
                                throw new RuntimeException("$cat.$key is an array and can't be set using this command.");
                        }
 
-                       $result = Core\Config::set($cat, $key, $value);
+                       $result = $this->config->set($cat, $key, $value);
                        if ($result) {
                                $this->out("{$cat}.{$key} <= " .
-                                       Core\Config::get($cat, $key));
+                                          $this->config->get($cat, $key));
                        } else {
                                $this->out("Unable to set {$cat}.{$key}");
                        }
@@ -109,7 +124,7 @@ HELP;
                if (count($this->args) == 2) {
                        $cat = $this->getArgument(0);
                        $key = $this->getArgument(1);
-                       $value = Core\Config::get($this->getArgument(0), $this->getArgument(1));
+                       $value = $this->config->get($this->getArgument(0), $this->getArgument(1));
 
                        if (is_array($value)) {
                                foreach ($value as $k => $v) {
@@ -122,11 +137,12 @@ HELP;
 
                if (count($this->args) == 1) {
                        $cat = $this->getArgument(0);
-                       Core\Config::load($cat);
+                       $this->config->load($cat);
+                       $configCache = $this->config->getCache();
 
-                       if ($a->getConfigCache()->get($cat) !== null) {
+                       if ($configCache->get($cat) !== null) {
                                $this->out("[{$cat}]");
-                               $catVal = $a->getConfigCache()->get($cat);
+                               $catVal = $configCache->get($cat);
                                foreach ($catVal as $key => $value) {
                                        if (is_array($value)) {
                                                foreach ($value as $k => $v) {
@@ -142,13 +158,13 @@ HELP;
                }
 
                if (count($this->args) == 0) {
-                       Core\Config::load();
+                       $this->config->load();
 
-                       if (Core\Config::get('system', 'config_adapter') == 'jit' && $a->getMode()->has(App\Mode::DBCONFIGAVAILABLE)) {
+                       if ($this->config->get('system', 'config_adapter') == 'jit' && $this->appMode->has(App\Mode::DBCONFIGAVAILABLE)) {
                                $this->out('Warning: The JIT (Just In Time) Config adapter doesn\'t support loading the entire configuration, showing file config only');
                        }
 
-                       $config = $a->getConfigCache()->getAll();
+                       $config = $this->config->getCache()->getAll();
                        foreach ($config as $cat => $section) {
                                if (is_array($section)) {
                                        foreach ($section as $key => $value) {
index 3feaa64d6005cdea8442ef6756e045bad3e6851e..ca210064527af673f700cac9467dbd4396dfc108 100644 (file)
@@ -2,9 +2,9 @@
 
 namespace Friendica\Console;
 
-use Friendica\Core;
+use Friendica\Core\Config\Cache\ConfigCache;
 use Friendica\Core\Update;
-use Friendica\Database\DBA;
+use Friendica\Database\Database;
 use Friendica\Database\DBStructure;
 use RuntimeException;
 
@@ -17,6 +17,15 @@ class DatabaseStructure extends \Asika\SimpleConsole\Console
 {
        protected $helpOptions = ['h', 'help', '?'];
 
+       /**
+        * @var Database
+        */
+       private $dba;
+       /**
+        * @var ConfigCache
+        */
+       private $configCache;
+
        protected function getHelp()
        {
                $help = <<<HELP
@@ -39,6 +48,14 @@ HELP;
                return $help;
        }
 
+       public function __construct(Database $dba, ConfigCache $configCache, $argv = null)
+       {
+               parent::__construct($argv);
+
+               $this->dba = $dba;
+               $this->configCache = $configCache;
+       }
+
        protected function doExecute()
        {
                if ($this->getOption('v')) {
@@ -56,26 +73,24 @@ HELP;
                        throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
                }
 
-               if (!DBA::connected()) {
+               if (!$this->dba->isConnected()) {
                        throw new RuntimeException('Unable to connect to database');
                }
 
-               Core\Config::load();
-
-               $a = get_app();
+               $basePath = $this->configCache->get('system', 'basepath');
 
                switch ($this->getArgument(0)) {
                        case "dryrun":
-                               $output = DBStructure::update($a->getBasePath(), true, false);
+                               $output = DBStructure::update($basePath, true, false);
                                break;
                        case "update":
                                $force    = $this->getOption(['f', 'force'], false);
                                $override = $this->getOption(['o', 'override'], false);
-                               $output = Update::run($a->getBasePath(), $force, $override,true, false);
+                               $output = Update::run($basePath, $force, $override,true, false);
                                break;
                        case "dumpsql":
                                ob_start();
-                               DBStructure::printStructure($a->getBasePath());
+                               DBStructure::printStructure($basePath);
                                $output = ob_get_clean();
                                break;
                        case "toinnodb":
index 12ea63e5d70d4f885d38cd7513daf56893f5a746..1789b66d9ca58378c172e37dc485a5c0a5f95d2d 100644 (file)
@@ -2,6 +2,7 @@
 
 namespace Friendica\Console;
 
+use Friendica\App;
 use Friendica\Core\L10n;
 use Friendica\Model\Contact;
 
@@ -20,6 +21,15 @@ class GlobalCommunityBlock extends \Asika\SimpleConsole\Console
 {
        protected $helpOptions = ['h', 'help', '?'];
 
+       /**
+        * @var App\Mode
+        */
+       private $appMode;
+       /**
+        * @var L10n\L10n
+        */
+       private $l10n;
+
        protected function getHelp()
        {
                $help = <<<HELP
@@ -38,10 +48,16 @@ HELP;
                return $help;
        }
 
-       protected function doExecute()
+       public function __construct(App\Mode $appMode, L10n $l10n, $argv = null)
        {
-               $a = \get_app();
+               parent::__construct($argv);
+
+               $this->appMode = $appMode;
+               $this->l10n = $l10n;
+       }
 
+       protected function doExecute()
+       {
                if ($this->getOption('v')) {
                        $this->out('Class: ' . __CLASS__);
                        $this->out('Arguments: ' . var_export($this->args, true));
@@ -57,18 +73,18 @@ HELP;
                        throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
                }
 
-               if ($a->getMode()->isInstall()) {
+               if ($this->appMode->isInstall()) {
                        throw new \RuntimeException('Database isn\'t ready or populated yet');
                }
 
                $contact_id = Contact::getIdForURL($this->getArgument(0));
                if (!$contact_id) {
-                       throw new \RuntimeException(L10n::t('Could not find any contact entry for this URL (%s)', $this->getArgument(0)));
+                       throw new \RuntimeException($this->l10n->t('Could not find any contact entry for this URL (%s)', $this->getArgument(0)));
                }
 
                $block_reason = $this->getArgument(1);
                if(Contact::block($contact_id, $block_reason)) {
-                       $this->out(L10n::t('The contact has been blocked from the node'));
+                       $this->out($this->l10n->t('The contact has been blocked from the node'));
                } else {
                        throw new \RuntimeException('The contact block failed.');
                }
index daaf55149979f7098cd962326883f1e1c1396873..58feb45077751c00c394ea0d875ddb1b147a31d6 100644 (file)
@@ -2,10 +2,9 @@
 
 namespace Friendica\Console;
 
-use Friendica\Core\Protocol;
-use Friendica\Database\DBA;
-use Friendica\Network\Probe;
-use Friendica\Util\Strings;
+use Friendica\App;
+use Friendica\Database\Database;
+use Friendica\Model\Contact;
 use RuntimeException;
 
 /**
@@ -25,6 +24,15 @@ class GlobalCommunitySilence extends \Asika\SimpleConsole\Console
 {
        protected $helpOptions = ['h', 'help', '?'];
 
+       /**
+        * @var App\Mode
+        */
+       private $appMode;
+       /**
+        * @var Database
+        */
+       private $dba;
+
        protected function getHelp()
        {
                $help = <<<HELP
@@ -45,10 +53,16 @@ HELP;
                return $help;
        }
 
-       protected function doExecute()
+       public function __construct(App\Mode $appMode, Database $dba, array $argv = null)
        {
-               $a = \get_app();
+               parent::__construct($argv);
+
+               $this->appMode = $appMode;
+               $this->dba  =$dba;
+       }
 
+       protected function doExecute()
+       {
                if ($this->getOption('v')) {
                        $this->out('Class: ' . __CLASS__);
                        $this->out('Arguments: ' . var_export($this->args, true));
@@ -64,27 +78,16 @@ HELP;
                        throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
                }
 
-               if ($a->getMode()->isInstall()) {
+               if ($this->appMode->isInstall()) {
                        throw new RuntimeException('Database isn\'t ready or populated yet');
                }
 
-               /**
-                * 1. make nurl from last parameter
-                * 2. check DB (contact) if there is a contact with uid=0 and that nurl, get the ID
-                * 3. set the flag hidden=1 for the contact entry with the found ID
-                * */
-               $net = Probe::uri($this->getArgument(0));
-               if (in_array($net['network'], [Protocol::PHANTOM, Protocol::MAIL])) {
-                       throw new RuntimeException('This account seems not to exist.');
-               }
-
-               $nurl = Strings::normaliseLink($net['url']);
-               $contact = DBA::selectFirst("contact", ["id"], ["nurl" => $nurl, "uid" => 0]);
-               if (DBA::isResult($contact)) {
-                       DBA::update("contact", ["hidden" => true], ["id" => $contact["id"]]);
-                       $this->out('NOTICE: The account should be silenced from the global community page');
+               $contact_id = Contact::getIdForURL($this->getArgument(0));
+               if ($contact_id) {
+                       $this->dba->update('contact', ['hidden' => true], ['id' => $contact_id]);
+                       $this->out('The account has been successfully silenced from the global community page.');
                } else {
-                       throw new RuntimeException('NOTICE: Could not find any entry for this URL (' . $nurl . ')');
+                       throw new RuntimeException('Could not find any public contact entry for this URL (' . $this->getArgument(0) . ')');
                }
 
                return 0;
diff --git a/src/Console/Lock.php b/src/Console/Lock.php
new file mode 100644 (file)
index 0000000..46826cc
--- /dev/null
@@ -0,0 +1,185 @@
+<?php
+
+namespace Friendica\Console;
+
+use Asika\SimpleConsole\CommandArgsException;
+use Friendica\App;
+use Friendica\Core\Lock\ILock;
+use RuntimeException;
+
+/**
+ * @brief tool to access the locks from the CLI
+ *
+ * With this script you can access the locks of your node from the CLI.
+ * You can read current locks and set/remove locks.
+ *
+ * @author Philipp Holzer <admin@philipp.info>, Hypolite Petovan <hypolite@mrpetovan.com>
+ */
+class Lock extends \Asika\SimpleConsole\Console
+{
+       protected $helpOptions = ['h', 'help', '?'];
+
+       /**
+        * @var App\Mode
+        */
+       private $appMode;
+
+       /**
+        * @var ILock
+        */
+       private $lock;
+
+       protected function getHelp()
+       {
+               $help = <<<HELP
+console lock - Manage node locks
+Synopsis
+       bin/console lock list [<prefix>] [-h|--help|-?] [-v]
+       bin/console lock set <lock> [<timeout> [<ttl>]] [-h|--help|-?] [-v]
+       bin/console lock del <lock> [-h|--help|-?] [-v]
+       bin/console lock clear [-h|--help|-?] [-v]
+
+Description
+       bin/console lock list [<prefix>]
+               List all locks, optionally filtered by a prefix
+
+       bin/console lock set <lock> [<timeout> [<ttl>]]
+               Sets manually a lock, optionally with the provided TTL (time to live) with a default of five minutes.
+
+       bin/console lock del <lock>
+               Deletes a lock.
+
+       bin/console lock clear
+               Clears all locks
+
+Options
+    -h|--help|-? Show help information
+    -v           Show more debug information.
+HELP;
+               return $help;
+       }
+
+       public function __construct(App\Mode $appMode, ILock $lock, array $argv = null)
+       {
+               parent::__construct($argv);
+
+               $this->appMode = $appMode;
+               $this->lock    = $lock;
+       }
+
+       protected function doExecute()
+       {
+               if ($this->getOption('v')) {
+                       $this->out('Executable: ' . $this->executable);
+                       $this->out('Class: ' . __CLASS__);
+                       $this->out('Arguments: ' . var_export($this->args, true));
+                       $this->out('Options: ' . var_export($this->options, true));
+               }
+
+               if (!$this->appMode->has(App\Mode::DBCONFIGAVAILABLE)) {
+                       $this->out('Database isn\'t ready or populated yet, database cache won\'t be available');
+               }
+
+               if ($this->getOption('v')) {
+                       $this->out('Lock Driver Name: ' . $this->lock->getName());
+                       $this->out('Lock Driver Class: ' . get_class($this->lock));
+               }
+
+               switch ($this->getArgument(0)) {
+                       case 'list':
+                               $this->executeList();
+                               break;
+                       case 'set':
+                               $this->executeSet();
+                               break;
+                       case 'del':
+                               $this->executeDel();
+                               break;
+                       case 'clear':
+                               $this->executeClear();
+                               break;
+               }
+
+               if (count($this->args) == 0) {
+                       $this->out($this->getHelp());
+                       return 0;
+               }
+
+               return 0;
+       }
+
+       private function executeList()
+       {
+               $prefix = $this->getArgument(1, '');
+               $keys   = $this->lock->getLocks($prefix);
+
+               if (empty($prefix)) {
+                       $this->out('Listing all Locks:');
+               } else {
+                       $this->out('Listing all Locks starting with "' . $prefix . '":');
+               }
+
+               $count = 0;
+               foreach ($keys as $key) {
+                       $this->out($key);
+                       $count++;
+               }
+
+               $this->out($count . ' locks found');
+       }
+
+       private function executeDel()
+       {
+               if (count($this->args) >= 2) {
+                       $lock = $this->getArgument(1);
+
+                       if ($this->lock->releaseLock($lock, true)) {
+                               $this->out(sprintf('Lock \'%s\' released.', $lock));
+                       } else {
+                               $this->out(sprintf('Couldn\'t release Lock \'%s\'', $lock));
+                       }
+
+               } else {
+                       throw new CommandArgsException('Too few arguments for del.');
+               }
+       }
+
+       private function executeSet()
+       {
+               if (count($this->args) >= 2) {
+                       $lock    = $this->getArgument(1);
+                       $timeout = intval($this->getArgument(2, false));
+                       $ttl     = intval($this->getArgument(3, false));
+
+                       if ($this->lock->isLocked($lock)) {
+                               throw new RuntimeException(sprintf('\'%s\' is already set.', $lock));
+                       }
+
+                       if (!empty($ttl) && !empty($timeout)) {
+                               $result = $this->lock->acquireLock($lock, $timeout, $ttl);
+                       } elseif (!empty($timeout)) {
+                               $result = $this->lock->acquireLock($lock, $timeout);
+                       } else {
+                               $result = $this->lock->acquireLock($lock);
+                       }
+
+                       if ($result) {
+                               $this->out(sprintf('Lock \'%s\' acquired.', $lock));
+                       } else {
+                               throw new RuntimeException(sprintf('Unable to lock \'%s\'.', $lock));
+                       }
+               } else {
+                       throw new CommandArgsException('Too few arguments for set.');
+               }
+       }
+
+       private function executeClear()
+       {
+               $result = $this->lock->releaseAll(true);
+               if ($result) {
+                       $this->out('Locks successfully cleared.');
+               } else {
+                       throw new RuntimeException('Unable to clear the locks.');
+               }
+       }
+}
index 080eb092b75856557677375e5cbb76fe7a52ab82..26b77a974148850343f5a740cf80793b13660b87 100644 (file)
@@ -2,7 +2,8 @@
 
 namespace Friendica\Console;
 
-use Friendica\Core;
+use Friendica\App;
+use Friendica\Core\Config\Configuration;
 
 /**
  * @brief Sets maintenance mode for this node
@@ -13,6 +14,15 @@ class Maintenance extends \Asika\SimpleConsole\Console
 {
        protected $helpOptions = ['h', 'help', '?'];
 
+       /**
+        * @var App\Mode
+        */
+       private $appMode;
+       /**
+        * @var Configuration
+        */
+       private $config;
+
        protected function getHelp()
        {
                $help = <<<HELP
@@ -42,10 +52,16 @@ HELP;
                return $help;
        }
 
-       protected function doExecute()
+       public function __construct(App\Mode $appMode, Configuration $config, $argv = null)
        {
-               $a = \Friendica\BaseObject::getApp();
+               parent::__construct($argv);
+
+               $this->appMode = $appMode;
+               $this->config = $config;
+       }
 
+       protected function doExecute()
+       {
                if ($this->getOption('v')) {
                        $this->out('Class: ' . __CLASS__);
                        $this->out('Arguments: ' . var_export($this->args, true));
@@ -61,20 +77,20 @@ HELP;
                        throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
                }
 
-               if ($a->getMode()->isInstall()) {
+               if ($this->appMode->isInstall()) {
                        throw new \RuntimeException('Database isn\'t ready or populated yet');
                }
 
                $enabled = intval($this->getArgument(0));
 
-               Core\Config::set('system', 'maintenance', $enabled);
+               $this->config->set('system', 'maintenance', $enabled);
 
                $reason = $this->getArgument(1);
 
                if ($enabled && $this->getArgument(1)) {
-                       Core\Config::set('system', 'maintenance_reason', $this->getArgument(1));
+                       $this->config->set('system', 'maintenance_reason', $this->getArgument(1));
                } else {
-                       Core\Config::set('system', 'maintenance_reason', '');
+                       $this->config->set('system', 'maintenance_reason', '');
                }
 
                if ($enabled) {
index dc6943817f2722ce235fcbe18ef5b1ecf85b2c7c..e19fd03ba88f632f8e0601745e4eb36e4aa58e5b 100644 (file)
@@ -2,8 +2,9 @@
 
 namespace Friendica\Console;
 
-use Friendica\Core\L10n;
-use Friendica\Database\DBA;
+use Friendica\App;
+use Friendica\Core\L10n\L10n;
+use Friendica\Database\Database;
 use Friendica\Model\User;
 use RuntimeException;
 
@@ -20,6 +21,19 @@ class NewPassword extends \Asika\SimpleConsole\Console
 {
        protected $helpOptions = ['h', 'help', '?'];
 
+       /**
+        * @var App\Mode
+        */
+       private $appMode;
+       /**
+        * @var L10n
+        */
+       private $l10n;
+       /**
+        * @var Database
+        */
+       private $dba;
+
        protected function getHelp()
        {
                $help = <<<HELP
@@ -37,10 +51,17 @@ HELP;
                return $help;
        }
 
-       protected function doExecute()
+       public function __construct(App\Mode $appMode, L10n $l10n, Database $dba, array $argv = null)
        {
-               $a = \get_app();
+               parent::__construct($argv);
+
+               $this->appMode = $appMode;
+               $this->l10n = $l10n;
+               $this->dba = $dba;
+       }
 
+       protected function doExecute()
+       {
                if ($this->getOption('v')) {
                        $this->out('Class: ' . __CLASS__);
                        $this->out('Arguments: ' . var_export($this->args, true));
@@ -56,31 +77,31 @@ HELP;
                        throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
                }
 
-               if ($a->getMode()->isInstall()) {
+               if ($this->appMode->isInstall()) {
                        throw new RuntimeException('Database isn\'t ready or populated yet');
                }
 
                $nick = $this->getArgument(0);
 
-               $user = DBA::selectFirst('user', ['uid'], ['nickname' => $nick]);
-               if (!DBA::isResult($user)) {
-                       throw new RuntimeException(L10n::t('User not found'));
+               $user = $this->dba->selectFirst('user', ['uid'], ['nickname' => $nick]);
+               if (!$this->dba->isResult($user)) {
+                       throw new RuntimeException($this->l10n->t('User not found'));
                }
 
                $password = $this->getArgument(1);
                if (is_null($password)) {
-                       $this->out(L10n::t('Enter new password: '), false);
+                       $this->out($this->l10n->t('Enter new password: '), false);
                        $password = \Seld\CliPrompt\CliPrompt::hiddenPrompt(true);
                }
 
                try {
                        $result = User::updatePassword($user['uid'], $password);
 
-                       if (!DBA::isResult($result)) {
-                               throw new \Exception(L10n::t('Password update failed. Please try again.'));
+                       if (!$this->dba->isResult($result)) {
+                               throw new \Exception($this->l10n->t('Password update failed. Please try again.'));
                        }
 
-                       $this->out(L10n::t('Password changed.'));
+                       $this->out($this->l10n->t('Password changed.'));
                } catch (\Exception $e) {
                        throw new RuntimeException($e->getMessage(), $e->getCode(), $e);
                }
index 4d7246d90bf459e85e3be374ef0ede8a187c5c08..fb640a0b0ef13902c438ba5ce23c9ee8d2afe726 100644 (file)
@@ -2,8 +2,9 @@
 
 namespace Friendica\Console;
 
-use Friendica\Core\Config;
-use Friendica\Core\L10n;
+use Friendica\App;
+use Friendica\Core\Config\Configuration;
+use Friendica\Core\L10n\L10n;
 use Friendica\Core\Update;
 
 /**
@@ -16,11 +17,24 @@ use Friendica\Core\Update;
  */
 class PostUpdate extends \Asika\SimpleConsole\Console
 {
-        protected $helpOptions = ['h', 'help', '?'];
+       protected $helpOptions = ['h', 'help', '?'];
 
-        protected function getHelp()
-        {
-                $help = <<<HELP
+       /**
+        * @var App\Mode
+        */
+       private $appMode;
+       /**
+        * @var Configuration
+        */
+       private $config;
+       /**
+        * @var L10n
+        */
+       private $l10n;
+
+       protected function getHelp()
+       {
+               $help = <<<HELP
 console postupdate - Performs database post updates
 Usage
         bin/console postupdate [-h|--help|-?] [--reset <version>]
@@ -29,8 +43,17 @@ Options
     -h|--help|-?      Show help information
     --reset <version> Reset the post update version
 HELP;
-                return $help;
-        }
+               return $help;
+       }
+
+       public function __construct(App\Mode $appMode, Configuration $config, L10n $l10n, array $argv = null)
+       {
+               parent::__construct($argv);
+
+               $this->appMode = $appMode;
+               $this->config = $config;
+               $this->l10n = $l10n;
+       }
 
        protected function doExecute()
        {
@@ -46,26 +69,26 @@ HELP;
                        $this->out($this->getHelp());
                        return 0;
                } elseif ($reset_version) {
-                       Config::set('system', 'post_update_version', $reset_version);
-                       echo L10n::t('Post update version number has been set to %s.', $reset_version) . "\n";
+                       $this->config->set('system', 'post_update_version', $reset_version);
+                       echo $this->l10n->t('Post update version number has been set to %s.', $reset_version) . "\n";
                        return 0;
                }
 
-               if ($a->getMode()->isInstall()) {
+               if ($this->appMode->isInstall()) {
                        throw new \RuntimeException('Database isn\'t ready or populated yet');
                }
 
-               echo L10n::t('Check for pending update actions.') . "\n";
+               echo $this->l10n->t('Check for pending update actions.') . "\n";
                Update::run($a->getBasePath(), true, false, true, false);
-               echo L10n::t('Done.') . "\n";
+               echo $this->l10n->t('Done.') . "\n";
 
-               echo L10n::t('Execute pending post updates.') . "\n";
+               echo $this->l10n->t('Execute pending post updates.') . "\n";
 
                while (!\Friendica\Database\PostUpdate::update()) {
                        echo '.';
                }
 
-               echo "\n" . L10n::t('All pending post updates are done.') . "\n";
+               echo "\n" . $this->l10n->t('All pending post updates are done.') . "\n";
 
                return 0;
        }
index 7e45f108bb87309b2fa369067126a8ba473a19e9..322f8f6ee305feccb83315988646fa756739b904 100644 (file)
@@ -5,7 +5,6 @@ namespace Friendica\Console;
 use Asika\SimpleConsole\CommandArgsException;
 use Asika\SimpleConsole\Console;
 use Console_Table;
-use Friendica\BaseObject;
 use Friendica\Core\Config\Configuration;
 
 /**
@@ -20,18 +19,28 @@ class ServerBlock extends Console
 
        protected $helpOptions = ['h', 'help', '?'];
 
+       /**
+        * @var Configuration
+        */
+       private $config;
+
        protected function getHelp()
        {
                $help = <<<HELP
-console serverblock - Manage blocked servers
+console serverblock - Manage blocked server domain patterns
 Usage
        bin/console serverblock [-h|--help|-?] [-v]
-       bin/console serverblock add <server> <reason> [-h|--help|-?] [-v]
-       bin/console serverblock remove <server> [-h|--help|-?] [-v]
+       bin/console serverblock add <pattern> <reason> [-h|--help|-?] [-v]
+       bin/console serverblock remove <pattern> [-h|--help|-?] [-v]
 
 Description
-       With this tool, you can list the current blocked servers
-    or you can add / remove a blocked server from the list
+       With this tool, you can list the current blocked server domain patterns
+    or you can add / remove a blocked server domain pattern from the list.
+    
+    Patterns are case-insensitive shell wildcard comprising the following special characters:
+    - * : Any number of characters
+    - ? : Any single character
+    - [<char1><char2>...] : char1 or char2 or...
 
 Options
     -h|--help|-? Show help information
@@ -40,20 +49,25 @@ HELP;
                return $help;
        }
 
-       protected function doExecute()
+       public function __construct(Configuration $config, $argv = null)
        {
-               $a = BaseObject::getApp();
+               parent::__construct($argv);
 
+               $this->config = $config;
+       }
+
+       protected function doExecute()
+       {
                if (count($this->args) == 0) {
-                       $this->printBlockedServers($a->getConfig());
+                       $this->printBlockedServers($this->config);
                        return 0;
                }
 
                switch ($this->getArgument(0)) {
                        case 'add':
-                               return $this->addBlockedServer($a->getConfig());
+                               return $this->addBlockedServer($this->config);
                        case 'remove':
-                               return $this->removeBlockedServer($a->getConfig());
+                               return $this->removeBlockedServer($this->config);
                        default:
                                throw new CommandArgsException('Unknown command.');
                                break;
@@ -69,7 +83,7 @@ HELP;
        {
                $table = new Console_Table();
                $table->setHeaders(['Domain', 'Reason']);
-               $blocklist = $config->get('system', 'blocklist');
+               $blocklist = $config->get('system', 'blocklist', []);
                foreach ($blocklist as $domain) {
                        $table->addRow($domain);
                }
@@ -94,7 +108,7 @@ HELP;
 
                $update = false;
 
-               $currBlocklist = $config->get('system', 'blocklist');
+               $currBlocklist = $config->get('system', 'blocklist', []);
                $newBlockList = [];
                foreach ($currBlocklist  as $blocked) {
                        if ($blocked['domain'] === $domain) {
@@ -145,7 +159,7 @@ HELP;
 
                $found = false;
 
-               $currBlocklist = $config->get('system', 'blocklist');
+               $currBlocklist = $config->get('system', 'blocklist', []);
                $newBlockList = [];
                foreach ($currBlocklist as $blocked) {
                        if ($blocked['domain'] === $domain) {
index 216d05723285bce1e818da6b9fbd4ef3186edba1..855c1705c2e19fc33924110436aade1b699bdf63 100644 (file)
@@ -2,7 +2,7 @@
 
 namespace Friendica\Console;
 
-use Friendica\BaseObject;
+use Friendica\Core\Config\Configuration;
 
 /**
  * Tired of chasing typos and finding them after a commit.
@@ -14,6 +14,11 @@ class Typo extends \Asika\SimpleConsole\Console
 {
        protected $helpOptions = ['h', 'help', '?'];
 
+       /**
+        * @var Configuration
+        */
+       private $config;
+
        protected function getHelp()
        {
                $help = <<<HELP
@@ -31,6 +36,13 @@ HELP;
                return $help;
        }
 
+       public function __construct(Configuration $config, array $argv = null)
+       {
+               parent::__construct($argv);
+
+               $this->config = $config;
+       }
+
        protected function doExecute()
        {
                if ($this->getOption('v')) {
@@ -43,7 +55,7 @@ HELP;
                        throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
                }
 
-               $php_path = BaseObject::getApp()->getConfig()->get('config', 'php_path', 'php');
+               $php_path = $this->config->get('config', 'php_path', 'php');
 
                if ($this->getOption('v')) {
                        $this->out('Directory: src');
index e327069b33fd86653bad93e0b9a661c1c3a1bcc3..2b86a6e75df663291b5f6bbd1fdaa7fac437928f 100644 (file)
@@ -105,7 +105,7 @@ class ContactSelector
 
                $networkname = str_replace($search, $replace, $network);
 
-               if ((in_array($network, [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS])) && ($profile != "")) {
+               if ((in_array($network, Protocol::FEDERATED)) && ($profile != "")) {
                        // Create the server url out of the profile url
                        $parts = parse_url($profile);
                        unset($parts['path']);
@@ -231,8 +231,7 @@ class ContactSelector
                        ''                     => L10n::t('No answer'),
                        'Single'               => L10n::t('Single'),
                        'Lonely'               => L10n::t('Lonely'),
-                       'Available'            => L10n::t('Available'),
-                       'Unavailable'          => L10n::t('Unavailable'),
+                       'In a relation'        => L10n::t('In a relation'),
                        'Has crush'            => L10n::t('Has crush'),
                        'Infatuated'           => L10n::t('Infatuated'),
                        'Dating'               => L10n::t('Dating'),
index 58ef856f3d7cc5b02d5228ff872bd2d151dabf97..0f119d3054cb1231706e3fdc2e99401c774b19d2 100644 (file)
@@ -20,7 +20,7 @@ class Feature
         * @return boolean
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       public static function isEnabled($uid, $feature)
+       public static function isEnabled(int $uid, $feature)
        {
                $x = Config::get('feature_lock', $feature, false);
 
@@ -84,6 +84,7 @@ class Feature
                                ['multi_profiles',  L10n::t('Multiple Profiles'),      L10n::t('Ability to create multiple profiles'), false, Config::get('feature_lock', 'multi_profiles', false)],
                                ['photo_location',  L10n::t('Photo Location'),         L10n::t("Photo metadata is normally stripped. This extracts the location \x28if present\x29 prior to stripping metadata and links it to a map."), false, Config::get('feature_lock', 'photo_location', false)],
                                ['export_calendar', L10n::t('Export Public Calendar'), L10n::t('Ability for visitors to download the public calendar'), false, Config::get('feature_lock', 'export_calendar', false)],
+                               ['trending_tags',   L10n::t('Trending Tags'),          L10n::t('Show a community page widget with a list of the most popular tags in recent public posts.'), false, Config::get('feature_lock', 'trending_tags', false)],
                        ],
 
                        // Post composition
index 98ea7aa6b97456fad2b8860205dc85d468080a7f..9ea8cc449ece517619d677a731a35d22e3d4d150 100644 (file)
@@ -43,7 +43,7 @@ class ForumManager
                        $params = ['order' => ['name']];
                }
 
-               $condition_str = "`network` = ? AND `uid` = ? AND NOT `blocked` AND NOT `pending` AND NOT `archive` AND `success_update` > `failure_update` AND ";
+               $condition_str = "`network` = ? AND `uid` = ? AND NOT `blocked` AND NOT `pending` AND NOT `archive` AND ";
 
                if ($showprivate) {
                        $condition_str .= '(`forum` OR `prv`)';
@@ -203,7 +203,6 @@ class ForumManager
                                AND `contact`.`network`= 'dfrn' AND (`contact`.`forum` OR `contact`.`prv`)
                                AND NOT `contact`.`blocked` AND NOT `contact`.`hidden`
                                AND NOT `contact`.`pending` AND NOT `contact`.`archive`
-                               AND `contact`.`success_update` > `failure_update`
                                GROUP BY `contact`.`id` ",
                        local_user()
                );
index 690af1935371d1cee8c0e60a4201a03d72ac6082..ea5c0bbc05230c77984392b5171f1f2846383825 100644 (file)
@@ -9,6 +9,7 @@ use Friendica\Core\Config;
 use Friendica\Core\Hook;
 use Friendica\Core\L10n;
 use Friendica\Core\Renderer;
+use Friendica\Core\Session;
 use Friendica\Core\System;
 use Friendica\Database\DBA;
 use Friendica\Model\Profile;
@@ -174,7 +175,7 @@ class Nav
                // "Home" should also take you home from an authenticated remote profile connection
                $homelink = Profile::getMyURL();
                if (! $homelink) {
-                       $homelink = defaults($_SESSION, 'visitor_home', '');
+                       $homelink = Session::get('visitor_home', '');
                }
 
                if (($a->module != 'home') && (! (local_user()))) {
@@ -243,7 +244,7 @@ class Nav
                        $nav['home'] = ['profile/' . $a->user['nickname'], L10n::t('Home'), '', L10n::t('Your posts and conversations')];
 
                        // Don't show notifications for public communities
-                       if (defaults($_SESSION, 'page_flags', '') != User::PAGE_FLAGS_COMMUNITY) {
+                       if (Session::get('page_flags', '') != User::PAGE_FLAGS_COMMUNITY) {
                                $nav['introductions'] = ['notifications/intros', L10n::t('Introductions'), '', L10n::t('Friend Requests')];
                                $nav['notifications'] = ['notifications',       L10n::t('Notifications'), '', L10n::t('Notifications')];
                                $nav['notifications']['all'] = ['notifications/system', L10n::t('See all notifications'), '', ''];
index 57d14633ac2329ff7a491717c7f1a805613b0a62..2bf232d090464bcfb3f52ce01736e495978ef798 100644 (file)
@@ -267,17 +267,18 @@ class Smilies
         * @return string HTML Output
         *
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
-        * @todo  : Rework because it doesn't work correctly
         */
        private static function pregHeart($x)
        {
                if (strlen($x[1]) == 1) {
                        return $x[0];
                }
+
                $t = '';
                for ($cnt = 0; $cnt < strlen($x[1]); $cnt ++) {
-                       $t .= '<img class="smiley" src="' . System::baseUrl() . '/images/smiley-heart.gif" alt="&lt;3" />';
+                       $t .= '';
                }
+
                $r =  str_replace($x[0], $t, $x[0]);
                return $r;
        }
index 61fe707b40473d26b53b0ef8d5a16acb93f3617b..c16041e2207df7fe929a8cb040afd91e067f61c0 100644 (file)
@@ -21,6 +21,7 @@ use Friendica\Core\Renderer;
 use Friendica\Core\System;
 use Friendica\Model\Contact;
 use Friendica\Model\Event;
+use Friendica\Model\Photo;
 use Friendica\Network\Probe;
 use Friendica\Object\Image;
 use Friendica\Util\Map;
@@ -238,12 +239,32 @@ class BBCode extends BaseObject
                $plink = defaults($item, 'plink', '');
                $post = self::getAttachmentData($body);
 
+               // Get all linked images with alternative image description
+               if (preg_match_all("/\[img=([^\[\]]*)\]([^\[\]]*)\[\/img\]/Usi", $body, $pictures, PREG_SET_ORDER)) {
+                       foreach ($pictures as $picture) {
+                               if (Photo::isLocal($picture[1])) {
+                                       $post['images'][] = ['url' => str_replace('-1.', '-0.', $picture[1]), 'description' => $picture[2]];
+                               }
+                       }
+                       if (!empty($post['images']) && !empty($post['images'][0]['description'])) {
+                               $post['image_description'] = $post['images'][0]['description'];
+                       }
+               }
+
+               if (preg_match_all("/\[img\]([^\[\]]*)\[\/img\]/Usi", $body, $pictures, PREG_SET_ORDER)) {
+                       foreach ($pictures as $picture) {
+                               if (Photo::isLocal($picture[1])) {
+                                       $post['images'][] = ['url' => str_replace('-1.', '-0.', $picture[1]), 'description' => ''];
+                               }
+                       }
+               }
+
                // if nothing is found, it maybe having an image.
                if (!isset($post["type"])) {
                        // Simplify image codes
                        $body = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '[img]$3[/img]', $body);
-
                        $body = preg_replace("/\[img\=(.*?)\](.*?)\[\/img\]/ism", '[img]$1[/img]', $body);
+                       $post["text"] = $body;
 
                        if (preg_match_all("(\[url=(.*?)\]\s*\[img\](.*?)\[\/img\]\s*\[\/url\])ism", $body, $pictures, PREG_SET_ORDER)) {
                                if ((count($pictures) == 1) && !$has_title) {
@@ -288,6 +309,10 @@ class BBCode extends BaseObject
                                        $post["url"] = $plink;
                                        $post["image"] = $pictures[0][2];
                                        $post["text"] = $body;
+
+                                       foreach ($pictures as $picture) {
+                                               $post["text"] = trim(str_replace($picture[0], "", $post["text"]));
+                                       }
                                }
                        } elseif (preg_match_all("(\[img\](.*?)\[\/img\])ism", $body, $pictures, PREG_SET_ORDER)) {
                                if ((count($pictures) == 1) && !$has_title) {
@@ -299,12 +324,16 @@ class BBCode extends BaseObject
                                        $post["url"] = $plink;
                                        $post["image"] = $pictures[0][1];
                                        $post["text"] = $body;
+
+                                       foreach ($pictures as $picture) {
+                                               $post["text"] = trim(str_replace($picture[0], "", $post["text"]));
+                                       }
                                }
                        }
 
                        // Test for the external links
-                       preg_match_all("(\[url\](.*?)\[\/url\])ism", $body, $links1, PREG_SET_ORDER);
-                       preg_match_all("(\[url\=(.*?)\].*?\[\/url\])ism", $body, $links2, PREG_SET_ORDER);
+                       preg_match_all("(\[url\](.*?)\[\/url\])ism", $post["text"], $links1, PREG_SET_ORDER);
+                       preg_match_all("(\[url\=(.*?)\].*?\[\/url\])ism", $post["text"], $links2, PREG_SET_ORDER);
 
                        $links = array_merge($links1, $links2);
 
@@ -312,15 +341,14 @@ class BBCode extends BaseObject
                        // This should cover link posts via API.
                        if ((count($links) == 1) && !isset($post["preview"]) && !$has_title) {
                                $post["type"] = "link";
-                               $post["text"] = trim($body);
                                $post["url"] = $links[0][1];
                        }
 
                        // Now count the number of external media links
-                       preg_match_all("(\[vimeo\](.*?)\[\/vimeo\])ism", $body, $links1, PREG_SET_ORDER);
-                       preg_match_all("(\[youtube\\](.*?)\[\/youtube\\])ism", $body, $links2, PREG_SET_ORDER);
-                       preg_match_all("(\[video\\](.*?)\[\/video\\])ism", $body, $links3, PREG_SET_ORDER);
-                       preg_match_all("(\[audio\\](.*?)\[\/audio\\])ism", $body, $links4, PREG_SET_ORDER);
+                       preg_match_all("(\[vimeo\](.*?)\[\/vimeo\])ism", $post["text"], $links1, PREG_SET_ORDER);
+                       preg_match_all("(\[youtube\\](.*?)\[\/youtube\\])ism", $post["text"], $links2, PREG_SET_ORDER);
+                       preg_match_all("(\[video\\](.*?)\[\/video\\])ism", $post["text"], $links3, PREG_SET_ORDER);
+                       preg_match_all("(\[audio\\](.*?)\[\/audio\\])ism", $post["text"], $links4, PREG_SET_ORDER);
 
                        // Add them to the other external links
                        $links = array_merge($links, $links1, $links2, $links3, $links4);
@@ -357,10 +385,7 @@ class BBCode extends BaseObject
         */
        public static function toPlaintext($text, $keep_urls = true)
        {
-               $naked_text = preg_replace('/\[(.+?)\]\s*/','', $text);
-               if (!$keep_urls) {
-                       $naked_text = preg_replace('#https?\://[^\s<]+[^\s\.\)]#i', '', $naked_text);
-               }
+               $naked_text = HTML::toPlaintext(BBCode::convert($text, false, 0, true), 0, !$keep_urls);
 
                return $naked_text;
        }
@@ -905,7 +930,17 @@ class BBCode extends BaseObject
                                // We only call this so that a previously unknown contact can be added.
                                // This is important for the function "Model\Contact::getDetailsByURL()".
                                // This function then can fetch an entry from the contact table.
-                               Contact::getIdForURL($attributes['profile'], 0, true);
+                               $default['url'] = $attributes['profile'];
+
+                               if (!empty($attributes['author'])) {
+                                       $default['name'] = $attributes['author'];
+                               }
+
+                               if (!empty($attributes['avatar'])) {
+                                       $default['photo'] = $attributes['avatar'];
+                               }
+
+                               Contact::getIdForURL($attributes['profile'], 0, true, $default);
 
                                $author_contact = Contact::getDetailsByURL($attributes['profile']);
                                $author_contact['addr'] = defaults($author_contact, 'addr' , Protocol::getAddrFromProfileUrl($attributes['profile']));
@@ -1092,7 +1127,11 @@ class BBCode extends BaseObject
                        if (substr($curl_info["content_type"], 0, 6) == "image/") {
                                $text = "[img]" . $match[1] . "[/img]";
                        } else {
-                               $text = "[img]" . $match[2] . "[/img]";
+                               if (!empty($match[3])) {
+                                       $text = "[img=" . $match[2] . "]" . $match[3] . "[/img]";
+                               } else {
+                                       $text = "[img]" . $match[2] . "[/img]";
+                               }
 
                                // if its not a picture then look if its a page that contains a picture link
                                $body = Network::fetchUrl($match[1]);
@@ -1110,7 +1149,11 @@ class BBCode extends BaseObject
                                        }
 
                                        if (strtolower($attr["name"]) == "twitter:image") {
-                                               $text = "[img]" . $attr["content"] . "[/img]";
+                                               if (!empty($match[3])) {
+                                                       $text = "[img=" . $attr["content"] . "]" . $match[3] . "[/img]";
+                                               } else {
+                                                       $text = "[img]" . $attr["content"] . "[/img]";
+                                               }
                                        }
                                }
                        }
@@ -1122,7 +1165,8 @@ class BBCode extends BaseObject
 
        public static function cleanPictureLinks($text)
        {
-               $return = preg_replace_callback("&\[url=([^\[\]]*)\]\[img\](.*)\[\/img\]\[\/url\]&Usi", 'self::cleanPictureLinksCallback', $text);
+               $return = preg_replace_callback("&\[url=([^\[\]]*)\]\[img=(.*)\](.*)\[\/img\]\[\/url\]&Usi", 'self::cleanPictureLinksCallback', $text);
+               $return = preg_replace_callback("&\[url=([^\[\]]*)\]\[img\](.*)\[\/img\]\[\/url\]&Usi", 'self::cleanPictureLinksCallback', $return);
                return $return;
        }
 
@@ -1395,6 +1439,7 @@ class BBCode extends BaseObject
 
                // This is actually executed in Item::prepareBody()
 
+               $nosmile = strpos($text, '[nosmile]') !== false;
                $text = str_replace('[nosmile]', '', $text);
 
                // Check for font change text
@@ -1572,7 +1617,7 @@ class BBCode extends BaseObject
                }
 
                // Replace non graphical smilies for external posts
-               if ($simple_html) {
+               if (!$nosmile && !$for_plaintext) {
                        $text = Smilies::replace($text);
                }
 
@@ -1708,18 +1753,25 @@ class BBCode extends BaseObject
                $text = preg_replace('/\<([^>]*?)(src|href)=(.*?)\&amp\;(.*?)\>/ism', '<$1$2=$3&$4>', $text);
 
                // sanitizes src attributes (http and redir URLs for displaying in a web page, cid used for inline images in emails)
-               $allowed_src_protocols = ['http', 'redir', 'cid'];
+               $allowed_src_protocols = ['//', 'http://', 'https://', 'redir/', 'cid:'];
+
+               array_walk($allowed_src_protocols, function(&$value) { $value = preg_quote($value, '#');});
+
                $text = preg_replace('#<([^>]*?)(src)="(?!' . implode('|', $allowed_src_protocols) . ')(.*?)"(.*?)>#ism',
                                         '<$1$2=""$4 data-original-src="$3" class="invalid-src" title="' . L10n::t('Invalid source protocol') . '">', $text);
 
                // sanitize href attributes (only whitelisted protocols URLs)
                // default value for backward compatibility
-               $allowed_link_protocols = Config::get('system', 'allowed_link_protocols', ['ftp', 'mailto', 'gopher', 'cid']);
+               $allowed_link_protocols = Config::get('system', 'allowed_link_protocols', []);
 
                // Always allowed protocol even if config isn't set or not including it
-               $allowed_link_protocols[] = 'http';
+               $allowed_link_protocols[] = '//';
+               $allowed_link_protocols[] = 'http://';
+               $allowed_link_protocols[] = 'https://';
                $allowed_link_protocols[] = 'redir/';
 
+               array_walk($allowed_link_protocols, function(&$value) { $value = preg_quote($value, '#');});
+
                $regex = '#<([^>]*?)(href)="(?!' . implode('|', $allowed_link_protocols) . ')(.*?)"(.*?)>#ism';
                $text = preg_replace($regex, '<$1$2="javascript:void(0)"$4 data-original-href="$3" class="invalid-href" title="' . L10n::t('Invalid link protocol') . '">', $text);
 
index 47463bdd091d1b665c07a116bcdaf042ffc843c4..c8bed0b9d69e03b53f5fab1be5ec7b06988e191f 100644 (file)
@@ -56,6 +56,7 @@ class HTML
 
                $xpath = new DOMXPath($doc);
 
+               /** @var \DOMNode[] $list */
                $list = $xpath->query("//" . $tag);
                foreach ($list as $node) {
                        $attr = [];
@@ -98,9 +99,13 @@ class HTML
                                $node->parentNode->insertBefore($StartCode, $node);
 
                                if ($node->hasChildNodes()) {
-                                       foreach ($node->childNodes as $child) {
-                                               $newNode = $child->cloneNode(true);
-                                               $node->parentNode->insertBefore($newNode, $node);
+                                       /** @var \DOMNode $child */
+                                       foreach ($node->childNodes as $key => $child) {
+                                               /* Remove empty text nodes at the start or at the end of the children list */
+                                               if ($key > 0 && $key < $node->childNodes->length - 1 || $child->nodeName != '#text' || trim($child->nodeValue)) {
+                                                       $newNode = $child->cloneNode(true);
+                                                       $node->parentNode->insertBefore($newNode, $node);
+                                               }
                                        }
                                }
 
@@ -166,7 +171,7 @@ class HTML
 
                $message = mb_convert_encoding($message, 'HTML-ENTITIES', "UTF-8");
 
-               @$doc->loadHTML($message);
+               @$doc->loadHTML($message, LIBXML_HTML_NODEFDTD);
 
                XML::deleteNode($doc, 'style');
                XML::deleteNode($doc, 'head');
@@ -186,7 +191,8 @@ class HTML
                $message = $doc->saveHTML();
                $message = str_replace(["\n<", ">\n", "\r", "\n", "\xC3\x82\xC2\xA0"], ["<", ">", "<br />", " ", ""], $message);
                $message = preg_replace('= [\s]*=i', " ", $message);
-               @$doc->loadHTML($message);
+
+               @$doc->loadHTML($message, LIBXML_HTML_NODEFDTD);
 
                self::tagToBBCode($doc, 'html', [], "", "");
                self::tagToBBCode($doc, 'body', [], "", "");
@@ -290,6 +296,7 @@ class HTML
                self::tagToBBCode($doc, 'a', ['href' => '/mailto:(.+)/'], '[mail=$1]', '[/mail]');
                self::tagToBBCode($doc, 'a', ['href' => '/(.+)/'], '[url=$1]', '[/url]');
 
+               self::tagToBBCode($doc, 'img', ['src' => '/(.+)/', 'alt' => '/(.+)/'], '[img=$1]$2', '[/img]');
                self::tagToBBCode($doc, 'img', ['src' => '/(.+)/', 'width' => '/(\d+)/', 'height' => '/(\d+)/'], '[img=$2x$3]$1', '[/img]');
                self::tagToBBCode($doc, 'img', ['src' => '/(.+)/'], '[img]$1', '[/img]');
 
@@ -559,6 +566,8 @@ class HTML
                                $ignore = false;
                        }
 
+                       $ignore = $ignore || strpos($treffer[1], '#') === 0;
+
                        if (!$ignore) {
                                $urls[$treffer[1]] = $treffer[1];
                        }
@@ -567,7 +576,13 @@ class HTML
                return $urls;
        }
 
-       public static function toPlaintext($html, $wraplength = 75, $compact = false)
+       /**
+        * @param string $html
+        * @param int    $wraplength Ensures individual lines aren't longer than this many characters. Doesn't break words.
+        * @param bool   $compact    True: Completely strips image tags; False: Keeps image URLs
+        * @return string
+        */
+       public static function toPlaintext(string $html, $wraplength = 75, $compact = false)
        {
                $message = str_replace("\r", "", $html);
 
@@ -576,38 +591,20 @@ class HTML
 
                $message = mb_convert_encoding($message, 'HTML-ENTITIES', "UTF-8");
 
-               @$doc->loadHTML($message);
-
-               $xpath = new DOMXPath($doc);
-               $list = $xpath->query("//pre");
-               foreach ($list as $node) {
-                       $node->nodeValue = str_replace("\n", "\r", $node->nodeValue);
-               }
+               @$doc->loadHTML($message, LIBXML_HTML_NODEFDTD);
 
                $message = $doc->saveHTML();
-               $message = str_replace(["\n<", ">\n", "\r", "\n", "\xC3\x82\xC2\xA0"], ["<", ">", "<br>", " ", ""], $message);
-               $message = preg_replace('= [\s]*=i', " ", $message);
+               // Remove eventual UTF-8 BOM
+               $message = str_replace("\xC3\x82\xC2\xA0", "", $message);
 
                // Collecting all links
                $urls = self::collectURLs($message);
 
-               @$doc->loadHTML($message);
+               @$doc->loadHTML($message, LIBXML_HTML_NODEFDTD);
 
                self::tagToBBCode($doc, 'html', [], '', '');
                self::tagToBBCode($doc, 'body', [], '', '');
 
-               // MyBB-Auszeichnungen
-               /*
-                 self::node2BBCode($doc, 'span', array('style'=>'text-decoration: underline;'), '_', '_');
-                 self::node2BBCode($doc, 'span', array('style'=>'font-style: italic;'), '/', '/');
-                 self::node2BBCode($doc, 'span', array('style'=>'font-weight: bold;'), '*', '*');
-
-                 self::node2BBCode($doc, 'strong', array(), '*', '*');
-                 self::node2BBCode($doc, 'b', array(), '*', '*');
-                 self::node2BBCode($doc, 'i', array(), '/', '/');
-                 self::node2BBCode($doc, 'u', array(), '_', '_');
-                */
-
                if ($compact) {
                        self::tagToBBCode($doc, 'blockquote', [], "»", "«");
                } else {
@@ -621,8 +618,6 @@ class HTML
                self::tagToBBCode($doc, 'div', [], "\r", "\r");
                self::tagToBBCode($doc, 'p', [], "\n", "\n");
 
-               //self::node2BBCode($doc, 'ul', array(), "\n[list]", "[/list]\n");
-               //self::node2BBCode($doc, 'ol', array(), "\n[list=1]", "[/list]\n");
                self::tagToBBCode($doc, 'li', [], "\n* ", "\n");
 
                self::tagToBBCode($doc, 'hr', [], "\n" . str_repeat("-", 70) . "\n", "");
@@ -637,12 +632,6 @@ class HTML
                self::tagToBBCode($doc, 'h5', [], "\n\n*", "*\n");
                self::tagToBBCode($doc, 'h6', [], "\n\n*", "*\n");
 
-               // Problem: there is no reliable way to detect if it is a link to a tag or profile
-               //self::node2BBCode($doc, 'a', array('href'=>'/(.+)/'), ' $1 ', ' ', true);
-               //self::node2BBCode($doc, 'a', array('href'=>'/(.+)/', 'rel'=>'oembed'), ' $1 ', '', true);
-               //self::node2BBCode($doc, 'img', array('alt'=>'/(.+)/'), '$1', '');
-               //self::node2BBCode($doc, 'img', array('title'=>'/(.+)/'), '$1', '');
-               //self::node2BBCode($doc, 'img', array(), '', '');
                if (!$compact) {
                        self::tagToBBCode($doc, 'img', ['src' => '/(.+)/'], ' [img]$1', '[/img] ');
                } else {
index dcfc1d0e3d95da631db6899dc781c10eff9f017c..a1482ae943a68aab80e3427d631caf3de006fe4a 100644 (file)
@@ -52,7 +52,7 @@ class Widget
                $global_dir = Config::get('system', 'directory');
 
                if (Config::get('system', 'invitation_only')) {
-                       $x = PConfig::get(local_user(), 'system', 'invites_remaining');
+                       $x = intval(PConfig::get(local_user(), 'system', 'invites_remaining'));
                        if ($x || is_site_admin()) {
                                $a->page['aside'] .= '<div class="side-link widget" id="side-invite-remain">'
                                        . L10n::tt('%d invitation available', '%d invitations available', $x)
@@ -297,11 +297,13 @@ class Widget
        {
                $a = \get_app();
 
-               if (!Feature::isEnabled($a->profile['profile_uid'], 'categories')) {
+               $uid = intval($a->profile['profile_uid']);
+
+               if (!Feature::isEnabled($uid, 'categories')) {
                        return '';
                }
 
-               $saved = PConfig::get($a->profile['profile_uid'], 'system', 'filetags');
+               $saved = PConfig::get($uid, 'system', 'filetags');
                if (!strlen($saved)) {
                        return;
                }
@@ -420,17 +422,19 @@ class Widget
        {
                $a = \get_app();
 
-               if (!$a->profile['profile_uid'] || !$a->profile['url']) {
+               $uid = intval($a->profile['profile_uid']);
+
+               if (!$uid || !$a->profile['url']) {
                        return '';
                }
 
-               if (Feature::isEnabled($a->profile['profile_uid'], 'tagadelic')) {
+               if (Feature::isEnabled($uid, 'tagadelic')) {
                        $owner_id = Contact::getIdForURL($a->profile['url'], 0, true);
 
                        if (!$owner_id) {
                                return '';
                        }
-                       return Widget\TagCloud::getHTML($a->profile['profile_uid'], $limit, $owner_id, 'wall');
+                       return Widget\TagCloud::getHTML($uid, $limit, $owner_id, 'wall');
                }
 
                return '';
index 84482f638b90e8a7be334712749ec5505e5b147a..829d267d8fd5ea9ee5668efade3a72cef6fdd936 100644 (file)
@@ -30,7 +30,7 @@ class CalendarExport
                        return;
                }
 
-               $owner_uid = $a->data['user']['uid'];
+               $owner_uid = intval($a->data['user']['uid']);
 
                // The permission testing is a little bit tricky because we have to respect many cases.
 
index bc33b9c9c928672a24de0d9712bf0a52562a0c73..ef152f900846fbfcaa7061475eb37499a29e94cc 100644 (file)
@@ -75,7 +75,7 @@ class ContactBlock
                                'hidden' => false,
                                'archive' => false,
                                'rel' => $rel,
-                               'network' => [Protocol::DFRN, Protocol::ACTIVITYPUB, Protocol::OSTATUS, Protocol::DIASPORA],
+                               'network' => Protocol::FEDERATED,
                        ], ['limit' => $shown]);
 
                        if (DBA::isResult($contact_ids_stmt)) {
diff --git a/src/Content/Widget/TrendingTags.php b/src/Content/Widget/TrendingTags.php
new file mode 100644 (file)
index 0000000..a7cfa85
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+
+namespace Friendica\Content\Widget;
+
+use Friendica\Core\Cache;
+use Friendica\Core\L10n;
+use Friendica\Core\Renderer;
+use Friendica\Database\DBA;
+use Friendica\Model\Term;
+
+/**
+ * Trending tags aside widget for the community pages, handles both local and global scopes
+ *
+ * @package Friendica\Content\Widget
+ */
+class TrendingTags
+{
+       /**
+        * @param string $content 'global' (all posts) or 'local' (this node's posts only)
+        * @param int    $period  Period in hours to consider posts
+        * @return string
+        * @throws \Exception
+        */
+       public static function getHTML($content = 'global', int $period = 24)
+       {
+               if ($content == 'local') {
+                       $tags = Term::getLocalTrendingHashtags($period, 20);
+               } else {
+                       $tags = Term::getGlobalTrendingHashtags($period, 20);
+               }
+
+               $tpl = Renderer::getMarkupTemplate('widget/trending_tags.tpl');
+               $o = Renderer::replaceMacros($tpl, [
+                       '$title' => L10n::tt('Trending Tags (last %d hour)', 'Trending Tags (last %d hours)', $period),
+                       '$more' => L10n::t('More Trending Tags'),
+                       '$tags' => $tags,
+               ]);
+
+               return $o;
+       }
+}
index 646729c434014ac37794cdedf1ecc3d36c3e9f63..59061c04c4b08e2392045d07236eeb29d22cdbd9 100644 (file)
@@ -7,7 +7,7 @@ namespace Friendica\Core;
 
 use Friendica\App;
 use Friendica\BaseObject;
-use Friendica\Util\BaseURL;
+use Friendica\Network\HTTPException\ForbiddenException;
 
 /**
 * Handle Authentification, Session and Cookies
@@ -50,7 +50,7 @@ class Authentication extends BaseObject
                        $value = "";
                }
 
-               setcookie("Friendica", $value, $time, "/", "", (Config::get('system', 'ssl_policy') == BaseUrl::SSL_POLICY_FULL), true);
+               setcookie("Friendica", $value, $time, "/", "", (Config::get('system', 'ssl_policy') == App\BaseURL::SSL_POLICY_FULL), true);
        }
 
        /**
@@ -71,7 +71,7 @@ class Authentication extends BaseObject
                }
 
                // Check current path, if 2fa authentication module return
-               if ($a->argc > 0 && in_array($a->argv[0], ['ping', '2fa', 'view', 'help', 'api', 'proxy', 'logout'])) {
+               if ($a->argc > 0 && in_array($a->argv[0], ['2fa', 'view', 'help', 'api', 'proxy', 'logout'])) {
                        return;
                }
 
@@ -81,7 +81,11 @@ class Authentication extends BaseObject
                }
 
                // Case 2: No valid 2FA session: redirect to code verification page
-               $a->internalRedirect('2fa');
+               if ($a->isAjax()) {
+                       throw new ForbiddenException();
+               } else {
+                       $a->internalRedirect('2fa');
+               }
        }
 }
 
index 7a8f7367ec10597613b7ed94385bfdf85c2464f0..7a952ff8a14a8149875bada999f778676adca4d2 100644 (file)
@@ -4,50 +4,33 @@
  */
 namespace Friendica\Core;
 
-use Friendica\Factory\CacheDriverFactory;
+use Friendica\BaseObject;
+use Friendica\Core\Cache\Cache as CacheClass;
+use Friendica\Core\Cache\ICache;
 
 /**
  * @brief Class for storing data for a short time
  */
-class Cache extends \Friendica\BaseObject
+class Cache extends BaseObject
 {
-       const MONTH        = 2592000;
-       const WEEK         = 604800;
-       const DAY          = 86400;
-       const HOUR         = 3600;
-       const HALF_HOUR    = 1800;
-       const QUARTER_HOUR = 900;
-       const FIVE_MINUTES = 300;
-       const MINUTE       = 60;
-       const INFINITE     = 0;
-
-       /**
-        * @var Cache\ICacheDriver
-        */
-       private static $driver       = null;
-       public  static $driver_class = null;
-       public  static $driver_name  = null;
-
-       public static function init()
-       {
-               self::$driver_name  = Config::get('system', 'cache_driver', 'database');
-               self::$driver       = CacheDriverFactory::create(self::$driver_name);
-               self::$driver_class = get_class(self::$driver);
-       }
-
-       /**
-        * Returns the current cache driver
-        *
-        * @return Cache\ICacheDriver
-        */
-       private static function getDriver()
-       {
-               if (self::$driver === null) {
-                       self::init();
-               }
-
-               return self::$driver;
-       }
+       /** @deprecated Use CacheClass::MONTH */
+       const MONTH        = CacheClass::MONTH;
+       /** @deprecated Use CacheClass::WEEK */
+       const WEEK         = CacheClass::WEEK;
+       /** @deprecated Use CacheClass::DAY */
+       const DAY          = CacheClass::DAY;
+       /** @deprecated Use CacheClass::HOUR */
+       const HOUR         = CacheClass::HOUR;
+       /** @deprecated Use CacheClass::HALF_HOUR */
+       const HALF_HOUR    = CacheClass::HALF_HOUR;
+       /** @deprecated Use CacheClass::QUARTER_HOUR */
+       const QUARTER_HOUR = CacheClass::QUARTER_HOUR;
+       /** @deprecated Use CacheClass::FIVE_MINUTES */
+       const FIVE_MINUTES = CacheClass::FIVE_MINUTES;
+       /** @deprecated Use CacheClass::MINUTE */
+       const MINUTE       = CacheClass::MINUTE;
+       /** @deprecated Use CacheClass::INFINITE */
+       const INFINITE     = CacheClass::INFINITE;
 
        /**
         * @brief Returns all the cache keys sorted alphabetically
@@ -59,13 +42,7 @@ class Cache extends \Friendica\BaseObject
         */
        public static function getAllKeys($prefix = null)
        {
-               $time = microtime(true);
-
-               $return = self::getDriver()->getAllKeys($prefix);
-
-               self::getApp()->getProfiler()->saveTimestamp($time, 'cache', System::callstack());
-
-               return $return;
+               return self::getClass(ICache::class)->getAllKeys($prefix);
        }
 
        /**
@@ -78,13 +55,7 @@ class Cache extends \Friendica\BaseObject
         */
        public static function get($key)
        {
-               $time = microtime(true);
-
-               $return = self::getDriver()->get($key);
-
-               self::getApp()->getProfiler()->saveTimestamp($time, 'cache', System::callstack());
-
-               return $return;
+               return self::getClass(ICache::class)->get($key);
        }
 
        /**
@@ -99,15 +70,9 @@ class Cache extends \Friendica\BaseObject
         * @return bool
         * @throws \Exception
         */
-       public static function set($key, $value, $duration = self::MONTH)
+       public static function set($key, $value, $duration = CacheClass::MONTH)
        {
-               $time = microtime(true);
-
-               $return = self::getDriver()->set($key, $value, $duration);
-
-               self::getApp()->getProfiler()->saveTimestamp($time, 'cache_write', System::callstack());
-
-               return $return;
+               return self::getClass(ICache::class)->set($key, $value, $duration);
        }
 
        /**
@@ -120,13 +85,7 @@ class Cache extends \Friendica\BaseObject
         */
        public static function delete($key)
        {
-               $time = microtime(true);
-
-               $return = self::getDriver()->delete($key);
-
-               self::getApp()->getProfiler()->saveTimestamp($time, 'cache_write', System::callstack());
-
-               return $return;
+               return self::getClass(ICache::class)->delete($key);
        }
 
        /**
@@ -135,9 +94,10 @@ class Cache extends \Friendica\BaseObject
         * @param boolean $outdated just remove outdated values
         *
         * @return bool
+        * @throws \Exception
         */
        public static function clear($outdated = true)
        {
-               return self::getDriver()->clear($outdated);
+               return self::getClass(ICache::class)->clear($outdated);
        }
 }
index f658424cdcb7a907b365b8e5f8f143593f5e0633..48880fe98609730baf77462e88af82c38e2d043f 100644 (file)
@@ -3,14 +3,13 @@
 namespace Friendica\Core\Cache;
 
 use Exception;
-use Friendica\Core\Cache;
 
 /**
- * APCu Cache Driver.
+ * APCu Cache.
  *
  * @author Philipp Holzer <admin@philipp.info>
  */
-class APCuCache extends AbstractCacheDriver implements IMemoryCacheDriver
+class APCuCache extends Cache implements IMemoryCache
 {
        use TraitCompareSet;
        use TraitCompareDelete;
@@ -18,11 +17,13 @@ class APCuCache extends AbstractCacheDriver implements IMemoryCacheDriver
        /**
         * @throws Exception
         */
-       public function __construct()
+       public function __construct(string $hostname)
        {
                if (!self::isAvailable()) {
                        throw new Exception('APCu is not available.');
                }
+
+               parent::__construct($hostname);
        }
 
        /**
@@ -151,4 +152,12 @@ class APCuCache extends AbstractCacheDriver implements IMemoryCacheDriver
 
                return true;
        }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function getName()
+       {
+               return self::TYPE_APCU;
+       }
 }
diff --git a/src/Core/Cache/AbstractCacheDriver.php b/src/Core/Cache/AbstractCacheDriver.php
deleted file mode 100644 (file)
index f238a78..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-
-namespace Friendica\Core\Cache;
-use Friendica\BaseObject;
-
-
-/**
- * Abstract class for common used functions
- *
- * Class AbstractCacheDriver
- *
- * @package Friendica\Core\Cache
- */
-abstract class AbstractCacheDriver extends BaseObject
-{
-       /**
-        * Returns the prefix (to avoid namespace conflicts)
-        *
-        * @return string
-        * @throws \Exception
-        */
-       protected function getPrefix()
-       {
-               // We fetch with the hostname as key to avoid problems with other applications
-               return self::getApp()->getHostName();
-       }
-
-       /**
-        * @param string $key The original key
-        * @return string        The cache key used for the cache
-        * @throws \Exception
-        */
-       protected function getCacheKey($key)
-       {
-               return $this->getPrefix() . ":" . $key;
-       }
-
-       /**
-        * @param array $keys   A list of cached keys
-        * @return array        A list of original keys
-        */
-       protected function getOriginalKeys($keys)
-       {
-               if (empty($keys)) {
-                       return [];
-               } else {
-                       // Keys are prefixed with the node hostname, let's remove it
-                       array_walk($keys, function (&$value) {
-                               $value = preg_replace('/^' . self::getApp()->getHostName() . ':/', '', $value);
-                       });
-
-                       sort($keys);
-
-                       return $keys;
-               }
-       }
-
-       /**
-        * Filters the keys of an array with a given prefix
-        * Returns the filtered keys as an new array
-        *
-        * @param array $array The array, which should get filtered
-        * @param string|null $prefix The prefix (if null, all keys will get returned)
-        *
-        * @return array The filtered array with just the keys
-        */
-       protected function filterArrayKeysByPrefix($array, $prefix = null)
-       {
-               if (empty($prefix)) {
-                       return array_keys($array);
-               } else {
-                       $result = [];
-
-                       foreach (array_keys($array) as $key) {
-                               if (strpos($key, $prefix) === 0) {
-                                       array_push($result, $key);
-                               }
-                       }
-
-                       return $result;
-               }
-
-       }
-}
index a99b05788f64e75e46d5d8e4df8c230bdcf6c414..c6f3983ee2586efed12aeed3a8db4d516ccef3f7 100644 (file)
@@ -2,17 +2,14 @@
 
 namespace Friendica\Core\Cache;
 
-
-use Friendica\Core\Cache;
-
 /**
- * Implementation of the IMemoryCacheDriver mainly for testing purpose
+ * Implementation of the IMemoryCache mainly for testing purpose
  *
  * Class ArrayCache
  *
  * @package Friendica\Core\Cache
  */
-class ArrayCache extends AbstractCacheDriver implements IMemoryCacheDriver
+class ArrayCache extends Cache implements IMemoryCache
 {
        use TraitCompareDelete;
 
@@ -24,7 +21,7 @@ class ArrayCache extends AbstractCacheDriver implements IMemoryCacheDriver
         */
        public function getAllKeys($prefix = null)
        {
-               return $this->filterArrayKeysByPrefix($this->cachedData, $prefix);
+               return $this->filterArrayKeysByPrefix(array_keys($this->cachedData), $prefix);
        }
 
        /**
@@ -93,4 +90,12 @@ class ArrayCache extends AbstractCacheDriver implements IMemoryCacheDriver
                        return false;
                }
        }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function getName()
+       {
+               return self::TYPE_ARRAY;
+       }
 }
diff --git a/src/Core/Cache/Cache.php b/src/Core/Cache/Cache.php
new file mode 100644 (file)
index 0000000..cf5b15d
--- /dev/null
@@ -0,0 +1,108 @@
+<?php
+
+namespace Friendica\Core\Cache;
+
+/**
+ * Abstract class for common used functions
+ *
+ * Class AbstractCache
+ *
+ * @package Friendica\Core\Cache
+ */
+abstract class Cache implements ICache
+{
+       const TYPE_APCU      = 'apcu';
+       const TYPE_ARRAY     = 'array';
+       const TYPE_DATABASE  = 'database';
+       const TYPE_MEMCACHE  = 'memcache';
+       const TYPE_MEMCACHED = 'memcached';
+       const TYPE_REDIS     = 'redis';
+
+       const MONTH        = 2592000;
+       const WEEK         = 604800;
+       const DAY          = 86400;
+       const HOUR         = 3600;
+       const HALF_HOUR    = 1800;
+       const QUARTER_HOUR = 900;
+       const FIVE_MINUTES = 300;
+       const MINUTE       = 60;
+       const INFINITE     = 0;
+
+       /**
+        * @var string The hostname
+        */
+       private $hostName;
+
+       public function __construct(string $hostName)
+       {
+               $this->hostName = $hostName;
+       }
+
+       /**
+        * Returns the prefix (to avoid namespace conflicts)
+        *
+        * @return string
+        * @throws \Exception
+        */
+       protected function getPrefix()
+       {
+               // We fetch with the hostname as key to avoid problems with other applications
+               return $this->hostName;
+       }
+
+       /**
+        * @param string $key The original key
+        * @return string        The cache key used for the cache
+        * @throws \Exception
+        */
+       protected function getCacheKey($key)
+       {
+               return $this->getPrefix() . ":" . $key;
+       }
+
+       /**
+        * @param array $keys   A list of cached keys
+        * @return array        A list of original keys
+        */
+       protected function getOriginalKeys($keys)
+       {
+               if (empty($keys)) {
+                       return [];
+               } else {
+                       // Keys are prefixed with the node hostname, let's remove it
+                       array_walk($keys, function (&$value) {
+                               $value = preg_replace('/^' . $this->hostName . ':/', '', $value);
+                       });
+
+                       sort($keys);
+
+                       return $keys;
+               }
+       }
+
+       /**
+        * Filters the keys of an array with a given prefix
+        * Returns the filtered keys as an new array
+        *
+        * @param array $keys The keys, which should get filtered
+        * @param string|null $prefix The prefix (if null, all keys will get returned)
+        *
+        * @return array The filtered array with just the keys
+        */
+       protected function filterArrayKeysByPrefix(array $keys, string $prefix = null)
+       {
+               if (empty($prefix)) {
+                       return $keys;
+               } else {
+                       $result = [];
+
+                       foreach ($keys as $key) {
+                               if (strpos($key, $prefix) === 0) {
+                                       array_push($result, $key);
+                               }
+                       }
+
+                       return $result;
+               }
+       }
+}
diff --git a/src/Core/Cache/DatabaseCache.php b/src/Core/Cache/DatabaseCache.php
new file mode 100644 (file)
index 0000000..7fbbdb5
--- /dev/null
@@ -0,0 +1,120 @@
+<?php
+
+namespace Friendica\Core\Cache;
+
+use Friendica\Database\Database;
+use Friendica\Util\DateTimeFormat;
+
+/**
+ * Database Cache
+ *
+ * @author Hypolite Petovan <hypolite@mrpetovan.com>
+ */
+class DatabaseCache extends Cache implements ICache
+{
+       /**
+        * @var Database
+        */
+       private $dba;
+
+       public function __construct(string $hostname, Database $dba)
+       {
+               parent::__construct($hostname);
+
+               $this->dba = $dba;
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function getAllKeys($prefix = null)
+       {
+               if (empty($prefix)) {
+                       $where = ['`expires` >= ?', DateTimeFormat::utcNow()];
+               } else {
+                       $where = ['`expires` >= ? AND `k` LIKE CONCAT(?, \'%\')', DateTimeFormat::utcNow(), $prefix];
+               }
+
+               $stmt = $this->dba->select('cache', ['k'], $where);
+
+               $keys = [];
+               while ($key = $this->dba->fetch($stmt)) {
+                       array_push($keys, $key['k']);
+               }
+               $this->dba->close($stmt);
+
+               return $keys;
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function get($key)
+       {
+               $cache = $this->dba->selectFirst('cache', ['v'], ['`k` = ? AND (`expires` >= ? OR `expires` = -1)', $key, DateTimeFormat::utcNow()]);
+
+               if ($this->dba->isResult($cache)) {
+                       $cached = $cache['v'];
+                       $value = @unserialize($cached);
+
+                       // Only return a value if the serialized value is valid.
+                       // We also check if the db entry is a serialized
+                       // boolean 'false' value (which we want to return).
+                       if ($cached === serialize(false) || $value !== false) {
+                               return $value;
+                       }
+               }
+
+               return null;
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function set($key, $value, $ttl = Cache::FIVE_MINUTES)
+       {
+               if ($ttl > 0) {
+                       $fields = [
+                               'v' => serialize($value),
+                               'expires' => DateTimeFormat::utc('now + ' . $ttl . 'seconds'),
+                               'updated' => DateTimeFormat::utcNow()
+                       ];
+               } else {
+                       $fields = [
+                               'v' => serialize($value),
+                               'expires' => -1,
+                               'updated' => DateTimeFormat::utcNow()
+                       ];
+               }
+
+               return $this->dba->update('cache', $fields, ['k' => $key], true);
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function delete($key)
+       {
+               return $this->dba->delete('cache', ['k' => $key]);
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function clear($outdated = true)
+       {
+               if ($outdated) {
+                       return $this->dba->delete('cache', ['`expires` < NOW()']);
+               } else {
+                       return $this->dba->delete('cache', ['`k` IS NOT NULL ']);
+               }
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function getName()
+       {
+               return self::TYPE_DATABASE;
+       }
+}
diff --git a/src/Core/Cache/DatabaseCacheDriver.php b/src/Core/Cache/DatabaseCacheDriver.php
deleted file mode 100644 (file)
index f6f5b64..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-<?php
-
-namespace Friendica\Core\Cache;
-
-use Friendica\Core\Cache;
-use Friendica\Database\DBA;
-use Friendica\Util\DateTimeFormat;
-
-/**
- * Database Cache Driver
- *
- * @author Hypolite Petovan <hypolite@mrpetovan.com>
- */
-class DatabaseCacheDriver extends AbstractCacheDriver implements ICacheDriver
-{
-       /**
-        * (@inheritdoc)
-        */
-       public function getAllKeys($prefix = null)
-       {
-               if (empty($prefix)) {
-                       $where = ['`expires` >= ?', DateTimeFormat::utcNow()];
-               } else {
-                       $where = ['`expires` >= ? AND `k` LIKE CONCAT(?, \'%\')', DateTimeFormat::utcNow(), $prefix];
-               }
-
-               $stmt = DBA::select('cache', ['k'], $where);
-
-               $keys = [];
-               while ($key = DBA::fetch($stmt)) {
-                       array_push($keys, $key['k']);
-               }
-               DBA::close($stmt);
-
-               return $keys;
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function get($key)
-       {
-               $cache = DBA::selectFirst('cache', ['v'], ['`k` = ? AND (`expires` >= ? OR `expires` = -1)', $key, DateTimeFormat::utcNow()]);
-
-               if (DBA::isResult($cache)) {
-                       $cached = $cache['v'];
-                       $value = @unserialize($cached);
-
-                       // Only return a value if the serialized value is valid.
-                       // We also check if the db entry is a serialized
-                       // boolean 'false' value (which we want to return).
-                       if ($cached === serialize(false) || $value !== false) {
-                               return $value;
-                       }
-               }
-
-               return null;
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function set($key, $value, $ttl = Cache::FIVE_MINUTES)
-       {
-               if ($ttl > 0) {
-                       $fields = [
-                               'v' => serialize($value),
-                               'expires' => DateTimeFormat::utc('now + ' . $ttl . 'seconds'),
-                               'updated' => DateTimeFormat::utcNow()
-                       ];
-               } else {
-                       $fields = [
-                               'v' => serialize($value),
-                               'expires' => -1,
-                               'updated' => DateTimeFormat::utcNow()
-                       ];
-               }
-
-               return DBA::update('cache', $fields, ['k' => $key], true);
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function delete($key)
-       {
-               return DBA::delete('cache', ['k' => $key]);
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function clear($outdated = true)
-       {
-               if ($outdated) {
-                       return DBA::delete('cache', ['`expires` < NOW()']);
-               } else {
-                       return DBA::delete('cache', ['`k` IS NOT NULL ']);
-               }
-       }
-}
diff --git a/src/Core/Cache/ICache.php b/src/Core/Cache/ICache.php
new file mode 100644 (file)
index 0000000..f8e98c5
--- /dev/null
@@ -0,0 +1,64 @@
+<?php
+
+namespace Friendica\Core\Cache;
+
+/**
+ * Cache Interface
+ *
+ * @author Hypolite Petovan <hypolite@mrpetovan.com>
+ */
+interface ICache
+{
+       /**
+        * Lists all cache keys
+        *
+        * @param string prefix optional a prefix to search
+        *
+        * @return array Empty if it isn't supported by the cache driver
+        */
+       public function getAllKeys($prefix = null);
+
+       /**
+        * Fetches cached data according to the key
+        *
+        * @param string $key The key to the cached data
+        *
+        * @return mixed Cached $value or "null" if not found
+        */
+       public function get($key);
+
+       /**
+        * Stores data in the cache identified by the key. The input $value can have multiple formats.
+        *
+        * @param string  $key      The cache key
+        * @param mixed   $value    The value to store
+        * @param integer $ttl      The cache lifespan, must be one of the Cache constants
+        *
+        * @return bool
+        */
+       public function set($key, $value, $ttl = Cache::FIVE_MINUTES);
+
+       /**
+        * Delete a key from the cache
+        *
+        * @param string $key      The cache key
+        *
+        * @return bool
+        */
+       public function delete($key);
+
+       /**
+        * Remove outdated data from the cache
+        * @param  boolean $outdated just remove outdated values
+        *
+        * @return bool
+        */
+       public function clear($outdated = true);
+
+       /**
+        * Returns the name of the current cache
+        *
+        * @return string
+        */
+       public function getName();
+}
diff --git a/src/Core/Cache/ICacheDriver.php b/src/Core/Cache/ICacheDriver.php
deleted file mode 100644 (file)
index 1188e51..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-<?php
-
-namespace Friendica\Core\Cache;
-
-use Friendica\Core\Cache;
-
-/**
- * Cache Driver Interface
- *
- * @author Hypolite Petovan <hypolite@mrpetovan.com>
- */
-interface ICacheDriver
-{
-       /**
-        * Lists all cache keys
-        *
-        * @param string prefix optional a prefix to search
-        *
-        * @return array Empty if it isn't supported by the cache driver
-        */
-       public function getAllKeys($prefix = null);
-
-       /**
-        * Fetches cached data according to the key
-        *
-        * @param string $key The key to the cached data
-        *
-        * @return mixed Cached $value or "null" if not found
-        */
-       public function get($key);
-
-       /**
-        * Stores data in the cache identified by the key. The input $value can have multiple formats.
-        *
-        * @param string  $key      The cache key
-        * @param mixed   $value    The value to store
-        * @param integer $ttl      The cache lifespan, must be one of the Cache constants
-        *
-        * @return bool
-        */
-       public function set($key, $value, $ttl = Cache::FIVE_MINUTES);
-
-       /**
-        * Delete a key from the cache
-        *
-        * @param string $key      The cache key
-        *
-        * @return bool
-        */
-       public function delete($key);
-
-       /**
-        * Remove outdated data from the cache
-        * @param  boolean $outdated just remove outdated values
-        *
-        * @return bool
-        */
-       public function clear($outdated = true);
-}
diff --git a/src/Core/Cache/IMemoryCache.php b/src/Core/Cache/IMemoryCache.php
new file mode 100644 (file)
index 0000000..339f72d
--- /dev/null
@@ -0,0 +1,44 @@
+<?php
+
+namespace Friendica\Core\Cache;
+
+/**
+ * This interface defines methods for Memory-Caches only
+ *
+ * Interface IMemoryCache
+ *
+ * @package Friendica\Core\Cache
+ */
+interface IMemoryCache extends ICache
+{
+       /**
+        * Sets a value if it's not already stored
+        *
+        * @param string $key      The cache key
+        * @param mixed  $value    The old value we know from the cache
+        * @param int    $ttl      The cache lifespan, must be one of the Cache constants
+        * @return bool
+        */
+       public function add($key, $value, $ttl = Cache::FIVE_MINUTES);
+
+       /**
+        * Compares if the old value is set and sets the new value
+        *
+        * @param string $key         The cache key
+        * @param mixed  $oldValue    The old value we know from the cache
+        * @param mixed  $newValue    The new value we want to set
+        * @param int    $ttl             The cache lifespan, must be one of the Cache constants
+        *
+        * @return bool
+        */
+       public function compareSet($key, $oldValue, $newValue, $ttl = Cache::FIVE_MINUTES);
+
+       /**
+        * Compares if the old value is set and removes it
+        *
+        * @param string $key          The cache key
+        * @param mixed  $value        The old value we know and want to delete
+        * @return bool
+        */
+       public function compareDelete($key, $value);
+}
diff --git a/src/Core/Cache/IMemoryCacheDriver.php b/src/Core/Cache/IMemoryCacheDriver.php
deleted file mode 100644 (file)
index 0c5146f..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-
-namespace Friendica\Core\Cache;
-use Friendica\Core\Cache;
-
-/**
- * This interface defines methods for Memory-Caches only
- *
- * Interface IMemoryCacheDriver
- *
- * @package Friendica\Core\Cache
- */
-interface IMemoryCacheDriver extends ICacheDriver
-{
-       /**
-        * Sets a value if it's not already stored
-        *
-        * @param string $key      The cache key
-        * @param mixed  $value    The old value we know from the cache
-        * @param int    $ttl      The cache lifespan, must be one of the Cache constants
-        * @return bool
-        */
-       public function add($key, $value, $ttl = Cache::FIVE_MINUTES);
-
-       /**
-        * Compares if the old value is set and sets the new value
-        *
-        * @param string $key         The cache key
-        * @param mixed  $oldValue    The old value we know from the cache
-        * @param mixed  $newValue    The new value we want to set
-        * @param int    $ttl             The cache lifespan, must be one of the Cache constants
-        *
-        * @return bool
-        */
-       public function compareSet($key, $oldValue, $newValue, $ttl = Cache::FIVE_MINUTES);
-
-       /**
-        * Compares if the old value is set and removes it
-        *
-        * @param string $key          The cache key
-        * @param mixed  $value        The old value we know and want to delete
-        * @return bool
-        */
-       public function compareDelete($key, $value);
-}
diff --git a/src/Core/Cache/MemcacheCache.php b/src/Core/Cache/MemcacheCache.php
new file mode 100644 (file)
index 0000000..7171669
--- /dev/null
@@ -0,0 +1,158 @@
+<?php
+
+namespace Friendica\Core\Cache;
+
+use Exception;
+use Friendica\Core\Config\Configuration;
+use Memcache;
+
+/**
+ * Memcache Cache
+ *
+ * @author Hypolite Petovan <hypolite@mrpetovan.com>
+ */
+class MemcacheCache extends Cache implements IMemoryCache
+{
+       use TraitCompareSet;
+       use TraitCompareDelete;
+
+       /**
+        * @var Memcache
+        */
+       private $memcache;
+
+       /**
+        * @throws Exception
+        */
+       public function __construct(string $hostname, Configuration $config)
+       {
+               if (!class_exists('Memcache', false)) {
+                       throw new Exception('Memcache class isn\'t available');
+               }
+
+               parent::__construct($hostname);
+
+               $this->memcache = new Memcache();
+
+               $memcache_host = $config->get('system', 'memcache_host');
+               $memcache_port = $config->get('system', 'memcache_port');
+
+               if (!$this->memcache->connect($memcache_host, $memcache_port)) {
+                       throw new Exception('Expected Memcache server at ' . $memcache_host . ':' . $memcache_port . ' isn\'t available');
+               }
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function getAllKeys($prefix = null)
+       {
+               $keys     = [];
+               $allSlabs = $this->memcache->getExtendedStats('slabs');
+               foreach ($allSlabs as $slabs) {
+                       foreach (array_keys($slabs) as $slabId) {
+                               $cachedump = $this->memcache->getExtendedStats('cachedump', (int)$slabId);
+                               foreach ($cachedump as $key => $arrVal) {
+                                       if (!is_array($arrVal)) {
+                                               continue;
+                                       }
+                                       $keys = array_merge($keys, array_keys($arrVal));
+                               }
+                       }
+               }
+
+               $keys = $this->getOriginalKeys($keys);
+
+               return $this->filterArrayKeysByPrefix($keys, $prefix);
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function get($key)
+       {
+               $return   = null;
+               $cachekey = $this->getCacheKey($key);
+
+               // We fetch with the hostname as key to avoid problems with other applications
+               $cached = $this->memcache->get($cachekey);
+
+               // @see http://php.net/manual/en/memcache.get.php#84275
+               if (is_bool($cached) || is_double($cached) || is_long($cached)) {
+                       return $return;
+               }
+
+               $value = @unserialize($cached);
+
+               // Only return a value if the serialized value is valid.
+               // We also check if the db entry is a serialized
+               // boolean 'false' value (which we want to return).
+               if ($cached === serialize(false) || $value !== false) {
+                       $return = $value;
+               }
+
+               return $return;
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function set($key, $value, $ttl = Cache::FIVE_MINUTES)
+       {
+               $cachekey = $this->getCacheKey($key);
+
+               // We store with the hostname as key to avoid problems with other applications
+               if ($ttl > 0) {
+                       return $this->memcache->set(
+                               $cachekey,
+                               serialize($value),
+                               MEMCACHE_COMPRESSED,
+                               time() + $ttl
+                       );
+               } else {
+                       return $this->memcache->set(
+                               $cachekey,
+                               serialize($value),
+                               MEMCACHE_COMPRESSED
+                       );
+               }
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function delete($key)
+       {
+               $cachekey = $this->getCacheKey($key);
+               return $this->memcache->delete($cachekey);
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function clear($outdated = true)
+       {
+               if ($outdated) {
+                       return true;
+               } else {
+                       return $this->memcache->flush();
+               }
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function add($key, $value, $ttl = Cache::FIVE_MINUTES)
+       {
+               $cachekey = $this->getCacheKey($key);
+               return $this->memcache->add($cachekey, serialize($value), MEMCACHE_COMPRESSED, $ttl);
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function getName()
+       {
+               return self::TYPE_MEMCACHE;
+       }
+}
diff --git a/src/Core/Cache/MemcacheCacheDriver.php b/src/Core/Cache/MemcacheCacheDriver.php
deleted file mode 100644 (file)
index fd928c6..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-<?php
-
-namespace Friendica\Core\Cache;
-
-use Friendica\Core\Cache;
-
-use Exception;
-use Memcache;
-
-/**
- * Memcache Cache Driver
- *
- * @author Hypolite Petovan <hypolite@mrpetovan.com>
- */
-class MemcacheCacheDriver extends AbstractCacheDriver implements IMemoryCacheDriver
-{
-       use TraitCompareSet;
-       use TraitCompareDelete;
-
-       /**
-        * @var Memcache
-        */
-       private $memcache;
-
-       /**
-        * @param string $memcache_host
-        * @param int    $memcache_port
-        * @throws Exception
-        */
-       public function __construct($memcache_host, $memcache_port)
-       {
-               if (!class_exists('Memcache', false)) {
-                       throw new Exception('Memcache class isn\'t available');
-               }
-
-               $this->memcache = new Memcache();
-
-               if (!$this->memcache->connect($memcache_host, $memcache_port)) {
-                       throw new Exception('Expected Memcache server at ' . $memcache_host . ':' . $memcache_port . ' isn\'t available');
-               }
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function getAllKeys($prefix = null)
-       {
-               $keys = [];
-               $allSlabs = $this->memcache->getExtendedStats('slabs');
-               foreach ($allSlabs as $slabs) {
-                       foreach (array_keys($slabs) as $slabId) {
-                               $cachedump = $this->memcache->getExtendedStats('cachedump', (int)$slabId);
-                               foreach ($cachedump as $key => $arrVal) {
-                                       if (!is_array($arrVal)) {
-                                               continue;
-                                       }
-                                       $keys = array_merge($keys, array_keys($arrVal));
-                               }
-                       }
-               }
-
-               $keys = $this->getOriginalKeys($keys);
-
-               return $this->filterArrayKeysByPrefix($keys, $prefix);
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function get($key)
-       {
-               $return = null;
-               $cachekey = $this->getCacheKey($key);
-
-               // We fetch with the hostname as key to avoid problems with other applications
-               $cached = $this->memcache->get($cachekey);
-
-               // @see http://php.net/manual/en/memcache.get.php#84275
-               if (is_bool($cached) || is_double($cached) || is_long($cached)) {
-                       return $return;
-               }
-
-               $value = @unserialize($cached);
-
-               // Only return a value if the serialized value is valid.
-               // We also check if the db entry is a serialized
-               // boolean 'false' value (which we want to return).
-               if ($cached === serialize(false) || $value !== false) {
-                       $return = $value;
-               }
-
-               return $return;
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function set($key, $value, $ttl = Cache::FIVE_MINUTES)
-       {
-               $cachekey = $this->getCacheKey($key);
-
-               // We store with the hostname as key to avoid problems with other applications
-               if ($ttl > 0) {
-                       return $this->memcache->set(
-                               $cachekey,
-                               serialize($value),
-                               MEMCACHE_COMPRESSED,
-                               time() + $ttl
-                       );
-               } else {
-                       return $this->memcache->set(
-                               $cachekey,
-                               serialize($value),
-                               MEMCACHE_COMPRESSED
-                       );
-               }
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function delete($key)
-       {
-               $cachekey = $this->getCacheKey($key);
-               return $this->memcache->delete($cachekey);
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function clear($outdated = true)
-       {
-               if ($outdated) {
-                       return true;
-               } else {
-                       return $this->memcache->flush();
-               }
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function add($key, $value, $ttl = Cache::FIVE_MINUTES)
-       {
-               $cachekey = $this->getCacheKey($key);
-               return $this->memcache->add($cachekey, serialize($value), MEMCACHE_COMPRESSED, $ttl);
-       }
-}
diff --git a/src/Core/Cache/MemcachedCache.php b/src/Core/Cache/MemcachedCache.php
new file mode 100644 (file)
index 0000000..69f6b9a
--- /dev/null
@@ -0,0 +1,257 @@
+<?php
+
+namespace Friendica\Core\Cache;
+
+use Exception;
+use Friendica\Core\Config\Configuration;
+use Memcached;
+use Psr\Log\LoggerInterface;
+
+/**
+ * Memcached Cache
+ *
+ * @author Hypolite Petovan <hypolite@mrpetovan.com>
+ */
+class MemcachedCache extends Cache implements IMemoryCache
+{
+       use TraitCompareSet;
+       use TraitCompareDelete;
+
+       /**
+        * @var \Memcached
+        */
+       private $memcached;
+
+       /**
+        * @var LoggerInterface
+        */
+       private $logger;
+
+       /**
+        * @var string First server address
+        */
+
+       private $firstServer;
+
+       /**
+        * @var int First server port
+        */
+       private $firstPort;
+
+       /**
+        * Due to limitations of the INI format, the expected configuration for Memcached servers is the following:
+        * array {
+        *   0 => "hostname, port(, weight)",
+        *   1 => ...
+        * }
+        *
+        * @param array $memcached_hosts
+        *
+        * @throws \Exception
+        */
+       public function __construct(string $hostname, Configuration $config, LoggerInterface $logger)
+       {
+               if (!class_exists('Memcached', false)) {
+                       throw new Exception('Memcached class isn\'t available');
+               }
+
+               parent::__construct($hostname);
+
+               $this->logger = $logger;
+
+               $this->memcached = new Memcached();
+
+               $memcached_hosts = $config->get('system', 'memcached_hosts');
+
+               array_walk($memcached_hosts, function (&$value) {
+                       if (is_string($value)) {
+                               $value = array_map('trim', explode(',', $value));
+                       }
+               });
+
+               $this->firstServer = $memcached_hosts[0][0] ?? 'localhost';
+               $this->firstPort   = $memcached_hosts[0][1] ?? 11211;
+
+               $this->memcached->addServers($memcached_hosts);
+
+               if (count($this->memcached->getServerList()) == 0) {
+                       throw new Exception('Expected Memcached servers aren\'t available, config:' . var_export($memcached_hosts, true));
+               }
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function getAllKeys($prefix = null)
+       {
+               $keys = $this->getOriginalKeys($this->getMemcachedKeys());
+
+               return $this->filterArrayKeysByPrefix($keys, $prefix);
+       }
+
+       /**
+        * Get all memcached keys.
+        * Special function because getAllKeys() is broken since memcached 1.4.23.
+        *
+        * cleaned up version of code found on Stackoverflow.com by Maduka Jayalath
+        * @see https://stackoverflow.com/a/34724821
+        *
+        * @return array|int - all retrieved keys (or negative number on error)
+        */
+       private function getMemcachedKeys()
+       {
+               $mem = @fsockopen($this->firstServer, $this->firstPort);
+               if ($mem === false) {
+                       return -1;
+               }
+
+               // retrieve distinct slab
+               $r = @fwrite($mem, 'stats items' . chr(10));
+               if ($r === false) {
+                       return -2;
+               }
+
+               $slab = [];
+               while (($l = @fgets($mem, 1024)) !== false) {
+                       // finished?
+                       $l = trim($l);
+                       if ($l == 'END') {
+                               break;
+                       }
+
+                       $m = [];
+                       // <STAT items:22:evicted_nonzero 0>
+                       $r = preg_match('/^STAT\sitems\:(\d+)\:/', $l, $m);
+                       if ($r != 1) {
+                               return -3;
+                       }
+                       $a_slab = $m[1];
+
+                       if (!array_key_exists($a_slab, $slab)) {
+                               $slab[$a_slab] = [];
+                       }
+               }
+
+               reset($slab);
+               foreach ($slab as $a_slab_key => &$a_slab) {
+                       $r = @fwrite($mem, 'stats cachedump ' . $a_slab_key . ' 100' . chr(10));
+                       if ($r === false) {
+                               return -4;
+                       }
+
+                       while (($l = @fgets($mem, 1024)) !== false) {
+                               // finished?
+                               $l = trim($l);
+                               if ($l == 'END') {
+                                       break;
+                               }
+
+                               $m = [];
+                               // ITEM 42 [118 b; 1354717302 s]
+                               $r = preg_match('/^ITEM\s([^\s]+)\s/', $l, $m);
+                               if ($r != 1) {
+                                       return -5;
+                               }
+                               $a_key = $m[1];
+
+                               $a_slab[] = $a_key;
+                       }
+               }
+
+               // close the connection
+               @fclose($mem);
+               unset($mem);
+
+               $keys = [];
+               reset($slab);
+               foreach ($slab AS &$a_slab) {
+                       reset($a_slab);
+                       foreach ($a_slab AS &$a_key) {
+                               $keys[] = $a_key;
+                       }
+               }
+               unset($slab);
+
+               return $keys;
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function get($key)
+       {
+               $return   = null;
+               $cachekey = $this->getCacheKey($key);
+
+               // We fetch with the hostname as key to avoid problems with other applications
+               $value = $this->memcached->get($cachekey);
+
+               if ($this->memcached->getResultCode() === Memcached::RES_SUCCESS) {
+                       $return = $value;
+               } else {
+                       $this->logger->debug('Memcached \'get\' failed', ['result' => $this->memcached->getResultMessage()]);
+               }
+
+               return $return;
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function set($key, $value, $ttl = Cache::FIVE_MINUTES)
+       {
+               $cachekey = $this->getCacheKey($key);
+
+               // We store with the hostname as key to avoid problems with other applications
+               if ($ttl > 0) {
+                       return $this->memcached->set(
+                               $cachekey,
+                               $value,
+                               $ttl
+                       );
+               } else {
+                       return $this->memcached->set(
+                               $cachekey,
+                               $value
+                       );
+               }
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function delete($key)
+       {
+               $cachekey = $this->getCacheKey($key);
+               return $this->memcached->delete($cachekey);
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function clear($outdated = true)
+       {
+               if ($outdated) {
+                       return true;
+               } else {
+                       return $this->memcached->flush();
+               }
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function add($key, $value, $ttl = Cache::FIVE_MINUTES)
+       {
+               $cachekey = $this->getCacheKey($key);
+               return $this->memcached->add($cachekey, $value, $ttl);
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function getName()
+       {
+               return self::TYPE_MEMCACHED;
+       }
+}
diff --git a/src/Core/Cache/MemcachedCacheDriver.php b/src/Core/Cache/MemcachedCacheDriver.php
deleted file mode 100644 (file)
index 687e674..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-<?php
-
-namespace Friendica\Core\Cache;
-
-use Friendica\Core\Cache;
-use Friendica\Core\Logger;
-
-use Exception;
-use Memcached;
-
-/**
- * Memcached Cache Driver
- *
- * @author Hypolite Petovan <hypolite@mrpetovan.com>
- */
-class MemcachedCacheDriver extends AbstractCacheDriver implements IMemoryCacheDriver
-{
-       use TraitCompareSet;
-       use TraitCompareDelete;
-
-       /**
-        * @var \Memcached
-        */
-       private $memcached;
-
-       /**
-        * Due to limitations of the INI format, the expected configuration for Memcached servers is the following:
-        * array {
-        *   0 => "hostname, port(, weight)",
-        *   1 => ...
-        * }
-        *
-        * @param array $memcached_hosts
-        * @throws \Exception
-        */
-       public function __construct(array $memcached_hosts)
-       {
-               if (!class_exists('Memcached', false)) {
-                       throw new Exception('Memcached class isn\'t available');
-               }
-
-               $this->memcached = new Memcached();
-
-               array_walk($memcached_hosts, function (&$value) {
-                       if (is_string($value)) {
-                               $value = array_map('trim', explode(',', $value));
-                       }
-               });
-
-               $this->memcached->addServers($memcached_hosts);
-
-               if (count($this->memcached->getServerList()) == 0) {
-                       throw new Exception('Expected Memcached servers aren\'t available, config:' . var_export($memcached_hosts, true));
-               }
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function getAllKeys($prefix = null)
-       {
-               $keys = $this->getOriginalKeys($this->memcached->getAllKeys());
-
-               if ($this->memcached->getResultCode() == Memcached::RES_SUCCESS) {
-                       return $this->filterArrayKeysByPrefix($keys, $prefix);
-               } else {
-                       Logger::log('Memcached \'getAllKeys\' failed with ' . $this->memcached->getResultMessage(), Logger::ALL);
-                       return [];
-               }
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function get($key)
-       {
-               $return = null;
-               $cachekey = $this->getCacheKey($key);
-
-               // We fetch with the hostname as key to avoid problems with other applications
-               $value = $this->memcached->get($cachekey);
-
-               if ($this->memcached->getResultCode() === Memcached::RES_SUCCESS) {
-                       $return = $value;
-               } else {
-                       Logger::log('Memcached \'get\' failed with ' . $this->memcached->getResultMessage(), Logger::ALL);
-               }
-
-               return $return;
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function set($key, $value, $ttl = Cache::FIVE_MINUTES)
-       {
-               $cachekey = $this->getCacheKey($key);
-
-               // We store with the hostname as key to avoid problems with other applications
-               if ($ttl > 0) {
-                       return $this->memcached->set(
-                               $cachekey,
-                               $value,
-                               $ttl
-                       );
-               } else {
-                       return $this->memcached->set(
-                               $cachekey,
-                               $value
-                       );
-               }
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function delete($key)
-       {
-               $cachekey = $this->getCacheKey($key);
-               return $this->memcached->delete($cachekey);
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function clear($outdated = true)
-       {
-               if ($outdated) {
-                       return true;
-               } else {
-                       return $this->memcached->flush();
-               }
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function add($key, $value, $ttl = Cache::FIVE_MINUTES)
-       {
-               $cachekey = $this->getCacheKey($key);
-               return $this->memcached->add($cachekey, $value, $ttl);
-       }
-}
diff --git a/src/Core/Cache/ProfilerCache.php b/src/Core/Cache/ProfilerCache.php
new file mode 100644 (file)
index 0000000..d59b885
--- /dev/null
@@ -0,0 +1,162 @@
+<?php
+
+namespace Friendica\Core\Cache;
+
+use Friendica\Core\System;
+use Friendica\Util\Profiler;
+
+/**
+ * This class wraps cache driver so they can get profiled - in case the profiler is enabled
+ *
+ * It is using the decorator pattern (@see
+ */
+class ProfilerCache implements ICache, IMemoryCache
+{
+       /**
+        * @var ICache The original cache driver
+        */
+       private $cache;
+
+       /**
+        * @var Profiler The profiler of Friendica
+        */
+       private $profiler;
+
+       public function __construct(ICache $cache, Profiler $profiler)
+       {
+               $this->cache    = $cache;
+               $this->profiler = $profiler;
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function getAllKeys($prefix = null)
+       {
+               $time = microtime(true);
+
+               $return = $this->cache->getAllKeys($prefix);
+
+               $this->profiler->saveTimestamp($time, 'cache', System::callstack());
+
+               return $return;
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function get($key)
+       {
+               $time = microtime(true);
+
+               $return = $this->cache->get($key);
+
+               $this->profiler->saveTimestamp($time, 'cache', System::callstack());
+
+               return $return;
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function set($key, $value, $ttl = Cache::FIVE_MINUTES)
+       {
+               $time = microtime(true);
+
+               $return = $this->cache->set($key, $value, $ttl);
+
+               $this->profiler->saveTimestamp($time, 'cache', System::callstack());
+
+               return $return;
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function delete($key)
+       {
+               $time = microtime(true);
+
+               $return = $this->cache->delete($key);
+
+               $this->profiler->saveTimestamp($time, 'cache', System::callstack());
+
+               return $return;
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function clear($outdated = true)
+       {
+               $time = microtime(true);
+
+               $return = $this->cache->clear($outdated);
+
+               $this->profiler->saveTimestamp($time, 'cache', System::callstack());
+
+               return $return;
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function add($key, $value, $ttl = Cache::FIVE_MINUTES)
+       {
+               if ($this->cache instanceof IMemoryCache) {
+                       $time = microtime(true);
+
+                       $return = $this->cache->add($key, $value, $ttl);
+
+                       $this->profiler->saveTimestamp($time, 'cache', System::callstack());
+
+                       return $return;
+               } else {
+                       return false;
+               }
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function compareSet($key, $oldValue, $newValue, $ttl = Cache::FIVE_MINUTES)
+       {
+               if ($this->cache instanceof IMemoryCache) {
+                       $time = microtime(true);
+
+                       $return = $this->cache->compareSet($key, $oldValue, $newValue, $ttl);
+
+                       $this->profiler->saveTimestamp($time, 'cache', System::callstack());
+
+                       return $return;
+               } else {
+                       return false;
+               }
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function compareDelete($key, $value)
+       {
+               if ($this->cache instanceof IMemoryCache) {
+                       $time = microtime(true);
+
+                       $return = $this->cache->compareDelete($key, $value);
+
+                       $this->profiler->saveTimestamp($time, 'cache', System::callstack());
+
+                       return $return;
+               } else {
+                       return false;
+               }
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function GetName()
+       {
+               return $this->cache->getName() . ' (with profiler)';
+       }
+}
diff --git a/src/Core/Cache/RedisCache.php b/src/Core/Cache/RedisCache.php
new file mode 100644 (file)
index 0000000..b2638c4
--- /dev/null
@@ -0,0 +1,204 @@
+<?php
+
+namespace Friendica\Core\Cache;
+
+use Exception;
+use Friendica\Core\Config\Configuration;
+use Redis;
+
+/**
+ * Redis Cache. This driver is based on Memcache driver
+ *
+ * @author Hypolite Petovan <hypolite@mrpetovan.com>
+ * @author Roland Haeder <roland@mxchange.org>
+ */
+class RedisCache extends Cache implements IMemoryCache
+{
+       /**
+        * @var Redis
+        */
+       private $redis;
+
+       /**
+        * @throws Exception
+        */
+       public function __construct(string $hostname, Configuration $config)
+       {
+               if (!class_exists('Redis', false)) {
+                       throw new Exception('Redis class isn\'t available');
+               }
+
+               parent::__construct($hostname);
+
+               $this->redis = new Redis();
+
+               $redis_host = $config->get('system', 'redis_host');
+               $redis_port = $config->get('system', 'redis_port');
+               $redis_pw   = $config->get('system', 'redis_password');
+               $redis_db   = $config->get('system', 'redis_db', 0);
+
+               if (isset($redis_port) && !$this->redis->connect($redis_host, $redis_port)) {
+                       throw new Exception('Expected Redis server at ' . $redis_host . ':' . $redis_port . ' isn\'t available');
+               } elseif (!$this->redis->connect($redis_host)) {
+                       throw new Exception('Expected Redis server at ' . $redis_host . ' isn\'t available');
+               }
+
+               if (isset($redis_pw) && !$this->redis->auth($redis_pw)) {
+                       throw new Exception('Cannot authenticate redis server at ' . $redis_host . ':' . $redis_port);
+               }
+
+               if ($redis_db !== 0 && !$this->redis->select($redis_db)) {
+                       throw new Exception('Cannot switch to redis db ' . $redis_db . ' at ' . $redis_host . ':' . $redis_port);
+               }
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function getAllKeys($prefix = null)
+       {
+               if (empty($prefix)) {
+                       $search = '*';
+               } else {
+                       $search = $prefix . '*';
+               }
+
+               $list = $this->redis->keys($this->getCacheKey($search));
+
+               return $this->getOriginalKeys($list);
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function get($key)
+       {
+               $return = null;
+               $cachekey = $this->getCacheKey($key);
+
+               $cached = $this->redis->get($cachekey);
+               if ($cached === false && !$this->redis->exists($cachekey)) {
+                       return null;
+               }
+
+               $value = unserialize($cached);
+
+               // Only return a value if the serialized value is valid.
+               // We also check if the db entry is a serialized
+               // boolean 'false' value (which we want to return).
+               if ($cached === serialize(false) || $value !== false) {
+                       $return = $value;
+               }
+
+               return $return;
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function set($key, $value, $ttl = Cache::FIVE_MINUTES)
+       {
+               $cachekey = $this->getCacheKey($key);
+
+               $cached = serialize($value);
+
+               if ($ttl > 0) {
+                       return $this->redis->setex(
+                               $cachekey,
+                               $ttl,
+                               $cached
+                       );
+               } else {
+                       return $this->redis->set(
+                               $cachekey,
+                               $cached
+                       );
+               }
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function delete($key)
+       {
+               $cachekey = $this->getCacheKey($key);
+               return ($this->redis->del($cachekey) > 0);
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function clear($outdated = true)
+       {
+               if ($outdated) {
+                       return true;
+               } else {
+                       return $this->redis->flushAll();
+               }
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function add($key, $value, $ttl = Cache::FIVE_MINUTES)
+       {
+               $cachekey = $this->getCacheKey($key);
+               $cached = serialize($value);
+
+               return $this->redis->setnx($cachekey, $cached);
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function compareSet($key, $oldValue, $newValue, $ttl = Cache::FIVE_MINUTES)
+       {
+               $cachekey = $this->getCacheKey($key);
+
+               $newCached = serialize($newValue);
+
+               $this->redis->watch($cachekey);
+               // If the old value isn't what we expected, somebody else changed the key meanwhile
+               if ($this->get($key) === $oldValue) {
+                       if ($ttl > 0) {
+                               $result = $this->redis->multi()
+                                       ->setex($cachekey, $ttl, $newCached)
+                                       ->exec();
+                       } else {
+                               $result = $this->redis->multi()
+                                       ->set($cachekey, $newCached)
+                                       ->exec();
+                       }
+                       return $result !== false;
+               }
+               $this->redis->unwatch();
+               return false;
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function compareDelete($key, $value)
+       {
+               $cachekey = $this->getCacheKey($key);
+
+               $this->redis->watch($cachekey);
+               // If the old value isn't what we expected, somebody else changed the key meanwhile
+               if ($this->get($key) === $value) {
+                       $result = $this->redis->multi()
+                               ->del($cachekey)
+                               ->exec();
+                       return $result !== false;
+               }
+               $this->redis->unwatch();
+               return false;
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function getName()
+       {
+               return self::TYPE_REDIS;
+       }
+}
diff --git a/src/Core/Cache/RedisCacheDriver.php b/src/Core/Cache/RedisCacheDriver.php
deleted file mode 100644 (file)
index ea4eb43..0000000
+++ /dev/null
@@ -1,191 +0,0 @@
-<?php
-
-namespace Friendica\Core\Cache;
-
-use Exception;
-use Friendica\Core\Cache;
-use Redis;
-
-/**
- * Redis Cache Driver. This driver is based on Memcache driver
- *
- * @author Hypolite Petovan <hypolite@mrpetovan.com>
- * @author Roland Haeder <roland@mxchange.org>
- */
-class RedisCacheDriver extends AbstractCacheDriver implements IMemoryCacheDriver
-{
-       /**
-        * @var Redis
-        */
-       private $redis;
-
-       /**
-        * @param string  $redis_host
-        * @param int     $redis_port
-        * @param int     $redis_db (Default = 0, maximum is 15)
-        * @param string? $redis_pw
-        * @throws Exception
-        */
-       public function __construct($redis_host, $redis_port, $redis_db = 0, $redis_pw = null)
-       {
-               if (!class_exists('Redis', false)) {
-                       throw new Exception('Redis class isn\'t available');
-               }
-
-               $this->redis = new Redis();
-
-               if (!$this->redis->connect($redis_host, $redis_port)) {
-                       throw new Exception('Expected Redis server at ' . $redis_host . ':' . $redis_port . ' isn\'t available');
-               }
-
-               if (isset($redis_pw) && !$this->redis->auth($redis_pw)) {
-                       throw new Exception('Cannot authenticate redis server at ' . $redis_host . ':' . $redis_port);
-               }
-
-               if ($redis_db !== 0 && !$this->redis->select($redis_db)) {
-                       throw new Exception('Cannot switch to redis db ' . $redis_db . ' at ' . $redis_host . ':' . $redis_port);
-               }
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function getAllKeys($prefix = null)
-       {
-               if (empty($prefix)) {
-                       $search = '*';
-               } else {
-                       $search = $prefix . '*';
-               }
-
-               $list = $this->redis->keys($this->getCacheKey($search));
-
-               return $this->getOriginalKeys($list);
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function get($key)
-       {
-               $return = null;
-               $cachekey = $this->getCacheKey($key);
-
-               $cached = $this->redis->get($cachekey);
-               if ($cached === false && !$this->redis->exists($cachekey)) {
-                       return null;
-               }
-
-               $value = unserialize($cached);
-
-               // Only return a value if the serialized value is valid.
-               // We also check if the db entry is a serialized
-               // boolean 'false' value (which we want to return).
-               if ($cached === serialize(false) || $value !== false) {
-                       $return = $value;
-               }
-
-               return $return;
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function set($key, $value, $ttl = Cache::FIVE_MINUTES)
-       {
-               $cachekey = $this->getCacheKey($key);
-
-               $cached = serialize($value);
-
-               if ($ttl > 0) {
-                       return $this->redis->setex(
-                               $cachekey,
-                               $ttl,
-                               $cached
-                       );
-               } else {
-                       return $this->redis->set(
-                               $cachekey,
-                               $cached
-                       );
-               }
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function delete($key)
-       {
-               $cachekey = $this->getCacheKey($key);
-               return ($this->redis->delete($cachekey) > 0);
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function clear($outdated = true)
-       {
-               if ($outdated) {
-                       return true;
-               } else {
-                       return $this->redis->flushAll();
-               }
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function add($key, $value, $ttl = Cache::FIVE_MINUTES)
-       {
-               $cachekey = $this->getCacheKey($key);
-               $cached = serialize($value);
-
-               return $this->redis->setnx($cachekey, $cached);
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function compareSet($key, $oldValue, $newValue, $ttl = Cache::FIVE_MINUTES)
-       {
-               $cachekey = $this->getCacheKey($key);
-
-               $newCached = serialize($newValue);
-
-               $this->redis->watch($cachekey);
-               // If the old value isn't what we expected, somebody else changed the key meanwhile
-               if ($this->get($key) === $oldValue) {
-                       if ($ttl > 0) {
-                               $result = $this->redis->multi()
-                                       ->setex($cachekey, $ttl, $newCached)
-                                       ->exec();
-                       } else {
-                               $result = $this->redis->multi()
-                                       ->set($cachekey, $newCached)
-                                       ->exec();
-                       }
-                       return $result !== false;
-               }
-               $this->redis->unwatch();
-               return false;
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function compareDelete($key, $value)
-       {
-               $cachekey = $this->getCacheKey($key);
-
-               $this->redis->watch($cachekey);
-               // If the old value isn't what we expected, somebody else changed the key meanwhile
-               if ($this->get($key) === $value) {
-                       $result = $this->redis->multi()
-                               ->del($cachekey)
-                               ->exec();
-                       return $result !== false;
-               }
-               $this->redis->unwatch();
-               return false;
-       }
-}
index ef59f69cd17f4fd1a5d868337d4d517720480b68..a553f875160038f23c1fc73f5c13be8873373d34 100644 (file)
@@ -2,8 +2,6 @@
 
 namespace Friendica\Core\Cache;
 
-use Friendica\Core\Cache;
-
 /**
  * Trait TraitCompareSetDelete
  *
index 77a6028355c41e4f0bb6d25ab6a023ad7b14ddbf..9c192d95290c58ac33399af54264057bb3966bf4 100644 (file)
@@ -2,8 +2,6 @@
 
 namespace Friendica\Core\Cache;
 
-use Friendica\Core\Cache;
-
 /**
  * Trait TraitCompareSetDelete
  *
index 4bf9c5b11d2d4aa96495516edfc38dc94c098f25..cec7a460e7cf8aac9e228e458cddf2b9bb793261 100644 (file)
@@ -8,6 +8,9 @@
  */
 namespace Friendica\Core;
 
+use Friendica\BaseObject;
+use Friendica\Core\Config\Configuration;
+
 /**
  * @brief Arbitrary system configuration storage
  *
@@ -15,23 +18,8 @@ namespace Friendica\Core;
  * If we ever would decide to return exactly the variable type as entered,
  * we will have fun with the additional features. :-)
  */
-class Config
+class Config extends BaseObject
 {
-       /**
-        * @var Config\Configuration
-        */
-       private static $config;
-
-       /**
-        * Initialize the config
-        *
-        * @param Config\Configuration $config
-        */
-       public static function init(Config\Configuration $config)
-       {
-               self::$config = $config;
-       }
-
        /**
         * @brief Loads all configuration values of family into a cached storage.
         *
@@ -41,7 +29,7 @@ class Config
         */
        public static function load($cat = "config")
        {
-               self::$config->load($cat);
+               self::getClass(Configuration::class)->load($cat);
        }
 
        /**
@@ -57,7 +45,7 @@ class Config
         */
        public static function get($cat, $key, $default_value = null, $refresh = false)
        {
-               return self::$config->get($cat, $key, $default_value, $refresh);
+               return self::getClass(Configuration::class)->get($cat, $key, $default_value, $refresh);
        }
 
        /**
@@ -75,7 +63,7 @@ class Config
         */
        public static function set($cat, $key, $value)
        {
-               return self::$config->set($cat, $key, $value);
+               return self::getClass(Configuration::class)->set($cat, $key, $value);
        }
 
        /**
@@ -88,6 +76,6 @@ class Config
         */
        public static function delete($cat, $key)
        {
-               return self::$config->delete($cat, $key);
+               return self::getClass(Configuration::class)->delete($cat, $key);
        }
 }
diff --git a/src/Core/Config/Adapter/AbstractDbaConfigAdapter.php b/src/Core/Config/Adapter/AbstractDbaConfigAdapter.php
deleted file mode 100644 (file)
index 38caf35..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-
-namespace Friendica\Core\Config\Adapter;
-
-use Friendica\Database\DBA;
-
-abstract class AbstractDbaConfigAdapter
-{
-       /**
-        * The connection state of the adapter
-        *
-        * @var bool
-        */
-       protected $connected = true;
-
-       public function __construct()
-       {
-               $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;
-               }
-       }
-}
diff --git a/src/Core/Config/Adapter/IConfigAdapter.php b/src/Core/Config/Adapter/IConfigAdapter.php
deleted file mode 100644 (file)
index 892c476..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-
-namespace Friendica\Core\Config\Adapter;
-
-/**
- *
- * @author Hypolite Petovan <hypolite@mrpetovan.com>
- */
-interface IConfigAdapter
-{
-       /**
-        * Loads all configuration values and returns the loaded category as an array.
-        *
-        * @param string  $cat The category of the configuration values to load
-        *
-        * @return array
-        */
-       public function load($cat = "config");
-
-       /**
-        * 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 null|mixed Stored value or null if it does not exist
-        */
-       public function get($cat, $key);
-
-       /**
-        * Stores a config value ($value) in the category ($family) under the key ($key).
-        *
-        * Note: Please do not store booleans - convert to 0/1 integer values!
-        *
-        * @param string $cat   The category of the configuration value
-        * @param string $key   The configuration key to set
-        * @param mixed  $value The value to store
-        *
-        * @return bool Operation success
-        */
-       public function set($cat, $key, $value);
-
-       /**
-        * Removes the configured value from the stored cache
-        * and removes it from the database.
-        *
-        * @param string $cat The category of the configuration value
-        * @param string $key The configuration key to delete
-        *
-        * @return bool Operation success
-        */
-       public function delete($cat, $key);
-
-       /**
-        * Checks, if the current adapter is connected to the backend
-        *
-        * @return bool
-        */
-       public function isConnected();
-
-       /**
-        * Checks, if a config key ($key) in the category ($cat) is already loaded.
-        *
-        * @param string $cat The configuration category
-        * @param string $key The configuration key
-        *
-        * @return bool
-        */
-       public function isLoaded($cat, $key);
-}
diff --git a/src/Core/Config/Adapter/IPConfigAdapter.php b/src/Core/Config/Adapter/IPConfigAdapter.php
deleted file mode 100644 (file)
index c505532..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-<?php
-
-/*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
- */
-
-namespace Friendica\Core\Config\Adapter;
-
-/**
- *
- * @author benlo
- */
-interface IPConfigAdapter
-{
-       /**
-        * Loads all configuration values of a user's config family and returns the loaded category as an array.
-        *
-        * @param string $uid The user_id
-        * @param string $cat The category of the configuration value
-        *
-        * @return array
-        */
-       public function load($uid, $cat);
-
-       /**
-        * 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 null|mixed Stored value or null if it does not exist
-        */
-       public function get($uid, $cat, $key);
-
-       /**
-        * Stores a config value ($value) in the category ($family) under the key ($key)
-        * for the user_id $uid.
-        *
-        * @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
-        * @param string $value The value to store
-        *
-        * @return bool Operation success
-        */
-       public function set($uid, $cat, $key, $value);
-
-       /**
-        * Removes the configured value from the stored cache
-        * and removes it from the database.
-        *
-        * @param string $uid The user_id
-        * @param string $cat The category of the configuration value
-        * @param string $key The configuration key to delete
-        *
-        * @return bool Operation success
-        */
-       public function delete($uid, $cat, $key);
-
-       /**
-        * Checks, if the current adapter is connected to the backend
-        *
-        * @return bool
-        */
-       public function isConnected();
-
-       /**
-        * Checks, if a config key ($key) in the category ($cat) is already loaded for the user_id $uid.
-        *
-        * @param string $uid The user_id
-        * @param string $cat The configuration category
-        * @param string $key The configuration key
-        *
-        * @return bool
-        */
-       public function isLoaded($uid, $cat, $key);
-}
diff --git a/src/Core/Config/Adapter/JITConfigAdapter.php b/src/Core/Config/Adapter/JITConfigAdapter.php
deleted file mode 100644 (file)
index d125f7d..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
-<?php
-namespace Friendica\Core\Config\Adapter;
-
-use Friendica\Database\DBA;
-
-/**
- * JustInTime Configuration Adapter
- *
- * Default Config Adapter. Provides the best performance for pages loading few configuration variables.
- *
- * @author Hypolite Petovan <hypolite@mrpetovan.com>
- */
-class JITConfigAdapter extends AbstractDbaConfigAdapter implements IConfigAdapter
-{
-       private $in_db;
-
-       /**
-        * {@inheritdoc}
-        */
-       public function load($cat = "config")
-       {
-               $return = [];
-
-               if (!$this->isConnected()) {
-                       return $return;
-               }
-
-               // We don't preload "system" anymore.
-               // This reduces the number of database reads a lot.
-               if ($cat === 'system') {
-                       return $return;
-               }
-
-               $configs = DBA::select('config', ['v', 'k'], ['cat' => $cat]);
-               while ($config = DBA::fetch($configs)) {
-                       $key   = $config['k'];
-                       $value = $this->toConfigValue($config['v']);
-
-                       // 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;
-                       }
-               }
-               DBA::close($configs);
-
-               return [$cat => $return];
-       }
-
-       /**
-        * {@inheritdoc}
-        *
-        * @param bool $mark if true, mark the selection of the current cat/key pair
-        */
-       public function get($cat, $key, $mark = true)
-       {
-               if (!$this->isConnected()) {
-                       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)) {
-                       $value = $this->toConfigValue($config['v']);
-
-                       // just return it in case it is set
-                       if (isset($value)) {
-                               return $value;
-                       }
-               }
-
-               return null;
-       }
-
-       /**
-        * {@inheritdoc}
-        */
-       public function set($cat, $key, $value)
-       {
-               if (!$this->isConnected()) {
-                       return false;
-               }
-
-               // 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.
-               $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] = [];
-               }
-               if (!isset($this->in_db[$cat][$key])) {
-                       $this->in_db[$cat][$key] = false;
-               }
-
-               if (isset($stored_value) && ($stored_value === $compare_value) && $this->in_db[$cat][$key]) {
-                       return true;
-               }
-
-               $dbvalue = $this->toDbValue($value);
-
-               $result = DBA::update('config', ['v' => $dbvalue], ['cat' => $cat, 'k' => $key], true);
-
-               $this->in_db[$cat][$key] = $result;
-
-               return $result;
-       }
-
-       /**
-        * {@inheritdoc}
-        */
-       public function delete($cat, $key)
-       {
-               if (!$this->isConnected()) {
-                       return false;
-               }
-
-               if (isset($this->cache[$cat][$key])) {
-                       unset($this->in_db[$cat][$key]);
-               }
-
-               $result = DBA::delete('config', ['cat' => $cat, 'k' => $key]);
-
-               return $result;
-       }
-
-       /**
-        * {@inheritdoc}
-        */
-       public function isLoaded($cat, $key)
-       {
-               if (!$this->isConnected()) {
-                       return false;
-               }
-
-               return (isset($this->in_db[$cat][$key])) && $this->in_db[$cat][$key];
-       }
-}
diff --git a/src/Core/Config/Adapter/JITPConfigAdapter.php b/src/Core/Config/Adapter/JITPConfigAdapter.php
deleted file mode 100644 (file)
index a0c6a95..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
-<?php
-namespace Friendica\Core\Config\Adapter;
-
-use Friendica\Database\DBA;
-
-/**
- * JustInTime User Configuration Adapter
- *
- * Default PConfig Adapter. Provides the best performance for pages loading few configuration variables.
- *
- * @author Hypolite Petovan <hypolite@mrpetovan.com>
- */
-class JITPConfigAdapter extends AbstractDbaConfigAdapter implements IPConfigAdapter
-{
-       private $in_db;
-
-       /**
-        * {@inheritdoc}
-        */
-       public function load($uid, $cat)
-       {
-               $return = [];
-
-               if (!$this->isConnected()) {
-                       return $return;
-               }
-
-               $pconfigs = DBA::select('pconfig', ['v', 'k'], ['cat' => $cat, 'uid' => $uid]);
-               if (DBA::isResult($pconfigs)) {
-                       while ($pconfig = DBA::fetch($pconfigs)) {
-                               $key = $pconfig['k'];
-                               $value = $this->toConfigValue($pconfig['v']);
-
-                               // 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;
-                               }
-                       }
-               } else if ($cat != 'config') {
-                       // Negative caching
-                       $return = null;
-               }
-               DBA::close($pconfigs);
-
-               return [$cat => $return];
-       }
-
-       /**
-        * {@inheritdoc}
-        *
-        * @param bool $mark if true, mark the selection of the current cat/key pair
-        */
-       public function get($uid, $cat, $key, $mark = true)
-       {
-               if (!$this->isConnected()) {
-                       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)) {
-                       $value = $this->toConfigValue($pconfig['v']);
-
-                       if (isset($value)) {
-                               return $value;
-                       }
-               }
-
-               $this->in_db[$uid][$cat][$key] = false;
-               return null;
-       }
-
-       /**
-        * {@inheritdoc}
-        */
-       public function set($uid, $cat, $key, $value)
-       {
-               if (!$this->isConnected()) {
-                       return false;
-               }
-
-               // 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.
-               $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] = [];
-               }
-               if (!isset($this->in_db[$uid][$cat])) {
-                       $this->in_db[$uid][$cat] = [];
-               }
-               if (!isset($this->in_db[$uid][$cat][$key])) {
-                       $this->in_db[$uid][$cat][$key] = false;
-               }
-
-               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) : $value);
-
-               $result = DBA::update('pconfig', ['v' => $dbvalue], ['uid' => $uid, 'cat' => $cat, 'k' => $key], true);
-
-               $this->in_db[$uid][$cat][$key] = $result;
-
-               return $result;
-       }
-
-       /**
-        * {@inheritdoc}
-        */
-       public function delete($uid, $cat, $key)
-       {
-               if (!$this->isConnected()) {
-                       return false;
-               }
-
-               if (isset($this->in_db[$uid][$cat][$key])) {
-                       unset($this->in_db[$uid][$cat][$key]);
-               }
-
-               return DBA::delete('pconfig', ['uid' => $uid, 'cat' => $cat, 'k' => $key]);
-       }
-
-       /**
-        * {@inheritdoc}
-        */
-       public function isLoaded($uid, $cat, $key)
-       {
-               if (!$this->isConnected()) {
-                       return false;
-               }
-
-               return (isset($this->in_db[$uid][$cat][$key])) && $this->in_db[$uid][$cat][$key];
-       }
-}
diff --git a/src/Core/Config/Adapter/PreloadConfigAdapter.php b/src/Core/Config/Adapter/PreloadConfigAdapter.php
deleted file mode 100644 (file)
index c691c88..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-<?php
-
-namespace Friendica\Core\Config\Adapter;
-
-use Friendica\Database\DBA;
-
-/**
- * Preload Configuration Adapter
- *
- * Minimizes the number of database queries to retrieve configuration values at the cost of memory.
- *
- * @author Hypolite Petovan <hypolite@mrpetovan.com>
- */
-class PreloadConfigAdapter extends AbstractDbaConfigAdapter implements IConfigAdapter
-{
-       private $config_loaded = false;
-
-       /**
-        * {@inheritdoc}
-        */
-       public function load($cat = 'config')
-       {
-               $return = [];
-
-               if (!$this->isConnected()) {
-                       return $return;
-               }
-
-               if ($this->config_loaded) {
-                       return $return;
-               }
-
-               $configs = DBA::select('config', ['cat', 'v', 'k']);
-               while ($config = DBA::fetch($configs)) {
-                       $value = $this->toConfigValue($config['v']);
-                       if (isset($value)) {
-                               $return[$config['cat']][$config['k']] = $value;
-                       }
-               }
-               DBA::close($configs);
-
-               $this->config_loaded = true;
-
-               return $return;
-       }
-
-       /**
-        * {@inheritdoc}
-        */
-       public function get($cat, $key)
-       {
-               if (!$this->isConnected()) {
-                       return null;
-               }
-
-               $config = DBA::selectFirst('config', ['v'], ['cat' => $cat, 'k' => $key]);
-               if (DBA::isResult($config)) {
-                       $value = $this->toConfigValue($config['v']);
-
-                       if (isset($value)) {
-                               return $value;
-                       }
-               }
-
-               return null;
-       }
-
-       /**
-        * {@inheritdoc}
-        */
-       public function set($cat, $key, $value)
-       {
-               if (!$this->isConnected()) {
-                       return false;
-               }
-
-               // We store our setting values as strings.
-               // 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 (isset($stored_value) && $stored_value === $compare_value) {
-                       return true;
-               }
-
-               $dbvalue = $this->toDbValue($value);
-
-               return DBA::update('config', ['v' => $dbvalue], ['cat' => $cat, 'k' => $key], true);
-       }
-
-       /**
-        * {@inheritdoc}
-        */
-       public function delete($cat, $key)
-       {
-               if (!$this->isConnected()) {
-                       return false;
-               }
-
-               return DBA::delete('config', ['cat' => $cat, 'k' => $key]);
-       }
-
-       /**
-        * {@inheritdoc}
-        */
-       public function isLoaded($cat, $key)
-       {
-               if (!$this->isConnected()) {
-                       return false;
-               }
-
-               return $this->config_loaded;
-       }
-}
diff --git a/src/Core/Config/Adapter/PreloadPConfigAdapter.php b/src/Core/Config/Adapter/PreloadPConfigAdapter.php
deleted file mode 100644 (file)
index 838f376..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-<?php
-
-namespace Friendica\Core\Config\Adapter;
-
-use Friendica\Database\DBA;
-
-/**
- * Preload User Configuration Adapter
- *
- * Minimizes the number of database queries to retrieve configuration values at the cost of memory.
- *
- * @author Hypolite Petovan <hypolite@mrpetovan.com>
- */
-class PreloadPConfigAdapter extends AbstractDbaConfigAdapter implements IPConfigAdapter
-{
-       /**
-        * @var array true if config for user is loaded
-        */
-       private $config_loaded;
-
-       /**
-        * @param int $uid The UID of the current user
-        */
-       public function __construct($uid = null)
-       {
-               parent::__construct();
-
-               $this->config_loaded = [];
-
-               if (isset($uid)) {
-                       $this->load($uid, 'config');
-               }
-       }
-
-       /**
-        * {@inheritdoc}
-        */
-       public function load($uid, $cat)
-       {
-               $return = [];
-
-               if (empty($uid)) {
-                       return $return;
-               }
-
-               if (!$this->isLoaded($uid, $cat, null)) {
-                       return $return;
-               }
-
-               $pconfigs = DBA::select('pconfig', ['cat', 'v', 'k'], ['uid' => $uid]);
-               while ($pconfig = DBA::fetch($pconfigs)) {
-                       $value = $this->toConfigValue($pconfig['v']);
-                       if (isset($value)) {
-                               $return[$pconfig['cat']][$pconfig['k']] = $value;
-                       }
-               }
-               DBA::close($pconfigs);
-
-               $this->config_loaded[$uid] = true;
-
-               return $return;
-       }
-
-       /**
-        * {@inheritdoc}
-        */
-       public function get($uid, $cat, $key)
-       {
-               if (!$this->isConnected()) {
-                       return null;
-               }
-
-               if (!$this->isLoaded($uid, $cat, $key)) {
-                       $this->load($uid, $cat);
-               }
-
-               $config = DBA::selectFirst('pconfig', ['v'], ['uid' => $uid, 'cat' => $cat, 'k' => $key]);
-               if (DBA::isResult($config)) {
-                       $value = $this->toConfigValue($config['v']);
-
-                       if (isset($value)) {
-                               return $value;
-                       }
-               }
-               return null;
-       }
-
-       /**
-        * {@inheritdoc}
-        */
-       public function set($uid, $cat, $key, $value)
-       {
-               if (!$this->isConnected()) {
-                       return false;
-               }
-
-               if (!$this->isLoaded($uid, $cat, $key)) {
-                       $this->load($uid, $cat);
-               }
-               // We store our setting values as strings.
-               // 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 (isset($stored_value) && $stored_value === $compare_value) {
-                       return true;
-               }
-
-               $dbvalue = $this->toDbValue($value);
-
-               return DBA::update('pconfig', ['v' => $dbvalue], ['uid' => $uid, 'cat' => $cat, 'k' => $key], true);
-       }
-
-       /**
-        * {@inheritdoc}
-        */
-       public function delete($uid, $cat, $key)
-       {
-               if (!$this->isConnected()) {
-                       return false;
-               }
-
-               if (!$this->isLoaded($uid, $cat, $key)) {
-                       $this->load($uid, $cat);
-               }
-
-               return DBA::delete('pconfig', ['uid' => $uid, 'cat' => $cat, 'k' => $key]);
-       }
-
-       /**
-        * {@inheritdoc}
-        */
-       public function isLoaded($uid, $cat, $key)
-       {
-               if (!$this->isConnected()) {
-                       return false;
-               }
-
-               return isset($this->config_loaded[$uid]) && $this->config_loaded[$uid];
-       }
-}
index 441cdee811cc550c3e0bb748c8fdb26887b0dc59..3119b5db123c4d1665c587b907cb6363fd8d0d56 100644 (file)
@@ -9,7 +9,7 @@ use ParagonIE\HiddenString\HiddenString;
  * Initial, all *.config.php files are loaded into this cache with the
  * ConfigFileLoader ( @see ConfigFileLoader )
  */
-class ConfigCache implements IConfigCache, IPConfigCache
+class ConfigCache
 {
        /**
         * @var array
@@ -22,19 +22,23 @@ class ConfigCache implements IConfigCache, IPConfigCache
        private $hidePasswordOutput;
 
        /**
-        * @param array $config    A initial config array
+        * @param array $config             A initial config array
         * @param bool  $hidePasswordOutput True, if cache variables should take extra care of password values
         */
-       public function __construct(array $config = [], $hidePasswordOutput = true)
+       public function __construct(array $config = [], bool $hidePasswordOutput = true)
        {
                $this->hidePasswordOutput = $hidePasswordOutput;
                $this->load($config);
        }
 
        /**
-        * {@inheritdoc}
+        * Tries to load the specified configuration array into the config array.
+        * Doesn't overwrite previously set values by default to prevent default config files to supersede DB Config.
+        *
+        * @param array $config
+        * @param bool  $overwrite Force value overwrite if the config key already exists
         */
-       public function load(array $config, $overwrite = false)
+       public function load(array $config, bool $overwrite = false)
        {
                $categories = array_keys($config);
 
@@ -57,9 +61,14 @@ class ConfigCache implements IConfigCache, IPConfigCache
        }
 
        /**
-        * {@inheritdoc}
+        * Gets a value from the config cache.
+        *
+        * @param string $cat Config category
+        * @param string $key Config key
+        *
+        * @return null|mixed Returns the value of the Config entry or null if not set
         */
-       public function get($cat, $key = null)
+       public function get(string $cat, string $key = null)
        {
                if (isset($this->config[$cat][$key])) {
                        return $this->config[$cat][$key];
@@ -73,21 +82,27 @@ class ConfigCache implements IConfigCache, IPConfigCache
        /**
         * Sets a default value in the config cache. Ignores already existing keys.
         *
-        * @param string $cat Config category
-        * @param string $k   Config key
-        * @param mixed  $v   Default value to set
+        * @param string $cat   Config category
+        * @param string $key   Config key
+        * @param mixed  $value Default value to set
         */
-       private function setDefault($cat, $k, $v)
+       private function setDefault(string $cat, string $key, $value)
        {
-               if (!isset($this->config[$cat][$k])) {
-                       $this->set($cat, $k, $v);
+               if (!isset($this->config[$cat][$key])) {
+                       $this->set($cat, $key, $value);
                }
        }
 
        /**
-        * {@inheritdoc}
+        * Sets a value in the config cache. Accepts raw output from the config table
+        *
+        * @param string $cat   Config category
+        * @param string $key   Config key
+        * @param mixed  $value Value to set
+        *
+        * @return bool True, if the value is set
         */
-       public function set($cat, $key, $value)
+       public function set(string $cat, string $key, $value)
        {
                if (!isset($this->config[$cat])) {
                        $this->config[$cat] = [];
@@ -95,8 +110,8 @@ class ConfigCache implements IConfigCache, IPConfigCache
 
                if ($this->hidePasswordOutput &&
                    $key == 'password' &&
-                   !empty($value) && is_string($value)) {
-                       $this->config[$cat][$key] = new HiddenString((string) $value);
+                   is_string($value)) {
+                       $this->config[$cat][$key] = new HiddenString((string)$value);
                } else {
                        $this->config[$cat][$key] = $value;
                }
@@ -104,9 +119,14 @@ class ConfigCache implements IConfigCache, IPConfigCache
        }
 
        /**
-        * {@inheritdoc}
+        * Deletes a value from the config cache.
+        *
+        * @param string $cat Config category
+        * @param string $key Config key
+        *
+        * @return bool true, if deleted
         */
-       public function delete($cat, $key)
+       public function delete(string $cat, string $key)
        {
                if (isset($this->config[$cat][$key])) {
                        unset($this->config[$cat][$key]);
@@ -119,80 +139,6 @@ class ConfigCache implements IConfigCache, IPConfigCache
                }
        }
 
-       /**
-        * {@inheritdoc}
-        */
-       public function loadP($uid, array $config)
-       {
-               $categories = array_keys($config);
-
-               foreach ($categories as $category) {
-                       if (isset($config[$category]) && is_array($config[$category])) {
-
-                               $keys = array_keys($config[$category]);
-
-                               foreach ($keys as $key) {
-                                       $value = $config[$category][$key];
-                                       if (isset($value)) {
-                                               $this->setP($uid, $category, $key, $value);
-                                       }
-                               }
-                       }
-               }
-       }
-
-       /**
-        * {@inheritdoc}
-        */
-       public function getP($uid, $cat, $key = null)
-       {
-               if (isset($this->config[$uid][$cat][$key])) {
-                       return $this->config[$uid][$cat][$key];
-               } elseif (!isset($key) && isset($this->config[$uid][$cat])) {
-                       return $this->config[$uid][$cat];
-               } else {
-                       return null;
-               }
-       }
-
-       /**
-        * {@inheritdoc}
-        */
-       public function setP($uid, $cat, $key, $value)
-       {
-               if (!isset($this->config[$uid]) || !is_array($this->config[$uid])) {
-                       $this->config[$uid] = [];
-               }
-
-               if (!isset($this->config[$uid][$cat])) {
-                       $this->config[$uid][$cat] = [];
-               }
-
-               $this->config[$uid][$cat][$key] = $value;
-
-               return true;
-       }
-
-       /**
-        * {@inheritdoc}
-        */
-       public function deleteP($uid, $cat, $key)
-       {
-               if (isset($this->config[$uid][$cat][$key])) {
-                       unset($this->config[$uid][$cat][$key]);
-                       if (count($this->config[$uid][$cat]) == 0) {
-                               unset($this->config[$uid][$cat]);
-                               if (count($this->config[$uid]) == 0) {
-                                       unset($this->config[$uid]);
-                               }
-                       }
-
-                       return true;
-               } else {
-                       return false;
-               }
-       }
-
        /**
         * Returns the whole configuration
         *
diff --git a/src/Core/Config/Cache/IConfigCache.php b/src/Core/Config/Cache/IConfigCache.php
deleted file mode 100644 (file)
index 499bd31..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-<?php
-
-namespace Friendica\Core\Config\Cache;
-
-/**
- * The interface for a system-wide ConfigCache
- */
-interface IConfigCache
-{
-       /**
-        * Tries to load the specified configuration array into the config array.
-        * Doesn't overwrite previously set values by default to prevent default config files to supersede DB Config.
-        *
-        * @param array $config
-        * @param bool  $overwrite Force value overwrite if the config key already exists
-        */
-       function load(array $config, $overwrite = false);
-
-       /**
-        * Gets a value from the config cache.
-        *
-        * @param string $cat     Config category
-        * @param string $key     Config key
-        *
-        * @return null|mixed Returns the value of the Config entry or null if not set
-        */
-       function get($cat, $key = null);
-
-       /**
-        * Sets a value in the config cache. Accepts raw output from the config table
-        *
-        * @param string $cat   Config category
-        * @param string $key   Config key
-        * @param mixed  $value Value to set
-        *
-        * @return bool True, if the value is set
-        */
-       function set($cat, $key, $value);
-
-       /**
-        * Deletes a value from the config cache.
-        *
-        * @param string $cat  Config category
-        * @param string $key  Config key
-        *
-        * @return bool true, if deleted
-        */
-       function delete($cat, $key);
-
-       /**
-        * Returns the whole configuration cache
-        *
-        * @return array
-        */
-       function getAll();
-}
diff --git a/src/Core/Config/Cache/IPConfigCache.php b/src/Core/Config/Cache/IPConfigCache.php
deleted file mode 100644 (file)
index 30076a2..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-<?php
-
-namespace Friendica\Core\Config\Cache;
-
-/**
- * The interface for a user-specific config cache
- */
-interface IPConfigCache
-{
-       /**
-        * Tries to load the specified configuration array into the user specific config array.
-        * Doesn't overwrite previously set values by default to prevent default config files to supersede DB Config.
-        *
-        * @param int   $uid
-        * @param array $config
-        */
-       function loadP($uid, array $config);
-
-       /**
-        * Retrieves a value from the user config cache
-        *
-        * @param int    $uid     User Id
-        * @param string $cat     Config category
-        * @param string $key     Config key
-        *
-        * @return null|string The value of the config entry or null if not set
-        */
-       function getP($uid, $cat, $key = null);
-
-       /**
-        * Sets a value in the user config cache
-        *
-        * Accepts raw output from the pconfig table
-        *
-        * @param int    $uid   User Id
-        * @param string $cat   Config category
-        * @param string $key   Config key
-        * @param mixed  $value Value to set
-        */
-       function setP($uid, $cat, $key, $value);
-
-       /**
-        * Deletes a value from the user config cache
-        *
-        * @param int    $uid User Id
-        * @param string $cat Config category
-        * @param string $key Config key
-        *
-        * @return bool true, if deleted
-        */
-       function deleteP($uid, $cat, $key);
-
-       /**
-        * Returns the whole configuration cache
-        *
-        * @return array
-        */
-       function getAll();
-}
diff --git a/src/Core/Config/Cache/PConfigCache.php b/src/Core/Config/Cache/PConfigCache.php
new file mode 100644 (file)
index 0000000..b0dd209
--- /dev/null
@@ -0,0 +1,189 @@
+<?php
+
+namespace Friendica\Core\Config\Cache;
+
+use ParagonIE\HiddenString\HiddenString;
+
+/**
+ * The Friendica config cache for users
+ */
+class PConfigCache
+{
+       /**
+        * @var array
+        */
+       private $config;
+
+       /**
+        * @var bool
+        */
+       private $hidePasswordOutput;
+
+       /**
+        * @param bool $hidePasswordOutput True, if cache variables should take extra care of password values
+        */
+       public function __construct(bool $hidePasswordOutput = true)
+       {
+               $this->hidePasswordOutput = $hidePasswordOutput;
+       }
+
+       /**
+        * Tries to load the specified configuration array into the user specific config array.
+        * Doesn't overwrite previously set values by default to prevent default config files to supersede DB Config.
+        *
+        * @param int   $uid
+        * @param array $config
+        */
+       public function load($uid, array $config)
+       {
+               if (!is_int($uid)) {
+                       return;
+               }
+
+               $categories = array_keys($config);
+
+               foreach ($categories as $category) {
+                       if (isset($config[$category]) && is_array($config[$category])) {
+
+                               $keys = array_keys($config[$category]);
+
+                               foreach ($keys as $key) {
+                                       $value = $config[$category][$key];
+                                       if (isset($value)) {
+                                               $this->set($uid, $category, $key, $value);
+                                       }
+                               }
+                       }
+               }
+       }
+
+       /**
+        * Retrieves a value from the user config cache
+        *
+        * @param int    $uid User Id
+        * @param string $cat Config category
+        * @param string $key Config key
+        *
+        * @return null|string The value of the config entry or null if not set
+        */
+       public function get($uid, string $cat, string $key = null)
+       {
+               if (!is_int($uid)) {
+                       return null;
+               }
+
+               if (isset($this->config[$uid][$cat][$key])) {
+                       return $this->config[$uid][$cat][$key];
+               } elseif (!isset($key) && isset($this->config[$uid][$cat])) {
+                       return $this->config[$uid][$cat];
+               } else {
+                       return null;
+               }
+       }
+
+       /**
+        * Sets a value in the user config cache
+        *
+        * Accepts raw output from the pconfig table
+        *
+        * @param int    $uid   User Id
+        * @param string $cat   Config category
+        * @param string $key   Config key
+        * @param mixed  $value Value to set
+        *
+        * @return bool Set successful
+        */
+       public function set($uid, string $cat, string $key, $value)
+       {
+               if (!is_int($uid)) {
+                       return false;
+               }
+
+               if (!isset($this->config[$uid]) || !is_array($this->config[$uid])) {
+                       $this->config[$uid] = [];
+               }
+
+               if (!isset($this->config[$uid][$cat])) {
+                       $this->config[$uid][$cat] = [];
+               }
+
+               if ($this->hidePasswordOutput &&
+                   $key == 'password' &&
+                   !empty($value) && is_string($value)) {
+                       $this->config[$uid][$cat][$key] = new HiddenString((string)$value);
+               } else {
+                       $this->config[$uid][$cat][$key] = $value;
+               }
+
+
+               return true;
+       }
+
+       /**
+        * Deletes a value from the user config cache
+        *
+        * @param int    $uid User Id
+        * @param string $cat Config category
+        * @param string $key Config key
+        *
+        * @return bool true, if deleted
+        */
+       public function delete($uid, string $cat, string $key)
+       {
+               if (!is_int($uid)) {
+                       return false;
+               }
+
+               if (isset($this->config[$uid][$cat][$key])) {
+                       unset($this->config[$uid][$cat][$key]);
+                       if (count($this->config[$uid][$cat]) == 0) {
+                               unset($this->config[$uid][$cat]);
+                               if (count($this->config[$uid]) == 0) {
+                                       unset($this->config[$uid]);
+                               }
+                       }
+
+                       return true;
+               } else {
+                       return false;
+               }
+       }
+
+       /**
+        * Returns the whole configuration
+        *
+        * @return array The configuration
+        */
+       public function getAll()
+       {
+               return $this->config;
+       }
+
+       /**
+        * Returns an array with missing categories/Keys
+        *
+        * @param array $config The array to check
+        *
+        * @return array
+        */
+       public function keyDiff(array $config)
+       {
+               $return = [];
+
+               $categories = array_keys($config);
+
+               foreach ($categories as $category) {
+                       if (is_array($config[$category])) {
+                               $keys = array_keys($config[$category]);
+
+                               foreach ($keys as $key) {
+                                       if (!isset($this->config[$category][$key])) {
+                                               $return[$category][$key] = $config[$category][$key];
+                                       }
+                               }
+                       }
+               }
+
+               return $return;
+       }
+}
index 18191d0429c45bfd2fb5fc9f860fb71eaca2b008..f904f369bb81455d888254cbff9e80bb4000ff56 100644 (file)
@@ -2,40 +2,40 @@
 
 namespace Friendica\Core\Config;
 
+use Friendica\Model;
+
 /**
  * This class is responsible for all system-wide configuration values in Friendica
  * There are two types of storage
- * - The Config-Files    (loaded into the FileCache @see Cache\IConfigCache )
- * - The Config-DB-Table (per Config-DB-adapter @see Adapter\IConfigAdapter )
+ * - The Config-Files    (loaded into the FileCache @see Cache\ConfigCache )
+ * - The Config-DB-Table (per Config-DB-model @see Model\Config\Config )
  */
-class Configuration
+abstract class Configuration
 {
        /**
-        * @var Cache\IConfigCache
+        * @var Cache\ConfigCache
         */
-       private $configCache;
+       protected $configCache;
 
        /**
-        * @var Adapter\IConfigAdapter
+        * @var Model\Config\Config
         */
-       private $configAdapter;
+       protected $configModel;
 
        /**
-        * @param Cache\IConfigCache     $configCache   The configuration cache (based on the config-files)
-        * @param Adapter\IConfigAdapter $configAdapter The configuration DB-backend
+        * @param Cache\ConfigCache  $configCache The configuration cache (based on the config-files)
+        * @param Model\Config\Config $configModel The configuration model
         */
-       public function __construct(Cache\IConfigCache $configCache, Adapter\IConfigAdapter $configAdapter)
+       public function __construct(Cache\ConfigCache $configCache, Model\Config\Config $configModel)
        {
                $this->configCache = $configCache;
-               $this->configAdapter = $configAdapter;
-
-               $this->load();
+               $this->configModel = $configModel;
        }
 
        /**
         * Returns the Config Cache
         *
-        * @return Cache\IConfigCache
+        * @return Cache\ConfigCache
         */
        public function getCache()
        {
@@ -45,22 +45,13 @@ class Configuration
        /**
         * @brief Loads all configuration values of family into a cached storage.
         *
-        * All configuration values of the system are stored in the cache ( @see IConfigCache )
+        * All configuration values of the system are stored in the cache ( @see ConfigCache )
         *
         * @param string $cat The category of the configuration value
         *
         * @return void
         */
-       public function load($cat = 'config')
-       {
-               // If not connected, do nothing
-               if (!$this->configAdapter->isConnected()) {
-                       return;
-               }
-
-               // load the whole category out of the DB into the cache
-               $this->configCache->load($this->configAdapter->load($cat), true);
-       }
+       abstract public function load(string $cat = 'config');
 
        /**
         * @brief Get a particular user's config variable given the category name
@@ -68,7 +59,7 @@ class Configuration
         *
         * Get a particular config value from the given category ($cat)
         * and the $key from a cached storage either from the $this->configAdapter
-        * (@see IConfigAdapter ) or from the $this->configCache (@see IConfigCache ).
+        * (@see IConfigAdapter ) or from the $this->configCache (@see ConfigCache ).
         *
         * @param string  $cat        The category of the configuration value
         * @param string  $key           The configuration key to query
@@ -77,26 +68,7 @@ class Configuration
         *
         * @return mixed Stored value or null if it does not exist
         */
-       public function get($cat, $key, $default_value = null, $refresh = false)
-       {
-               // if the value isn't loaded or refresh is needed, load it to the cache
-               if ($this->configAdapter->isConnected() &&
-                       (!$this->configAdapter->isLoaded($cat, $key) ||
-                       $refresh)) {
-
-                       $dbvalue = $this->configAdapter->get($cat, $key);
-
-                       if (isset($dbvalue)) {
-                               $this->configCache->set($cat, $key, $dbvalue);
-                               unset($dbvalue);
-                       }
-               }
-
-               // use the config cache for return
-               $result = $this->configCache->get($cat, $key);
-
-               return (isset($result)) ? $result : $default_value;
-       }
+       abstract public function get(string $cat, string $key, $default_value = null, bool $refresh = false);
 
        /**
         * @brief Sets a configuration value for system config
@@ -111,20 +83,7 @@ class Configuration
         *
         * @return bool Operation success
         */
-       public function set($cat, $key, $value)
-       {
-               // set the cache first
-               $cached = $this->configCache->set($cat, $key, $value);
-
-               // If there is no connected adapter, we're finished
-               if (!$this->configAdapter->isConnected()) {
-                       return $cached;
-               }
-
-               $stored = $this->configAdapter->set($cat, $key, $value);
-
-               return $cached && $stored;
-       }
+       abstract public function set(string $cat, string $key, $value);
 
        /**
         * @brief Deletes the given key from the system configuration.
@@ -137,16 +96,5 @@ class Configuration
         *
         * @return bool
         */
-       public function delete($cat, $key)
-       {
-               $cacheRemoved = $this->configCache->delete($cat, $key);
-
-               if (!$this->configAdapter->isConnected()) {
-                       return $cacheRemoved;
-               }
-
-               $storeRemoved = $this->configAdapter->delete($cat, $key);
-
-               return $cacheRemoved || $storeRemoved;
-       }
+       abstract public function delete(string $cat, string $key);
 }
diff --git a/src/Core/Config/JitConfiguration.php b/src/Core/Config/JitConfiguration.php
new file mode 100644 (file)
index 0000000..07f6d0e
--- /dev/null
@@ -0,0 +1,121 @@
+<?php
+
+namespace Friendica\Core\Config;
+
+use Friendica\Model;
+
+/**
+ * This class implements the Just-In-Time configuration, which will cache
+ * config values in a cache, once they are retrieved.
+ *
+ * Default Configuration type.
+ * Provides the best performance for pages loading few configuration variables.
+ */
+class JitConfiguration extends Configuration
+{
+       /**
+        * @var array Array of already loaded db values (even if there was no value)
+        */
+       private $db_loaded;
+
+       /**
+        * @param Cache\ConfigCache   $configCache The configuration cache (based on the config-files)
+        * @param Model\Config\Config $configModel The configuration model
+        */
+       public function __construct(Cache\ConfigCache $configCache, Model\Config\Config $configModel)
+       {
+               parent::__construct($configCache, $configModel);
+               $this->db_loaded = [];
+
+               $this->load();
+       }
+
+       /**
+        * {@inheritDoc}
+        *
+        */
+       public function load(string $cat = 'config')
+       {
+               // If not connected, do nothing
+               if (!$this->configModel->isConnected()) {
+                       return;
+               }
+
+               $config = $this->configModel->load($cat);
+
+               if (!empty($config[$cat])) {
+                       foreach ($config[$cat] as $key => $value) {
+                               $this->db_loaded[$cat][$key] = true;
+                       }
+               }
+
+               // load the whole category out of the DB into the cache
+               $this->configCache->load($config, true);
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function get(string $cat, string $key, $default_value = null, bool $refresh = false)
+       {
+               // if the value isn't loaded or refresh is needed, load it to the cache
+               if ($this->configModel->isConnected() &&
+                   (empty($this->db_loaded[$cat][$key]) ||
+                    $refresh)) {
+
+                       $dbvalue = $this->configModel->get($cat, $key);
+
+                       if (isset($dbvalue)) {
+                               $this->configCache->set($cat, $key, $dbvalue);
+                               unset($dbvalue);
+                       }
+
+                       $this->db_loaded[$cat][$key] = true;
+               }
+
+               // use the config cache for return
+               $result = $this->configCache->get($cat, $key);
+
+               return (isset($result)) ? $result : $default_value;
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function set(string $cat, string $key, $value)
+       {
+               // set the cache first
+               $cached = $this->configCache->set($cat, $key, $value);
+
+               // If there is no connected adapter, we're finished
+               if (!$this->configModel->isConnected()) {
+                       return $cached;
+               }
+
+               $stored = $this->configModel->set($cat, $key, $value);
+
+               $this->db_loaded[$cat][$key] = $stored;
+
+               return $cached && $stored;
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function delete(string $cat, string $key)
+       {
+               $cacheRemoved = $this->configCache->delete($cat, $key);
+
+               if (isset($this->db_loaded[$cat][$key])) {
+                       unset($this->db_loaded[$cat][$key]);
+               }
+
+               if (!$this->configModel->isConnected()) {
+                       return $cacheRemoved;
+               }
+
+               $storeRemoved = $this->configModel->delete($cat, $key);
+
+               return $cacheRemoved || $storeRemoved;
+       }
+}
diff --git a/src/Core/Config/JitPConfiguration.php b/src/Core/Config/JitPConfiguration.php
new file mode 100644 (file)
index 0000000..fb5c9d1
--- /dev/null
@@ -0,0 +1,131 @@
+<?php
+
+namespace Friendica\Core\Config;
+
+use Friendica\Model;
+
+/**
+ * This class implements the Just-In-Time configuration, which will cache
+ * user config values in a cache, once they are retrieved.
+ *
+ * Default Configuration type.
+ * Provides the best performance for pages loading few configuration variables.
+ */
+class JitPConfiguration extends PConfiguration
+{
+       /**
+        * @var array Array of already loaded db values (even if there was no value)
+        */
+       private $db_loaded;
+
+       /**
+        * @param Cache\PConfigCache   $configCache The configuration cache
+        * @param Model\Config\PConfig $configModel The configuration model
+        */
+       public function __construct(Cache\PConfigCache $configCache, Model\Config\PConfig $configModel)
+       {
+               parent::__construct($configCache, $configModel);
+               $this->db_loaded = [];
+       }
+
+       /**
+        * {@inheritDoc}
+        *
+        */
+       public function load(int $uid, string $cat = 'config')
+       {
+               // If not connected or no uid, do nothing
+               if (!$uid || !$this->configModel->isConnected()) {
+                       return;
+               }
+
+               $config = $this->configModel->load($uid, $cat);
+
+               if (!empty($config[$cat])) {
+                       foreach ($config[$cat] as $key => $value) {
+                               $this->db_loaded[$uid][$cat][$key] = true;
+                       }
+               }
+
+               // load the whole category out of the DB into the cache
+               $this->configCache->load($uid, $config);
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function get(int $uid, string $cat, string $key, $default_value = null, bool $refresh = false)
+       {
+               if (!$uid) {
+                       return $default_value;
+               }
+
+               // if the value isn't loaded or refresh is needed, load it to the cache
+               if ($this->configModel->isConnected() &&
+                   (empty($this->db_loaded[$uid][$cat][$key]) ||
+                    $refresh)) {
+
+                       $dbvalue = $this->configModel->get($uid, $cat, $key);
+
+                       if (isset($dbvalue)) {
+                               $this->configCache->set($uid, $cat, $key, $dbvalue);
+                               unset($dbvalue);
+                       }
+
+                       $this->db_loaded[$uid][$cat][$key] = true;
+               }
+
+               // use the config cache for return
+               $result = $this->configCache->get($uid, $cat, $key);
+
+               return (isset($result)) ? $result : $default_value;
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function set(int $uid, string $cat, string $key, $value)
+       {
+               if (!$uid) {
+                       return false;
+               }
+
+               // set the cache first
+               $cached = $this->configCache->set($uid, $cat, $key, $value);
+
+               // If there is no connected adapter, we're finished
+               if (!$this->configModel->isConnected()) {
+                       return $cached;
+               }
+
+               $stored = $this->configModel->set($uid, $cat, $key, $value);
+
+               $this->db_loaded[$uid][$cat][$key] = $stored;
+
+               return $cached && $stored;
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function delete(int $uid, string $cat, string $key)
+       {
+               if (!$uid) {
+                       return false;
+               }
+
+               $cacheRemoved = $this->configCache->delete($uid, $cat, $key);
+
+               if (isset($this->db_loaded[$uid][$cat][$key])) {
+                       unset($this->db_loaded[$uid][$cat][$key]);
+               }
+
+               if (!$this->configModel->isConnected()) {
+                       return $cacheRemoved;
+               }
+
+               $storeRemoved = $this->configModel->delete($uid, $cat, $key);
+
+               return $cacheRemoved || $storeRemoved;
+       }
+}
index 0d3b0c178c6cb24c02a53c8ec54454e3a096e220..badec9dfca094d5a60057065a919fc07ab9bb89e 100644 (file)
@@ -2,66 +2,70 @@
 
 namespace Friendica\Core\Config;
 
+use Friendica\Model;
+
 /**
  * This class is responsible for the user-specific configuration values in Friendica
- * The values are set through the Config-DB-Table (per Config-DB-adapter @see Adapter\IPConfigAdapter )
+ * The values are set through the Config-DB-Table (per Config-DB-model @see Model\Config\PConfig)
  *
- * The configuration cache (@see Cache\IPConfigCache ) is used for temporary caching of database calls. This will
+ * The configuration cache (@see Cache\PConfigCache ) is used for temporary caching of database calls. This will
  * increase the performance.
  */
-class PConfiguration
+abstract class PConfiguration
 {
        /**
-        * @var Cache\IPConfigCache
+        * @var Cache\PConfigCache
         */
-       private $configCache;
+       protected $configCache;
 
        /**
-        * @var Adapter\IPConfigAdapter
+        * @var Model\Config\PConfig
         */
-       private $configAdapter;
+       protected $configModel;
 
        /**
-        * @param Cache\IPConfigCache     $configCache   The configuration cache
-        * @param Adapter\IPConfigAdapter $configAdapter The configuration DB-backend
+        * @param Cache\PConfigCache   $configCache The configuration cache
+        * @param Model\Config\PConfig $configModel The configuration model
         */
-       public function __construct(Cache\IPConfigCache $configCache, Adapter\IPConfigAdapter $configAdapter)
+       public function __construct(Cache\PConfigCache $configCache, Model\Config\PConfig $configModel)
        {
                $this->configCache = $configCache;
-               $this->configAdapter = $configAdapter;
+               $this->configModel = $configModel;
+       }
+
+       /**
+        * Returns the Config Cache
+        *
+        * @return Cache\PConfigCache
+        */
+       public function getCache()
+       {
+               return $this->configCache;
        }
 
        /**
-        * @brief Loads all configuration values of a user's config family into a cached storage.
+        * Loads all configuration values of a user's config family into a cached storage.
         *
-        * All configuration values of the given user are stored with the $uid in
-        * the cache ( @see IPConfigCache )
+        * All configuration values of the given user are stored with the $uid in the cache
         *
-        * @param string $uid The user_id
+        * @param int $uid The user_id
         * @param string $cat The category of the configuration value
         *
         * @return void
+        * @see PConfigCache )
+        *
         */
-       public function load($uid, $cat = 'config')
-       {
-               // If not connected, do nothing
-               if (!$this->configAdapter->isConnected()) {
-                       return;
-               }
-
-               // load the whole category out of the DB into the cache
-               $this->configCache->loadP($uid, $this->configAdapter->load($uid, $cat));
-       }
+       abstract public function load(int $uid, string $cat = 'config');
 
        /**
-        * @brief Get a particular user's config variable given the category name
+        * Get a particular user's config variable given the category name
         * ($cat) and a key.
         *
         * Get a particular user's config value from the given category ($cat)
         * and the $key with the $uid from a cached storage either from the $this->configAdapter
-        * (@see IConfigAdapter ) or from the $this->configCache (@see IConfigCache ).
+        * (@see IConfigAdapter ) or from the $this->configCache (@see PConfigCache ).
         *
-        * @param string  $uid           The user_id
+        * @param int     $uid           The user_id
         * @param string  $cat           The category of the configuration value
         * @param string  $key           The configuration key to query
         * @param mixed   $default_value optional, The value to return if key is not set (default: null)
@@ -69,78 +73,37 @@ class PConfiguration
         *
         * @return mixed Stored value or null if it does not exist
         */
-       public function get($uid, $cat, $key, $default_value = null, $refresh = false)
-       {
-               // if the value isn't loaded or refresh is needed, load it to the cache
-               if ($this->configAdapter->isConnected() &&
-                       (!$this->configAdapter->isLoaded($uid, $cat, $key) ||
-                               $refresh)) {
-                       $dbValue = $this->configAdapter->get($uid, $cat, $key);
-
-                       if (isset($dbValue)) {
-                               $this->configCache->setP($uid, $cat, $key, $dbValue);
-                               return $dbValue;
-                       }
-               }
-
-               // use the config cache for return
-               $result = $this->configCache->getP($uid, $cat, $key);
-               return (isset($result)) ? $result : $default_value;
-       }
+       abstract public function get(int $uid, string $cat, string $key, $default_value = null, bool $refresh = false);
 
        /**
-        * @brief Sets a configuration value for a user
+        * Sets a configuration value for a user
         *
         * Stores a config value ($value) in the category ($family) under the key ($key)
         * for the user_id $uid.
         *
         * @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
-        * @param mixed  $value  The value to store
+        * @param int    $uid   The user_id
+        * @param string $cat   The category of the configuration value
+        * @param string $key   The configuration key to set
+        * @param mixed  $value The value to store
         *
         * @return bool Operation success
         */
-       public function set($uid, $cat, $key, $value)
-       {
-               // set the cache first
-               $cached = $this->configCache->setP($uid, $cat, $key, $value);
-
-               // If there is no connected adapter, we're finished
-               if (!$this->configAdapter->isConnected()) {
-                       return $cached;
-               }
-
-               $stored = $this->configAdapter->set($uid, $cat, $key, $value);
-
-               return $cached && $stored;
-       }
+       abstract public function set(int $uid, string $cat, string $key, $value);
 
        /**
-        * @brief Deletes the given key from the users's configuration.
+        * Deletes the given key from the users's configuration.
         *
         * Removes the configured value from the stored cache in $this->configCache
         * (@see ConfigCache ) and removes it from the database (@see IConfigAdapter )
-        * with the given $uid.
+        *  with the given $uid.
         *
-        * @param string $uid The user_id
+        * @param int $uid The user_id
         * @param string $cat The category of the configuration value
         * @param string $key The configuration key to delete
         *
         * @return bool
         */
-       public function delete($uid, $cat, $key)
-       {
-               $cacheRemoved = $this->configCache->deleteP($uid, $cat, $key);
-
-               if (!$this->configAdapter->isConnected()) {
-                       return $cacheRemoved;
-               }
-
-               $storeRemoved = $this->configAdapter->delete($uid, $cat, $key);
-
-               return $cacheRemoved || $storeRemoved;
-       }
+       abstract public function delete(int $uid, string $cat, string $key);
 }
diff --git a/src/Core/Config/PreloadConfiguration.php b/src/Core/Config/PreloadConfiguration.php
new file mode 100644 (file)
index 0000000..d54f1b0
--- /dev/null
@@ -0,0 +1,116 @@
+<?php
+
+namespace Friendica\Core\Config;
+
+use Friendica\Model;
+
+/**
+ * This class implements the preload configuration, which will cache
+ * all config values per call in a cache.
+ *
+ * Minimizes the number of database queries to retrieve configuration values at the cost of memory.
+ */
+class PreloadConfiguration extends Configuration
+{
+       /** @var bool */
+       private $config_loaded;
+
+       /**
+        * @param Cache\ConfigCache   $configCache The configuration cache (based on the config-files)
+        * @param Model\Config\Config $configModel The configuration model
+        */
+       public function __construct(Cache\ConfigCache $configCache, Model\Config\Config $configModel)
+       {
+               parent::__construct($configCache, $configModel);
+               $this->config_loaded = false;
+
+               $this->load();
+       }
+
+       /**
+        * {@inheritDoc}
+        *
+        * This loads all config values everytime load is called
+        *
+        */
+       public function load(string $cat = 'config')
+       {
+               // Don't load the whole configuration twice
+               if ($this->config_loaded) {
+                       return;
+               }
+
+               // If not connected, do nothing
+               if (!$this->configModel->isConnected()) {
+                       return;
+               }
+
+               $config              = $this->configModel->load();
+               $this->config_loaded = true;
+
+               // load the whole category out of the DB into the cache
+               $this->configCache->load($config, true);
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function get(string $cat, string $key, $default_value = null, bool $refresh = false)
+       {
+               if ($refresh) {
+                       if ($this->configModel->isConnected()) {
+                               $config = $this->configModel->get($cat, $key);
+                               if (isset($config)) {
+                                       $this->configCache->set($cat, $key, $config);
+                               }
+                       }
+               }
+
+               // use the config cache for return
+               $result = $this->configCache->get($cat, $key);
+
+               return (isset($result)) ? $result : $default_value;
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function set(string $cat, string $key, $value)
+       {
+               if (!$this->config_loaded) {
+                       $this->load();
+               }
+
+               // set the cache first
+               $cached = $this->configCache->set($cat, $key, $value);
+
+               // If there is no connected adapter, we're finished
+               if (!$this->configModel->isConnected()) {
+                       return $cached;
+               }
+
+               $stored = $this->configModel->set($cat, $key, $value);
+
+               return $cached && $stored;
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function delete(string $cat, string $key)
+       {
+               if ($this->config_loaded) {
+                       $this->load();
+               }
+
+               $cacheRemoved = $this->configCache->delete($cat, $key);
+
+               if (!$this->configModel->isConnected()) {
+                       return $cacheRemoved;
+               }
+
+               $storeRemoved = $this->configModel->delete($cat, $key);
+
+               return $cacheRemoved || $storeRemoved;
+       }
+}
diff --git a/src/Core/Config/PreloadPConfiguration.php b/src/Core/Config/PreloadPConfiguration.php
new file mode 100644 (file)
index 0000000..975a15c
--- /dev/null
@@ -0,0 +1,128 @@
+<?php
+
+namespace Friendica\Core\Config;
+
+use Friendica\Model;
+
+/**
+ * This class implements the preload configuration, which will cache
+ * all user config values per call in a cache.
+ *
+ * Minimizes the number of database queries to retrieve configuration values at the cost of memory.
+ */
+class PreloadPConfiguration extends PConfiguration
+{
+       /** @var array */
+       private $config_loaded;
+
+       /**
+        * @param Cache\PConfigCache   $configCache The configuration cache
+        * @param Model\Config\PConfig $configModel The configuration model
+        */
+       public function __construct(Cache\PConfigCache $configCache, Model\Config\PConfig $configModel)
+       {
+               parent::__construct($configCache, $configModel);
+               $this->config_loaded = [];
+       }
+
+       /**
+        * {@inheritDoc}
+        *
+        * This loads all config values everytime load is called
+        *
+        */
+       public function load(int $uid, string $cat = 'config')
+       {
+               // Don't load the whole configuration twice or with invalid uid
+               if (!$uid || !empty($this->config_loaded[$uid])) {
+                       return;
+               }
+
+               // If not connected, do nothing
+               if (!$this->configModel->isConnected()) {
+                       return;
+               }
+
+               $config                    = $this->configModel->load($uid);
+               $this->config_loaded[$uid] = true;
+
+               // load the whole category out of the DB into the cache
+               $this->configCache->load($uid, $config);
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function get(int $uid, string $cat, string $key, $default_value = null, bool $refresh = false)
+       {
+               if (!$uid) {
+                       return $default_value;
+               }
+
+               if (empty($this->config_loaded[$uid])) {
+                       $this->load($uid);
+               } elseif ($refresh) {
+                       if ($this->configModel->isConnected()) {
+                               $config = $this->configModel->get($uid, $cat, $key);
+                               if (isset($config)) {
+                                       $this->configCache->set($uid, $cat, $key, $config);
+                               }
+                       }
+               }
+
+               // use the config cache for return
+               $result = $this->configCache->get($uid, $cat, $key);
+
+               return (isset($result)) ? $result : $default_value;
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function set(int $uid, string $cat, string $key, $value)
+       {
+               if (!$uid) {
+                       return false;
+               }
+
+               if (empty($this->config_loaded[$uid])) {
+                       $this->load($uid);
+               }
+
+               // set the cache first
+               $cached = $this->configCache->set($uid, $cat, $key, $value);
+
+               // If there is no connected adapter, we're finished
+               if (!$this->configModel->isConnected()) {
+                       return $cached;
+               }
+
+               $stored = $this->configModel->set($uid, $cat, $key, $value);
+
+               return $cached && $stored;
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function delete(int $uid, string $cat, string $key)
+       {
+               if (!$uid) {
+                       return false;
+               }
+
+               if (empty($this->config_loaded[$uid])) {
+                       $this->load($uid);
+               }
+
+               $cacheRemoved = $this->configCache->delete($uid, $cat, $key);
+
+               if (!$this->configModel->isConnected()) {
+                       return $cacheRemoved;
+               }
+
+               $storeRemoved = $this->configModel->delete($uid, $cat, $key);
+
+               return $cacheRemoved || $storeRemoved;
+       }
+}
index 2893c27b2341e2275b3f2055d84b7e3e4a8b9052..2ca568c2da906114b0808efbb83294088119c992 100644 (file)
@@ -2,6 +2,7 @@
 
 namespace Friendica\Core;
 
+use Dice\Dice;
 use Friendica;
 
 /**
@@ -15,6 +16,11 @@ class Console extends \Asika\SimpleConsole\Console
        protected $helpOptions = [];
        protected $customHelpOptions = ['h', 'help', '?'];
 
+       /**
+        * @var Dice The DI library
+        */
+       protected $dice;
+
        protected function getHelp()
        {
                $help = <<<HELP
@@ -32,6 +38,7 @@ Commands:
        archivecontact         Archive a contact when you know that it isn't existing anymore
        help                   Show help about a command, e.g (bin/console help config)
        autoinstall            Starts automatic installation of friendica based on values from htconfig.php
+       lock                   Edit site locks
        maintenance            Set maintenance mode for this node
        newpassword            Set a new password for a given user
        php2po                 Generate a messages.po file from a strings.php file
@@ -59,6 +66,7 @@ HELP;
                'globalcommunitysilence' => Friendica\Console\GlobalCommunitySilence::class,
                'archivecontact'         => Friendica\Console\ArchiveContact::class,
                'autoinstall'            => Friendica\Console\AutomaticInstallation::class,
+               'lock'                   => Friendica\Console\Lock::class,
                'maintenance'            => Friendica\Console\Maintenance::class,
                'newpassword'            => Friendica\Console\NewPassword::class,
                'php2po'                 => Friendica\Console\PhpToPo::class,
@@ -69,6 +77,19 @@ HELP;
                'storage'                => Friendica\Console\Storage::class,
        ];
 
+       /**
+        * CliInput Friendica constructor.
+        *
+        * @param Dice $dice The DI library
+        * @param array $argv
+        */
+       public function __construct(Dice $dice, array $argv = null)
+       {
+               parent::__construct($argv);
+
+               $this->dice = $dice;
+       }
+
        protected function doExecute()
        {
                if ($this->getOption('v')) {
@@ -125,8 +146,10 @@ HELP;
 
                $className = $this->subConsoles[$command];
 
+               Friendica\BaseObject::setDependencyInjection($this->dice);
+
                /** @var Console $subconsole */
-               $subconsole = new $className($subargs);
+               $subconsole = $this->dice->create($className, [$subargs]);
 
                foreach ($this->options as $name => $value) {
                        $subconsole->setOption($name, $value);
index 046b34ea6f7e3e87d495e7ff23908d4b848c5ca6..16d7bf0aad681f19d9f81c3ac87a9200dcb4c1ce 100644 (file)
@@ -6,13 +6,11 @@ namespace Friendica\Core;
 
 use DOMDocument;
 use Exception;
-use Friendica\Core\Config\Cache\IConfigCache;
-use Friendica\Database\DBA;
+use Friendica\Core\Config\Cache\ConfigCache;
+use Friendica\Database\Database;
 use Friendica\Database\DBStructure;
 use Friendica\Object\Image;
-use Friendica\Util\Logger\VoidLogger;
 use Friendica\Util\Network;
-use Friendica\Util\Profiler;
 use Friendica\Util\Strings;
 
 /**
@@ -130,12 +128,12 @@ class Installer
         * - Creates `config/local.config.php`
         * - Installs Database Structure
         *
-        * @param IConfigCache $configCache The config cache with all config relevant information
+        * @param ConfigCache $configCache The config cache with all config relevant information
         *
         * @return bool true if the config was created, otherwise false
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       public function createConfig(IConfigCache $configCache)
+       public function createConfig(ConfigCache $configCache)
        {
                $basepath = $configCache->get('system', 'basepath');
 
@@ -592,31 +590,25 @@ class Installer
        /**
         * Checking the Database connection and if it is available for the current installation
         *
-        * @param IConfigCache $configCache The configuration cache
-        * @param Profiler    $profiler    The profiler of this app
+        * @param Database $dba
         *
         * @return bool true if the check was successful, otherwise false
         * @throws Exception
         */
-       public function checkDB(IConfigCache $configCache, Profiler $profiler)
+       public function checkDB(Database $dba)
        {
-               $dbhost = $configCache->get('database', 'hostname');
-               $dbuser = $configCache->get('database', 'username');
-               $dbpass = $configCache->get('database', 'password');
-               $dbdata = $configCache->get('database', 'database');
+               $dba->reconnect();
 
-               if (!DBA::connect($configCache, $profiler, new VoidLogger(), $dbhost, $dbuser, $dbpass, $dbdata)) {
-                       $this->addCheck(L10n::t('Could not connect to database.'), false, true, '');
-
-                       return false;
-               }
-
-               if (DBA::connected()) {
+               if ($dba->isConnected()) {
                        if (DBStructure::existsTable('user')) {
                                $this->addCheck(L10n::t('Database already in use.'), false, true, '');
 
                                return false;
                        }
+               } else {
+                       $this->addCheck(L10n::t('Could not connect to database.'), false, true, '');
+
+                       return false;
                }
 
                return true;
@@ -625,12 +617,12 @@ class Installer
        /**
         * Setup the default cache for a new installation
         *
-        * @param IConfigCache $configCache The configuration cache
+        * @param ConfigCache $configCache The configuration cache
         * @param string       $basePath    The determined basepath
         *
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       public function setUpCache(IConfigCache $configCache, $basePath)
+       public function setUpCache(ConfigCache $configCache, $basePath)
        {
                $configCache->set('config', 'php_path'  , $this->getPHPPath());
                $configCache->set('system', 'basepath'  , $basePath);
index ae0ed18c3d0a732364bfc5d53ca072f935f253cf..db008d6a9e66659354975e2c2948b2e7bbd96ed1 100644 (file)
@@ -5,8 +5,7 @@
 namespace Friendica\Core;
 
 use Friendica\BaseObject;
-use Friendica\Database\DBA;
-use Friendica\Util\Strings;
+use Friendica\Core\L10n\L10n as L10nClass;
 
 /**
  * Provide Language, Translation, and Localization functions to the application
@@ -14,42 +13,6 @@ use Friendica\Util\Strings;
  */
 class L10n extends BaseObject
 {
-       /**
-        * A string indicating the current language used for translation:
-        * - Two-letter ISO 639-1 code.
-        * - Two-letter ISO 639-1 code + dash + Two-letter ISO 3166-1 alpha-2 country code.
-        * @var string
-        */
-       private static $lang = '';
-       /**
-        * A language code saved for later after pushLang() has been called.
-        *
-        * @var string
-        */
-       private static $langSave = '';
-
-       /**
-        * An array of translation strings whose key is the neutral english message.
-        *
-        * @var array
-        */
-       private static $strings = [];
-       /**
-        * An array of translation strings saved for later after pushLang() has been called.
-        *
-        * @var array
-        */
-       private static $stringsSave = [];
-
-       /**
-        * Detects the language and sets the translation table
-        */
-       public static function init()
-       {
-               $lang = self::detectLanguage();
-               self::loadTranslationTable($lang);
-       }
-
        /**
         * Returns the current language code
         *
@@ -57,82 +20,7 @@ class L10n extends BaseObject
         */
        public static function getCurrentLang()
        {
-               return self::$lang;
-       }
-
-       /**
-        * Sets the language session variable
-        */
-       public static function setSessionVariable()
-       {
-               if (!empty($_SESSION['authenticated']) && empty($_SESSION['language'])) {
-                       $_SESSION['language'] = self::$lang;
-                       // we haven't loaded user data yet, but we need user language
-                       if (!empty($_SESSION['uid'])) {
-                               $user = DBA::selectFirst('user', ['language'], ['uid' => $_SESSION['uid']]);
-                               if (DBA::isResult($user)) {
-                                       $_SESSION['language'] = $user['language'];
-                               }
-                       }
-               }
-
-               if (isset($_GET['lang'])) {
-                       $_SESSION['language'] = $_GET['lang'];
-               }
-       }
-
-       public static function setLangFromSession()
-       {
-               if (!empty($_SESSION['language']) && $_SESSION['language'] !== self::$lang) {
-                       self::loadTranslationTable($_SESSION['language']);
-               }
-       }
-
-       /**
-        * @brief Returns the preferred language from the HTTP_ACCEPT_LANGUAGE header
-        * @return string The two-letter language code
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
-        */
-       public static function detectLanguage()
-       {
-               $lang_list = [];
-
-               if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
-                       // break up string into pieces (languages and q factors)
-                       preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse);
-
-                       if (count($lang_parse[1])) {
-                               // go through the list of prefered languages and add a generic language
-                               // for sub-linguas (e.g. de-ch will add de) if not already in array
-                               for ($i = 0; $i < count($lang_parse[1]); $i++) {
-                                       $lang_list[] = strtolower($lang_parse[1][$i]);
-                                       if (strlen($lang_parse[1][$i])>3) {
-                                               $dashpos = strpos($lang_parse[1][$i], '-');
-                                               if (!in_array(substr($lang_parse[1][$i], 0, $dashpos), $lang_list)) {
-                                                       $lang_list[] = strtolower(substr($lang_parse[1][$i], 0, $dashpos));
-                                               }
-                                       }
-                               }
-                       }
-               }
-
-               if (isset($_GET['lang'])) {
-                       $lang_list = [$_GET['lang']];
-               }
-
-               // check if we have translations for the preferred languages and pick the 1st that has
-               foreach ($lang_list as $lang) {
-                       if ($lang === 'en' || (file_exists("view/lang/$lang") && is_dir("view/lang/$lang"))) {
-                               $preferred = $lang;
-                               break;
-                       }
-               }
-               if (isset($preferred)) {
-                       return $preferred;
-               }
-
-               // in case none matches, get the system wide configured language, or fall back to English
-               return Config::get('system', 'language', 'en');
+               return self::getClass(L10nClass::class)->getCurrentLang();
        }
 
        /**
@@ -150,20 +38,7 @@ class L10n extends BaseObject
         */
        public static function pushLang($lang)
        {
-               if (!self::$lang) {
-                       self::init();
-               }
-
-               if ($lang === self::$lang) {
-                       return;
-               }
-
-               if (!self::$langSave) {
-                       self::$langSave = self::$lang;
-                       self::$stringsSave = self::$strings;
-               }
-
-               self::loadTranslationTable($lang);
+               self::getClass(L10nClass::class)->pushLang($lang);
        }
 
        /**
@@ -171,55 +46,7 @@ class L10n extends BaseObject
         */
        public static function popLang()
        {
-               if (!self::$langSave) {
-                       return;
-               }
-
-               self::$strings = self::$stringsSave;
-               self::$lang = self::$langSave;
-
-               self::$stringsSave = [];
-               self::$langSave = '';
-       }
-
-       /**
-        * Loads string translation table
-        *
-        * First addon strings are loaded, then globals
-        *
-        * Uses an App object shim since all the strings files refer to $a->strings
-        *
-        * @param string $lang language code to load
-        * @throws \Exception
-        */
-       private static function loadTranslationTable($lang)
-       {
-               $lang = Strings::sanitizeFilePathItem($lang);
-
-               if ($lang === self::$lang) {
-                       return;
-               }
-
-               $a = new \stdClass();
-               $a->strings = [];
-
-               // load enabled addons strings
-               $addons = DBA::select('addon', ['name'], ['installed' => true]);
-               while ($p = DBA::fetch($addons)) {
-                       $name = Strings::sanitizeFilePathItem($p['name']);
-                       if (file_exists("addon/$name/lang/$lang/strings.php")) {
-                               include "addon/$name/lang/$lang/strings.php";
-                       }
-               }
-
-               if (file_exists("view/lang/$lang/strings.php")) {
-                       include "view/lang/$lang/strings.php";
-               }
-
-               self::$lang = $lang;
-               self::$strings = $a->strings;
-
-               unset($a);
+               self::getClass(L10nClass::class)->popLang();
        }
 
        /**
@@ -240,24 +67,7 @@ class L10n extends BaseObject
         */
        public static function t($s, ...$vars)
        {
-               if (empty($s)) {
-                       return '';
-               }
-
-               if (!self::$lang) {
-                       self::init();
-               }
-
-               if (!empty(self::$strings[$s])) {
-                       $t = self::$strings[$s];
-                       $s = is_array($t) ? $t[0] : $t;
-               }
-
-               if (count($vars) > 0) {
-                       $s = sprintf($s, ...$vars);
-               }
-
-               return $s;
+               return self::getClass(L10nClass::class)->t($s, ...$vars);
        }
 
        /**
@@ -279,55 +89,9 @@ class L10n extends BaseObject
         * @return string
         * @throws \Exception
         */
-       public static function tt($singular, $plural, $count)
-       {
-               if (!is_numeric($count)) {
-                       Logger::log('Non numeric count called by ' . System::callstack(20));
-               }
-
-               if (!self::$lang) {
-                       self::init();
-               }
-
-               if (!empty(self::$strings[$singular])) {
-                       $t = self::$strings[$singular];
-                       if (is_array($t)) {
-                               $plural_function = 'string_plural_select_' . str_replace('-', '_', self::$lang);
-                               if (function_exists($plural_function)) {
-                                       $i = $plural_function($count);
-                               } else {
-                                       $i = self::stringPluralSelectDefault($count);
-                               }
-
-                               // for some languages there is only a single array item
-                               if (!isset($t[$i])) {
-                                       $s = $t[0];
-                               } else {
-                                       $s = $t[$i];
-                               }
-                       } else {
-                               $s = $t;
-                       }
-               } elseif (self::stringPluralSelectDefault($count)) {
-                       $s = $plural;
-               } else {
-                       $s = $singular;
-               }
-
-               $s = @sprintf($s, $count);
-
-               return $s;
-       }
-
-       /**
-        * Provide a fallback which will not collide with a function defined in any language file
-        *
-        * @param int $n
-        * @return bool
-        */
-       private static function stringPluralSelectDefault($n)
+       public static function tt(string $singular, string $plural, int $count)
        {
-               return $n != 1;
+               return self::getClass(L10nClass::class)->tt($singular, $plural, $count);
        }
 
        /**
@@ -343,20 +107,7 @@ class L10n extends BaseObject
         */
        public static function getAvailableLanguages()
        {
-               $langs = [];
-               $strings_file_paths = glob('view/lang/*/strings.php');
-
-               if (is_array($strings_file_paths) && count($strings_file_paths)) {
-                       if (!in_array('view/lang/en/strings.php', $strings_file_paths)) {
-                               $strings_file_paths[] = 'view/lang/en/strings.php';
-                       }
-                       asort($strings_file_paths);
-                       foreach ($strings_file_paths as $strings_file_path) {
-                               $path_array = explode('/', $strings_file_path);
-                               $langs[$path_array[2]] = $path_array[2];
-                       }
-               }
-               return $langs;
+               return L10nClass::getAvailableLanguages();
        }
 
        /**
@@ -367,15 +118,7 @@ class L10n extends BaseObject
         */
        public static function getDay($s)
        {
-               $ret = str_replace(['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'],
-                       [self::t('Monday'), self::t('Tuesday'), self::t('Wednesday'), self::t('Thursday'), self::t('Friday'), self::t('Saturday'), self::t('Sunday')],
-                       $s);
-
-               $ret = str_replace(['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
-                       [self::t('January'), self::t('February'), self::t('March'), self::t('April'), self::t('May'), self::t('June'), self::t('July'), self::t('August'), self::t('September'), self::t('October'), self::t('November'), self::t('December')],
-                       $ret);
-
-               return $ret;
+               return self::getClass(L10nClass::class)->getDay($s);
        }
 
        /**
@@ -386,40 +129,6 @@ class L10n extends BaseObject
         */
        public static function getDayShort($s)
        {
-               $ret = str_replace(['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
-                       [self::t('Mon'), self::t('Tue'), self::t('Wed'), self::t('Thu'), self::t('Fri'), self::t('Sat'), self::t('Sun')],
-                       $s);
-
-               $ret = str_replace(['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
-                       [self::t('Jan'), self::t('Feb'), self::t('Mar'), self::t('Apr'), self::t('May'), ('Jun'), self::t('Jul'), self::t('Aug'), self::t('Sep'), self::t('Oct'), self::t('Nov'), self::t('Dec')],
-                       $ret);
-
-               return $ret;
-       }
-
-       /**
-        * Load poke verbs
-        *
-        * @return array index is present tense verb
-        *                 value is array containing past tense verb, translation of present, translation of past
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
-        * @hook poke_verbs pokes array
-        */
-       public static function getPokeVerbs()
-       {
-               // index is present tense verb
-               // value is array containing past tense verb, translation of present, translation of past
-               $arr = [
-                       'poke' => ['poked', self::t('poke'), self::t('poked')],
-                       'ping' => ['pinged', self::t('ping'), self::t('pinged')],
-                       'prod' => ['prodded', self::t('prod'), self::t('prodded')],
-                       'slap' => ['slapped', self::t('slap'), self::t('slapped')],
-                       'finger' => ['fingered', self::t('finger'), self::t('fingered')],
-                       'rebuff' => ['rebuffed', self::t('rebuff'), self::t('rebuffed')],
-               ];
-
-               Hook::callAll('poke_verbs', $arr);
-
-               return $arr;
+               return self::getClass(L10nClass::class)->getDayShort($s);
        }
 }
diff --git a/src/Core/L10n/L10n.php b/src/Core/L10n/L10n.php
new file mode 100644 (file)
index 0000000..f4e14c7
--- /dev/null
@@ -0,0 +1,425 @@
+<?php
+
+namespace Friendica\Core\L10n;
+
+use Friendica\Core\Config\Configuration;
+use Friendica\Core\Hook;
+use Friendica\Core\Session;
+use Friendica\Database\Database;
+use Friendica\Util\Strings;
+use Psr\Log\LoggerInterface;
+
+/**
+ * Provide Language, Translation, and Localization functions to the application
+ * Localization can be referred to by the numeronym L10N (as in: "L", followed by ten more letters, and then "N").
+ */
+class L10n
+{
+       /**
+        * A string indicating the current language used for translation:
+        * - Two-letter ISO 639-1 code.
+        * - Two-letter ISO 639-1 code + dash + Two-letter ISO 3166-1 alpha-2 country code.
+        *
+        * @var string
+        */
+       private $lang = '';
+       /**
+        * A language code saved for later after pushLang() has been called.
+        *
+        * @var string
+        */
+       private $langSave = '';
+
+       /**
+        * An array of translation strings whose key is the neutral english message.
+        *
+        * @var array
+        */
+       private $strings = [];
+       /**
+        * An array of translation strings saved for later after pushLang() has been called.
+        *
+        * @var array
+        */
+       private $stringsSave = [];
+
+       /**
+        * @var Database
+        */
+       private $dba;
+
+       /**
+        * @var LoggerInterface
+        */
+       private $logger;
+
+       public function __construct(Configuration $config, Database $dba, LoggerInterface $logger)
+       {
+               $this->dba    = $dba;
+               $this->logger = $logger;
+
+               $this->loadTranslationTable(L10n::detectLanguage($config->get('system', 'language', 'en')));
+       }
+
+       /**
+        * Returns the current language code
+        *
+        * @return string Language code
+        */
+       public function getCurrentLang()
+       {
+               return $this->lang;
+       }
+
+       /**
+        * Sets the language session variable
+        */
+       public function setSessionVariable()
+       {
+               if (Session::get('authenticated') && !Session::get('language')) {
+                       $_SESSION['language'] = $this->lang;
+                       // we haven't loaded user data yet, but we need user language
+                       if (Session::get('uid')) {
+                               $user = $this->dba->selectFirst('user', ['language'], ['uid' => $_SESSION['uid']]);
+                               if ($this->dba->isResult($user)) {
+                                       $_SESSION['language'] = $user['language'];
+                               }
+                       }
+               }
+
+               if (isset($_GET['lang'])) {
+                       Session::set('language', $_GET['lang']);
+               }
+       }
+
+       public function setLangFromSession()
+       {
+               if (Session::get('language') !== $this->lang) {
+                       $this->loadTranslationTable(Session::get('language'));
+               }
+       }
+
+       /**
+        * This function should be called before formatting messages in a specific target language
+        * different from the current user/system language.
+        *
+        * It saves the current translation strings in a separate variable and loads new translations strings.
+        *
+        * If called repeatedly, it won't save the translation strings again, just load the new ones.
+        *
+        * @param string $lang Language code
+        *
+        * @throws \Exception
+        * @see   popLang()
+        * @brief Stores the current language strings and load a different language.
+        */
+       public function pushLang($lang)
+       {
+               if ($lang === $this->lang) {
+                       return;
+               }
+
+               if (empty($this->langSave)) {
+                       $this->langSave    = $this->lang;
+                       $this->stringsSave = $this->strings;
+               }
+
+               $this->loadTranslationTable($lang);
+       }
+
+       /**
+        * Restores the original user/system language after having used pushLang()
+        */
+       public function popLang()
+       {
+               if (!isset($this->langSave)) {
+                       return;
+               }
+
+               $this->strings = $this->stringsSave;
+               $this->lang    = $this->langSave;
+
+               $this->stringsSave = null;
+               $this->langSave = null;
+       }
+
+       /**
+        * Loads string translation table
+        *
+        * First addon strings are loaded, then globals
+        *
+        * Uses an App object shim since all the strings files refer to $a->strings
+        *
+        * @param string $lang language code to load
+        *
+        * @throws \Exception
+        */
+       private function loadTranslationTable($lang)
+       {
+               $lang = Strings::sanitizeFilePathItem($lang);
+
+               $a          = new \stdClass();
+               $a->strings = [];
+
+               // load enabled addons strings
+               $addons = $this->dba->select('addon', ['name'], ['installed' => true]);
+               while ($p = $this->dba->fetch($addons)) {
+                       $name = Strings::sanitizeFilePathItem($p['name']);
+                       if (file_exists("addon/$name/lang/$lang/strings.php")) {
+                               include "addon/$name/lang/$lang/strings.php";
+                       }
+               }
+
+               if (file_exists("view/lang/$lang/strings.php")) {
+                       include "view/lang/$lang/strings.php";
+               }
+
+               $this->lang    = $lang;
+               $this->strings = $a->strings;
+
+               unset($a);
+       }
+
+       /**
+        * @brief Returns the preferred language from the HTTP_ACCEPT_LANGUAGE header
+        *
+        * @param string $sysLang The default fallback language
+        *
+        * @return string The two-letter language code
+        */
+       public static function detectLanguage(string $sysLang = 'en')
+       {
+               $lang_list = [];
+
+               if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
+                       // break up string into pieces (languages and q factors)
+                       preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse);
+
+                       if (count($lang_parse[1])) {
+                               // go through the list of prefered languages and add a generic language
+                               // for sub-linguas (e.g. de-ch will add de) if not already in array
+                               for ($i = 0; $i < count($lang_parse[1]); $i++) {
+                                       $lang_list[] = strtolower($lang_parse[1][$i]);
+                                       if (strlen($lang_parse[1][$i]) > 3) {
+                                               $dashpos = strpos($lang_parse[1][$i], '-');
+                                               if (!in_array(substr($lang_parse[1][$i], 0, $dashpos), $lang_list)) {
+                                                       $lang_list[] = strtolower(substr($lang_parse[1][$i], 0, $dashpos));
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               if (isset($_GET['lang'])) {
+                       $lang_list = [$_GET['lang']];
+               }
+
+               // check if we have translations for the preferred languages and pick the 1st that has
+               foreach ($lang_list as $lang) {
+                       if ($lang === 'en' || (file_exists("view/lang/$lang") && is_dir("view/lang/$lang"))) {
+                               $preferred = $lang;
+                               break;
+                       }
+               }
+               if (isset($preferred)) {
+                       return $preferred;
+               }
+
+               // in case none matches, get the system wide configured language, or fall back to English
+               return $sysLang;
+       }
+
+       /**
+        * @brief Return the localized version of the provided string with optional string interpolation
+        *
+        * This function takes a english string as parameter, and if a localized version
+        * exists for the current language, substitutes it before performing an eventual
+        * string interpolation (sprintf) with additional optional arguments.
+        *
+        * Usages:
+        * - L10n::t('This is an example')
+        * - L10n::t('URL %s returned no result', $url)
+        * - L10n::t('Current version: %s, new version: %s', $current_version, $new_version)
+        *
+        * @param string $s
+        * @param array  $vars Variables to interpolate in the translation string
+        *
+        * @return string
+        */
+       public function t($s, ...$vars)
+       {
+               if (empty($s)) {
+                       return '';
+               }
+
+               if (!empty($this->strings[$s])) {
+                       $t = $this->strings[$s];
+                       $s = is_array($t) ? $t[0] : $t;
+               }
+
+               if (count($vars) > 0) {
+                       $s = sprintf($s, ...$vars);
+               }
+
+               return $s;
+       }
+
+       /**
+        * @brief Return the localized version of a singular/plural string with optional string interpolation
+        *
+        * This function takes two english strings as parameters, singular and plural, as
+        * well as a count. If a localized version exists for the current language, they
+        * are used instead. Discrimination between singular and plural is done using the
+        * localized function if any or the default one. Finally, a string interpolation
+        * is performed using the count as parameter.
+        *
+        * Usages:
+        * - L10n::tt('Like', 'Likes', $count)
+        * - L10n::tt("%s user deleted", "%s users deleted", count($users))
+        *
+        * @param string $singular
+        * @param string $plural
+        * @param int    $count
+        *
+        * @return string
+        * @throws \Exception
+        */
+       public function tt(string $singular, string $plural, int $count)
+       {
+               if (!empty($this->strings[$singular])) {
+                       $t = $this->strings[$singular];
+                       if (is_array($t)) {
+                               $plural_function = 'string_plural_select_' . str_replace('-', '_', $this->lang);
+                               if (function_exists($plural_function)) {
+                                       $i = $plural_function($count);
+                               } else {
+                                       $i = $this->stringPluralSelectDefault($count);
+                               }
+
+                               // for some languages there is only a single array item
+                               if (!isset($t[$i])) {
+                                       $s = $t[0];
+                               } else {
+                                       $s = $t[$i];
+                               }
+                       } else {
+                               $s = $t;
+                       }
+               } elseif ($this->stringPluralSelectDefault($count)) {
+                       $s = $plural;
+               } else {
+                       $s = $singular;
+               }
+
+               $s = @sprintf($s, $count);
+
+               return $s;
+       }
+
+       /**
+        * Provide a fallback which will not collide with a function defined in any language file
+        *
+        * @param int $n
+        *
+        * @return bool
+        */
+       private function stringPluralSelectDefault($n)
+       {
+               return $n != 1;
+       }
+
+       /**
+        * Return installed languages codes as associative array
+        *
+        * Scans the view/lang directory for the existence of "strings.php" files, and
+        * returns an alphabetical list of their folder names (@-char language codes).
+        * Adds the english language if it's missing from the list.
+        *
+        * Ex: array('de' => 'de', 'en' => 'en', 'fr' => 'fr', ...)
+        *
+        * @return array
+        */
+       public static function getAvailableLanguages()
+       {
+               $langs              = [];
+               $strings_file_paths = glob('view/lang/*/strings.php');
+
+               if (is_array($strings_file_paths) && count($strings_file_paths)) {
+                       if (!in_array('view/lang/en/strings.php', $strings_file_paths)) {
+                               $strings_file_paths[] = 'view/lang/en/strings.php';
+                       }
+                       asort($strings_file_paths);
+                       foreach ($strings_file_paths as $strings_file_path) {
+                               $path_array            = explode('/', $strings_file_path);
+                               $langs[$path_array[2]] = $path_array[2];
+                       }
+               }
+               return $langs;
+       }
+
+       /**
+        * Translate days and months names.
+        *
+        * @param string $s String with day or month name.
+        *
+        * @return string Translated string.
+        */
+       public function getDay($s)
+       {
+               $ret = str_replace(['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'],
+                       [$this->t('Monday'), $this->t('Tuesday'), $this->t('Wednesday'), $this->t('Thursday'), $this->t('Friday'), $this->t('Saturday'), $this->t('Sunday')],
+                       $s);
+
+               $ret = str_replace(['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
+                       [$this->t('January'), $this->t('February'), $this->t('March'), $this->t('April'), $this->t('May'), $this->t('June'), $this->t('July'), $this->t('August'), $this->t('September'), $this->t('October'), $this->t('November'), $this->t('December')],
+                       $ret);
+
+               return $ret;
+       }
+
+       /**
+        * Translate short days and months names.
+        *
+        * @param string $s String with short day or month name.
+        *
+        * @return string Translated string.
+        */
+       public function getDayShort($s)
+       {
+               $ret = str_replace(['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
+                       [$this->t('Mon'), $this->t('Tue'), $this->t('Wed'), $this->t('Thu'), $this->t('Fri'), $this->t('Sat'), $this->t('Sun')],
+                       $s);
+
+               $ret = str_replace(['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+                       [$this->t('Jan'), $this->t('Feb'), $this->t('Mar'), $this->t('Apr'), $this->t('May'), $this->t('Jun'), $this->t('Jul'), $this->t('Aug'), $this->t('Sep'), $this->t('Oct'), $this->t('Nov'), $this->t('Dec')],
+                       $ret);
+
+               return $ret;
+       }
+
+       /**
+        * Load poke verbs
+        *
+        * @return array index is present tense verb
+        *                 value is array containing past tense verb, translation of present, translation of past
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @hook poke_verbs pokes array
+        */
+       public function getPokeVerbs()
+       {
+               // index is present tense verb
+               // value is array containing past tense verb, translation of present, translation of past
+               $arr = [
+                       'poke'   => ['poked', $this->t('poke'), $this->t('poked')],
+                       'ping'   => ['pinged', $this->t('ping'), $this->t('pinged')],
+                       'prod'   => ['prodded', $this->t('prod'), $this->t('prodded')],
+                       'slap'   => ['slapped', $this->t('slap'), $this->t('slapped')],
+                       'finger' => ['fingered', $this->t('finger'), $this->t('fingered')],
+                       'rebuff' => ['rebuffed', $this->t('rebuff'), $this->t('rebuffed')],
+               ];
+
+               Hook::callAll('poke_verbs', $arr);
+
+               return $arr;
+       }
+}
index a45490bf3966065990476741e64340910bb78582..ef62bc8f76e20770a9f7287226424ae7a8379063 100644 (file)
 
 namespace Friendica\Core;
 
-use Friendica\Factory\CacheDriverFactory;
-use Friendica\Core\Cache\IMemoryCacheDriver;
+use Friendica\BaseObject;
+use Friendica\Core\Cache\Cache;
+use Friendica\Core\Lock\ILock;
 
 /**
- * @brief This class contain Functions for preventing parallel execution of functions
+ * This class contain Functions for preventing parallel execution of functions
  */
-class Lock
+class Lock extends BaseObject
 {
-       /**
-        * @var Lock\ILockDriver;
-        */
-       static $driver = null;
-
-       public static function init()
-       {
-               $lock_driver = Config::get('system', 'lock_driver', 'default');
-
-               try {
-                       switch ($lock_driver) {
-                               case 'memcache':
-                               case 'memcached':
-                               case 'redis':
-                                       $cache_driver = CacheDriverFactory::create($lock_driver);
-                                       if ($cache_driver instanceof IMemoryCacheDriver) {
-                                               self::$driver = new Lock\CacheLockDriver($cache_driver);
-                                       }
-                                       break;
-
-                               case 'database':
-                                       self::$driver = new Lock\DatabaseLockDriver();
-                                       break;
-
-                               case 'semaphore':
-                                       self::$driver = new Lock\SemaphoreLockDriver();
-                                       break;
-
-                               default:
-                                       self::useAutoDriver();
-                       }
-               } catch (\Exception $exception) {
-                       Logger::log('Driver \'' . $lock_driver . '\' failed - Fallback to \'useAutoDriver()\'');
-                       self::useAutoDriver();
-               }
-       }
-
-       /**
-        * @brief This method tries to find the best - local - locking method for Friendica
-        *
-        * The following sequence will be tried:
-        * 1. Semaphore Locking
-        * 2. Cache Locking
-        * 3. Database Locking
-        *
-        */
-       private static function useAutoDriver() {
-
-               // 1. Try to use Semaphores for - local - locking
-               if (function_exists('sem_get')) {
-                       try {
-                               self::$driver = new Lock\SemaphoreLockDriver();
-                               return;
-                       } catch (\Exception $exception) {
-                               Logger::log('Using Semaphore driver for locking failed: ' . $exception->getMessage());
-                       }
-               }
-
-               // 2. Try to use Cache Locking (don't use the DB-Cache Locking because it works different!)
-               $cache_driver = Config::get('system', 'cache_driver', 'database');
-               if ($cache_driver != 'database') {
-                       try {
-                               $lock_driver = CacheDriverFactory::create($cache_driver);
-                               if ($lock_driver instanceof IMemoryCacheDriver) {
-                                       self::$driver = new Lock\CacheLockDriver($lock_driver);
-                               }
-                               return;
-                       } catch (\Exception $exception) {
-                               Logger::log('Using Cache driver for locking failed: ' . $exception->getMessage());
-                       }
-               }
-
-               // 3. Use Database Locking as a Fallback
-               self::$driver = new Lock\DatabaseLockDriver();
-       }
-
-       /**
-        * Returns the current cache driver
-        *
-        * @return Lock\ILockDriver;
-        */
-       private static function getDriver()
-       {
-               if (self::$driver === null) {
-                       self::init();
-               }
-
-               return self::$driver;
-       }
-
        /**
         * @brief Acquires a lock for a given name
         *
-        * @param string  $key Name of the lock
+        * @param string  $key     Name of the lock
         * @param integer $timeout Seconds until we give up
-        * @param integer $ttl The Lock lifespan, must be one of the Cache constants
+        * @param integer $ttl     The Lock lifespan, must be one of the Cache constants
         *
         * @return boolean Was the lock successful?
+        * @throws \Exception
         */
        public static function acquire($key, $timeout = 120, $ttl = Cache::FIVE_MINUTES)
        {
-               return self::getDriver()->acquireLock($key, $timeout, $ttl);
+               return self::getClass(ILock::class)->acquireLock($key, $timeout, $ttl);
        }
 
        /**
@@ -124,19 +36,22 @@ class Lock
         *
         * @param string $key      Name of the lock
         * @param bool   $override Overrides the lock to get releases
+        *
         * @return void
+        * @throws \Exception
         */
        public static function release($key, $override = false)
        {
-               self::getDriver()->releaseLock($key, $override);
+               return self::getClass(ILock::class)->releaseLock($key, $override);
        }
 
        /**
         * @brief Releases all lock that were set by us
         * @return void
+        * @throws \Exception
         */
        public static function releaseAll()
        {
-               self::getDriver()->releaseAll();
+               self::getClass(ILock::class)->releaseAll();
        }
 }
diff --git a/src/Core/Lock/AbstractLockDriver.php b/src/Core/Lock/AbstractLockDriver.php
deleted file mode 100644 (file)
index 0aedeeb..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-<?php
-
-namespace Friendica\Core\Lock;
-use Friendica\BaseObject;
-
-/**
- * Class AbstractLockDriver
- *
- * @package Friendica\Core\Lock
- *
- * Basic class for Locking with common functions (local acquired locks, releaseAll, ..)
- */
-abstract class AbstractLockDriver extends BaseObject implements ILockDriver
-{
-       /**
-        * @var array The local acquired locks
-        */
-       protected $acquiredLocks = [];
-
-       /**
-        * Check if we've locally acquired a lock
-        *
-        * @param string key The Name of the lock
-        * @return bool      Returns true if the lock is set
-        */
-       protected function hasAcquiredLock($key)
-       {
-               return isset($this->acquireLock[$key]) && $this->acquiredLocks[$key] === true;
-       }
-
-       /**
-        * Mark a locally acquired lock
-        *
-        * @param string $key The Name of the lock
-        */
-       protected function markAcquire($key)
-       {
-               $this->acquiredLocks[$key] = true;
-       }
-
-       /**
-        * Mark a release of a locally acquired lock
-        *
-        * @param string $key The Name of the lock
-        */
-       protected function markRelease($key)
-       {
-               unset($this->acquiredLocks[$key]);
-       }
-
-       /**
-        * Releases all lock that were set by us
-        *
-        * @return boolean Was the unlock of all locks successful?
-        */
-       public function releaseAll()
-       {
-               $return = true;
-
-               foreach ($this->acquiredLocks as $acquiredLock => $hasLock) {
-                       if (!$this->releaseLock($acquiredLock)) {
-                               $return = false;
-                       }
-               }
-
-               return $return;
-       }
-}
diff --git a/src/Core/Lock/CacheLock.php b/src/Core/Lock/CacheLock.php
new file mode 100644 (file)
index 0000000..238beb7
--- /dev/null
@@ -0,0 +1,142 @@
+<?php
+
+namespace Friendica\Core\Lock;
+
+use Friendica\Core\Cache;
+use Friendica\Core\Cache\IMemoryCache;
+
+class CacheLock extends Lock
+{
+       /**
+        * @var string The static prefix of all locks inside the cache
+        */
+       const CACHE_PREFIX = 'lock:';
+
+       /**
+        * @var \Friendica\Core\Cache\ICache;
+        */
+       private $cache;
+
+       /**
+        * CacheLock constructor.
+        *
+        * @param IMemoryCache $cache The CacheDriver for this type of lock
+        */
+       public function __construct(IMemoryCache $cache)
+       {
+               $this->cache = $cache;
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function acquireLock($key, $timeout = 120, $ttl = Cache\Cache::FIVE_MINUTES)
+       {
+               $got_lock = false;
+               $start    = time();
+
+               $cachekey = self::getLockKey($key);
+
+               do {
+                       $lock = $this->cache->get($cachekey);
+                       // When we do want to lock something that was already locked by us.
+                       if ((int)$lock == getmypid()) {
+                               $got_lock = true;
+                       }
+
+                       // When we do want to lock something new
+                       if (is_null($lock)) {
+                               // At first initialize it with "0"
+                               $this->cache->add($cachekey, 0);
+                               // Now the value has to be "0" because otherwise the key was used by another process meanwhile
+                               if ($this->cache->compareSet($cachekey, 0, getmypid(), $ttl)) {
+                                       $got_lock = true;
+                                       $this->markAcquire($key);
+                               }
+                       }
+
+                       if (!$got_lock && ($timeout > 0)) {
+                               usleep(rand(10000, 200000));
+                       }
+               } while (!$got_lock && ((time() - $start) < $timeout));
+
+               return $got_lock;
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function releaseLock($key, $override = false)
+       {
+               $cachekey = self::getLockKey($key);
+
+               if ($override) {
+                       $return = $this->cache->delete($cachekey);
+               } else {
+                       $return = $this->cache->compareDelete($cachekey, getmypid());
+               }
+               $this->markRelease($key);
+
+               return $return;
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function isLocked($key)
+       {
+               $cachekey = self::getLockKey($key);
+               $lock     = $this->cache->get($cachekey);
+               return isset($lock) && ($lock !== false);
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function getName()
+       {
+               return $this->cache->getName();
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function getLocks(string $prefix = '')
+       {
+               $locks = $this->cache->getAllKeys(self::CACHE_PREFIX . $prefix);
+
+               array_walk($locks, function (&$lock, $key) {
+                       $lock = substr($lock, strlen(self::CACHE_PREFIX));
+               });
+
+               return $locks;
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function releaseAll($override = false)
+       {
+               $success = parent::releaseAll($override);
+
+               $locks = $this->getLocks();
+
+               foreach ($locks as $lock) {
+                       if (!$this->releaseLock($lock, $override)) {
+                               $success = false;
+                       }
+               }
+
+               return $success;
+       }
+
+       /**
+        * @param string $key The original key
+        *
+        * @return string        The cache key used for the cache
+        */
+       private static function getLockKey($key)
+       {
+               return self::CACHE_PREFIX . $key;
+       }
+}
diff --git a/src/Core/Lock/CacheLockDriver.php b/src/Core/Lock/CacheLockDriver.php
deleted file mode 100644 (file)
index 6f34a0d..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-<?php
-
-namespace Friendica\Core\Lock;
-
-use Friendica\Core\Cache;
-use Friendica\Core\Cache\IMemoryCacheDriver;
-
-class CacheLockDriver extends AbstractLockDriver
-{
-       /**
-        * @var \Friendica\Core\Cache\ICacheDriver;
-        */
-       private $cache;
-
-       /**
-        * CacheLockDriver constructor.
-        *
-        * @param IMemoryCacheDriver $cache The CacheDriver for this type of lock
-        */
-       public function __construct(IMemoryCacheDriver $cache)
-       {
-               $this->cache = $cache;
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function acquireLock($key, $timeout = 120, $ttl = Cache::FIVE_MINUTES)
-       {
-               $got_lock = false;
-               $start = time();
-
-               $cachekey = self::getLockKey($key);
-
-               do {
-                       $lock = $this->cache->get($cachekey);
-                       // When we do want to lock something that was already locked by us.
-                       if ((int)$lock == getmypid()) {
-                               $got_lock = true;
-                       }
-
-                       // When we do want to lock something new
-                       if (is_null($lock)) {
-                               // At first initialize it with "0"
-                               $this->cache->add($cachekey, 0);
-                               // Now the value has to be "0" because otherwise the key was used by another process meanwhile
-                               if ($this->cache->compareSet($cachekey, 0, getmypid(), $ttl)) {
-                                       $got_lock = true;
-                                       $this->markAcquire($key);
-                               }
-                       }
-
-                       if (!$got_lock && ($timeout > 0)) {
-                               usleep(rand(10000, 200000));
-                       }
-               } while (!$got_lock && ((time() - $start) < $timeout));
-
-               return $got_lock;
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function releaseLock($key, $override = false)
-       {
-               $cachekey = self::getLockKey($key);
-
-               $return = false;
-
-               if ($override) {
-                       $return = $this->cache->delete($cachekey);
-               } else {
-                       $return = $this->cache->compareDelete($cachekey, getmypid());
-               }
-               $this->markRelease($key);
-
-               return $return;
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function isLocked($key)
-       {
-               $cachekey = self::getLockKey($key);
-               $lock = $this->cache->get($cachekey);
-               return isset($lock) && ($lock !== false);
-       }
-
-       /**
-        * @param string $key   The original key
-        * @return string               The cache key used for the cache
-        */
-       private static function getLockKey($key) {
-               return "lock:" . $key;
-       }
-}
diff --git a/src/Core/Lock/DatabaseLock.php b/src/Core/Lock/DatabaseLock.php
new file mode 100644 (file)
index 0000000..cecdc39
--- /dev/null
@@ -0,0 +1,158 @@
+<?php
+
+namespace Friendica\Core\Lock;
+
+use Friendica\Core\Cache;
+use Friendica\Database\Database;
+use Friendica\Util\DateTimeFormat;
+
+/**
+ * Locking driver that stores the locks in the database
+ */
+class DatabaseLock extends Lock
+{
+       /**
+        * The current ID of the process
+        *
+        * @var int
+        */
+       private $pid;
+
+       /**
+        * @var Database The database connection of Friendica
+        */
+       private $dba;
+
+       /**
+        * @param null|int $pid The Id of the current process (null means determine automatically)
+        */
+       public function __construct(Database $dba, $pid = null)
+       {
+               $this->dba = $dba;
+               $this->pid = isset($pid) ? $pid : getmypid();
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function acquireLock($key, $timeout = 120, $ttl = Cache::FIVE_MINUTES)
+       {
+               $got_lock = false;
+               $start    = time();
+
+               do {
+                       $this->dba->lock('locks');
+                       $lock = $this->dba->selectFirst('locks', ['locked', 'pid'], ['`name` = ? AND `expires` >= ?', $key, DateTimeFormat::utcNow()]);
+
+                       if ($this->dba->isResult($lock)) {
+                               if ($lock['locked']) {
+                                       // We want to lock something that was already locked by us? So we got the lock.
+                                       if ($lock['pid'] == $this->pid) {
+                                               $got_lock = true;
+                                       }
+                               }
+                               if (!$lock['locked']) {
+                                       $this->dba->update('locks', ['locked' => true, 'pid' => $this->pid, 'expires' => DateTimeFormat::utc('now + ' . $ttl . 'seconds')], ['name' => $key]);
+                                       $got_lock = true;
+                               }
+                       } else {
+                               $this->dba->insert('locks', ['name' => $key, 'locked' => true, 'pid' => $this->pid, 'expires' => DateTimeFormat::utc('now + ' . $ttl . 'seconds')]);
+                               $got_lock = true;
+                               $this->markAcquire($key);
+                       }
+
+                       $this->dba->unlock();
+
+                       if (!$got_lock && ($timeout > 0)) {
+                               usleep(rand(100000, 2000000));
+                       }
+               } while (!$got_lock && ((time() - $start) < $timeout));
+
+               return $got_lock;
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function releaseLock($key, $override = false)
+       {
+               if ($override) {
+                       $where = ['name' => $key];
+               } else {
+                       $where = ['name' => $key, 'pid' => $this->pid];
+               }
+
+               if ($this->dba->exists('locks', $where)) {
+                       $return = $this->dba->delete('locks', $where);
+               } else {
+                       $return = false;
+               }
+
+               $this->markRelease($key);
+
+               return $return;
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function releaseAll($override = false)
+       {
+               $success = parent::releaseAll($override);
+
+               if ($override) {
+                       $where = ['1 = 1'];
+               } else {
+                       $where = ['pid' => $this->pid];
+               }
+               $return = $this->dba->delete('locks', $where);
+
+               $this->acquiredLocks = [];
+
+               return $return && $success;
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function isLocked($key)
+       {
+               $lock = $this->dba->selectFirst('locks', ['locked'], ['`name` = ? AND `expires` >= ?', $key, DateTimeFormat::utcNow()]);
+
+               if ($this->dba->isResult($lock)) {
+                       return $lock['locked'] !== false;
+               } else {
+                       return false;
+               }
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function getName()
+       {
+               return self::TYPE_DATABASE;
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function getLocks(string $prefix = '')
+       {
+               if (empty($prefix)) {
+                       $where = ['`expires` >= ?', DateTimeFormat::utcNow()];
+               } else {
+                       $where = ['`expires` >= ? AND `name` LIKE CONCAT(?, \'%\')', DateTimeFormat::utcNow(), $prefix];
+               }
+
+               $stmt = $this->dba->select('locks', ['name'], $where);
+
+               $keys = [];
+               while ($key = $this->dba->fetch($stmt)) {
+                       array_push($keys, $key['name']);
+               }
+               $this->dba->close($stmt);
+
+               return $keys;
+       }
+}
diff --git a/src/Core/Lock/DatabaseLockDriver.php b/src/Core/Lock/DatabaseLockDriver.php
deleted file mode 100644 (file)
index a8269bc..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php
-
-namespace Friendica\Core\Lock;
-
-use Friendica\Core\Cache;
-use Friendica\Database\DBA;
-use Friendica\Util\DateTimeFormat;
-
-/**
- * Locking driver that stores the locks in the database
- */
-class DatabaseLockDriver extends AbstractLockDriver
-{
-       /**
-        * The current ID of the process
-        *
-        * @var int
-        */
-       private $pid;
-
-       /**
-        * @param null|int $pid The Id of the current process (null means determine automatically)
-        */
-       public function __construct($pid = null)
-       {
-               $this->pid = isset($pid) ? $pid : getmypid();
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function acquireLock($key, $timeout = 120, $ttl = Cache::FIVE_MINUTES)
-       {
-               $got_lock = false;
-               $start = time();
-
-               do {
-                       DBA::lock('locks');
-                       $lock = DBA::selectFirst('locks', ['locked', 'pid'], ['`name` = ? AND `expires` >= ?', $key, DateTimeFormat::utcNow()]);
-
-                       if (DBA::isResult($lock)) {
-                               if ($lock['locked']) {
-                                       // We want to lock something that was already locked by us? So we got the lock.
-                                       if ($lock['pid'] == $this->pid) {
-                                               $got_lock = true;
-                                       }
-                               }
-                               if (!$lock['locked']) {
-                                       DBA::update('locks', ['locked' => true, 'pid' => $this->pid, 'expires' => DateTimeFormat::utc('now + ' . $ttl . 'seconds')], ['name' => $key]);
-                                       $got_lock = true;
-                               }
-                       } else {
-                               DBA::insert('locks', ['name' => $key, 'locked' => true, 'pid' => $this->pid, 'expires' => DateTimeFormat::utc('now + ' . $ttl . 'seconds')]);
-                               $got_lock = true;
-                               $this->markAcquire($key);
-                       }
-
-                       DBA::unlock();
-
-                       if (!$got_lock && ($timeout > 0)) {
-                               usleep(rand(100000, 2000000));
-                       }
-               } while (!$got_lock && ((time() - $start) < $timeout));
-
-               return $got_lock;
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function releaseLock($key, $override = false)
-       {
-               if ($override) {
-                       $where = ['name' => $key];
-               } else {
-                       $where = ['name' => $key, 'pid' => $this->pid];
-               }
-
-               $return = DBA::delete('locks', $where);
-
-               $this->markRelease($key);
-
-               return $return;
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function releaseAll()
-       {
-               $return = DBA::delete('locks', ['pid' => $this->pid]);
-
-               $this->acquiredLocks = [];
-
-               return $return;
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function isLocked($key)
-       {
-               $lock = DBA::selectFirst('locks', ['locked'], ['`name` = ? AND `expires` >= ?', $key, DateTimeFormat::utcNow()]);
-
-               if (DBA::isResult($lock)) {
-                       return $lock['locked'] !== false;
-               } else {
-                       return false;
-               }
-       }
-}
diff --git a/src/Core/Lock/ILock.php b/src/Core/Lock/ILock.php
new file mode 100644 (file)
index 0000000..d103d99
--- /dev/null
@@ -0,0 +1,69 @@
+<?php
+
+namespace Friendica\Core\Lock;
+
+use Friendica\Core\Cache;
+
+/**
+ * Lock Interface
+ *
+ * @author Philipp Holzer <admin@philipp.info>
+ */
+interface ILock
+{
+       /**
+        * Checks, if a key is currently locked to a or my process
+        *
+        * @param string $key The name of the lock
+        *
+        * @return bool
+        */
+       public function isLocked($key);
+
+       /**
+        *
+        * Acquires a lock for a given name
+        *
+        * @param string  $key     The Name of the lock
+        * @param integer $timeout Seconds until we give up
+        * @param integer $ttl     Seconds The lock lifespan, must be one of the Cache constants
+        *
+        * @return boolean Was the lock successful?
+        */
+       public function acquireLock($key, $timeout = 120, $ttl = Cache\Cache::FIVE_MINUTES);
+
+       /**
+        * Releases a lock if it was set by us
+        *
+        * @param string $key      The Name of the lock
+        * @param bool   $override Overrides the lock to get released
+        *
+        * @return boolean Was the unlock successful?
+        */
+       public function releaseLock($key, $override = false);
+
+       /**
+        * Releases all lock that were set by us
+        *
+        * @param bool $override Override to release all locks
+        *
+        * @return boolean Was the unlock of all locks successful?
+        */
+       public function releaseAll($override = false);
+
+       /**
+        * Returns the name of the current lock
+        *
+        * @return string
+        */
+       public function getName();
+
+       /**
+        * Lists all locks
+        *
+        * @param string prefix optional a prefix to search
+        *
+        * @return array Empty if it isn't supported by the cache driver
+        */
+       public function getLocks(string $prefix = '');
+}
diff --git a/src/Core/Lock/ILockDriver.php b/src/Core/Lock/ILockDriver.php
deleted file mode 100644 (file)
index 7df5b3f..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-
-namespace Friendica\Core\Lock;
-use Friendica\Core\Cache;
-
-/**
- * Lock Driver Interface
- *
- * @author Philipp Holzer <admin@philipp.info>
- */
-interface ILockDriver
-{
-       /**
-        * Checks, if a key is currently locked to a or my process
-        *
-        * @param string $key           The name of the lock
-        * @return bool
-        */
-       public function isLocked($key);
-
-       /**
-        *
-        * Acquires a lock for a given name
-        *
-        * @param string  $key      The Name of the lock
-        * @param integer $timeout  Seconds until we give up
-        * @param integer $ttl      Seconds The lock lifespan, must be one of the Cache constants
-        *
-        * @return boolean Was the lock successful?
-        */
-       public function acquireLock($key, $timeout = 120, $ttl = Cache::FIVE_MINUTES);
-
-       /**
-        * Releases a lock if it was set by us
-        *
-        * @param string $key      The Name of the lock
-        * @param bool   $override Overrides the lock to get released
-        *
-        * @return boolean Was the unlock successful?
-        */
-       public function releaseLock($key, $override = false);
-
-       /**
-        * Releases all lock that were set by us
-        *
-        * @return boolean Was the unlock of all locks successful?
-        */
-       public function releaseAll();
-}
diff --git a/src/Core/Lock/Lock.php b/src/Core/Lock/Lock.php
new file mode 100644 (file)
index 0000000..f03ffe0
--- /dev/null
@@ -0,0 +1,71 @@
+<?php
+
+namespace Friendica\Core\Lock;
+
+use Friendica\Core\Cache\Cache;
+
+/**
+ * Class AbstractLock
+ *
+ * @package Friendica\Core\Lock
+ *
+ * Basic class for Locking with common functions (local acquired locks, releaseAll, ..)
+ */
+abstract class Lock implements ILock
+{
+       const TYPE_DATABASE  = Cache::TYPE_DATABASE;
+       const TYPE_SEMAPHORE = 'semaphore';
+
+       /**
+        * @var array The local acquired locks
+        */
+       protected $acquiredLocks = [];
+
+       /**
+        * Check if we've locally acquired a lock
+        *
+        * @param string key The Name of the lock
+        *
+        * @return bool      Returns true if the lock is set
+        */
+       protected function hasAcquiredLock($key)
+       {
+               return isset($this->acquireLock[$key]) && $this->acquiredLocks[$key] === true;
+       }
+
+       /**
+        * Mark a locally acquired lock
+        *
+        * @param string $key The Name of the lock
+        */
+       protected function markAcquire($key)
+       {
+               $this->acquiredLocks[$key] = true;
+       }
+
+       /**
+        * Mark a release of a locally acquired lock
+        *
+        * @param string $key The Name of the lock
+        */
+       protected function markRelease($key)
+       {
+               unset($this->acquiredLocks[$key]);
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function releaseAll($override = false)
+       {
+               $return = true;
+
+               foreach ($this->acquiredLocks as $acquiredLock => $hasLock) {
+                       if (!$this->releaseLock($acquiredLock, $override)) {
+                               $return = false;
+                       }
+               }
+
+               return $return;
+       }
+}
diff --git a/src/Core/Lock/SemaphoreLock.php b/src/Core/Lock/SemaphoreLock.php
new file mode 100644 (file)
index 0000000..d5153d4
--- /dev/null
@@ -0,0 +1,124 @@
+<?php
+
+namespace Friendica\Core\Lock;
+
+use Friendica\Core\Cache;
+
+class SemaphoreLock extends Lock
+{
+       private static $semaphore = [];
+
+       public function __construct()
+       {
+               if (!function_exists('sem_get')) {
+                       throw new \Exception('Semaphore lock not supported');
+               }
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       private static function semaphoreKey($key)
+       {
+               $success = true;
+
+               $temp = get_temppath();
+
+               $file = $temp . '/' . $key . '.sem';
+
+               if (!file_exists($file)) {
+                       $success = !empty(file_put_contents($file, $key));
+               }
+
+               return $success ? ftok($file, 'f') : false;
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function acquireLock($key, $timeout = 120, $ttl = Cache\Cache::FIVE_MINUTES)
+       {
+               self::$semaphore[$key] = sem_get(self::semaphoreKey($key));
+               if (self::$semaphore[$key]) {
+                       if (sem_acquire(self::$semaphore[$key], ($timeout == 0))) {
+                               $this->markAcquire($key);
+                               return true;
+                       }
+               }
+
+               return false;
+       }
+
+       /**
+        * (@inheritdoc)
+        *
+        * @param bool $override not necessary parameter for semaphore locks since the lock lives as long as the execution
+        *                       of the using function
+        */
+       public function releaseLock($key, $override = false)
+       {
+               $success = false;
+
+               if (!empty(self::$semaphore[$key])) {
+                       try {
+                               $success = @sem_release(self::$semaphore[$key]);
+                               unset(self::$semaphore[$key]);
+                               $this->markRelease($key);
+                       } catch (\Exception $exception) {
+                               $success = false;
+                       }
+               }
+
+               return $success;
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function isLocked($key)
+       {
+               return isset(self::$semaphore[$key]);
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function getName()
+       {
+               return self::TYPE_SEMAPHORE;
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function getLocks(string $prefix = '')
+       {
+               // We can just return our own semaphore keys, since we don't know
+               // the state of other semaphores, even if the .sem files exists
+               $keys = array_keys(self::$semaphore);
+
+               if (empty($prefix)) {
+                       return $keys;
+               } else {
+                       $result = [];
+
+                       foreach ($keys as $key) {
+                               if (strpos($key, $prefix) === 0) {
+                                       array_push($result, $key);
+                               }
+                       }
+
+                       return $result;
+               }
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function releaseAll($override = false)
+       {
+               // Semaphores are just alive during a run, so there is no need to release
+               // You can just release your own locks
+               return parent::releaseAll($override);
+       }
+}
diff --git a/src/Core/Lock/SemaphoreLockDriver.php b/src/Core/Lock/SemaphoreLockDriver.php
deleted file mode 100644 (file)
index 781e110..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-<?php
-
-namespace Friendica\Core\Lock;
-
-use Friendica\Core\Cache;
-
-class SemaphoreLockDriver extends AbstractLockDriver
-{
-       private static $semaphore = [];
-
-       public function __construct()
-       {
-               if (!function_exists('sem_get')) {
-                       throw new \Exception('Semaphore lock not supported');
-               }
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       private static function semaphoreKey($key)
-       {
-               $temp = get_temppath();
-
-               $file = $temp . '/' . $key . '.sem';
-
-               if (!file_exists($file)) {
-                       file_put_contents($file, $key);
-               }
-
-               return ftok($file, 'f');
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function acquireLock($key, $timeout = 120, $ttl = Cache::FIVE_MINUTES)
-       {
-               self::$semaphore[$key] = sem_get(self::semaphoreKey($key));
-               if (self::$semaphore[$key]) {
-                       if (sem_acquire(self::$semaphore[$key], ($timeout == 0))) {
-                               $this->markAcquire($key);
-                               return true;
-                       }
-               }
-
-               return false;
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function releaseLock($key, $override = false)
-       {
-               if (empty(self::$semaphore[$key])) {
-                       return false;
-               } else {
-                       $success = @sem_release(self::$semaphore[$key]);
-                       unset(self::$semaphore[$key]);
-                       $this->markRelease($key);
-                       return $success;
-               }
-       }
-
-       /**
-        * (@inheritdoc)
-        */
-       public function isLocked($key)
-       {
-               return isset(self::$semaphore[$key]);
-       }
-}
index fc2dde1dfe703f3de75e6044cc7fccc8b699e7bd..e376485e564adae830ee0e1103d71d1a868fe281 100644 (file)
@@ -4,13 +4,15 @@
  */
 namespace Friendica\Core;
 
+use Friendica\BaseObject;
+use Friendica\Util\Logger\WorkerLogger;
 use Psr\Log\LoggerInterface;
 use Psr\Log\LogLevel;
 
 /**
  * @brief Logger functions
  */
-class Logger
+class Logger extends BaseObject
 {
        /**
         * @see Logger::error()
@@ -37,6 +39,19 @@ class Logger
         */
        const ALL = LogLevel::DEBUG;
 
+       /**
+        * @var LoggerInterface The default Logger type
+        */
+       const TYPE_LOGGER = LoggerInterface::class;
+       /**
+        * @var WorkerLogger A specific worker logger type, which can be anabled
+        */
+       const TYPE_WORKER = WorkerLogger::class;
+       /**
+        * @var LoggerInterface The current logger type
+        */
+       private static $type = self::TYPE_LOGGER;
+
        /**
         * @var array the legacy loglevels
         * @deprecated 2019.03 use PSR-3 loglevels
@@ -53,33 +68,24 @@ class Logger
        ];
 
        /**
-        * @var LoggerInterface A PSR-3 compliant logger instance
-        */
-       private static $logger;
-
-       /**
-        * @var LoggerInterface A PSR-3 compliant logger instance for developing only
-        */
-       private static $devLogger;
-
-       /**
-        * Sets the default logging handler for Friendica.
+        * Enable additional logging for worker usage
+        *
+        * @param string $functionName The worker function, which got called
         *
-        * @param LoggerInterface $logger The Logger instance of this Application
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       public static function init(LoggerInterface $logger)
+       public static function enableWorker(string $functionName)
        {
-               self::$logger = $logger;
+               self::$type = self::TYPE_WORKER;
+               self::getClass(self::$type)->setFunctionName($functionName);
        }
 
        /**
-        * Sets the default dev-logging handler for Friendica.
-        *
-        * @param LoggerInterface $logger The Logger instance of this Application
+        * Disable additional logging for worker usage
         */
-       public static function setDevLogger(LoggerInterface $logger)
+       public static function disableWorker()
        {
-               self::$devLogger = $logger;
+               self::$type = self::TYPE_LOGGER;
        }
 
        /**
@@ -95,7 +101,7 @@ class Logger
         */
        public static function emergency($message, $context = [])
        {
-               self::$logger->emergency($message, $context);
+               self::getClass(self::$type)->emergency($message, $context);
        }
 
        /**
@@ -113,7 +119,7 @@ class Logger
         */
        public static function alert($message, $context = [])
        {
-               self::$logger->alert($message, $context);
+               self::getClass(self::$type)->alert($message, $context);
        }
 
        /**
@@ -130,7 +136,7 @@ class Logger
         */
        public static function critical($message, $context = [])
        {
-               self::$logger->critical($message, $context);
+               self::getClass(self::$type)->critical($message, $context);
        }
 
        /**
@@ -146,7 +152,7 @@ class Logger
         */
        public static function error($message, $context = [])
        {
-               self::$logger->error($message, $context);
+               self::getClass(self::$type)->error($message, $context);
        }
 
        /**
@@ -164,7 +170,7 @@ class Logger
         */
        public static function warning($message, $context = [])
        {
-               self::$logger->warning($message, $context);
+               self::getClass(self::$type)->warning($message, $context);
        }
 
        /**
@@ -179,7 +185,7 @@ class Logger
         */
        public static function notice($message, $context = [])
        {
-               self::$logger->notice($message, $context);
+               self::getClass(self::$type)->notice($message, $context);
        }
 
        /**
@@ -196,7 +202,7 @@ class Logger
         */
        public static function info($message, $context = [])
        {
-               self::$logger->info($message, $context);
+               self::getClass(self::$type)->info($message, $context);
        }
 
        /**
@@ -211,7 +217,7 @@ class Logger
         */
        public static function debug($message, $context = [])
        {
-               self::$logger->debug($message, $context);
+               self::getClass(self::$type)->debug($message, $context);
        }
 
            /**
@@ -225,7 +231,7 @@ class Logger
         */
        public static function log($msg, $level = LogLevel::INFO)
        {
-               self::$logger->log($level, $msg);
+               self::getClass(self::$type)->log($level, $msg);
        }
 
        /**
@@ -240,10 +246,6 @@ class Logger
         */
        public static function devLog($msg, $level = LogLevel::DEBUG)
        {
-               if (!isset(self::$devLogger)) {
-                       return;
-               }
-
-               self::$devLogger->log($level, $msg);
+               self::getClass('$devLogger')->log($level, $msg);
        }
 }
index 5b2e97005aec370ea502de52570334963a3fca81..8ac5d93c729d33779573990638b978af602dcf3e 100644 (file)
@@ -394,7 +394,7 @@ class NotificationsManager extends BaseObject
 
                $fields = ['id', 'parent', 'verb', 'author-name', 'unseen', 'author-link', 'author-avatar', 'contact-avatar',
                        'network', 'created', 'object', 'parent-author-name', 'parent-author-link', 'parent-guid'];
-               $params = ['order' => ['created' => true], 'limit' => [$start, $limit]];
+               $params = ['order' => ['received' => true], 'limit' => [$start, $limit]];
 
                $items = Item::selectForUser(local_user(), $fields, $condition, $params);
 
@@ -485,7 +485,7 @@ class NotificationsManager extends BaseObject
 
                $fields = ['id', 'parent', 'verb', 'author-name', 'unseen', 'author-link', 'author-avatar', 'contact-avatar',
                        'network', 'created', 'object', 'parent-author-name', 'parent-author-link', 'parent-guid'];
-               $params = ['order' => ['created' => true], 'limit' => [$start, $limit]];
+               $params = ['order' => ['received' => true], 'limit' => [$start, $limit]];
 
                $items = Item::selectForUser(local_user(), $fields, $condition, $params);
 
@@ -527,7 +527,7 @@ class NotificationsManager extends BaseObject
 
                $fields = ['id', 'parent', 'verb', 'author-name', 'unseen', 'author-link', 'author-avatar', 'contact-avatar',
                        'network', 'created', 'object', 'parent-author-name', 'parent-author-link', 'parent-guid'];
-               $params = ['order' => ['created' => true], 'limit' => [$start, $limit]];
+               $params = ['order' => ['received' => true], 'limit' => [$start, $limit]];
                $items = Item::selectForUser(local_user(), $fields, $condition, $params);
 
                if (DBA::isResult($items)) {
index da4c802937d301271f3d80497bb454a50b5a2983..e96935c4e69b73b7b305df49c1741374cce3d246 100644 (file)
@@ -8,6 +8,9 @@
  */
 namespace Friendica\Core;
 
+use Friendica\BaseObject;
+use Friendica\Core\Config\PConfiguration;
+
 /**
  * @brief Management of user configuration storage
  * Note:
@@ -15,41 +18,26 @@ namespace Friendica\Core;
  * The PConfig::get() functions return boolean false for keys that are unset,
  * and this could lead to subtle bugs.
  */
-class PConfig
+class PConfig extends BaseObject
 {
-       /**
-        * @var Config\PConfiguration
-        */
-       private static $config;
-
-       /**
-        * Initialize the config with only the cache
-        *
-        * @param Config\PConfiguration $config The configuration cache
-        */
-       public static function init(Config\PConfiguration $config)
-       {
-               self::$config = $config;
-       }
-
        /**
         * @brief Loads all configuration values of a user's config family into a cached storage.
         *
-        * @param string $uid The user_id
+        * @param int    $uid The user_id
         * @param string $cat The category of the configuration value
         *
         * @return void
         */
-       public static function load($uid, $cat)
+       public static function load(int $uid, string $cat)
        {
-               self::$config->load($uid, $cat);
+               self::getClass(PConfiguration::class)->load($uid, $cat);
        }
 
        /**
         * @brief Get a particular user's config variable given the category name
         * ($cat) and a key.
         *
-        * @param string  $uid           The user_id
+        * @param int     $uid           The user_id
         * @param string  $cat           The category of the configuration value
         * @param string  $key           The configuration key to query
         * @param mixed   $default_value optional, The value to return if key is not set (default: null)
@@ -57,37 +45,37 @@ class PConfig
         *
         * @return mixed Stored value or null if it does not exist
         */
-       public static function get($uid, $cat, $key, $default_value = null, $refresh = false)
+       public static function get(int $uid, string $cat, string $key, $default_value = null, bool $refresh = false)
        {
-               return self::$config->get($uid, $cat, $key, $default_value, $refresh);
+               return self::getClass(PConfiguration::class)->get($uid, $cat, $key, $default_value, $refresh);
        }
 
        /**
         * @brief Sets a configuration value for a user
         *
-        * @param string $uid    The user_id
+        * @param int    $uid    The user_id
         * @param string $cat    The category of the configuration value
         * @param string $key    The configuration key to set
         * @param mixed  $value  The value to store
         *
         * @return bool Operation success
         */
-       public static function set($uid, $cat, $key, $value)
+       public static function set(int $uid, string $cat, string $key, $value)
        {
-               return self::$config->set($uid, $cat, $key, $value);
+               return self::getClass(PConfiguration::class)->set($uid, $cat, $key, $value);
        }
 
        /**
         * @brief Deletes the given key from the users's configuration.
         *
-        * @param string $uid The user_id
+        * @param int    $uid The user_id
         * @param string $cat The category of the configuration value
         * @param string $key The configuration key to delete
         *
         * @return bool
         */
-       public static function delete($uid, $cat, $key)
+       public static function delete(int $uid, string $cat, string $key)
        {
-               return self::$config->delete($uid, $cat, $key);
+               return self::getClass(PConfiguration::class)->delete($uid, $cat, $key);
        }
 }
diff --git a/src/Core/Process.php b/src/Core/Process.php
new file mode 100644 (file)
index 0000000..035f4bf
--- /dev/null
@@ -0,0 +1,203 @@
+<?php
+
+namespace Friendica\Core;
+
+use Friendica\App;
+use Friendica\Core\Config\Configuration;
+use Psr\Log\LoggerInterface;
+
+/**
+ * Methods for interacting with the current process or create new process
+ *
+ * @todo 2019.12 Next release, this class holds all process relevant methods based on the big Worker class
+ *       - Starting new processes (including checks)
+ *       - Enabling multi-node processing (e.g. for docker service)
+ *         - Using an process-id per node
+ *         - Using memory locks for multi-node locking (redis, memcached, ..)
+ */
+final class Process
+{
+       /**
+        * @var LoggerInterface
+        */
+       private $logger;
+
+       /**
+        * @var App\Mode
+        */
+       private $mode;
+
+       /**
+        * @var Configuration
+        */
+       private $config;
+
+       /**
+        * @var string
+        */
+       private $basePath;
+
+       public function __construct(LoggerInterface $logger, App\Mode $mode, Configuration $config, string $basepath)
+       {
+               $this->logger   = $logger;
+               $this->mode     = $mode;
+               $this->config   = $config;
+               $this->basePath = $basepath;
+       }
+
+       /**
+        * @brief Checks if the maximum number of database processes is reached
+        *
+        * @return bool Is the limit reached?
+        */
+       public function isMaxProcessesReached()
+       {
+               // Deactivated, needs more investigating if this check really makes sense
+               return false;
+
+               /*
+                * Commented out to suppress static analyzer issues
+                *
+               if ($this->mode->isBackend()) {
+                       $process = 'backend';
+                       $max_processes = $this->config->get('system', 'max_processes_backend');
+                       if (intval($max_processes) == 0) {
+                               $max_processes = 5;
+                       }
+               } else {
+                       $process = 'frontend';
+                       $max_processes = $this->config->get('system', 'max_processes_frontend');
+                       if (intval($max_processes) == 0) {
+                               $max_processes = 20;
+                       }
+               }
+
+               $processlist = DBA::processlist();
+               if ($processlist['list'] != '') {
+                       $this->logger->debug('Processcheck: Processes: ' . $processlist['amount'] . ' - Processlist: ' . $processlist['list']);
+
+                       if ($processlist['amount'] > $max_processes) {
+                               $this->logger->debug('Processcheck: Maximum number of processes for ' . $process . ' tasks (' . $max_processes . ') reached.');
+                               return true;
+                       }
+               }
+               return false;
+                */
+       }
+
+       /**
+        * @brief Checks if the minimal memory is reached
+        *
+        * @return bool Is the memory limit reached?
+        */
+       public function isMinMemoryReached()
+       {
+               $min_memory = $this->config->get('system', 'min_memory', 0);
+               if ($min_memory == 0) {
+                       return false;
+               }
+
+               if (!is_readable('/proc/meminfo')) {
+                       return false;
+               }
+
+               $memdata = explode("\n", file_get_contents('/proc/meminfo'));
+
+               $meminfo = [];
+               foreach ($memdata as $line) {
+                       $data = explode(':', $line);
+                       if (count($data) != 2) {
+                               continue;
+                       }
+                       list($key, $val) = $data;
+                       $meminfo[$key] = (int)trim(str_replace('kB', '', $val));
+                       $meminfo[$key] = (int)($meminfo[$key] / 1024);
+               }
+
+               if (!isset($meminfo['MemFree'])) {
+                       return false;
+               }
+
+               $free = $meminfo['MemFree'];
+
+               $reached = ($free < $min_memory);
+
+               if ($reached) {
+                       $this->logger->debug('Minimal memory reached.', ['free' => $free, 'memtotal' => $meminfo['MemTotal'], 'limit' => $min_memory]);
+               }
+
+               return $reached;
+       }
+
+       /**
+        * @brief Checks if the maximum load is reached
+        *
+        * @return bool Is the load reached?
+        */
+       public function isMaxLoadReached()
+       {
+               if ($this->mode->isBackend()) {
+                       $process    = 'backend';
+                       $maxsysload = intval($this->config->get('system', 'maxloadavg'));
+                       if ($maxsysload < 1) {
+                               $maxsysload = 50;
+                       }
+               } else {
+                       $process    = 'frontend';
+                       $maxsysload = intval($this->config->get('system', 'maxloadavg_frontend'));
+                       if ($maxsysload < 1) {
+                               $maxsysload = 50;
+                       }
+               }
+
+               $load = System::currentLoad();
+               if ($load) {
+                       if (intval($load) > $maxsysload) {
+                               $this->logger->info('system load for process too high.', ['load' => $load, 'process' => $process, 'maxsysload' => $maxsysload]);
+                               return true;
+                       }
+               }
+               return false;
+       }
+
+       /**
+        * Executes a child process with 'proc_open'
+        *
+        * @param string $command The command to execute
+        * @param array  $args    Arguments to pass to the command ( [ 'key' => value, 'key2' => value2, ... ]
+        */
+       public function run($command, $args)
+       {
+               if (!function_exists('proc_open')) {
+                       return;
+               }
+
+               $cmdline = $this->config->get('config', 'php_path', 'php') . ' ' . escapeshellarg($command);
+
+               foreach ($args as $key => $value) {
+                       if (!is_null($value) && is_bool($value) && !$value) {
+                               continue;
+                       }
+
+                       $cmdline .= ' --' . $key;
+                       if (!is_null($value) && !is_bool($value)) {
+                               $cmdline .= ' ' . $value;
+                       }
+               }
+
+               if ($this->isMinMemoryReached()) {
+                       return;
+               }
+
+               if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
+                       $resource = proc_open('cmd /c start /b ' . $cmdline, [], $foo, $this->basePath);
+               } else {
+                       $resource = proc_open($cmdline . ' &', [], $foo, $this->basePath);
+               }
+               if (!is_resource($resource)) {
+                       $this->logger->debug('We got no resource for command.', ['cmd' => $cmdline]);
+                       return;
+               }
+               proc_close($resource);
+       }
+}
index 0038b505a570b4f73f3cb48837a8cf049698b784..0ecc076a0fd5501e9b355b175c5b6ca20d30b1b0 100644 (file)
@@ -23,6 +23,10 @@ class Protocol
 
        const NATIVE_SUPPORT = [self::DFRN, self::DIASPORA, self::OSTATUS, self::FEED, self::MAIL, self::ACTIVITYPUB];
 
+       const FEDERATED = [self::DFRN, self::DIASPORA, self::OSTATUS, self::ACTIVITYPUB];
+
+       const SUPPORT_PRIVATE = [self::DFRN, self::DIASPORA, self::MAIL, self::ACTIVITYPUB, self::PUMPIO];
+
        // Supported through a connector
        const DIASPORA2 = 'dspc';    // Diaspora connector
        const LINKEDIN  = 'lnkd';    // LinkedIn
index e26cc0edc3a55792b682ad397cac11e4d87fafb7..9f8375da12f66e539a25d1da0954a3c14b34ca1a 100644 (file)
@@ -49,7 +49,7 @@ class Search extends BaseObject
                                return $emptyResultList;
                        }
 
-                       if (!(in_array($user_data["network"], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::OSTATUS, Protocol::DIASPORA]))) {
+                       if (!(in_array($user_data["network"], Protocol::FEDERATED))) {
                                return $emptyResultList;
                        }
 
index 8b6c26bc57ee4b18a60f3074ce279a6eec8a16bf..22909a6e6e039720d3d43b6310e6a762304ca331 100644 (file)
@@ -9,9 +9,7 @@ use Friendica\App;
 use Friendica\Core\Session\CacheSessionHandler;
 use Friendica\Core\Session\DatabaseSessionHandler;
 use Friendica\Database\DBA;
-use Friendica\Model\Contact;
 use Friendica\Model\User;
-use Friendica\Util\BaseURL;
 use Friendica\Util\DateTimeFormat;
 
 /**
@@ -30,7 +28,7 @@ class Session
                ini_set('session.use_only_cookies', 1);
                ini_set('session.cookie_httponly', 1);
 
-               if (Config::get('system', 'ssl_policy') == BaseURL::SSL_POLICY_FULL) {
+               if (Config::get('system', 'ssl_policy') == App\BaseURL::SSL_POLICY_FULL) {
                        ini_set('session.cookie_secure', 1);
                }
 
@@ -62,13 +60,7 @@ class Session
         */
        public static function get($name, $defaults = null)
        {
-               if (isset($_SESSION)) {
-                       $return = defaults($_SESSION, $name, $defaults);
-               } else {
-                       $return = $defaults;
-               }
-
-               return $return;
+               return $_SESSION[$name] ?? $defaults;
        }
 
        /**
index 42587577dae573105a9f6ce462a0556fb7d8d5d2..0888f390a694c8d59769a80e5a876e01ce9e8e37 100644 (file)
@@ -4,6 +4,7 @@
  */
 namespace Friendica\Core;
 
+use Friendica\App\BaseURL;
 use Friendica\BaseObject;
 use Friendica\Network\HTTPException\InternalServerErrorException;
 use Friendica\Util\XML;
@@ -29,7 +30,7 @@ class System extends BaseObject
         */
        public static function baseUrl($ssl = false)
        {
-               return self::getApp()->getBaseURL($ssl);
+               return self::getClass(BaseURL::class)->get($ssl);
        }
 
        /**
index 8fdd60c2a74db95549ec4d3766b631b3f1020358..037590c90d7783e025bdf492353114b34972bb73 100644 (file)
@@ -5,10 +5,10 @@
 namespace Friendica\Core;
 
 use Friendica\BaseObject;
+use Friendica\Core;
 use Friendica\Database\DBA;
 use Friendica\Model\Process;
 use Friendica\Util\DateTimeFormat;
-use Friendica\Util\Logger\WorkerLogger;
 use Friendica\Util\Network;
 
 /**
@@ -187,7 +187,7 @@ class Worker
        private static function deferredEntries()
        {
                $stamp = (float)microtime(true);
-               $count = DBA::count('workerqueue', ["NOT `done` AND `pid` = 0 AND `next_try` > ?", DateTimeFormat::utcNow()]);
+               $count = DBA::count('workerqueue', ["NOT `done` AND `pid` = 0 AND `retrial` > ?", 0]);
                self::$db_duration += (microtime(true) - $stamp);
                self::$db_duration_count += (microtime(true) - $stamp);
                return $count;
@@ -378,10 +378,9 @@ class Worker
 
                $argc = count($argv);
 
-               $logger = $a->getLogger();
-               $workerLogger = new WorkerLogger($logger, $funcname);
+               Logger::enableWorker($funcname);
 
-               $workerLogger ->info("Process start.", ['priority' => $queue["priority"], 'id' => $queue["id"]]);
+               Logger::info("Process start.", ['priority' => $queue["priority"], 'id' => $queue["id"]]);
 
                $stamp = (float)microtime(true);
 
@@ -397,13 +396,13 @@ class Worker
                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);
+
+               Logger::disableWorker();
 
                unset($a->queue);
 
@@ -423,7 +422,7 @@ class Worker
                $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]);
+               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;
@@ -433,23 +432,23 @@ class Worker
                self::$lock_duration = 0;
 
                if ($duration > 3600) {
-                       $logger->info('Longer than 1 hour.', ['priority' => $queue["priority"], 'id' => $queue["id"], 'duration' => round($duration/60, 3)]);
+                       Logger::info('Longer than 1 hour.', ['priority' => $queue["priority"], 'id' => $queue["id"], 'duration' => round($duration/60, 3)]);
                } elseif ($duration > 600) {
-                       $logger->info('Longer than 10 minutes.', ['priority' => $queue["priority"], 'id' => $queue["id"], 'duration' => round($duration/60, 3)]);
+                       Logger::info('Longer than 10 minutes.', ['priority' => $queue["priority"], 'id' => $queue["id"], 'duration' => round($duration/60, 3)]);
                } elseif ($duration > 300) {
-                       $logger->info('Longer than 5 minutes.', ['priority' => $queue["priority"], 'id' => $queue["id"], 'duration' => round($duration/60, 3)]);
+                       Logger::info('Longer than 5 minutes.', ['priority' => $queue["priority"], 'id' => $queue["id"], 'duration' => round($duration/60, 3)]);
                } elseif ($duration > 120) {
-                       $logger->info('Longer than 2 minutes.', ['priority' => $queue["priority"], 'id' => $queue["id"], 'duration' => round($duration/60, 3)]);
+                       Logger::info('Longer than 2 minutes.', ['priority' => $queue["priority"], 'id' => $queue["id"], 'duration' => round($duration/60, 3)]);
                }
 
-               $workerLogger->info('Process done.', ['priority' => $queue["priority"], 'id' => $queue["id"], 'duration' => round($duration, 3)]);
+               Logger::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->info('Cooldown.', ['priority' => $queue["priority"], 'id' => $queue["id"], 'cooldown' => $cooldown]);
+                       Logger::info('Cooldown.', ['priority' => $queue["priority"], 'id' => $queue["id"], 'cooldown' => $cooldown]);
                        sleep($cooldown);
                }
        }
@@ -688,10 +687,8 @@ class Worker
                                        DBA::close($processes);
                                }
                                DBA::close($jobs);
-                               $entries = $deferred + $waiting_processes;
                        } else {
-                               $entries = self::totalEntries();
-                               $waiting_processes = max(0, $entries - $deferred);
+                               $waiting_processes =  self::totalEntries();
                                $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);
@@ -1086,7 +1083,9 @@ class Worker
 
                $args = ['no_cron' => !$do_cron];
 
-               get_app()->proc_run($command, $args);
+               $a = get_app();
+               $process = new Core\Process($a->getLogger(), $a->getMode(), $a->getConfig(), $a->getBasePath());
+               $process->run($command, $args);
 
                // after spawning we have to remove the flag.
                if (Config::get('system', 'worker_daemon_mode', false)) {
@@ -1127,7 +1126,8 @@ class Worker
                }
 
                $priority = PRIORITY_MEDIUM;
-               $dont_fork = Config::get("system", "worker_dont_fork", false);
+               // Don't fork from frontend tasks by default
+               $dont_fork = Config::get("system", "worker_dont_fork", false) || !\get_app()->getMode()->isBackend();
                $created = DateTimeFormat::utcNow();
                $force_priority = false;
 
@@ -1194,6 +1194,32 @@ class Worker
                return true;
        }
 
+       /**
+        * Returns the next retrial level for worker jobs.
+        * This function will skip levels when jobs are older.
+        *
+        * @param array $queue Worker queue entry
+        * @param integer $max_level maximum retrial level
+        * @return integer the next retrial level value
+        */
+       private static function getNextRetrial($queue, $max_level)
+       {
+               $created = strtotime($queue['created']);
+               $retrial_time = time() - $created;
+
+               $new_retrial = $queue['retrial'] + 1;
+               $total = 0;
+               for ($retrial = 0; $retrial <= $max_level + 1; ++$retrial) {
+                       $delay = (($retrial + 3) ** 4) + (rand(1, 30) * ($retrial + 1));
+                       $total += $delay;
+                       if (($total < $retrial_time) && ($retrial > $queue['retrial'])) {
+                               $new_retrial = $retrial;
+                       }
+               }
+               Logger::info('New retrial for task', ['id' => $queue['id'], 'created' => $queue['created'], 'old' => $queue['retrial'], 'new' => $new_retrial]);
+               return $new_retrial;
+       }
+
        /**
         * Defers the current worker entry
         */
@@ -1209,27 +1235,31 @@ class Worker
                $id = $queue['id'];
                $priority = $queue['priority'];
 
-               if ($retrial > 14) {
-                       Logger::log('Id ' . $id . ' had been tried 14 times. We stop now.', Logger::DEBUG);
+               $max_level = Config::get('system', 'worker_defer_limit');
+
+               $new_retrial = self::getNextRetrial($queue, $max_level);
+
+               if ($new_retrial > $max_level) {
+                       Logger::info('The task exceeded the maximum retry count', ['id' => $id, 'max_level' => $max_level, 'retrial' => $new_retrial]);
                        return;
                }
 
                // Calculate the delay until the next trial
-               $delay = (($retrial + 3) ** 4) + (rand(1, 30) * ($retrial + 1));
+               $delay = (($new_retrial + 2) ** 4) + (rand(1, 30) * ($new_retrial));
                $next = DateTimeFormat::utc('now + ' . $delay . ' seconds');
 
-               if (($priority < PRIORITY_MEDIUM) && ($retrial > 2)) {
+               if (($priority < PRIORITY_MEDIUM) && ($new_retrial > 3)) {
                        $priority = PRIORITY_MEDIUM;
-               } elseif (($priority < PRIORITY_LOW) && ($retrial > 5)) {
+               } elseif (($priority < PRIORITY_LOW) && ($new_retrial > 6)) {
                        $priority = PRIORITY_LOW;
-               } elseif (($priority < PRIORITY_NEGLIGIBLE) && ($retrial > 7)) {
+               } elseif (($priority < PRIORITY_NEGLIGIBLE) && ($new_retrial > 8)) {
                        $priority = PRIORITY_NEGLIGIBLE;
                }
 
-               Logger::log('Defer execution ' . $retrial . ' of id ' . $id . ' to ' . $next . ' - priority old/new: ' . $queue['priority'] . '/' . $priority, Logger::DEBUG);
+               Logger::info('Deferred task', ['id' => $id, 'retrial' => $new_retrial, 'next_execution' => $next, 'old_prio' => $queue['priority'], 'new_prio' => $priority]);
 
                $stamp = (float)microtime(true);
-               $fields = ['retrial' => $retrial + 1, 'next_try' => $next, 'executed' => DBA::NULL_DATETIME, 'pid' => 0, 'priority' => $priority];
+               $fields = ['retrial' => $new_retrial, 'next_try' => $next, 'executed' => DBA::NULL_DATETIME, 'pid' => 0, 'priority' => $priority];
                DBA::update('workerqueue', $fields, ['id' => $id]);
                self::$db_duration += (microtime(true) - $stamp);
                self::$db_duration_write += (microtime(true) - $stamp);
index 72769dca9b6041e7129553c418e6f907186323fc..7f3e071fa1c388a426d10afa65349d5b83bc3064 100644 (file)
@@ -2,24 +2,19 @@
 
 namespace Friendica\Database;
 
-use Friendica\Core\Config\Cache\IConfigCache;
-use Friendica\Core\System;
-use Friendica\Util\DateTimeFormat;
-use Friendica\Util\Profiler;
+use Friendica\BaseObject;
 use mysqli;
 use mysqli_result;
 use mysqli_stmt;
 use PDO;
-use PDOException;
 use PDOStatement;
-use Psr\Log\LoggerInterface;
 
 /**
  * @class MySQL database class
  *
  * This class is for the low level database stuff that does driver specific things.
  */
-class DBA
+class DBA extends BaseObject
 {
        /**
         * Lowest possible date value
@@ -30,133 +25,9 @@ class DBA
         */
        const NULL_DATETIME = '0001-01-01 00:00:00';
 
-       public static $connected = false;
-
-       /**
-        * @var IConfigCache
-        */
-       private static $configCache;
-       /**
-        * @var Profiler
-        */
-       private static $profiler;
-       /**
-        * @var LoggerInterface
-        */
-       private static $logger;
-       private static $server_info = '';
-       /** @var PDO|mysqli */
-       private static $connection;
-       private static $driver;
-       private static $error = false;
-       private static $errorno = 0;
-       private static $affected_rows = 0;
-       private static $in_transaction = false;
-       private static $in_retrial = false;
-       private static $relation = [];
-       private static $db_serveraddr = '';
-       private static $db_user = '';
-       private static $db_pass = '';
-       private static $db_name = '';
-       private static $db_charset = '';
-
-       public static function connect(IConfigCache $configCache, Profiler $profiler, LoggerInterface $logger, $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::$configCache = $configCache;
-               self::$profiler = $profiler;
-               self::$logger = $logger;
-               self::$db_serveraddr = $serveraddr;
-               self::$db_user = $user;
-               self::$db_pass = $pass;
-               self::$db_name = $db;
-               self::$db_charset = $charset;
-
-               $port = 0;
-               $serveraddr = trim($serveraddr);
-
-               $serverdata = explode(':', $serveraddr);
-               $server = $serverdata[0];
-
-               if (count($serverdata) > 1) {
-                       $port = trim($serverdata[1]);
-               }
-
-               $server = trim($server);
-               $user = trim($user);
-               $pass = trim($pass);
-               $db = trim($db);
-               $charset = trim($charset);
-
-               if (!(strlen($server) && strlen($user))) {
-                       return false;
-               }
-
-               if (class_exists('\PDO') && in_array('mysql', PDO::getAvailableDrivers())) {
-                       self::$driver = 'pdo';
-                       $connect = "mysql:host=".$server.";dbname=".$db;
-
-                       if ($port > 0) {
-                               $connect .= ";port=".$port;
-                       }
-
-                       if ($charset) {
-                               $connect .= ";charset=".$charset;
-                       }
-
-                       try {
-                               self::$connection = @new PDO($connect, $user, $pass);
-                               self::$connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
-                               self::$connected = true;
-                       } catch (PDOException $e) {
-                               /// @TODO At least log exception, don't ignore it!
-                       }
-               }
-
-               if (!self::$connected && class_exists('\mysqli')) {
-                       self::$driver = 'mysqli';
-
-                       if ($port > 0) {
-                               self::$connection = @new mysqli($server, $user, $pass, $db, $port);
-                       } else {
-                               self::$connection = @new mysqli($server, $user, $pass, $db);
-                       }
-
-                       if (!mysqli_connect_errno()) {
-                               self::$connected = true;
-
-                               if ($charset) {
-                                       self::$connection->set_charset($charset);
-                               }
-                       }
-               }
-
-               // No suitable SQL driver was found.
-               if (!self::$connected) {
-                       self::$driver = null;
-                       self::$connection = null;
-               }
-
-               return self::$connected;
-       }
-
-       /**
-        * Sets the logger for DBA
-        *
-        * @note this is necessary because if we want to load the logger configuration
-        *       from the DB, but there's an error, we would print out an exception.
-        *       So the logger gets updated after the logger configuration can be retrieved
-        *       from the database
-        *
-        * @param LoggerInterface $logger
-        */
-       public static function setLogger(LoggerInterface $logger)
+       public static function connect()
        {
-               self::$logger = $logger;
+               return self::getClass(Database::class)->connect();
        }
 
        /**
@@ -164,29 +35,15 @@ class DBA
         */
        public static function disconnect()
        {
-               if (is_null(self::$connection)) {
-                       return;
-               }
-
-               switch (self::$driver) {
-                       case 'pdo':
-                               self::$connection = null;
-                               break;
-                       case 'mysqli':
-                               self::$connection->close();
-                               self::$connection = null;
-                               break;
-               }
+               self::getClass(Database::class)->disconnect();
        }
 
        /**
         * Perform a reconnect of an existing database connection
         */
-       public static function reconnect() {
-               self::disconnect();
-
-               $ret = self::connect(self::$configCache, self::$profiler, self::$logger, self::$db_serveraddr, self::$db_user, self::$db_pass, self::$db_name, self::$db_charset);
-               return $ret;
+       public static function reconnect()
+       {
+               return self::getClass(Database::class)->reconnect();
        }
 
        /**
@@ -195,7 +52,7 @@ class DBA
         */
        public static function getConnection()
        {
-               return self::$connection;
+               return self::getClass(Database::class)->getConnection();
        }
 
        /**
@@ -206,18 +63,9 @@ class DBA
         *
         * @return string
         */
-       public static function serverInfo() {
-               if (self::$server_info == '') {
-                       switch (self::$driver) {
-                               case 'pdo':
-                                       self::$server_info = self::$connection->getAttribute(PDO::ATTR_SERVER_VERSION);
-                                       break;
-                               case 'mysqli':
-                                       self::$server_info = self::$connection->server_info;
-                                       break;
-                       }
-               }
-               return self::$server_info;
+       public static function serverInfo()
+       {
+               return self::getClass(Database::class)->serverInfo();
        }
 
        /**
@@ -226,116 +74,19 @@ class DBA
         * @return string
         * @throws \Exception
         */
-       public static function databaseName() {
-               $ret = self::p("SELECT DATABASE() AS `db`");
-               $data = self::toArray($ret);
-               return $data[0]['db'];
-       }
-
-       /**
-        * @brief Analyze a database query and log this if some conditions are met.
-        *
-        * @param string $query The database query that will be analyzed
-        * @throws \Exception
-        */
-       private static function logIndex($query) {
-
-               if (!self::$configCache->get('system', 'db_log_index')) {
-                       return;
-               }
-
-               // Don't explain an explain statement
-               if (strtolower(substr($query, 0, 7)) == "explain") {
-                       return;
-               }
-
-               // Only do the explain on "select", "update" and "delete"
-               if (!in_array(strtolower(substr($query, 0, 6)), ["select", "update", "delete"])) {
-                       return;
-               }
-
-               $r = self::p("EXPLAIN ".$query);
-               if (!self::isResult($r)) {
-                       return;
-               }
-
-               $watchlist = explode(',', self::$configCache->get('system', 'db_log_index_watch'));
-               $blacklist = explode(',', self::$configCache->get('system', 'db_log_index_blacklist'));
-
-               while ($row = self::fetch($r)) {
-                       if ((intval(self::$configCache->get('system', 'db_loglimit_index')) > 0)) {
-                               $log = (in_array($row['key'], $watchlist) &&
-                                       ($row['rows'] >= intval(self::$configCache->get('system', 'db_loglimit_index'))));
-                       } else {
-                               $log = false;
-                       }
-
-                       if ((intval(self::$configCache->get('system', 'db_loglimit_index_high')) > 0) && ($row['rows'] >= intval(self::$configCache->get('system', 'db_loglimit_index_high')))) {
-                               $log = true;
-                       }
-
-                       if (in_array($row['key'], $blacklist) || ($row['key'] == "")) {
-                               $log = false;
-                       }
-
-                       if ($log) {
-                               $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
-                               @file_put_contents(self::$configCache->get('system', 'db_log_index'), DateTimeFormat::utcNow()."\t".
-                                               $row['key']."\t".$row['rows']."\t".$row['Extra']."\t".
-                                               basename($backtrace[1]["file"])."\t".
-                                               $backtrace[1]["line"]."\t".$backtrace[2]["function"]."\t".
-                                               substr($query, 0, 2000)."\n", FILE_APPEND);
-                       }
-               }
-       }
-
-       /**
-        * Removes every not whitelisted character from the identifier string
-        *
-        * @param string $identifier
-        *
-        * @return string sanitized identifier
-        * @throws \Exception
-        */
-       private static function sanitizeIdentifier($identifier)
+       public static function databaseName()
        {
-               return preg_replace('/[^A-Za-z0-9_\-]+/', '', $identifier);
+               return self::getClass(Database::class)->databaseName();
        }
 
-       public static function escape($str) {
-               if (self::$connected) {
-                       switch (self::$driver) {
-                               case 'pdo':
-                                       return substr(@self::$connection->quote($str, PDO::PARAM_STR), 1, -1);
-
-                               case 'mysqli':
-                                       return @self::$connection->real_escape_string($str);
-                       }
-               } else {
-                       return str_replace("'", "\\'", $str);
-               }
+       public static function escape($str)
+       {
+               return self::getClass(Database::class)->escape($str);
        }
 
-       public static function connected() {
-               $connected = false;
-
-               if (is_null(self::$connection)) {
-                       return false;
-               }
-
-               switch (self::$driver) {
-                       case 'pdo':
-                               $r = self::p("SELECT 1");
-                               if (self::isResult($r)) {
-                                       $row = self::toArray($r);
-                                       $connected = ($row[0]['1'] == '1');
-                               }
-                               break;
-                       case 'mysqli':
-                               $connected = self::$connection->ping();
-                               break;
-               }
-               return $connected;
+       public static function connected()
+       {
+               return self::getClass(Database::class)->connected();
        }
 
        /**
@@ -349,13 +100,9 @@ class DBA
         * @param string $sql An SQL string without the values
         * @return string The input SQL string modified if necessary.
         */
-       public static function anyValueFallback($sql) {
-               $server_info = self::serverInfo();
-               if (version_compare($server_info, '5.7.5', '<') ||
-                       (stripos($server_info, 'MariaDB') !== false)) {
-                       $sql = str_ireplace('ANY_VALUE(', 'MIN(', $sql);
-               }
-               return $sql;
+       public static function anyValueFallback($sql)
+       {
+               return self::getClass(Database::class)->anyValueFallback($sql);
        }
 
        /**
@@ -367,7 +114,8 @@ class DBA
         * @param string $sql An SQL string without the values
         * @return string The input SQL string modified if necessary.
         */
-       public static function cleanQuery($sql) {
+       public static function cleanQuery($sql)
+       {
                $search = ["\t", "\n", "\r", "  "];
                $replace = [' ', ' ', ' ', ' '];
                do {
@@ -378,38 +126,13 @@ class DBA
                return $sql;
        }
 
-
-       /**
-        * @brief Replaces the ? placeholders with the parameters in the $args array
-        *
-        * @param string $sql SQL query
-        * @param array $args The parameters that are to replace the ? placeholders
-        * @return string The replaced SQL query
-        */
-       private static function replaceParameters($sql, $args) {
-               $offset = 0;
-               foreach ($args AS $param => $value) {
-                       if (is_int($args[$param]) || is_float($args[$param])) {
-                               $replace = intval($args[$param]);
-                       } else {
-                               $replace = "'".self::escape($args[$param])."'";
-                       }
-
-                       $pos = strpos($sql, '?', $offset);
-                       if ($pos !== false) {
-                               $sql = substr_replace($sql, $replace, $pos, 1);
-                       }
-                       $offset = $pos + strlen($replace);
-               }
-               return $sql;
-       }
-
        /**
         * @brief Convert parameter array to an universal form
         * @param array $args Parameter array
         * @return array universalized parameter array
         */
-       private static function getParam($args) {
+       public static function getParam($args)
+       {
                unset($args[0]);
 
                // When the second function parameter is an array then use this as the parameter array
@@ -431,227 +154,11 @@ class DBA
         * @return bool|object statement object or result object
         * @throws \Exception
         */
-       public static function p($sql) {
-
-               $stamp1 = microtime(true);
-
+       public static function p($sql)
+       {
                $params = self::getParam(func_get_args());
 
-               // Renumber the array keys to be sure that they fit
-               $i = 0;
-               $args = [];
-               foreach ($params AS $param) {
-                       // Avoid problems with some MySQL servers and boolean values. See issue #3645
-                       if (is_bool($param)) {
-                               $param = (int)$param;
-                       }
-                       $args[++$i] = $param;
-               }
-
-               if (!self::$connected) {
-                       return false;
-               }
-
-               if ((substr_count($sql, '?') != count($args)) && (count($args) > 0)) {
-                       // Question: Should we continue or stop the query here?
-                       self::$logger->warning('Query parameters mismatch.', ['query' => $sql, 'args' => $args, 'callstack' => System::callstack()]);
-               }
-
-               $sql = self::cleanQuery($sql);
-               $sql = self::anyValueFallback($sql);
-
-               $orig_sql = $sql;
-
-               if (self::$configCache->get('system', 'db_callstack') !== null) {
-                       $sql = "/*".System::callstack()." */ ".$sql;
-               }
-
-               self::$error = '';
-               self::$errorno = 0;
-               self::$affected_rows = 0;
-
-               // We have to make some things different if this function is called from "e"
-               $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2);
-
-               if (isset($trace[1])) {
-                       $called_from = $trace[1];
-               } else {
-                       // We use just something that is defined to avoid warnings
-                       $called_from = $trace[0];
-               }
-               // We are having an own error logging in the function "e"
-               $called_from_e = ($called_from['function'] == 'e');
-
-               switch (self::$driver) {
-                       case 'pdo':
-                               // If there are no arguments we use "query"
-                               if (count($args) == 0) {
-                                       if (!$retval = self::$connection->query($sql)) {
-                                               $errorInfo = self::$connection->errorInfo();
-                                               self::$error = $errorInfo[2];
-                                               self::$errorno = $errorInfo[1];
-                                               $retval = false;
-                                               break;
-                                       }
-                                       self::$affected_rows = $retval->rowCount();
-                                       break;
-                               }
-
-                               /** @var $stmt mysqli_stmt|PDOStatement */
-                               if (!$stmt = self::$connection->prepare($sql)) {
-                                       $errorInfo = self::$connection->errorInfo();
-                                       self::$error = $errorInfo[2];
-                                       self::$errorno = $errorInfo[1];
-                                       $retval = false;
-                                       break;
-                               }
-
-                               foreach ($args AS $param => $value) {
-                                       if (is_int($args[$param])) {
-                                               $data_type = PDO::PARAM_INT;
-                                       } else {
-                                               $data_type = PDO::PARAM_STR;
-                                       }
-                                       $stmt->bindParam($param, $args[$param], $data_type);
-                               }
-
-                               if (!$stmt->execute()) {
-                                       $errorInfo = $stmt->errorInfo();
-                                       self::$error = $errorInfo[2];
-                                       self::$errorno = $errorInfo[1];
-                                       $retval = false;
-                               } else {
-                                       $retval = $stmt;
-                                       self::$affected_rows = $retval->rowCount();
-                               }
-                               break;
-                       case 'mysqli':
-                               // There are SQL statements that cannot be executed with a prepared statement
-                               $parts = explode(' ', $orig_sql);
-                               $command = strtolower($parts[0]);
-                               $can_be_prepared = in_array($command, ['select', 'update', 'insert', 'delete']);
-
-                               // The fallback routine is called as well when there are no arguments
-                               if (!$can_be_prepared || (count($args) == 0)) {
-                                       $retval = self::$connection->query(self::replaceParameters($sql, $args));
-                                       if (self::$connection->errno) {
-                                               self::$error = self::$connection->error;
-                                               self::$errorno = self::$connection->errno;
-                                               $retval = false;
-                                       } else {
-                                               if (isset($retval->num_rows)) {
-                                                       self::$affected_rows = $retval->num_rows;
-                                               } else {
-                                                       self::$affected_rows = self::$connection->affected_rows;
-                                               }
-                                       }
-                                       break;
-                               }
-
-                               $stmt = self::$connection->stmt_init();
-
-                               if (!$stmt->prepare($sql)) {
-                                       self::$error = $stmt->error;
-                                       self::$errorno = $stmt->errno;
-                                       $retval = false;
-                                       break;
-                               }
-
-                               $param_types = '';
-                               $values = [];
-                               foreach ($args AS $param => $value) {
-                                       if (is_int($args[$param])) {
-                                               $param_types .= 'i';
-                                       } elseif (is_float($args[$param])) {
-                                               $param_types .= 'd';
-                                       } elseif (is_string($args[$param])) {
-                                               $param_types .= 's';
-                                       } else {
-                                               $param_types .= 'b';
-                                       }
-                                       $values[] = &$args[$param];
-                               }
-
-                               if (count($values) > 0) {
-                                       array_unshift($values, $param_types);
-                                       call_user_func_array([$stmt, 'bind_param'], $values);
-                               }
-
-                               if (!$stmt->execute()) {
-                                       self::$error = self::$connection->error;
-                                       self::$errorno = self::$connection->errno;
-                                       $retval = false;
-                               } else {
-                                       $stmt->store_result();
-                                       $retval = $stmt;
-                                       self::$affected_rows = $retval->affected_rows;
-                               }
-                               break;
-               }
-
-               // We are having an own error logging in the function "e"
-               if ((self::$errorno != 0) && !$called_from_e) {
-                       // We have to preserve the error code, somewhere in the logging it get lost
-                       $error = self::$error;
-                       $errorno = self::$errorno;
-
-                       self::$logger->error('DB Error', [
-                               'code'      => self::$errorno,
-                               'error'     => self::$error,
-                               'callstack' => System::callstack(8),
-                               'params'    => self::replaceParameters($sql, $args),
-                       ]);
-
-                       // On a lost connection we try to reconnect - but only once.
-                       if ($errorno == 2006) {
-                               if (self::$in_retrial || !self::reconnect()) {
-                                       // It doesn't make sense to continue when the database connection was lost
-                                       if (self::$in_retrial) {
-                                               self::$logger->notice('Giving up retrial because of database error', [
-                                                       'code'  => self::$errorno,
-                                                       'error' => self::$error,
-                                               ]);
-                                       } else {
-                                               self::$logger->notice('Couldn\'t reconnect after database error', [
-                                                       'code'  => self::$errorno,
-                                                       'error' => self::$error,
-                                               ]);
-                                       }
-                                       exit(1);
-                               } else {
-                                       // We try it again
-                                       self::$logger->notice('Reconnected after database error', [
-                                               'code'  => self::$errorno,
-                                               'error' => self::$error,
-                                       ]);
-                                       self::$in_retrial = true;
-                                       $ret = self::p($sql, $args);
-                                       self::$in_retrial = false;
-                                       return $ret;
-                               }
-                       }
-
-                       self::$error = $error;
-                       self::$errorno = $errorno;
-               }
-
-               self::$profiler->saveTimestamp($stamp1, 'database', System::callstack());
-
-               if (self::$configCache->get('system', 'db_log')) {
-                       $stamp2 = microtime(true);
-                       $duration = (float)($stamp2 - $stamp1);
-
-                       if (($duration > self::$configCache->get('system', 'db_loglimit'))) {
-                               $duration = round($duration, 3);
-                               $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
-
-                               @file_put_contents(self::$configCache->get('system', 'db_log'), DateTimeFormat::utcNow()."\t".$duration."\t".
-                                               basename($backtrace[1]["file"])."\t".
-                                               $backtrace[1]["line"]."\t".$backtrace[2]["function"]."\t".
-                                               substr(self::replaceParameters($sql, $args), 0, 2000)."\n", FILE_APPEND);
-                       }
-               }
-               return $retval;
+               return self::getClass(Database::class)->p($sql, $params);
        }
 
        /**
@@ -665,96 +172,23 @@ class DBA
         */
        public static function e($sql) {
 
-               $stamp = microtime(true);
-
                $params = self::getParam(func_get_args());
 
-               // In a case of a deadlock we are repeating the query 20 times
-               $timeout = 20;
-
-               do {
-                       $stmt = self::p($sql, $params);
-
-                       if (is_bool($stmt)) {
-                               $retval = $stmt;
-                       } elseif (is_object($stmt)) {
-                               $retval = true;
-                       } else {
-                               $retval = false;
-                       }
-
-                       self::close($stmt);
-
-               } while ((self::$errorno == 1213) && (--$timeout > 0));
-
-               if (self::$errorno != 0) {
-                       // We have to preserve the error code, somewhere in the logging it get lost
-                       $error = self::$error;
-                       $errorno = self::$errorno;
-
-                       self::$logger->error('DB Error', [
-                               'code'      => self::$errorno,
-                               'error'     => self::$error,
-                               'callstack' => System::callstack(8),
-                               'params'    => self::replaceParameters($sql, $params),
-                       ]);
-
-                       // On a lost connection we simply quit.
-                       // A reconnect like in self::p could be dangerous with modifications
-                       if ($errorno == 2006) {
-                               self::$logger->notice('Giving up because of database error', [
-                                       'code'  => self::$errorno,
-                                       'error' => self::$error,
-                               ]);
-                               exit(1);
-                       }
-
-                       self::$error = $error;
-                       self::$errorno = $errorno;
-               }
-
-               self::$profiler->saveTimestamp($stamp, "database_write", System::callstack());
-
-               return $retval;
+               return self::getClass(Database::class)->e($sql, $params);
        }
 
        /**
         * @brief Check if data exists
         *
-        * @param string $table     Table name
-        * @param array  $condition array of fields for condition
+        * @param string|array $table     Table name or array [schema => table]
+        * @param array        $condition array of fields for condition
         *
         * @return boolean Are there rows for that condition?
         * @throws \Exception
         */
-       public static function exists($table, $condition) {
-               if (empty($table)) {
-                       return false;
-               }
-
-               $fields = [];
-
-               if (empty($condition)) {
-                       return DBStructure::existsTable($table);
-               }
-
-               reset($condition);
-               $first_key = key($condition);
-               if (!is_int($first_key)) {
-                       $fields = [$first_key];
-               }
-
-               $stmt = self::select($table, $fields, $condition, ['limit' => 1]);
-
-               if (is_bool($stmt)) {
-                       $retval = $stmt;
-               } else {
-                       $retval = (self::numRows($stmt) > 0);
-               }
-
-               self::close($stmt);
-
-               return $retval;
+       public static function exists($table, $condition)
+       {
+               return self::getClass(Database::class)->exists($table, $condition);
        }
 
        /**
@@ -767,20 +201,11 @@ class DBA
         * @return array first row of query
         * @throws \Exception
         */
-       public static function fetchFirst($sql) {
+       public static function fetchFirst($sql)
+       {
                $params = self::getParam(func_get_args());
 
-               $stmt = self::p($sql, $params);
-
-               if (is_bool($stmt)) {
-                       $retval = $stmt;
-               } else {
-                       $retval = self::fetch($stmt);
-               }
-
-               self::close($stmt);
-
-               return $retval;
+               return self::getClass(Database::class)->fetchFirst($sql, $params);
        }
 
        /**
@@ -788,8 +213,9 @@ class DBA
         *
         * @return int Number of rows
         */
-       public static function affectedRows() {
-               return self::$affected_rows;
+       public static function affectedRows()
+       {
+               return self::getClass(Database::class)->affectedRows();
        }
 
        /**
@@ -798,17 +224,9 @@ class DBA
         * @param object Statement object
         * @return int Number of columns
         */
-       public static function columnCount($stmt) {
-               if (!is_object($stmt)) {
-                       return 0;
-               }
-               switch (self::$driver) {
-                       case 'pdo':
-                               return $stmt->columnCount();
-                       case 'mysqli':
-                               return $stmt->field_count;
-               }
-               return 0;
+       public static function columnCount($stmt)
+       {
+               return self::getClass(Database::class)->columnCount($stmt);
        }
        /**
         * @brief Returns the number of rows of a statement
@@ -816,17 +234,9 @@ class DBA
         * @param PDOStatement|mysqli_result|mysqli_stmt Statement object
         * @return int Number of rows
         */
-       public static function numRows($stmt) {
-               if (!is_object($stmt)) {
-                       return 0;
-               }
-               switch (self::$driver) {
-                       case 'pdo':
-                               return $stmt->rowCount();
-                       case 'mysqli':
-                               return $stmt->num_rows;
-               }
-               return 0;
+       public static function numRows($stmt)
+       {
+               return self::getClass(Database::class)->numRows($stmt);
        }
 
        /**
@@ -835,109 +245,24 @@ class DBA
         * @param mixed $stmt statement object
         * @return array current row
         */
-       public static function fetch($stmt) {
-
-               $stamp1 = microtime(true);
-
-               $columns = [];
-
-               if (!is_object($stmt)) {
-                       return false;
-               }
-
-               switch (self::$driver) {
-                       case 'pdo':
-                               $columns = $stmt->fetch(PDO::FETCH_ASSOC);
-                               break;
-                       case 'mysqli':
-                               if (get_class($stmt) == 'mysqli_result') {
-                                       $columns = $stmt->fetch_assoc();
-                                       break;
-                               }
-
-                               // This code works, but is slow
-
-                               // Bind the result to a result array
-                               $cols = [];
-
-                               $cols_num = [];
-                               for ($x = 0; $x < $stmt->field_count; $x++) {
-                                       $cols[] = &$cols_num[$x];
-                               }
-
-                               call_user_func_array([$stmt, 'bind_result'], $cols);
-
-                               if (!$stmt->fetch()) {
-                                       return false;
-                               }
-
-                               // The slow part:
-                               // We need to get the field names for the array keys
-                               // It seems that there is no better way to do this.
-                               $result = $stmt->result_metadata();
-                               $fields = $result->fetch_fields();
-
-                               foreach ($cols_num AS $param => $col) {
-                                       $columns[$fields[$param]->name] = $col;
-                               }
-               }
-
-               self::$profiler->saveTimestamp($stamp1, 'database', System::callstack());
-
-               return $columns;
-       }
-
-       /**
-        * @brief Insert a row into a table
-        *
-        * @param string/array $table Table name
-        *
-        * @return string formatted and sanitzed table name
-        * @throws \Exception
-        */
-       public static function formatTableName($table)
+       public static function fetch($stmt)
        {
-               if (is_string($table)) {
-                       return "`" . self::sanitizeIdentifier($table) . "`";
-               }
-
-               if (!is_array($table)) {
-                       return '';
-               }
-
-               $scheme = key($table);
-
-               return "`" . self::sanitizeIdentifier($scheme) . "`.`" . self::sanitizeIdentifier($table[$scheme]) . "`";
+               return self::getClass(Database::class)->fetch($stmt);
        }
 
        /**
         * @brief Insert a row into a table
         *
-        * @param string $table               Table name
-        * @param array  $param               parameter array
-        * @param bool   $on_duplicate_update Do an update on a duplicate entry
+        * @param string|array $table               Table name or array [schema => table]
+        * @param array        $param               parameter array
+        * @param bool         $on_duplicate_update Do an update on a duplicate entry
         *
         * @return boolean was the insert successful?
         * @throws \Exception
         */
-       public static function insert($table, $param, $on_duplicate_update = false) {
-
-               if (empty($table) || empty($param)) {
-                       self::$logger->info('Table and fields have to be set');
-                       return false;
-               }
-
-               $sql = "INSERT INTO " . self::formatTableName($table) . " (`".implode("`, `", array_keys($param))."`) VALUES (".
-                       substr(str_repeat("?, ", count($param)), 0, -2).")";
-
-               if ($on_duplicate_update) {
-                       $sql .= " ON DUPLICATE KEY UPDATE `".implode("` = ?, `", array_keys($param))."` = ?";
-
-                       $values = array_values($param);
-                       $param = array_merge_recursive($values, $values);
-               }
-
-               return self::e($sql, $param);
+       public static function insert($table, $param, $on_duplicate_update = false)
+       {
+               return self::getClass(Database::class)->insert($table, $param, $on_duplicate_update);
        }
 
        /**
@@ -945,16 +270,9 @@ class DBA
         *
         * @return integer Last inserted id
         */
-       public static function lastInsertId() {
-               switch (self::$driver) {
-                       case 'pdo':
-                               $id = self::$connection->lastInsertId();
-                               break;
-                       case 'mysqli':
-                               $id = self::$connection->insert_id;
-                               break;
-               }
-               return $id;
+       public static function lastInsertId()
+       {
+               return self::getClass(Database::class)->lastInsertId();
        }
 
        /**
@@ -962,36 +280,14 @@ class DBA
         *
         * This function can be extended in the future to accept a table array as well.
         *
-        * @param string $table Table name
+        * @param string|array $table Table name or array [schema => table]
         *
         * @return boolean was the lock successful?
         * @throws \Exception
         */
-       public static function lock($table) {
-               // See here: https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html
-               if (self::$driver == 'pdo') {
-                       self::e("SET autocommit=0");
-                       self::$connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
-               } else {
-                       self::$connection->autocommit(false);
-               }
-
-               $success = self::e("LOCK TABLES " . self::formatTableName($table) ." WRITE");
-
-               if (self::$driver == 'pdo') {
-                       self::$connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
-               }
-
-               if (!$success) {
-                       if (self::$driver == 'pdo') {
-                               self::e("SET autocommit=1");
-                       } else {
-                               self::$connection->autocommit(true);
-                       }
-               } else {
-                       self::$in_transaction = true;
-               }
-               return $success;
+       public static function lock($table)
+       {
+               return self::getClass(Database::class)->lock($table);
        }
 
        /**
@@ -1000,25 +296,9 @@ class DBA
         * @return boolean was the unlock successful?
         * @throws \Exception
         */
-       public static function unlock() {
-               // See here: https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html
-               self::performCommit();
-
-               if (self::$driver == 'pdo') {
-                       self::$connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
-               }
-
-               $success = self::e("UNLOCK TABLES");
-
-               if (self::$driver == 'pdo') {
-                       self::$connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
-                       self::e("SET autocommit=1");
-               } else {
-                       self::$connection->autocommit(true);
-               }
-
-               self::$in_transaction = false;
-               return $success;
+       public static function unlock()
+       {
+               return self::getClass(Database::class)->unlock();
        }
 
        /**
@@ -1026,44 +306,9 @@ class DBA
         *
         * @return boolean Was the command executed successfully?
         */
-       public static function transaction() {
-               if (!self::performCommit()) {
-                       return false;
-               }
-
-               switch (self::$driver) {
-                       case 'pdo':
-                               if (!self::$connection->inTransaction() && !self::$connection->beginTransaction()) {
-                                       return false;
-                               }
-                               break;
-
-                       case 'mysqli':
-                               if (!self::$connection->begin_transaction()) {
-                                       return false;
-                               }
-                               break;
-               }
-
-               self::$in_transaction = true;
-               return true;
-       }
-
-       private static function performCommit()
+       public static function transaction()
        {
-               switch (self::$driver) {
-                       case 'pdo':
-                               if (!self::$connection->inTransaction()) {
-                                       return true;
-                               }
-
-                               return self::$connection->commit();
-
-                       case 'mysqli':
-                               return self::$connection->commit();
-               }
-
-               return true;
+               return self::getClass(Database::class)->transaction();
        }
 
        /**
@@ -1071,12 +316,9 @@ class DBA
         *
         * @return boolean Was the command executed successfully?
         */
-       public static function commit() {
-               if (!self::performCommit()) {
-                       return false;
-               }
-               self::$in_transaction = false;
-               return true;
+       public static function commit()
+       {
+               return self::getClass(Database::class)->commit();
        }
 
        /**
@@ -1084,45 +326,9 @@ class DBA
         *
         * @return boolean Was the command executed successfully?
         */
-       public static function rollback() {
-               $ret = false;
-
-               switch (self::$driver) {
-                       case 'pdo':
-                               if (!self::$connection->inTransaction()) {
-                                       $ret = true;
-                                       break;
-                               }
-                               $ret = self::$connection->rollBack();
-                               break;
-
-                       case 'mysqli':
-                               $ret = self::$connection->rollback();
-                               break;
-               }
-               self::$in_transaction = false;
-               return $ret;
-       }
-
-       /**
-        * @brief Build the array with the table relations
-        *
-        * The array is build from the database definitions in DBStructure.php
-        *
-        * This process must only be started once, since the value is cached.
-        */
-       private static function buildRelationData() {
-               $definition = DBStructure::definition(self::$configCache->get('system', 'basepath'));
-
-               foreach ($definition AS $table => $structure) {
-                       foreach ($structure['fields'] AS $field => $field_struct) {
-                               if (isset($field_struct['relation'])) {
-                                       foreach ($field_struct['relation'] AS $rel_table => $rel_field) {
-                                               self::$relation[$rel_table][$rel_field][$table][] = $field;
-                                       }
-                               }
-                       }
-               }
+       public static function rollback()
+       {
+               return self::getClass(Database::class)->rollback();
        }
 
        /**
@@ -1133,145 +339,13 @@ class DBA
         * @param array  $options
         *                           - cascade: If true we delete records in other tables that depend on the one we're deleting through
         *                           relations (default: true)
-        * @param array  $callstack  Internal use: prevent endless loops
         *
         * @return boolean was the delete successful?
         * @throws \Exception
         */
-       public static function delete($table, array $conditions, array $options = [], array &$callstack = [])
+       public static function delete($table, array $conditions, array $options = [])
        {
-               if (empty($table) || empty($conditions)) {
-                       self::$logger->info('Table and conditions have to be set');
-                       return false;
-               }
-
-               $commands = [];
-
-               // Create a key for the loop prevention
-               $key = $table . ':' . json_encode($conditions);
-
-               // We quit when this key already exists in the callstack.
-               if (isset($callstack[$key])) {
-                       return $commands;
-               }
-
-               $callstack[$key] = true;
-
-               $table = self::sanitizeIdentifier($table);
-
-               $commands[$key] = ['table' => $table, 'conditions' => $conditions];
-
-               // Don't use "defaults" here, since it would set "false" to "true"
-               if (isset($options['cascade'])) {
-                       $cascade = $options['cascade'];
-               } else {
-                       $cascade = true;
-               }
-
-               // To speed up the whole process we cache the table relations
-               if ($cascade && count(self::$relation) == 0) {
-                       self::buildRelationData();
-               }
-
-               // Is there a relation entry for the table?
-               if ($cascade && isset(self::$relation[$table])) {
-                       // We only allow a simple "one field" relation.
-                       $field = array_keys(self::$relation[$table])[0];
-                       $rel_def = array_values(self::$relation[$table])[0];
-
-                       // Create a key for preventing double queries
-                       $qkey = $field . '-' . $table . ':' . json_encode($conditions);
-
-                       // When the search field is the relation field, we don't need to fetch the rows
-                       // This is useful when the leading record is already deleted in the frontend but the rest is done in the backend
-                       if ((count($conditions) == 1) && ($field == array_keys($conditions)[0])) {
-                               foreach ($rel_def AS $rel_table => $rel_fields) {
-                                       foreach ($rel_fields AS $rel_field) {
-                                               self::delete($rel_table, [$rel_field => array_values($conditions)[0]], $options, $callstack);
-                                       }
-                               }
-                               // We quit when this key already exists in the callstack.
-                       } elseif (!isset($callstack[$qkey])) {
-                               $callstack[$qkey] = true;
-
-                               // Fetch all rows that are to be deleted
-                               $data = self::select($table, [$field], $conditions);
-
-                               while ($row = self::fetch($data)) {
-                                       self::delete($table, [$field => $row[$field]], $options, $callstack);
-                               }
-
-                               self::close($data);
-
-                               // Since we had split the delete command we don't need the original command anymore
-                               unset($commands[$key]);
-                       }
-               }
-
-               // Now we finalize the process
-               $do_transaction = !self::$in_transaction;
-
-               if ($do_transaction) {
-                       self::transaction();
-               }
-
-               $compacted = [];
-               $counter = [];
-
-               foreach ($commands AS $command) {
-                       $conditions = $command['conditions'];
-                       reset($conditions);
-                       $first_key = key($conditions);
-
-                       $condition_string = self::buildCondition($conditions);
-
-                       if ((count($command['conditions']) > 1) || is_int($first_key)) {
-                               $sql = "DELETE FROM `" . $command['table'] . "`" . $condition_string;
-                               self::$logger->debug(self::replaceParameters($sql, $conditions));
-
-                               if (!self::e($sql, $conditions)) {
-                                       if ($do_transaction) {
-                                               self::rollback();
-                                       }
-                                       return false;
-                               }
-                       } else {
-                               $key_table = $command['table'];
-                               $key_condition = array_keys($command['conditions'])[0];
-                               $value = array_values($command['conditions'])[0];
-
-                               // Split the SQL queries in chunks of 100 values
-                               // We do the $i stuff here to make the code better readable
-                               $i = isset($counter[$key_table][$key_condition]) ? $counter[$key_table][$key_condition] : 0;
-                               if (isset($compacted[$key_table][$key_condition][$i]) && count($compacted[$key_table][$key_condition][$i]) > 100) {
-                                       ++$i;
-                               }
-
-                               $compacted[$key_table][$key_condition][$i][$value] = $value;
-                               $counter[$key_table][$key_condition] = $i;
-                       }
-               }
-               foreach ($compacted AS $table => $values) {
-                       foreach ($values AS $field => $field_value_list) {
-                               foreach ($field_value_list AS $field_values) {
-                                       $sql = "DELETE FROM `" . $table . "` WHERE `" . $field . "` IN (" .
-                                               substr(str_repeat("?, ", count($field_values)), 0, -2) . ");";
-
-                                       self::$logger->debug(self::replaceParameters($sql, $field_values));
-
-                                       if (!self::e($sql, $field_values)) {
-                                               if ($do_transaction) {
-                                                       self::rollback();
-                                               }
-                                               return false;
-                                       }
-                               }
-                       }
-               }
-               if ($do_transaction) {
-                       self::commit();
-               }
-               return true;
+               return self::getClass(Database::class)->delete($table, $conditions, $options);
        }
 
        /**
@@ -1295,7 +369,7 @@ class DBA
         * Only set $old_fields to a boolean value when you are sure that you will update a single row.
         * When you set $old_fields to "true" then $fields must contain all relevant fields!
         *
-        * @param string        $table      Table name
+        * @param string|array  $table      Table name or array [schema => table]
         * @param array         $fields     contains the fields that are updated
         * @param array         $condition  condition array with the key values
         * @param array|boolean $old_fields array with the old field values that are about to be replaced (true = update on duplicate)
@@ -1303,88 +377,52 @@ class DBA
         * @return boolean was the update successfull?
         * @throws \Exception
         */
-       public static function update($table, $fields, $condition, $old_fields = []) {
-
-               if (empty($table) || empty($fields) || empty($condition)) {
-                       self::$logger->info('Table, fields and condition have to be set');
-                       return false;
-               }
-
-               $condition_string = self::buildCondition($condition);
-
-               if (is_bool($old_fields)) {
-                       $do_insert = $old_fields;
-
-                       $old_fields = self::selectFirst($table, [], $condition);
-
-                       if (is_bool($old_fields)) {
-                               if ($do_insert) {
-                                       $values = array_merge($condition, $fields);
-                                       return self::insert($table, $values, $do_insert);
-                               }
-                               $old_fields = [];
-                       }
-               }
-
-               $do_update = (count($old_fields) == 0);
-
-               foreach ($old_fields AS $fieldname => $content) {
-                       if (isset($fields[$fieldname])) {
-                               if (($fields[$fieldname] == $content) && !is_null($content)) {
-                                       unset($fields[$fieldname]);
-                               } else {
-                                       $do_update = true;
-                               }
-                       }
-               }
-
-               if (!$do_update || (count($fields) == 0)) {
-                       return true;
-               }
-
-               $sql = "UPDATE ". self::formatTableName($table) . " SET `".
-                       implode("` = ?, `", array_keys($fields))."` = ?".$condition_string;
-
-               $params1 = array_values($fields);
-               $params2 = array_values($condition);
-               $params = array_merge_recursive($params1, $params2);
-
-               return self::e($sql, $params);
+       public static function update($table, $fields, $condition, $old_fields = [])
+       {
+               return self::getClass(Database::class)->update($table, $fields, $condition, $old_fields);
        }
 
        /**
         * Retrieve a single record from a table and returns it in an associative array
         *
         * @brief Retrieve a single record from a table
-        * @param string $table
-        * @param array  $fields
-        * @param array  $condition
-        * @param array  $params
+        * @param string|array $table     Table name or array [schema => table]
+        * @param array        $fields
+        * @param array        $condition
+        * @param array        $params
         * @return bool|array
         * @throws \Exception
         * @see   self::select
         */
        public static function selectFirst($table, array $fields = [], array $condition = [], $params = [])
        {
-               $params['limit'] = 1;
-               $result = self::select($table, $fields, $condition, $params);
+               return self::getClass(Database::class)->selectFirst($table, $fields, $condition, $params);
+       }
 
-               if (is_bool($result)) {
-                       return $result;
-               } else {
-                       $row = self::fetch($result);
-                       self::close($result);
-                       return $row;
-               }
+       /**
+        * @brief Select rows from a table and fills an array with the data
+        *
+        * @param string|array $table     Table name or array [schema => table]
+        * @param array        $fields    Array of selected fields, empty for all
+        * @param array        $condition Array of fields for condition
+        * @param array        $params    Array of several parameters
+        *
+        * @return array Data array
+        * @throws \Exception
+        * @see   self::select
+        */
+       public static function selectToArray(string $table, array $fields = [], array $condition = [], array $params = [])
+       {
+               return self::getClass(Database::class)->selectToArray($table, $fields, $condition, $params);
        }
 
        /**
         * @brief Select rows from a table
         *
-        * @param string $table     Table name
-        * @param array  $fields    Array of selected fields, empty for all
-        * @param array  $condition Array of fields for condition
-        * @param array  $params    Array of several parameters
+        * @param string|array $table     Table name or array [schema => table]
+        * @param array        $fields    Array of selected fields, empty for all
+        * @param array        $condition Array of fields for condition
+        * @param array        $params    Array of several parameters
         *
         * @return boolean|object
         *
@@ -1403,32 +441,14 @@ class DBA
         */
        public static function select($table, array $fields = [], array $condition = [], array $params = [])
        {
-               if (empty($table)) {
-                       return false;
-               }
-
-               if (count($fields) > 0) {
-                       $select_fields = "`" . implode("`, `", array_values($fields)) . "`";
-               } else {
-                       $select_fields = "*";
-               }
-
-               $condition_string = self::buildCondition($condition);
-
-               $param_string = self::buildParameter($params);
-
-               $sql = "SELECT " . $select_fields . " FROM " . self::formatTableName($table) . $condition_string . $param_string;
-
-               $result = self::p($sql, $condition);
-
-               return $result;
+               return self::getClass(Database::class)->select($table, $fields, $condition, $params);
        }
 
        /**
         * @brief Counts the rows from a table satisfying the provided condition
         *
-        * @param string $table     Table name
-        * @param array  $condition array of fields for condition
+        * @param string|array $table     Table name or array [schema => table]
+        * @param array        $condition array of fields for condition
         *
         * @return int
         *
@@ -1444,17 +464,48 @@ class DBA
         */
        public static function count($table, array $condition = [])
        {
-               if (empty($table)) {
-                       return false;
+               return self::getClass(Database::class)->count($table, $condition);
+       }
+
+       /**
+        * Build the table query substring from one or more tables, with or without a schema.
+        *
+        * Expected formats:
+        * - table
+        * - [table1, table2, ...]
+        * - [schema1 => table1, schema2 => table2, table3, ...]
+        *
+        * @param string|array $tables
+        * @return string
+        */
+       public static function buildTableString($tables)
+       {
+               if (is_string($tables)) {
+                       $tables = [$tables];
                }
 
-               $condition_string = self::buildCondition($condition);
+               $quotedTables = [];
 
-               $sql = "SELECT COUNT(*) AS `count` FROM " . self::formatTableName($table) . $condition_string;
+               foreach ($tables as $schema => $table) {
+                       if (is_numeric($schema)) {
+                               $quotedTables[] = self::quoteIdentifier($table);
+                       } else {
+                               $quotedTables[] = self::quoteIdentifier($schema) . '.' . self::quoteIdentifier($table);
+                       }
+               }
 
-               $row = self::fetchFirst($sql, $condition);
+               return implode(', ', $quotedTables);
+       }
 
-               return $row['count'];
+       /**
+        * Escape an identifier (table or field name)
+        *
+        * @param $identifier
+        * @return string
+        */
+       public static function quoteIdentifier($identifier)
+       {
+               return '`' . str_replace('`', '``', $identifier) . '`';
        }
 
        /**
@@ -1517,12 +568,12 @@ class DBA
 
                                                $new_values = array_merge($new_values, array_values($value));
                                                $placeholders = substr(str_repeat("?, ", count($value)), 0, -2);
-                                               $condition_string .= "`" . $field . "` IN (" . $placeholders . ")";
+                                               $condition_string .= self::quoteIdentifier($field) . " IN (" . $placeholders . ")";
                                        } elseif (is_null($value)) {
-                                               $condition_string .= "`" . $field . "` IS NULL";
+                                               $condition_string .= self::quoteIdentifier($field) . " IS NULL";
                                        } else {
                                                $new_values[$field] = $value;
-                                               $condition_string .= "`" . $field . "` = ?";
+                                               $condition_string .= self::quoteIdentifier($field) . " = ?";
                                        }
                                }
                                $condition_string = " WHERE (" . $condition_string . ")";
@@ -1542,12 +593,8 @@ class DBA
        public static function buildParameter(array $params = [])
        {
                $groupby_string = '';
-               if (isset($params['group_by'])) {
-                       $groupby_string = " GROUP BY ";
-                       foreach ($params['group_by'] as $fields) {
-                               $groupby_string .= "`" . $fields . "`, ";
-                       }
-                       $groupby_string = substr($groupby_string, 0, -2);
+               if (!empty($params['group_by'])) {
+                       $groupby_string = " GROUP BY " . implode(', ', array_map(['self', 'quoteIdentifier'], $params['group_by']));
                }
 
                $order_string = '';
@@ -1557,9 +604,9 @@ class DBA
                                if ($order === 'RAND()') {
                                        $order_string .= "RAND(), ";
                                } elseif (!is_int($fields)) {
-                                       $order_string .= "`" . $fields . "` " . ($order ? "DESC" : "ASC") . ", ";
+                                       $order_string .= self::quoteIdentifier($fields) . " " . ($order ? "DESC" : "ASC") . ", ";
                                } else {
-                                       $order_string .= "`" . $order . "`, ";
+                                       $order_string .= self::quoteIdentifier($order) . ", ";
                                }
                        }
                        $order_string = substr($order_string, 0, -2);
@@ -1584,19 +631,9 @@ class DBA
         * @param bool   $do_close
         * @return array Data array
         */
-       public static function toArray($stmt, $do_close = true) {
-               if (is_bool($stmt)) {
-                       return $stmt;
-               }
-
-               $data = [];
-               while ($row = self::fetch($stmt)) {
-                       $data[] = $row;
-               }
-               if ($do_close) {
-                       self::close($stmt);
-               }
-               return $data;
+       public static function toArray($stmt, $do_close = true)
+       {
+               return self::getClass(Database::class)->toArray($stmt, $do_close);
        }
 
        /**
@@ -1604,8 +641,9 @@ class DBA
         *
         * @return string Error number (0 if no error)
         */
-       public static function errorNo() {
-               return self::$errorno;
+       public static function errorNo()
+       {
+               return self::getClass(Database::class)->errorNo();
        }
 
        /**
@@ -1613,8 +651,9 @@ class DBA
         *
         * @return string Error message ('' if no error)
         */
-       public static function errorMessage() {
-               return self::$error;
+       public static function errorMessage()
+       {
+               return self::getClass(Database::class)->errorMessage();
        }
 
        /**
@@ -1623,37 +662,9 @@ class DBA
         * @param object $stmt statement object
         * @return boolean was the close successful?
         */
-       public static function close($stmt) {
-
-               $stamp1 = microtime(true);
-
-               if (!is_object($stmt)) {
-                       return false;
-               }
-
-               switch (self::$driver) {
-                       case 'pdo':
-                               $ret = $stmt->closeCursor();
-                               break;
-                       case 'mysqli':
-                               // MySQLi offers both a mysqli_stmt and a mysqli_result class.
-                               // We should be careful not to assume the object type of $stmt
-                               // because DBA::p() has been able to return both types.
-                               if ($stmt instanceof mysqli_stmt) {
-                                       $stmt->free_result();
-                                       $ret = $stmt->close();
-                               } elseif ($stmt instanceof mysqli_result) {
-                                       $stmt->free();
-                                       $ret = true;
-                               } else {
-                                       $ret = false;
-                               }
-                               break;
-               }
-
-               self::$profiler->saveTimestamp($stamp1, 'database', System::callstack());
-
-               return $ret;
+       public static function close($stmt)
+       {
+               return self::getClass(Database::class)->close($stmt);
        }
 
        /**
@@ -1666,29 +677,7 @@ class DBA
         */
        public static function processlist()
        {
-               $ret = self::p("SHOW PROCESSLIST");
-               $data = self::toArray($ret);
-
-               $processes = 0;
-               $states = [];
-               foreach ($data as $process) {
-                       $state = trim($process["State"]);
-
-                       // Filter out all non blocking processes
-                       if (!in_array($state, ["", "init", "statistics", "updating"])) {
-                               ++$states[$state];
-                               ++$processes;
-                       }
-               }
-
-               $statelist = "";
-               foreach ($states as $state => $usage) {
-                       if ($statelist != "") {
-                               $statelist .= ", ";
-                       }
-                       $statelist .= $state.": ".$usage;
-               }
-               return(["list" => $statelist, "amount" => $processes]);
+               return self::getClass(Database::class)->processlist();
        }
 
        /**
@@ -1700,44 +689,7 @@ class DBA
         */
        public static function isResult($array)
        {
-               // It could be a return value from an update statement
-               if (is_bool($array)) {
-                       return $array;
-               }
-
-               if (is_object($array)) {
-                       return self::numRows($array) > 0;
-               }
-
-               return (is_array($array) && (count($array) > 0));
-       }
-
-       /**
-        * @brief Callback function for "esc_array"
-        *
-        * @param mixed   $value         Array value
-        * @param string  $key           Array key
-        * @param boolean $add_quotation add quotation marks for string values
-        * @return void
-        */
-       private static function escapeArrayCallback(&$value, $key, $add_quotation)
-       {
-               if (!$add_quotation) {
-                       if (is_bool($value)) {
-                               $value = ($value ? '1' : '0');
-                       } else {
-                               $value = self::escape($value);
-                       }
-                       return;
-               }
-
-               if (is_bool($value)) {
-                       $value = ($value ? 'true' : 'false');
-               } elseif (is_float($value) || is_integer($value)) {
-                       $value = (string) $value;
-               } else {
-                       $value = "'" . self::escape($value) . "'";
-               }
+               return self::getClass(Database::class)->isResult($array);
        }
 
        /**
@@ -1749,6 +701,6 @@ class DBA
         */
        public static function escapeArray(&$arr, $add_quotation = false)
        {
-               array_walk($arr, 'self::escapeArrayCallback', $add_quotation);
+               return self::getClass(Database::class)->escapeArray($arr, $add_quotation);
        }
 }
index abbac4e781795a700b10c52c95cbecf0abc0aeb2..cf707f205528aa4a1086884710f1deba573ea1f2 100644 (file)
@@ -40,16 +40,19 @@ class DBStructure
         */
        public static function convertToInnoDB()
        {
-               $r = q("SELECT `TABLE_NAME` FROM `information_schema`.`tables` WHERE `engine` = 'MyISAM' AND `table_schema` = '%s'",
-                       DBA::escape(DBA::databaseName()));
+               $tables = DBA::selectToArray(
+                       ['information_schema' => 'tables'],
+                       ['table_name'],
+                       ['engine' => 'MyISAM', 'table_schema' => DBA::databaseName()]
+               );
 
-               if (!DBA::isResult($r)) {
+               if (!DBA::isResult($tables)) {
                        echo L10n::t('There are no tables on MyISAM.') . "\n";
                        return;
                }
 
-               foreach ($r AS $table) {
-                       $sql = sprintf("ALTER TABLE `%s` engine=InnoDB;", DBA::escape($table['TABLE_NAME']));
+               foreach ($tables AS $table) {
+                       $sql = "ALTER TABLE " . DBA::quoteIdentifier($table['TABLE_NAME']) . " engine=InnoDB;";
                        echo $sql . "\n";
 
                        $result = DBA::e($sql);
@@ -96,7 +99,7 @@ class DBStructure
         * Loads the database structure definition from the config/dbstructure.config.php file.
         * On first pass, defines DB_UPDATE_VERSION constant.
         *
-        * @see config/dbstructure.config.php
+        * @see static/dbstructure.config.php
         * @param boolean $with_addons_structure Whether to tack on addons additional tables
         * @param string  $basePath              The base path of this application
         * @return array
@@ -106,16 +109,16 @@ class DBStructure
        {
                if (!self::$definition) {
 
-                       $filename = $basePath . '/config/dbstructure.config.php';
+                       $filename = $basePath . '/static/dbstructure.config.php';
 
                        if (!is_readable($filename)) {
-                               throw new Exception('Missing database structure config file config/dbstructure.config.php');
+                               throw new Exception('Missing database structure config file static/dbstructure.config.php');
                        }
 
                        $definition = require $filename;
 
                        if (!$definition) {
-                               throw new Exception('Corrupted database structure config file config/dbstructure.config.php');
+                               throw new Exception('Corrupted database structure config file static/dbstructure.config.php');
                        }
 
                        self::$definition = $definition;
@@ -817,7 +820,7 @@ class DBStructure
        /**
         *    Check if a table exists
         *
-        * @param string $table Table name
+        * @param string|array $table Table name
         *
         * @return boolean Does the table exist?
         * @throws Exception
@@ -828,21 +831,15 @@ class DBStructure
                        return false;
                }
 
-               $table = DBA::escape($table);
-
-               $sql = "SHOW TABLES LIKE '" . $table . "';";
-
-               $stmt = DBA::p($sql);
-
-               if (is_bool($stmt)) {
-                       $retval = $stmt;
+               if (is_array($table)) {
+                       $condition = ['table_schema' => key($table), 'table_name' => current($table)];
                } else {
-                       $retval = (DBA::numRows($stmt) > 0);
+                       $condition = ['table_schema' => DBA::databaseName(), 'table_name' => $table];
                }
 
-               DBA::close($stmt);
+               $result = DBA::exists(['information_schema' => 'tables'], $condition);
 
-               return $retval;
+               return $result;
        }
 
        /**
diff --git a/src/Database/Database.php b/src/Database/Database.php
new file mode 100644 (file)
index 0000000..d3ec4d5
--- /dev/null
@@ -0,0 +1,1677 @@
+<?php
+
+namespace Friendica\Database;
+
+use Friendica\Core\Config\Cache\ConfigCache;
+use Friendica\Core\System;
+use Friendica\Util\DateTimeFormat;
+use Friendica\Util\Profiler;
+use mysqli;
+use mysqli_result;
+use mysqli_stmt;
+use PDO;
+use PDOException;
+use PDOStatement;
+use Psr\Log\LoggerInterface;
+
+/**
+ * @class MySQL database class
+ *
+ * This class is for the low level database stuff that does driver specific things.
+ */
+class Database
+{
+       protected $connected = false;
+
+       /**
+        * @var ConfigCache
+        */
+       protected $configCache;
+       /**
+        * @var Profiler
+        */
+       protected $profiler;
+       /**
+        * @var LoggerInterface
+        */
+       protected $logger;
+       protected $server_info    = '';
+       /** @var PDO|mysqli */
+       protected $connection;
+       protected $driver;
+       private $error          = false;
+       private $errorno        = 0;
+       private $affected_rows  = 0;
+       protected $in_transaction = false;
+       protected $in_retrial     = false;
+       private $relation       = [];
+
+       public function __construct(ConfigCache $configCache, Profiler $profiler, LoggerInterface $logger, array $server = [])
+       {
+               // We are storing these values for being able to perform a reconnect
+               $this->configCache   = $configCache;
+               $this->profiler      = $profiler;
+               $this->logger        = $logger;
+
+               $this->readServerVariables($server);
+               $this->connect();
+
+               if ($this->isConnected()) {
+                       // Loads DB_UPDATE_VERSION constant
+                       DBStructure::definition($configCache->get('system', 'basepath'), false);
+               }
+       }
+
+       private function readServerVariables(array $server)
+       {
+               // Use environment variables for mysql if they are set beforehand
+               if (!empty($server['MYSQL_HOST'])
+                   && !empty($server['MYSQL_USERNAME'] || !empty($server['MYSQL_USER']))
+                   && $server['MYSQL_PASSWORD'] !== false
+                   && !empty($server['MYSQL_DATABASE']))
+               {
+                       $db_host = $server['MYSQL_HOST'];
+                       if (!empty($server['MYSQL_PORT'])) {
+                               $db_host .= ':' . $server['MYSQL_PORT'];
+                       }
+                       $this->configCache->set('database', 'hostname', $db_host);
+                       unset($db_host);
+                       if (!empty($server['MYSQL_USERNAME'])) {
+                               $this->configCache->set('database', 'username', $server['MYSQL_USERNAME']);
+                       } else {
+                               $this->configCache->set('database', 'username', $server['MYSQL_USER']);
+                       }
+                       $this->configCache->set('database', 'password', (string) $server['MYSQL_PASSWORD']);
+                       $this->configCache->set('database', 'database', $server['MYSQL_DATABASE']);
+               }
+       }
+
+       public function connect()
+       {
+               if (!is_null($this->connection) && $this->connected()) {
+                       return true;
+               }
+
+               $port       = 0;
+               $serveraddr = trim($this->configCache->get('database', 'hostname'));
+               $serverdata = explode(':', $serveraddr);
+               $server     = $serverdata[0];
+               if (count($serverdata) > 1) {
+                       $port = trim($serverdata[1]);
+               }
+               $server  = trim($server);
+               $user    = trim($this->configCache->get('database', 'username'));
+               $pass    = trim($this->configCache->get('database', 'password'));
+               $db      = trim($this->configCache->get('database', 'database'));
+               $charset = trim($this->configCache->get('database', 'charset'));
+
+               if (!(strlen($server) && strlen($user))) {
+                       return false;
+               }
+
+               if (class_exists('\PDO') && in_array('mysql', PDO::getAvailableDrivers())) {
+                       $this->driver = 'pdo';
+                       $connect      = "mysql:host=" . $server . ";dbname=" . $db;
+
+                       if ($port > 0) {
+                               $connect .= ";port=" . $port;
+                       }
+
+                       if ($charset) {
+                               $connect .= ";charset=" . $charset;
+                       }
+
+                       try {
+                               $this->connection = @new PDO($connect, $user, $pass);
+                               $this->connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
+                               $this->connected = true;
+                       } catch (PDOException $e) {
+                               /// @TODO At least log exception, don't ignore it!
+                       }
+               }
+
+               if (!$this->connected && class_exists('\mysqli')) {
+                       $this->driver = 'mysqli';
+
+                       if ($port > 0) {
+                               $this->connection = @new mysqli($server, $user, $pass, $db, $port);
+                       } else {
+                               $this->connection = @new mysqli($server, $user, $pass, $db);
+                       }
+
+                       if (!mysqli_connect_errno()) {
+                               $this->connected = true;
+
+                               if ($charset) {
+                                       $this->connection->set_charset($charset);
+                               }
+                       }
+               }
+
+               // No suitable SQL driver was found.
+               if (!$this->connected) {
+                       $this->driver     = null;
+                       $this->connection = null;
+               }
+
+               return $this->connected;
+       }
+
+       /**
+        * Sets the logger for DBA
+        *
+        * @note this is necessary because if we want to load the logger configuration
+        *       from the DB, but there's an error, we would print out an exception.
+        *       So the logger gets updated after the logger configuration can be retrieved
+        *       from the database
+        *
+        * @param LoggerInterface $logger
+        */
+       public function setLogger(LoggerInterface $logger)
+       {
+               $this->logger = $logger;
+       }
+
+       /**
+        * Sets the profiler for DBA
+        *
+        * @param Profiler $profiler
+        */
+       public function setProfiler(Profiler $profiler)
+       {
+               $this->profiler = $profiler;
+       }
+       /**
+        * Disconnects the current database connection
+        */
+       public function disconnect()
+       {
+               if (is_null($this->connection)) {
+                       return;
+               }
+
+               switch ($this->driver) {
+                       case 'pdo':
+                               $this->connection = null;
+                               break;
+                       case 'mysqli':
+                               $this->connection->close();
+                               $this->connection = null;
+                               break;
+               }
+       }
+
+       /**
+        * Perform a reconnect of an existing database connection
+        */
+       public function reconnect()
+       {
+               $this->disconnect();
+               return $this->connect();
+       }
+
+       /**
+        * Return the database object.
+        *
+        * @return PDO|mysqli
+        */
+       public function getConnection()
+       {
+               return $this->connection;
+       }
+
+       /**
+        * @brief Returns the MySQL server version string
+        *
+        * This function discriminate between the deprecated mysql API and the current
+        * object-oriented mysqli API. Example of returned string: 5.5.46-0+deb8u1
+        *
+        * @return string
+        */
+       public function serverInfo()
+       {
+               if ($this->server_info == '') {
+                       switch ($this->driver) {
+                               case 'pdo':
+                                       $this->server_info = $this->connection->getAttribute(PDO::ATTR_SERVER_VERSION);
+                                       break;
+                               case 'mysqli':
+                                       $this->server_info = $this->connection->server_info;
+                                       break;
+                       }
+               }
+               return $this->server_info;
+       }
+
+       /**
+        * @brief Returns the selected database name
+        *
+        * @return string
+        * @throws \Exception
+        */
+       public function databaseName()
+       {
+               $ret  = $this->p("SELECT DATABASE() AS `db`");
+               $data = $this->toArray($ret);
+               return $data[0]['db'];
+       }
+
+       /**
+        * @brief Analyze a database query and log this if some conditions are met.
+        *
+        * @param string $query The database query that will be analyzed
+        *
+        * @throws \Exception
+        */
+       private function logIndex($query)
+       {
+
+               if (!$this->configCache->get('system', 'db_log_index')) {
+                       return;
+               }
+
+               // Don't explain an explain statement
+               if (strtolower(substr($query, 0, 7)) == "explain") {
+                       return;
+               }
+
+               // Only do the explain on "select", "update" and "delete"
+               if (!in_array(strtolower(substr($query, 0, 6)), ["select", "update", "delete"])) {
+                       return;
+               }
+
+               $r = $this->p("EXPLAIN " . $query);
+               if (!$this->isResult($r)) {
+                       return;
+               }
+
+               $watchlist = explode(',', $this->configCache->get('system', 'db_log_index_watch'));
+               $blacklist = explode(',', $this->configCache->get('system', 'db_log_index_blacklist'));
+
+               while ($row = $this->fetch($r)) {
+                       if ((intval($this->configCache->get('system', 'db_loglimit_index')) > 0)) {
+                               $log = (in_array($row['key'], $watchlist) &&
+                                       ($row['rows'] >= intval($this->configCache->get('system', 'db_loglimit_index'))));
+                       } else {
+                               $log = false;
+                       }
+
+                       if ((intval($this->configCache->get('system', 'db_loglimit_index_high')) > 0) && ($row['rows'] >= intval($this->configCache->get('system', 'db_loglimit_index_high')))) {
+                               $log = true;
+                       }
+
+                       if (in_array($row['key'], $blacklist) || ($row['key'] == "")) {
+                               $log = false;
+                       }
+
+                       if ($log) {
+                               $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
+                               @file_put_contents($this->configCache->get('system', 'db_log_index'), DateTimeFormat::utcNow() . "\t" .
+                                                                                                     $row['key'] . "\t" . $row['rows'] . "\t" . $row['Extra'] . "\t" .
+                                                                                                     basename($backtrace[1]["file"]) . "\t" .
+                                                                                                     $backtrace[1]["line"] . "\t" . $backtrace[2]["function"] . "\t" .
+                                                                                                     substr($query, 0, 2000) . "\n", FILE_APPEND);
+                       }
+               }
+       }
+
+       /**
+        * Removes every not whitelisted character from the identifier string
+        *
+        * @param string $identifier
+        *
+        * @return string sanitized identifier
+        * @throws \Exception
+        */
+       private function sanitizeIdentifier($identifier)
+       {
+               return preg_replace('/[^A-Za-z0-9_\-]+/', '', $identifier);
+       }
+
+       public function escape($str)
+       {
+               if ($this->connected) {
+                       switch ($this->driver) {
+                               case 'pdo':
+                                       return substr(@$this->connection->quote($str, PDO::PARAM_STR), 1, -1);
+
+                               case 'mysqli':
+                                       return @$this->connection->real_escape_string($str);
+                       }
+               } else {
+                       return str_replace("'", "\\'", $str);
+               }
+       }
+
+       public function isConnected()
+       {
+               return $this->connected;
+       }
+
+       public function connected()
+       {
+               $connected = false;
+
+               if (is_null($this->connection)) {
+                       return false;
+               }
+
+               switch ($this->driver) {
+                       case 'pdo':
+                               $r = $this->p("SELECT 1");
+                               if ($this->isResult($r)) {
+                                       $row       = $this->toArray($r);
+                                       $connected = ($row[0]['1'] == '1');
+                               }
+                               break;
+                       case 'mysqli':
+                               $connected = $this->connection->ping();
+                               break;
+               }
+               return $connected;
+       }
+
+       /**
+        * @brief Replaces ANY_VALUE() function by MIN() function,
+        *  if the database server does not support ANY_VALUE().
+        *
+        * Considerations for Standard SQL, or MySQL with ONLY_FULL_GROUP_BY (default since 5.7.5).
+        * ANY_VALUE() is available from MySQL 5.7.5 https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html
+        * A standard fall-back is to use MIN().
+        *
+        * @param string $sql An SQL string without the values
+        *
+        * @return string The input SQL string modified if necessary.
+        */
+       public function anyValueFallback($sql)
+       {
+               $server_info = $this->serverInfo();
+               if (version_compare($server_info, '5.7.5', '<') ||
+                   (stripos($server_info, 'MariaDB') !== false)) {
+                       $sql = str_ireplace('ANY_VALUE(', 'MIN(', $sql);
+               }
+               return $sql;
+       }
+
+       /**
+        * @brief Replaces the ? placeholders with the parameters in the $args array
+        *
+        * @param string $sql  SQL query
+        * @param array  $args The parameters that are to replace the ? placeholders
+        *
+        * @return string The replaced SQL query
+        */
+       private function replaceParameters($sql, $args)
+       {
+               $offset = 0;
+               foreach ($args AS $param => $value) {
+                       if (is_int($args[$param]) || is_float($args[$param])) {
+                               $replace = intval($args[$param]);
+                       } else {
+                               $replace = "'" . $this->escape($args[$param]) . "'";
+                       }
+
+                       $pos = strpos($sql, '?', $offset);
+                       if ($pos !== false) {
+                               $sql = substr_replace($sql, $replace, $pos, 1);
+                       }
+                       $offset = $pos + strlen($replace);
+               }
+               return $sql;
+       }
+
+       /**
+        * @brief Executes a prepared statement that returns data
+        * @usage Example: $r = p("SELECT * FROM `item` WHERE `guid` = ?", $guid);
+        *
+        * Please only use it with complicated queries.
+        * For all regular queries please use DBA::select or DBA::exists
+        *
+        * @param string $sql SQL statement
+        *
+        * @return bool|object statement object or result object
+        * @throws \Exception
+        */
+       public function p($sql)
+       {
+
+               $stamp1 = microtime(true);
+
+               $params = DBA::getParam(func_get_args());
+
+               // Renumber the array keys to be sure that they fit
+               $i    = 0;
+               $args = [];
+               foreach ($params AS $param) {
+                       // Avoid problems with some MySQL servers and boolean values. See issue #3645
+                       if (is_bool($param)) {
+                               $param = (int)$param;
+                       }
+                       $args[++$i] = $param;
+               }
+
+               if (!$this->connected) {
+                       return false;
+               }
+
+               if ((substr_count($sql, '?') != count($args)) && (count($args) > 0)) {
+                       // Question: Should we continue or stop the query here?
+                       $this->logger->warning('Query parameters mismatch.', ['query' => $sql, 'args' => $args, 'callstack' => System::callstack()]);
+               }
+
+               $sql = DBA::cleanQuery($sql);
+               $sql = $this->anyValueFallback($sql);
+
+               $orig_sql = $sql;
+
+               if ($this->configCache->get('system', 'db_callstack') !== null) {
+                       $sql = "/*" . System::callstack() . " */ " . $sql;
+               }
+
+               $this->error         = '';
+               $this->errorno       = 0;
+               $this->affected_rows = 0;
+
+               // We have to make some things different if this function is called from "e"
+               $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2);
+
+               if (isset($trace[1])) {
+                       $called_from = $trace[1];
+               } else {
+                       // We use just something that is defined to avoid warnings
+                       $called_from = $trace[0];
+               }
+               // We are having an own error logging in the function "e"
+               $called_from_e = ($called_from['function'] == 'e');
+
+               switch ($this->driver) {
+                       case 'pdo':
+                               // If there are no arguments we use "query"
+                               if (count($args) == 0) {
+                                       if (!$retval = $this->connection->query($sql)) {
+                                               $errorInfo     = $this->connection->errorInfo();
+                                               $this->error   = $errorInfo[2];
+                                               $this->errorno = $errorInfo[1];
+                                               $retval        = false;
+                                               break;
+                                       }
+                                       $this->affected_rows = $retval->rowCount();
+                                       break;
+                               }
+
+                               /** @var $stmt mysqli_stmt|PDOStatement */
+                               if (!$stmt = $this->connection->prepare($sql)) {
+                                       $errorInfo     = $this->connection->errorInfo();
+                                       $this->error   = $errorInfo[2];
+                                       $this->errorno = $errorInfo[1];
+                                       $retval        = false;
+                                       break;
+                               }
+
+                               foreach ($args AS $param => $value) {
+                                       if (is_int($args[$param])) {
+                                               $data_type = PDO::PARAM_INT;
+                                       } else {
+                                               $data_type = PDO::PARAM_STR;
+                                       }
+                                       $stmt->bindParam($param, $args[$param], $data_type);
+                               }
+
+                               if (!$stmt->execute()) {
+                                       $errorInfo     = $stmt->errorInfo();
+                                       $this->error   = $errorInfo[2];
+                                       $this->errorno = $errorInfo[1];
+                                       $retval        = false;
+                               } else {
+                                       $retval              = $stmt;
+                                       $this->affected_rows = $retval->rowCount();
+                               }
+                               break;
+                       case 'mysqli':
+                               // There are SQL statements that cannot be executed with a prepared statement
+                               $parts           = explode(' ', $orig_sql);
+                               $command         = strtolower($parts[0]);
+                               $can_be_prepared = in_array($command, ['select', 'update', 'insert', 'delete']);
+
+                               // The fallback routine is called as well when there are no arguments
+                               if (!$can_be_prepared || (count($args) == 0)) {
+                                       $retval = $this->connection->query($this->replaceParameters($sql, $args));
+                                       if ($this->connection->errno) {
+                                               $this->error   = $this->connection->error;
+                                               $this->errorno = $this->connection->errno;
+                                               $retval        = false;
+                                       } else {
+                                               if (isset($retval->num_rows)) {
+                                                       $this->affected_rows = $retval->num_rows;
+                                               } else {
+                                                       $this->affected_rows = $this->connection->affected_rows;
+                                               }
+                                       }
+                                       break;
+                               }
+
+                               $stmt = $this->connection->stmt_init();
+
+                               if (!$stmt->prepare($sql)) {
+                                       $this->error   = $stmt->error;
+                                       $this->errorno = $stmt->errno;
+                                       $retval        = false;
+                                       break;
+                               }
+
+                               $param_types = '';
+                               $values      = [];
+                               foreach ($args AS $param => $value) {
+                                       if (is_int($args[$param])) {
+                                               $param_types .= 'i';
+                                       } elseif (is_float($args[$param])) {
+                                               $param_types .= 'd';
+                                       } elseif (is_string($args[$param])) {
+                                               $param_types .= 's';
+                                       } else {
+                                               $param_types .= 'b';
+                                       }
+                                       $values[] = &$args[$param];
+                               }
+
+                               if (count($values) > 0) {
+                                       array_unshift($values, $param_types);
+                                       call_user_func_array([$stmt, 'bind_param'], $values);
+                               }
+
+                               if (!$stmt->execute()) {
+                                       $this->error   = $this->connection->error;
+                                       $this->errorno = $this->connection->errno;
+                                       $retval        = false;
+                               } else {
+                                       $stmt->store_result();
+                                       $retval              = $stmt;
+                                       $this->affected_rows = $retval->affected_rows;
+                               }
+                               break;
+               }
+
+               // We are having an own error logging in the function "e"
+               if (($this->errorno != 0) && !$called_from_e) {
+                       // We have to preserve the error code, somewhere in the logging it get lost
+                       $error   = $this->error;
+                       $errorno = $this->errorno;
+
+                       $this->logger->error('DB Error', [
+                               'code'      => $this->errorno,
+                               'error'     => $this->error,
+                               'callstack' => System::callstack(8),
+                               'params'    => $this->replaceParameters($sql, $args),
+                       ]);
+
+                       // On a lost connection we try to reconnect - but only once.
+                       if ($errorno == 2006) {
+                               if ($this->in_retrial || !$this->reconnect()) {
+                                       // It doesn't make sense to continue when the database connection was lost
+                                       if ($this->in_retrial) {
+                                               $this->logger->notice('Giving up retrial because of database error', [
+                                                       'code'  => $this->errorno,
+                                                       'error' => $this->error,
+                                               ]);
+                                       } else {
+                                               $this->logger->notice('Couldn\'t reconnect after database error', [
+                                                       'code'  => $this->errorno,
+                                                       'error' => $this->error,
+                                               ]);
+                                       }
+                                       exit(1);
+                               } else {
+                                       // We try it again
+                                       $this->logger->notice('Reconnected after database error', [
+                                               'code'  => $this->errorno,
+                                               'error' => $this->error,
+                                       ]);
+                                       $this->in_retrial = true;
+                                       $ret              = $this->p($sql, $args);
+                                       $this->in_retrial = false;
+                                       return $ret;
+                               }
+                       }
+
+                       $this->error   = $error;
+                       $this->errorno = $errorno;
+               }
+
+               $this->profiler->saveTimestamp($stamp1, 'database', System::callstack());
+
+               if ($this->configCache->get('system', 'db_log')) {
+                       $stamp2   = microtime(true);
+                       $duration = (float)($stamp2 - $stamp1);
+
+                       if (($duration > $this->configCache->get('system', 'db_loglimit'))) {
+                               $duration  = round($duration, 3);
+                               $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
+
+                               @file_put_contents($this->configCache->get('system', 'db_log'), DateTimeFormat::utcNow() . "\t" . $duration . "\t" .
+                                                                                               basename($backtrace[1]["file"]) . "\t" .
+                                                                                               $backtrace[1]["line"] . "\t" . $backtrace[2]["function"] . "\t" .
+                                                                                               substr($this->replaceParameters($sql, $args), 0, 2000) . "\n", FILE_APPEND);
+                       }
+               }
+               return $retval;
+       }
+
+       /**
+        * @brief Executes a prepared statement like UPDATE or INSERT that doesn't return data
+        *
+        * Please use DBA::delete, DBA::insert, DBA::update, ... instead
+        *
+        * @param string $sql SQL statement
+        *
+        * @return boolean Was the query successfull? False is returned only if an error occurred
+        * @throws \Exception
+        */
+       public function e($sql)
+       {
+
+               $stamp = microtime(true);
+
+               $params = DBA::getParam(func_get_args());
+
+               // In a case of a deadlock we are repeating the query 20 times
+               $timeout = 20;
+
+               do {
+                       $stmt = $this->p($sql, $params);
+
+                       if (is_bool($stmt)) {
+                               $retval = $stmt;
+                       } elseif (is_object($stmt)) {
+                               $retval = true;
+                       } else {
+                               $retval = false;
+                       }
+
+                       $this->close($stmt);
+
+               } while (($this->errorno == 1213) && (--$timeout > 0));
+
+               if ($this->errorno != 0) {
+                       // We have to preserve the error code, somewhere in the logging it get lost
+                       $error   = $this->error;
+                       $errorno = $this->errorno;
+
+                       $this->logger->error('DB Error', [
+                               'code'      => $this->errorno,
+                               'error'     => $this->error,
+                               'callstack' => System::callstack(8),
+                               'params'    => $this->replaceParameters($sql, $params),
+                       ]);
+
+                       // On a lost connection we simply quit.
+                       // A reconnect like in $this->p could be dangerous with modifications
+                       if ($errorno == 2006) {
+                               $this->logger->notice('Giving up because of database error', [
+                                       'code'  => $this->errorno,
+                                       'error' => $this->error,
+                               ]);
+                               exit(1);
+                       }
+
+                       $this->error   = $error;
+                       $this->errorno = $errorno;
+               }
+
+               $this->profiler->saveTimestamp($stamp, "database_write", System::callstack());
+
+               return $retval;
+       }
+
+       /**
+        * @brief Check if data exists
+        *
+        * @param string|array $table     Table name or array [schema => table]
+        * @param array        $condition array of fields for condition
+        *
+        * @return boolean Are there rows for that condition?
+        * @throws \Exception
+        */
+       public function exists($table, $condition)
+       {
+               if (empty($table)) {
+                       return false;
+               }
+
+               $fields = [];
+
+               if (empty($condition)) {
+                       return DBStructure::existsTable($table);
+               }
+
+               reset($condition);
+               $first_key = key($condition);
+               if (!is_int($first_key)) {
+                       $fields = [$first_key];
+               }
+
+               $stmt = $this->select($table, $fields, $condition, ['limit' => 1]);
+
+               if (is_bool($stmt)) {
+                       $retval = $stmt;
+               } else {
+                       $retval = ($this->numRows($stmt) > 0);
+               }
+
+               $this->close($stmt);
+
+               return $retval;
+       }
+
+       /**
+        * Fetches the first row
+        *
+        * Please use DBA::selectFirst or DBA::exists whenever this is possible.
+        *
+        * @brief Fetches the first row
+        *
+        * @param string $sql SQL statement
+        *
+        * @return array first row of query
+        * @throws \Exception
+        */
+       public function fetchFirst($sql)
+       {
+               $params = DBA::getParam(func_get_args());
+
+               $stmt = $this->p($sql, $params);
+
+               if (is_bool($stmt)) {
+                       $retval = $stmt;
+               } else {
+                       $retval = $this->fetch($stmt);
+               }
+
+               $this->close($stmt);
+
+               return $retval;
+       }
+
+       /**
+        * @brief Returns the number of affected rows of the last statement
+        *
+        * @return int Number of rows
+        */
+       public function affectedRows()
+       {
+               return $this->affected_rows;
+       }
+
+       /**
+        * @brief Returns the number of columns of a statement
+        *
+        * @param object Statement object
+        *
+        * @return int Number of columns
+        */
+       public function columnCount($stmt)
+       {
+               if (!is_object($stmt)) {
+                       return 0;
+               }
+               switch ($this->driver) {
+                       case 'pdo':
+                               return $stmt->columnCount();
+                       case 'mysqli':
+                               return $stmt->field_count;
+               }
+               return 0;
+       }
+
+       /**
+        * @brief Returns the number of rows of a statement
+        *
+        * @param PDOStatement|mysqli_result|mysqli_stmt Statement object
+        *
+        * @return int Number of rows
+        */
+       public function numRows($stmt)
+       {
+               if (!is_object($stmt)) {
+                       return 0;
+               }
+               switch ($this->driver) {
+                       case 'pdo':
+                               return $stmt->rowCount();
+                       case 'mysqli':
+                               return $stmt->num_rows;
+               }
+               return 0;
+       }
+
+       /**
+        * @brief Fetch a single row
+        *
+        * @param mixed $stmt statement object
+        *
+        * @return array current row
+        */
+       public function fetch($stmt)
+       {
+
+               $stamp1 = microtime(true);
+
+               $columns = [];
+
+               if (!is_object($stmt)) {
+                       return false;
+               }
+
+               switch ($this->driver) {
+                       case 'pdo':
+                               $columns = $stmt->fetch(PDO::FETCH_ASSOC);
+                               break;
+                       case 'mysqli':
+                               if (get_class($stmt) == 'mysqli_result') {
+                                       $columns = $stmt->fetch_assoc();
+                                       break;
+                               }
+
+                               // This code works, but is slow
+
+                               // Bind the result to a result array
+                               $cols = [];
+
+                               $cols_num = [];
+                               for ($x = 0; $x < $stmt->field_count; $x++) {
+                                       $cols[] = &$cols_num[$x];
+                               }
+
+                               call_user_func_array([$stmt, 'bind_result'], $cols);
+
+                               if (!$stmt->fetch()) {
+                                       return false;
+                               }
+
+                               // The slow part:
+                               // We need to get the field names for the array keys
+                               // It seems that there is no better way to do this.
+                               $result = $stmt->result_metadata();
+                               $fields = $result->fetch_fields();
+
+                               foreach ($cols_num AS $param => $col) {
+                                       $columns[$fields[$param]->name] = $col;
+                               }
+               }
+
+               $this->profiler->saveTimestamp($stamp1, 'database', System::callstack());
+
+               return $columns;
+       }
+
+       /**
+        * @brief Insert a row into a table
+        *
+        * @param string|array $table               Table name or array [schema => table]
+        * @param array        $param               parameter array
+        * @param bool         $on_duplicate_update Do an update on a duplicate entry
+        *
+        * @return boolean was the insert successful?
+        * @throws \Exception
+        */
+       public function insert($table, $param, $on_duplicate_update = false)
+       {
+               if (empty($table) || empty($param)) {
+                       $this->logger->info('Table and fields have to be set');
+                       return false;
+               }
+
+               $table_string = DBA::buildTableString($table);
+
+               $fields_string = implode(', ', array_map([DBA::class, 'quoteIdentifier'], array_keys($param)));
+
+               $values_string = substr(str_repeat("?, ", count($param)), 0, -2);
+
+               $sql = "INSERT INTO " . $table_string . " (" . $fields_string . ") VALUES (" . $values_string . ")";
+
+               if ($on_duplicate_update) {
+                       $fields_string = implode(' = ?, ', array_map([DBA::class, 'quoteIdentifier'], array_keys($param)));
+
+                       $sql .= " ON DUPLICATE KEY UPDATE " . $fields_string . " = ?";
+
+                       $values = array_values($param);
+                       $param  = array_merge_recursive($values, $values);
+               }
+
+               return $this->e($sql, $param);
+       }
+
+       /**
+        * @brief Fetch the id of the last insert command
+        *
+        * @return integer Last inserted id
+        */
+       public function lastInsertId()
+       {
+               switch ($this->driver) {
+                       case 'pdo':
+                               $id = $this->connection->lastInsertId();
+                               break;
+                       case 'mysqli':
+                               $id = $this->connection->insert_id;
+                               break;
+               }
+               return $id;
+       }
+
+       /**
+        * @brief Locks a table for exclusive write access
+        *
+        * This function can be extended in the future to accept a table array as well.
+        *
+        * @param string|array $table Table name or array [schema => table]
+        *
+        * @return boolean was the lock successful?
+        * @throws \Exception
+        */
+       public function lock($table)
+       {
+               // See here: https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html
+               if ($this->driver == 'pdo') {
+                       $this->e("SET autocommit=0");
+                       $this->connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
+               } else {
+                       $this->connection->autocommit(false);
+               }
+
+               $success = $this->e("LOCK TABLES " . DBA::buildTableString($table) . " WRITE");
+
+               if ($this->driver == 'pdo') {
+                       $this->connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
+               }
+
+               if (!$success) {
+                       if ($this->driver == 'pdo') {
+                               $this->e("SET autocommit=1");
+                       } else {
+                               $this->connection->autocommit(true);
+                       }
+               } else {
+                       $this->in_transaction = true;
+               }
+               return $success;
+       }
+
+       /**
+        * @brief Unlocks all locked tables
+        *
+        * @return boolean was the unlock successful?
+        * @throws \Exception
+        */
+       public function unlock()
+       {
+               // See here: https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html
+               $this->performCommit();
+
+               if ($this->driver == 'pdo') {
+                       $this->connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
+               }
+
+               $success = $this->e("UNLOCK TABLES");
+
+               if ($this->driver == 'pdo') {
+                       $this->connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
+                       $this->e("SET autocommit=1");
+               } else {
+                       $this->connection->autocommit(true);
+               }
+
+               $this->in_transaction = false;
+               return $success;
+       }
+
+       /**
+        * @brief Starts a transaction
+        *
+        * @return boolean Was the command executed successfully?
+        */
+       public function transaction()
+       {
+               if (!$this->performCommit()) {
+                       return false;
+               }
+
+               switch ($this->driver) {
+                       case 'pdo':
+                               if (!$this->connection->inTransaction() && !$this->connection->beginTransaction()) {
+                                       return false;
+                               }
+                               break;
+
+                       case 'mysqli':
+                               if (!$this->connection->begin_transaction()) {
+                                       return false;
+                               }
+                               break;
+               }
+
+               $this->in_transaction = true;
+               return true;
+       }
+
+       protected function performCommit()
+       {
+               switch ($this->driver) {
+                       case 'pdo':
+                               if (!$this->connection->inTransaction()) {
+                                       return true;
+                               }
+
+                               return $this->connection->commit();
+
+                       case 'mysqli':
+                               return $this->connection->commit();
+               }
+
+               return true;
+       }
+
+       /**
+        * @brief Does a commit
+        *
+        * @return boolean Was the command executed successfully?
+        */
+       public function commit()
+       {
+               if (!$this->performCommit()) {
+                       return false;
+               }
+               $this->in_transaction = false;
+               return true;
+       }
+
+       /**
+        * @brief Does a rollback
+        *
+        * @return boolean Was the command executed successfully?
+        */
+       public function rollback()
+       {
+               $ret = false;
+
+               switch ($this->driver) {
+                       case 'pdo':
+                               if (!$this->connection->inTransaction()) {
+                                       $ret = true;
+                                       break;
+                               }
+                               $ret = $this->connection->rollBack();
+                               break;
+
+                       case 'mysqli':
+                               $ret = $this->connection->rollback();
+                               break;
+               }
+               $this->in_transaction = false;
+               return $ret;
+       }
+
+       /**
+        * @brief Build the array with the table relations
+        *
+        * The array is build from the database definitions in DBStructure.php
+        *
+        * This process must only be started once, since the value is cached.
+        */
+       private function buildRelationData()
+       {
+               $definition = DBStructure::definition($this->configCache->get('system', 'basepath'));
+
+               foreach ($definition AS $table => $structure) {
+                       foreach ($structure['fields'] AS $field => $field_struct) {
+                               if (isset($field_struct['relation'])) {
+                                       foreach ($field_struct['relation'] AS $rel_table => $rel_field) {
+                                               $this->relation[$rel_table][$rel_field][$table][] = $field;
+                                       }
+                               }
+                       }
+               }
+       }
+
+       /**
+        * @brief Delete a row from a table
+        *
+        * Note: this methods does NOT accept schema => table arrays because of the complex relation stuff.
+        *
+        * @param string $table      Table name
+        * @param array  $conditions Field condition(s)
+        * @param array  $options
+        *                           - cascade: If true we delete records in other tables that depend on the one we're deleting through
+        *                           relations (default: true)
+        * @param array  $callstack  Internal use: prevent endless loops
+        *
+        * @return boolean was the delete successful?
+        * @throws \Exception
+        */
+       public function delete($table, array $conditions, array $options = [], array &$callstack = [])
+       {
+               if (empty($table) || empty($conditions)) {
+                       $this->logger->info('Table and conditions have to be set');
+                       return false;
+               }
+
+               $commands = [];
+
+               // Create a key for the loop prevention
+               $key = $table . ':' . json_encode($conditions);
+
+               // We quit when this key already exists in the callstack.
+               if (isset($callstack[$key])) {
+                       return true;
+               }
+
+               $callstack[$key] = true;
+
+               $commands[$key] = ['table' => $table, 'conditions' => $conditions];
+
+               // Don't use "defaults" here, since it would set "false" to "true"
+               if (isset($options['cascade'])) {
+                       $cascade = $options['cascade'];
+               } else {
+                       $cascade = true;
+               }
+
+               // To speed up the whole process we cache the table relations
+               if ($cascade && count($this->relation) == 0) {
+                       $this->buildRelationData();
+               }
+
+               // Is there a relation entry for the table?
+               if ($cascade && isset($this->relation[$table])) {
+                       // We only allow a simple "one field" relation.
+                       $field   = array_keys($this->relation[$table])[0];
+                       $rel_def = array_values($this->relation[$table])[0];
+
+                       // Create a key for preventing double queries
+                       $qkey = $field . '-' . $table . ':' . json_encode($conditions);
+
+                       // When the search field is the relation field, we don't need to fetch the rows
+                       // This is useful when the leading record is already deleted in the frontend but the rest is done in the backend
+                       if ((count($conditions) == 1) && ($field == array_keys($conditions)[0])) {
+                               foreach ($rel_def AS $rel_table => $rel_fields) {
+                                       foreach ($rel_fields AS $rel_field) {
+                                               $this->delete($rel_table, [$rel_field => array_values($conditions)[0]], $options, $callstack);
+                                       }
+                               }
+                               // We quit when this key already exists in the callstack.
+                       } elseif (!isset($callstack[$qkey])) {
+                               $callstack[$qkey] = true;
+
+                               // Fetch all rows that are to be deleted
+                               $data = $this->select($table, [$field], $conditions);
+
+                               while ($row = $this->fetch($data)) {
+                                       $this->delete($table, [$field => $row[$field]], $options, $callstack);
+                               }
+
+                               $this->close($data);
+
+                               // Since we had split the delete command we don't need the original command anymore
+                               unset($commands[$key]);
+                       }
+               }
+
+               // Now we finalize the process
+               $do_transaction = !$this->in_transaction;
+
+               if ($do_transaction) {
+                       $this->transaction();
+               }
+
+               $compacted = [];
+               $counter   = [];
+
+               foreach ($commands AS $command) {
+                       $conditions = $command['conditions'];
+                       reset($conditions);
+                       $first_key = key($conditions);
+
+                       $condition_string = DBA::buildCondition($conditions);
+
+                       if ((count($command['conditions']) > 1) || is_int($first_key)) {
+                               $sql = "DELETE FROM " . DBA::quoteIdentifier($command['table']) . " " . $condition_string;
+                               $this->logger->debug($this->replaceParameters($sql, $conditions));
+
+                               if (!$this->e($sql, $conditions)) {
+                                       if ($do_transaction) {
+                                               $this->rollback();
+                                       }
+                                       return false;
+                               }
+                       } else {
+                               $key_table     = $command['table'];
+                               $key_condition = array_keys($command['conditions'])[0];
+                               $value         = array_values($command['conditions'])[0];
+
+                               // Split the SQL queries in chunks of 100 values
+                               // We do the $i stuff here to make the code better readable
+                               $i = isset($counter[$key_table][$key_condition]) ? $counter[$key_table][$key_condition] : 0;
+                               if (isset($compacted[$key_table][$key_condition][$i]) && count($compacted[$key_table][$key_condition][$i]) > 100) {
+                                       ++$i;
+                               }
+
+                               $compacted[$key_table][$key_condition][$i][$value] = $value;
+                               $counter[$key_table][$key_condition]               = $i;
+                       }
+               }
+               foreach ($compacted AS $table => $values) {
+                       foreach ($values AS $field => $field_value_list) {
+                               foreach ($field_value_list AS $field_values) {
+                                       $sql = "DELETE FROM " . DBA::quoteIdentifier($table) . " WHERE " . DBA::quoteIdentifier($field) . " IN (" .
+                                              substr(str_repeat("?, ", count($field_values)), 0, -2) . ");";
+
+                                       $this->logger->debug($this->replaceParameters($sql, $field_values));
+
+                                       if (!$this->e($sql, $field_values)) {
+                                               if ($do_transaction) {
+                                                       $this->rollback();
+                                               }
+                                               return false;
+                                       }
+                               }
+                       }
+               }
+               if ($do_transaction) {
+                       $this->commit();
+               }
+               return true;
+       }
+
+       /**
+        * @brief Updates rows
+        *
+        * Updates rows in the database. When $old_fields is set to an array,
+        * the system will only do an update if the fields in that array changed.
+        *
+        * Attention:
+        * Only the values in $old_fields are compared.
+        * This is an intentional behaviour.
+        *
+        * Example:
+        * We include the timestamp field in $fields but not in $old_fields.
+        * Then the row will only get the new timestamp when the other fields had changed.
+        *
+        * When $old_fields is set to a boolean value the system will do this compare itself.
+        * When $old_fields is set to "true" the system will do an insert if the row doesn't exists.
+        *
+        * Attention:
+        * Only set $old_fields to a boolean value when you are sure that you will update a single row.
+        * When you set $old_fields to "true" then $fields must contain all relevant fields!
+        *
+        * @param string|array  $table      Table name or array [schema => table]
+        * @param array         $fields     contains the fields that are updated
+        * @param array         $condition  condition array with the key values
+        * @param array|boolean $old_fields array with the old field values that are about to be replaced (true = update on duplicate)
+        *
+        * @return boolean was the update successfull?
+        * @throws \Exception
+        */
+       public function update($table, $fields, $condition, $old_fields = [])
+       {
+               if (empty($table) || empty($fields) || empty($condition)) {
+                       $this->logger->info('Table, fields and condition have to be set');
+                       return false;
+               }
+
+               $table_string = DBA::buildTableString($table);
+
+               $condition_string = DBA::buildCondition($condition);
+
+               if (is_bool($old_fields)) {
+                       $do_insert = $old_fields;
+
+                       $old_fields = $this->selectFirst($table, [], $condition);
+
+                       if (is_bool($old_fields)) {
+                               if ($do_insert) {
+                                       $values = array_merge($condition, $fields);
+                                       return $this->insert($table, $values, $do_insert);
+                               }
+                               $old_fields = [];
+                       }
+               }
+
+               $do_update = (count($old_fields) == 0);
+
+               foreach ($old_fields AS $fieldname => $content) {
+                       if (isset($fields[$fieldname])) {
+                               if (($fields[$fieldname] == $content) && !is_null($content)) {
+                                       unset($fields[$fieldname]);
+                               } else {
+                                       $do_update = true;
+                               }
+                       }
+               }
+
+               if (!$do_update || (count($fields) == 0)) {
+                       return true;
+               }
+
+               $sql = "UPDATE " . $table_string . " SET "
+                       . implode(" = ?, ", array_map([DBA::class, 'quoteIdentifier'], array_keys($fields))) . " = ?"
+                       . $condition_string;
+
+               $params1 = array_values($fields);
+               $params2 = array_values($condition);
+               $params  = array_merge_recursive($params1, $params2);
+
+               return $this->e($sql, $params);
+       }
+
+       /**
+        * Retrieve a single record from a table and returns it in an associative array
+        *
+        * @brief Retrieve a single record from a table
+        *
+        * @param string $table
+        * @param array  $fields
+        * @param array  $condition
+        * @param array  $params
+        *
+        * @return bool|array
+        * @throws \Exception
+        * @see   $this->select
+        */
+       public function selectFirst($table, array $fields = [], array $condition = [], $params = [])
+       {
+               $params['limit'] = 1;
+               $result          = $this->select($table, $fields, $condition, $params);
+
+               if (is_bool($result)) {
+                       return $result;
+               } else {
+                       $row = $this->fetch($result);
+                       $this->close($result);
+                       return $row;
+               }
+       }
+
+       /**
+        * @brief Select rows from a table and fills an array with the data
+        *
+        * @param string|array $table     Table name or array [schema => table]
+        * @param array        $fields    Array of selected fields, empty for all
+        * @param array        $condition Array of fields for condition
+        * @param array        $params    Array of several parameters
+        *
+        * @return array Data array
+        * @throws \Exception
+        * @see   self::select
+        */
+       public function selectToArray(string $table, array $fields = [], array $condition = [], array $params = [])
+       {
+               return $this->toArray($this->select($table, $fields, $condition, $params));
+       }
+
+       /**
+        * @brief Select rows from a table
+        *
+        * @param string|array $table     Table name or array [schema => table]
+        * @param array        $fields    Array of selected fields, empty for all
+        * @param array        $condition Array of fields for condition
+        * @param array        $params    Array of several parameters
+        *
+        * @return boolean|object
+        *
+        * Example:
+        * $table = "item";
+        * $fields = array("id", "uri", "uid", "network");
+        *
+        * $condition = array("uid" => 1, "network" => 'dspr');
+        * or:
+        * $condition = array("`uid` = ? AND `network` IN (?, ?)", 1, 'dfrn', 'dspr');
+        *
+        * $params = array("order" => array("id", "received" => true), "limit" => 10);
+        *
+        * $data = DBA::select($table, $fields, $condition, $params);
+        * @throws \Exception
+        */
+       public function select($table, array $fields = [], array $condition = [], array $params = [])
+       {
+               if (empty($table)) {
+                       return false;
+               }
+
+               if (count($fields) > 0) {
+                       $select_string = implode(', ', array_map([DBA::class, 'quoteIdentifier'], $fields));
+               } else {
+                       $select_string = '*';
+               }
+
+               $table_string = DBA::buildTableString($table);
+
+               $condition_string = DBA::buildCondition($condition);
+
+               $param_string = DBA::buildParameter($params);
+
+               $sql = "SELECT " . $select_string . " FROM " . $table_string . $condition_string . $param_string;
+
+               $result = $this->p($sql, $condition);
+
+               return $result;
+       }
+
+       /**
+        * @brief Counts the rows from a table satisfying the provided condition
+        *
+        * @param string|array $table     Table name or array [schema => table]
+        * @param array        $condition Array of fields for condition
+        *
+        * @return int
+        *
+        * Example:
+        * $table = "item";
+        *
+        * $condition = ["uid" => 1, "network" => 'dspr'];
+        * or:
+        * $condition = ["`uid` = ? AND `network` IN (?, ?)", 1, 'dfrn', 'dspr'];
+        *
+        * $count = DBA::count($table, $condition);
+        * @throws \Exception
+        */
+       public function count($table, array $condition = [])
+       {
+               if (empty($table)) {
+                       return false;
+               }
+
+               $table_string = DBA::buildTableString($table);
+
+               $condition_string = DBA::buildCondition($condition);
+
+               $sql = "SELECT COUNT(*) AS `count` FROM " . $table_string . $condition_string;
+
+               $row = $this->fetchFirst($sql, $condition);
+
+               return $row['count'];
+       }
+
+       /**
+        * @brief Fills an array with data from a query
+        *
+        * @param object $stmt statement object
+        * @param bool   $do_close
+        *
+        * @return array Data array
+        */
+       public function toArray($stmt, $do_close = true)
+       {
+               if (is_bool($stmt)) {
+                       return [];
+               }
+
+               $data = [];
+               while ($row = $this->fetch($stmt)) {
+                       $data[] = $row;
+               }
+
+               if ($do_close) {
+                       $this->close($stmt);
+               }
+
+               return $data;
+       }
+
+       /**
+        * @brief Returns the error number of the last query
+        *
+        * @return string Error number (0 if no error)
+        */
+       public function errorNo()
+       {
+               return $this->errorno;
+       }
+
+       /**
+        * @brief Returns the error message of the last query
+        *
+        * @return string Error message ('' if no error)
+        */
+       public function errorMessage()
+       {
+               return $this->error;
+       }
+
+       /**
+        * @brief Closes the current statement
+        *
+        * @param object $stmt statement object
+        *
+        * @return boolean was the close successful?
+        */
+       public function close($stmt)
+       {
+
+               $stamp1 = microtime(true);
+
+               if (!is_object($stmt)) {
+                       return false;
+               }
+
+               switch ($this->driver) {
+                       case 'pdo':
+                               $ret = $stmt->closeCursor();
+                               break;
+                       case 'mysqli':
+                               // MySQLi offers both a mysqli_stmt and a mysqli_result class.
+                               // We should be careful not to assume the object type of $stmt
+                               // because DBA::p() has been able to return both types.
+                               if ($stmt instanceof mysqli_stmt) {
+                                       $stmt->free_result();
+                                       $ret = $stmt->close();
+                               } elseif ($stmt instanceof mysqli_result) {
+                                       $stmt->free();
+                                       $ret = true;
+                               } else {
+                                       $ret = false;
+                               }
+                               break;
+               }
+
+               $this->profiler->saveTimestamp($stamp1, 'database', System::callstack());
+
+               return $ret;
+       }
+
+       /**
+        * @brief Return a list of database processes
+        *
+        * @return array
+        *      'list' => List of processes, separated in their different states
+        *      'amount' => Number of concurrent database processes
+        * @throws \Exception
+        */
+       public function processlist()
+       {
+               $ret  = $this->p("SHOW PROCESSLIST");
+               $data = $this->toArray($ret);
+
+               $processes = 0;
+               $states    = [];
+               foreach ($data as $process) {
+                       $state = trim($process["State"]);
+
+                       // Filter out all non blocking processes
+                       if (!in_array($state, ["", "init", "statistics", "updating"])) {
+                               ++$states[$state];
+                               ++$processes;
+                       }
+               }
+
+               $statelist = "";
+               foreach ($states as $state => $usage) {
+                       if ($statelist != "") {
+                               $statelist .= ", ";
+                       }
+                       $statelist .= $state . ": " . $usage;
+               }
+               return (["list" => $statelist, "amount" => $processes]);
+       }
+
+       /**
+        * Checks if $array is a filled array with at least one entry.
+        *
+        * @param mixed $array A filled array with at least one entry
+        *
+        * @return boolean Whether $array is a filled array or an object with rows
+        */
+       public function isResult($array)
+       {
+               // It could be a return value from an update statement
+               if (is_bool($array)) {
+                       return $array;
+               }
+
+               if (is_object($array)) {
+                       return $this->numRows($array) > 0;
+               }
+
+               return (is_array($array) && (count($array) > 0));
+       }
+
+       /**
+        * @brief Callback function for "esc_array"
+        *
+        * @param mixed   $value         Array value
+        * @param string  $key           Array key
+        * @param boolean $add_quotation add quotation marks for string values
+        *
+        * @return void
+        */
+       private function escapeArrayCallback(&$value, $key, $add_quotation)
+       {
+               if (!$add_quotation) {
+                       if (is_bool($value)) {
+                               $value = ($value ? '1' : '0');
+                       } else {
+                               $value = $this->escape($value);
+                       }
+                       return;
+               }
+
+               if (is_bool($value)) {
+                       $value = ($value ? 'true' : 'false');
+               } elseif (is_float($value) || is_integer($value)) {
+                       $value = (string)$value;
+               } else {
+                       $value = "'" . $this->escape($value) . "'";
+               }
+       }
+
+       /**
+        * @brief Escapes a whole array
+        *
+        * @param mixed   $arr           Array with values to be escaped
+        * @param boolean $add_quotation add quotation marks for string values
+        *
+        * @return void
+        */
+       public function escapeArray(&$arr, $add_quotation = false)
+       {
+               array_walk($arr, [$this, 'escapeArrayCallback'], $add_quotation);
+       }
+}
diff --git a/src/Factory/CacheDriverFactory.php b/src/Factory/CacheDriverFactory.php
deleted file mode 100644 (file)
index 390534a..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-<?php
-
-namespace Friendica\Factory;
-
-use Friendica\Core\Cache;
-use Friendica\Core\Cache\ICacheDriver;
-use Friendica\Core\Config;
-
-/**
- * Class CacheDriverFactory
- *
- * @package Friendica\Core\Cache
- *
- * A basic class to generate a CacheDriver
- */
-class CacheDriverFactory
-{
-       /**
-        * This method creates a CacheDriver for the given cache driver name
-        *
-        * @param string $driver The name of the cache driver
-        * @return ICacheDriver  The instance of the CacheDriver
-        * @throws \Exception    The exception if something went wrong during the CacheDriver creation
-        */
-       public static function create($driver) {
-
-               switch ($driver) {
-                       case 'memcache':
-                               $memcache_host = Config::get('system', 'memcache_host');
-                               $memcache_port = Config::get('system', 'memcache_port');
-
-                               return new Cache\MemcacheCacheDriver($memcache_host, $memcache_port);
-                               break;
-
-                       case 'memcached':
-                               $memcached_hosts = Config::get('system', 'memcached_hosts');
-
-                               return new Cache\MemcachedCacheDriver($memcached_hosts);
-                               break;
-                       case 'redis':
-                               $redis_host = Config::get('system', 'redis_host');
-                               $redis_port = Config::get('system', 'redis_port');
-                               $redis_pw   = Config::get('system', 'redis_password');
-                               $redis_db   = Config::get('system', 'redis_db', 0);
-
-                               return new Cache\RedisCacheDriver($redis_host, $redis_port, $redis_db, $redis_pw);
-                               break;
-
-                       case 'apcu':
-                               return new Cache\APCuCache();
-                               break;
-
-                       default:
-                               return new Cache\DatabaseCacheDriver();
-               }
-       }
-}
diff --git a/src/Factory/CacheFactory.php b/src/Factory/CacheFactory.php
new file mode 100644 (file)
index 0000000..39b0b94
--- /dev/null
@@ -0,0 +1,101 @@
+<?php
+
+namespace Friendica\Factory;
+
+use Friendica\App\BaseURL;
+use Friendica\Core\Cache;
+use Friendica\Core\Cache\ICache;
+use Friendica\Core\Config\Configuration;
+use Friendica\Database\Database;
+use Friendica\Util\Profiler;
+use Psr\Log\LoggerInterface;
+
+/**
+ * Class CacheFactory
+ *
+ * @package Friendica\Core\Cache
+ *
+ * A basic class to generate a CacheDriver
+ */
+class CacheFactory
+{
+       /**
+        * @var string The default cache if nothing set
+        */
+       const DEFAULT_TYPE = Cache\Cache::TYPE_DATABASE;
+
+       /**
+        * @var Configuration The configuration to read parameters out of the config
+        */
+       private $config;
+
+       /**
+        * @var Database The database connection in case that the cache is used the dba connection
+        */
+       private $dba;
+
+       /**
+        * @var string The hostname, used as Prefix for Caching
+        */
+       private $hostname;
+
+       /**
+        * @var Profiler The optional profiler if the cached should be profiled
+        */
+       private $profiler;
+
+       /**
+        * @var LoggerInterface The Friendica Logger
+        */
+       private $logger;
+
+       public function __construct(BaseURL $baseURL, Configuration $config, Database $dba, Profiler $profiler, LoggerInterface $logger)
+       {
+               $this->hostname = $baseURL->getHostname();
+               $this->config   = $config;
+               $this->dba      = $dba;
+               $this->profiler = $profiler;
+               $this->logger   = $logger;
+       }
+
+       /**
+        * This method creates a CacheDriver for the given cache driver name
+        *
+        * @param string $type The cache type to create (default is per config)
+        *
+        * @return ICache  The instance of the CacheDriver
+        * @throws \Exception    The exception if something went wrong during the CacheDriver creation
+        */
+       public function create(string $type = null)
+       {
+               if (empty($type)) {
+                       $type = $this->config->get('system', 'cache_driver', self::DEFAULT_TYPE);
+               }
+
+               switch ($type) {
+                       case Cache\Cache::TYPE_MEMCACHE:
+                               $cache = new Cache\MemcacheCache($this->hostname, $this->config);
+                               break;
+                       case Cache\Cache::TYPE_MEMCACHED:
+                               $cache = new Cache\MemcachedCache($this->hostname, $this->config, $this->logger);
+                               break;
+                       case Cache\Cache::TYPE_REDIS:
+                               $cache = new Cache\RedisCache($this->hostname, $this->config);
+                               break;
+                       case Cache\Cache::TYPE_APCU:
+                               $cache = new Cache\APCuCache($this->hostname);
+                               break;
+                       default:
+                               $cache = new Cache\DatabaseCache($this->hostname, $this->dba);
+               }
+
+               $profiling = $this->config->get('system', 'profiling', false);
+
+               // In case profiling is enabled, wrap the ProfilerCache around the current cache
+               if (isset($profiling) && $profiling !== false) {
+                       return new Cache\ProfilerCache($cache, $this->profiler);
+               } else {
+                       return $cache;
+               }
+       }
+}
index 1f9662bddbdf1f15095c9f7dcc86ac4fc8c816ec..494a5c7209ae2d55323e57832a1fc56dcb935909 100644 (file)
@@ -2,11 +2,11 @@
 
 namespace Friendica\Factory;
 
-use Friendica\Core;
 use Friendica\Core\Config;
-use Friendica\Core\Config\Adapter;
 use Friendica\Core\Config\Cache;
-use Friendica\Util\Config\ConfigFileLoader;
+use Friendica\Model\Config\Config as ConfigModel;
+use Friendica\Model\Config\PConfig as PConfigModel;
+use Friendica\Util\ConfigFileLoader;
 
 class ConfigFactory
 {
@@ -15,7 +15,7 @@ class ConfigFactory
         *
         * @return Cache\ConfigCache
         */
-       public static function createCache(ConfigFileLoader $loader)
+       public function createCache(ConfigFileLoader $loader)
        {
                $configCache = new Cache\ConfigCache();
                $loader->setupCache($configCache);
@@ -25,44 +25,37 @@ class ConfigFactory
 
        /**
         * @param Cache\ConfigCache $configCache The config cache of this adapter
+        * @param ConfigModel       $configModel The configuration model
         *
         * @return Config\Configuration
         */
-       public static function createConfig(Cache\ConfigCache $configCache)
+       public function createConfig(Cache\ConfigCache $configCache, ConfigModel $configModel)
        {
                if ($configCache->get('system', 'config_adapter') === 'preload') {
-                       $configAdapter = new Adapter\PreloadConfigAdapter();
+                       $configuration = new Config\PreloadConfiguration($configCache, $configModel);
                } else {
-                       $configAdapter = new Adapter\JITConfigAdapter();
+                       $configuration = new Config\JitConfiguration($configCache, $configModel);
                }
 
-               $configuration = new Config\Configuration($configCache, $configAdapter);
-
-               // Set the config in the static container for legacy usage
-               Core\Config::init($configuration);
 
                return $configuration;
        }
 
        /**
-        * @param Cache\ConfigCache  $configCache The config cache of this adapter
-        * @param int                $uid         The UID of the current user
+        * @param Cache\ConfigCache  $configCache  The config cache
+        * @param Cache\PConfigCache $pConfigCache The personal config cache
+        * @param PConfigModel       $configModel  The configuration model
         *
         * @return Config\PConfiguration
         */
-       public static function createPConfig(Cache\ConfigCache $configCache, $uid = null)
+       public function createPConfig(Cache\ConfigCache $configCache, Cache\PConfigCache $pConfigCache, PConfigModel $configModel)
        {
                if ($configCache->get('system', 'config_adapter') === 'preload') {
-                       $configAdapter = new Adapter\PreloadPConfigAdapter($uid);
+                       $configuration = new Config\PreloadPConfiguration($pConfigCache, $configModel);
                } else {
-                       $configAdapter = new Adapter\JITPConfigAdapter();
+                       $configuration = new Config\JitPConfiguration($pConfigCache, $configModel);
                }
 
-               $configuration = new Config\PConfiguration($configCache, $configAdapter);
-
-               // Set the config in the static container for legacy usage
-               Core\PConfig::init($configuration);
-
                return $configuration;
        }
 }
diff --git a/src/Factory/DBFactory.php b/src/Factory/DBFactory.php
deleted file mode 100644 (file)
index 7caa63e..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-<?php
-
-namespace Friendica\Factory;
-
-use Friendica\Core\Config\Cache;
-use Friendica\Database;
-use Friendica\Util\Logger\VoidLogger;
-use Friendica\Util\Profiler;
-use ParagonIE\HiddenString\HiddenString;
-
-class DBFactory
-{
-       /**
-        * Initialize the DBA connection
-        *
-        * @param Cache\IConfigCache $configCache The configuration cache
-        * @param Profiler           $profiler    The profiler
-        * @param array              $server      The $_SERVER variables
-        *
-        * @throws \Exception if connection went bad
-        */
-       public static function init(Cache\IConfigCache $configCache, Profiler $profiler, array $server)
-       {
-               if (Database\DBA::connected()) {
-                       return;
-               }
-
-               $db_host = $configCache->get('database', 'hostname');
-               $db_user = $configCache->get('database', 'username');
-               $db_pass = $configCache->get('database', 'password');
-               $db_data = $configCache->get('database', 'database');
-               $charset = $configCache->get('database', 'charset');
-
-               // Use environment variables for mysql if they are set beforehand
-               if (!empty($server['MYSQL_HOST'])
-                       && !empty($server['MYSQL_USERNAME'] || !empty($server['MYSQL_USER']))
-                       && $server['MYSQL_PASSWORD'] !== false
-                       && !empty($server['MYSQL_DATABASE']))
-               {
-                       $db_host = $server['MYSQL_HOST'];
-                       if (!empty($server['MYSQL_PORT'])) {
-                               $db_host .= ':' . $server['MYSQL_PORT'];
-                       }
-                       if (!empty($server['MYSQL_USERNAME'])) {
-                               $db_user = $server['MYSQL_USERNAME'];
-                       } else {
-                               $db_user = $server['MYSQL_USER'];
-                       }
-                       $db_pass = new HiddenString((string) $server['MYSQL_PASSWORD']);
-                       $db_data = $server['MYSQL_DATABASE'];
-               }
-
-               if (Database\DBA::connect($configCache, $profiler, new VoidLogger(), $db_host, $db_user, $db_pass, $db_data, $charset)) {
-                       // Loads DB_UPDATE_VERSION constant
-                       Database\DBStructure::definition($configCache->get('system', 'basepath'), false);
-               }
-
-               unset($db_host, $db_user, $db_pass, $db_data, $charset);
-       }
-}
diff --git a/src/Factory/DependencyFactory.php b/src/Factory/DependencyFactory.php
deleted file mode 100644 (file)
index aacd155..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-
-namespace Friendica\Factory;
-
-use Friendica\App;
-use Friendica\Database\DBA;
-use Friendica\Factory;
-use Friendica\Util\BasePath;
-use Friendica\Util\BaseURL;
-use Friendica\Util\Config;
-
-class DependencyFactory
-{
-       /**
-        * Setting all default-dependencies of a friendica execution
-        *
-        * @param string $channel   The channel of this execution
-        * @param string $directory The base directory
-        * @param bool   $isBackend True, if it's a backend execution, otherwise false (Default true)
-        *
-        * @return App The application
-        *
-        * @throws \Exception
-        */
-       public static function setUp($channel, $directory, $isBackend = true)
-       {
-               $basePath = BasePath::create($directory, $_SERVER);
-               $mode = new App\Mode($basePath);
-               $router = new App\Router();
-               $configLoader = new Config\ConfigFileLoader($basePath, $mode);
-               $configCache = Factory\ConfigFactory::createCache($configLoader);
-               $profiler = Factory\ProfilerFactory::create($configCache);
-               Factory\DBFactory::init($configCache, $profiler, $_SERVER);
-               $config = Factory\ConfigFactory::createConfig($configCache);
-               // needed to call PConfig::init()
-               Factory\ConfigFactory::createPConfig($configCache);
-               $logger = Factory\LoggerFactory::create($channel, $config, $profiler);
-               DBA::setLogger($logger);
-               Factory\LoggerFactory::createDev($channel, $config, $profiler);
-               $baseURL = new BaseURL($config, $_SERVER);
-
-               return new App($config, $mode, $router, $baseURL, $logger, $profiler, $isBackend);
-       }
-}
diff --git a/src/Factory/LockFactory.php b/src/Factory/LockFactory.php
new file mode 100644 (file)
index 0000000..cee01fe
--- /dev/null
@@ -0,0 +1,126 @@
+<?php
+
+namespace Friendica\Factory;
+
+use Friendica\Core\Cache\Cache;
+use Friendica\Core\Cache\IMemoryCache;
+use Friendica\Core\Config\Configuration;
+use Friendica\Core\Lock;
+use Friendica\Database\Database;
+use Psr\Log\LoggerInterface;
+
+/**
+ * Class LockFactory
+ *
+ * @package Friendica\Core\Cache
+ *
+ * A basic class to generate a LockDriver
+ */
+class LockFactory
+{
+       /**
+        * @var string The default driver for caching
+        */
+       const DEFAULT_DRIVER = 'default';
+
+       /**
+        * @var Configuration The configuration to read parameters out of the config
+        */
+       private $config;
+
+       /**
+        * @var Database The database connection in case that the cache is used the dba connection
+        */
+       private $dba;
+
+       /**
+        * @var CacheFactory The memory cache driver in case we use it
+        */
+       private $cacheFactory;
+
+       /**
+        * @var LoggerInterface The Friendica Logger
+        */
+       private $logger;
+
+       public function __construct(CacheFactory $cacheFactory, Configuration $config, Database $dba, LoggerInterface $logger)
+       {
+               $this->cacheFactory = $cacheFactory;
+               $this->config       = $config;
+               $this->dba          = $dba;
+               $this->logger       = $logger;
+       }
+
+       public function create()
+       {
+               $lock_type = $this->config->get('system', 'lock_driver', self::DEFAULT_DRIVER);
+
+               try {
+                       switch ($lock_type) {
+                               case Cache::TYPE_MEMCACHE:
+                               case Cache::TYPE_MEMCACHED:
+                               case Cache::TYPE_REDIS:
+                               case Cache::TYPE_APCU:
+                                       $cache = $this->cacheFactory->create($lock_type);
+                                       if ($cache instanceof IMemoryCache) {
+                                               return new Lock\CacheLock($cache);
+                                       } else {
+                                               throw new \Exception(sprintf('Incompatible cache driver \'%s\' for lock used', $lock_type));
+                                       }
+                                       break;
+
+                               case 'database':
+                                       return new Lock\DatabaseLock($this->dba);
+                                       break;
+
+                               case 'semaphore':
+                                       return new Lock\SemaphoreLock();
+                                       break;
+
+                               default:
+                                       return self::useAutoDriver();
+                       }
+               } catch (\Exception $exception) {
+                       $this->logger->alert('Driver \'' . $lock_type . '\' failed - Fallback to \'useAutoDriver()\'', ['exception' => $exception]);
+                       return self::useAutoDriver();
+               }
+       }
+
+       /**
+        * @brief This method tries to find the best - local - locking method for Friendica
+        *
+        * The following sequence will be tried:
+        * 1. Semaphore Locking
+        * 2. Cache Locking
+        * 3. Database Locking
+        *
+        * @return Lock\ILock
+        */
+       private function useAutoDriver()
+       {
+               // 1. Try to use Semaphores for - local - locking
+               if (function_exists('sem_get')) {
+                       try {
+                               return new Lock\SemaphoreLock();
+                       } catch (\Exception $exception) {
+                               $this->logger->debug('Using Semaphore driver for locking failed.', ['exception' => $exception]);
+                       }
+               }
+
+               // 2. Try to use Cache Locking (don't use the DB-Cache Locking because it works different!)
+               $cache_type = $this->config->get('system', 'cache_driver', 'database');
+               if ($cache_type != Cache::TYPE_DATABASE) {
+                       try {
+                               $cache = $this->cacheFactory->create($cache_type);
+                               if ($cache instanceof IMemoryCache) {
+                                       return new Lock\CacheLock($cache);
+                               }
+                       } catch (\Exception $exception) {
+                               $this->logger->debug('Using Cache driver for locking failed.', ['exception' => $exception]);
+                       }
+               }
+
+               // 3. Use Database Locking as a Fallback
+               return new Lock\DatabaseLock($this->dba);
+       }
+}
index bdd85cf3ae3e1d48aeeb221a9ccb33f2635abd89..0feb3b2f7842b787e04084e176075c63d0b818c4 100644 (file)
@@ -4,6 +4,7 @@ namespace Friendica\Factory;
 
 use Friendica\Core\Config\Configuration;
 use Friendica\Core\Logger;
+use Friendica\Database\Database;
 use Friendica\Network\HTTPException\InternalServerErrorException;
 use Friendica\Util\Introspection;
 use Friendica\Util\Logger\Monolog\DevelopHandler;
@@ -24,6 +25,8 @@ use Psr\Log\LogLevel;
  */
 class LoggerFactory
 {
+       const DEV_CHANNEL = 'dev';
+
        /**
         * A list of classes, which shouldn't get logged
         *
@@ -35,10 +38,19 @@ class LoggerFactory
                'Friendica\\Util\\Logger',
        ];
 
+       /**
+        * Retrieve the channel based on the __FILE__
+        *
+        * @return string
+        */
+       private function findChannel()
+       {
+               return basename($_SERVER['PHP_SELF'], '.php');
+       }
+
        /**
         * Creates a new PSR-3 compliant logger instances
         *
-        * @param string        $channel  The channel of the logger instance
         * @param Configuration $config   The config
         * @param Profiler      $profiler The profiler of the app
         *
@@ -47,11 +59,11 @@ class LoggerFactory
         * @throws \Exception
         * @throws InternalServerErrorException
         */
-       public static function create($channel, Configuration $config, Profiler $profiler)
+       public function create(Database $database, Configuration $config, Profiler $profiler)
        {
                if (empty($config->get('system', 'debugging', false))) {
                        $logger = new VoidLogger();
-                       Logger::init($logger);
+                       $database->setLogger($logger);
                        return $logger;
                }
 
@@ -64,7 +76,7 @@ class LoggerFactory
                                $loggerTimeZone = new \DateTimeZone('UTC');
                                Monolog\Logger::setTimezone($loggerTimeZone);
 
-                               $logger = new Monolog\Logger($channel);
+                               $logger = new Monolog\Logger($this->findChannel());
                                $logger->pushProcessor(new Monolog\Processor\PsrLogMessageProcessor());
                                $logger->pushProcessor(new Monolog\Processor\ProcessIdProcessor());
                                $logger->pushProcessor(new Monolog\Processor\UidProcessor());
@@ -79,7 +91,7 @@ class LoggerFactory
                                break;
 
                        case 'syslog':
-                               $logger = new SyslogLogger($channel, $introspection, $loglevel);
+                               $logger = new SyslogLogger($this->findChannel(), $introspection, $loglevel);
                                break;
 
                        case 'stream':
@@ -87,7 +99,7 @@ class LoggerFactory
                                $stream = $config->get('system', 'logfile');
                                // just add a stream in case it's either writable or not file
                                if (!is_file($stream) || is_writable($stream)) {
-                                       $logger = new StreamLogger($channel, $stream, $introspection, $loglevel);
+                                       $logger = new StreamLogger($this->findChannel(), $stream, $introspection, $loglevel);
                                } else {
                                        $logger = new VoidLogger();
                                }
@@ -101,8 +113,7 @@ class LoggerFactory
                        $logger = new ProfilerLogger($logger, $profiler);
                }
 
-               Logger::init($logger);
-
+               $database->setLogger($logger);
                return $logger;
        }
 
@@ -114,7 +125,6 @@ class LoggerFactory
         *
         * It should never get filled during normal usage of Friendica
         *
-        * @param string        $channel  The channel of the logger instance
         * @param Configuration $config   The config
         * @param Profiler      $profiler The profiler of the app
         *
@@ -123,7 +133,7 @@ class LoggerFactory
         * @throws InternalServerErrorException
         * @throws \Exception
         */
-       public static function createDev($channel, Configuration $config, Profiler $profiler)
+       public static function createDev(Configuration $config, Profiler $profiler)
        {
                $debugging   = $config->get('system', 'debugging');
                $stream      = $config->get('system', 'dlogfile');
@@ -132,7 +142,6 @@ class LoggerFactory
                if ((!isset($developerIp) || !$debugging) &&
                    (!is_file($stream) || is_writable($stream))) {
                        $logger = new VoidLogger();
-                       Logger::setDevLogger($logger);
                        return $logger;
                }
 
@@ -147,7 +156,7 @@ class LoggerFactory
                                $loggerTimeZone = new \DateTimeZone('UTC');
                                Monolog\Logger::setTimezone($loggerTimeZone);
 
-                               $logger = new Monolog\Logger($channel);
+                               $logger = new Monolog\Logger(self::DEV_CHANNEL);
                                $logger->pushProcessor(new Monolog\Processor\PsrLogMessageProcessor());
                                $logger->pushProcessor(new Monolog\Processor\ProcessIdProcessor());
                                $logger->pushProcessor(new Monolog\Processor\UidProcessor());
@@ -159,12 +168,12 @@ class LoggerFactory
                                break;
 
                        case 'syslog':
-                               $logger = new SyslogLogger($channel, $introspection, LogLevel::DEBUG);
+                               $logger = new SyslogLogger(self::DEV_CHANNEL, $introspection, LogLevel::DEBUG);
                                break;
 
                        case 'stream':
                        default:
-                               $logger = new StreamLogger($channel, $stream, $introspection, LogLevel::DEBUG);
+                               $logger = new StreamLogger(self::DEV_CHANNEL, $stream, $introspection, LogLevel::DEBUG);
                                break;
                }
 
@@ -175,8 +184,6 @@ class LoggerFactory
                        $logger = new ProfilerLogger($logger, $profiler);
                }
 
-               Logger::setDevLogger($logger);
-
                return $logger;
        }
 
diff --git a/src/Factory/ProfilerFactory.php b/src/Factory/ProfilerFactory.php
deleted file mode 100644 (file)
index 19c96e8..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-
-namespace Friendica\Factory;
-
-use Friendica\Core\Config\Cache\IConfigCache;
-use Friendica\Util\Profiler;
-
-class ProfilerFactory
-{
-       /**
-        * Creates a Profiler for the current execution
-        *
-        * @param IConfigCache     $configCache The configuration cache
-        *
-        * @return Profiler
-        */
-       public static function create(IConfigCache $configCache)
-       {
-               $enabled = $configCache->get('system', 'profiler');
-               $enabled = isset($enabled) && $enabled !== '0';
-               $renderTime = $configCache->get('rendertime', 'callstack');
-               $renderTime = isset($renderTime) && $renderTime !== '0';
-
-               return new Profiler($enabled, $renderTime);
-       }
-}
index b027d6c47810d61096b44a1661924930bc1fea2e..e7191d32e8ad34b569ad6c88309f0c5ccee3efd5 100644 (file)
@@ -153,7 +153,7 @@ class APContact extends BaseObject
                        self::unarchiveInbox($apcontact['sharedinbox'], true);
                }
 
-               $apcontact['nick'] = JsonLD::fetchElement($compacted, 'as:preferredUsername', '@value');
+               $apcontact['nick'] = JsonLD::fetchElement($compacted, 'as:preferredUsername', '@value') ?? '';
                $apcontact['name'] = JsonLD::fetchElement($compacted, 'as:name', '@value');
 
                if (empty($apcontact['name'])) {
@@ -185,7 +185,12 @@ class APContact extends BaseObject
                $parts = parse_url($apcontact['url']);
                unset($parts['scheme']);
                unset($parts['path']);
-               $apcontact['addr'] = $apcontact['nick'] . '@' . str_replace('//', '', Network::unparseURL($parts));
+
+               if (!empty($apcontact['nick'])) {
+                       $apcontact['addr'] = $apcontact['nick'] . '@' . str_replace('//', '', Network::unparseURL($parts));
+               } else {
+                       $apcontact['addr'] = '';
+               }
 
                if (!empty($compacted['w3id:publicKey'])) {
                        $apcontact['pubkey'] = trim(JsonLD::fetchElement($compacted['w3id:publicKey'], 'w3id:publicKeyPem', '@value'));
@@ -237,44 +242,6 @@ class APContact extends BaseObject
                        DBA::delete('apcontact', ['url' => $url]);
                }
 
-               // Update some data in the contact table with various ways to catch them all
-               $contact_fields = ['name' => $apcontact['name'], 'about' => $apcontact['about'], 'alias' => $apcontact['alias']];
-
-               // Fetch the type and match it with the contact type
-               $contact_types = array_keys(ActivityPub::ACCOUNT_TYPES, $apcontact['type']);
-               if (!empty($contact_types)) {
-                       $contact_type = array_pop($contact_types);
-                       if (is_int($contact_type)) {
-                               $contact_fields['contact-type'] = $contact_type;
-
-                               if ($contact_fields['contact-type'] != User::ACCOUNT_TYPE_COMMUNITY) {
-                                       // Resetting the 'forum' and 'prv' field when it isn't a forum
-                                       $contact_fields['forum'] = false;
-                                       $contact_fields['prv'] = false;
-                               } else {
-                                       // Otherwise set the corresponding forum type
-                                       $contact_fields['forum'] = !$apcontact['manually-approve'];
-                                       $contact_fields['prv'] = $apcontact['manually-approve'];
-                               }
-                       }
-               }
-
-               DBA::update('contact', $contact_fields, ['nurl' => Strings::normaliseLink($url)]);
-
-               if (!empty($apcontact['photo'])) {
-                       $contacts = DBA::select('contact', ['uid', 'id'], ['nurl' => Strings::normaliseLink($url)]);
-                       while ($contact = DBA::fetch($contacts)) {
-                               Contact::updateAvatar($apcontact['photo'], $contact['uid'], $contact['id']);
-                       }
-                       DBA::close($contacts);
-               }
-
-               // Update the gcontact table
-               // These two fields don't exist in the gcontact table
-               unset($contact_fields['forum']);
-               unset($contact_fields['prv']);
-               DBA::update('gcontact', $contact_fields, ['nurl' => Strings::normaliseLink($url)]);
-
                Logger::log('Updated profile for ' . $url, Logger::DEBUG);
 
                return $apcontact;
index d65e67fe3e6a8c34adec09eb7ffca2091f8e7f2c..0073a6ed3f52f9b2ab6cddf8be1aad23aaa23858 100644 (file)
@@ -38,25 +38,24 @@ class Attach extends BaseObject
        }
 
        /**
-        * @brief Select rows from the attach table
+        * @brief Select rows from the attach table and return them as array
         *
         * @param array $fields     Array of selected fields, empty for all
         * @param array $conditions Array of fields for conditions
         * @param array $params     Array of several parameters
         *
-        * @return boolean|array
+        * @return array
         *
         * @throws \Exception
-        * @see   \Friendica\Database\DBA::select
+        * @see   \Friendica\Database\DBA::selectToArray
         */
-       public static function select(array $fields = [], array $conditions = [], array $params = [])
+       public static function selectToArray(array $fields = [], array $conditions = [], array $params = [])
        {
                if (empty($fields)) {
                        $fields = self::getFields();
                }
 
-               $r = DBA::select('attach', $fields, $conditions, $params);
-               return DBA::toArray($r);
+               return DBA::selectToArray('attach', $fields, $conditions, $params);
        }
 
        /**
@@ -264,7 +263,7 @@ class Attach extends BaseObject
        {
                if (!is_null($img)) {
                        // get items to update
-                       $items = self::select(['backend-class','backend-ref'], $conditions);
+                       $items = self::selectToArray(['backend-class','backend-ref'], $conditions);
 
                        foreach($items as $item) {
                                /** @var IStorage $backend_class */
@@ -297,7 +296,7 @@ class Attach extends BaseObject
        public static function delete(array $conditions, array $options = [])
        {
                // get items to delete data info
-               $items = self::select(['backend-class','backend-ref'], $conditions);
+               $items = self::selectToArray(['backend-class','backend-ref'], $conditions);
 
                foreach($items as $item) {
                        /** @var IStorage $backend_class */
diff --git a/src/Model/Config/Config.php b/src/Model/Config/Config.php
new file mode 100644 (file)
index 0000000..aa81f1c
--- /dev/null
@@ -0,0 +1,131 @@
+<?php
+
+namespace Friendica\Model\Config;
+
+
+/**
+ * The Config model backend, which is using the general DB-model backend for configs
+ */
+class Config extends DbaConfig
+{
+       /**
+        * Loads all configuration values and returns the loaded category as an array.
+        *
+        * @param string|null $cat The category of the configuration values to load
+        *
+        * @return array The config array
+        *
+        * @throws \Exception In case DB calls are invalid
+        */
+       public function load(string $cat = null)
+       {
+               $return = [];
+
+               if (empty($cat)) {
+                       $configs = $this->dba->select('config', ['cat', 'v', 'k']);
+               } else {
+                       $configs = $this->dba->select('config', ['cat', 'v', 'k'], ['cat' => $cat]);
+               }
+
+               while ($config = $this->dba->fetch($configs)) {
+
+                       $key   = $config['k'];
+                       $value = $this->toConfigValue($config['v']);
+
+                       // just save it in case it is set
+                       if (isset($value)) {
+                               $return[$config['cat']][$key] = $value;
+                       }
+               }
+               $this->dba->close($configs);
+
+               return $return;
+       }
+
+       /**
+        * Get a particular, system-wide config variable out of the DB with the
+        * given category name ($cat) and a key ($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 array|string|null Stored value or null if it does not exist
+        *
+        * @throws \Exception In case DB calls are invalid
+        */
+       public function get(string $cat, string $key)
+       {
+               if (!$this->isConnected()) {
+                       return null;
+               }
+
+               $config = $this->dba->selectFirst('config', ['v'], ['cat' => $cat, 'k' => $key]);
+               if ($this->dba->isResult($config)) {
+                       $value = $this->toConfigValue($config['v']);
+
+                       // just return it in case it is set
+                       if (isset($value)) {
+                               return $value;
+                       }
+               }
+
+               return null;
+       }
+
+       /**
+        * Stores a config value ($value) in the category ($cat) under the key ($key).
+        *
+        * Note: Please do not store booleans - convert to 0/1 integer values!
+        *
+        * @param string $cat   The category of the configuration value
+        * @param string $key   The configuration key to set
+        * @param mixed  $value The value to store
+        *
+        * @return bool Operation success
+        *
+        * @throws \Exception In case DB calls are invalid
+        */
+       public function set(string $cat, string $key, $value)
+       {
+               if (!$this->isConnected()) {
+                       return false;
+               }
+
+               // 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.
+               $compare_value = (!is_array($value) ? (string)$value : $value);
+               $stored_value  = $this->get($cat, $key);
+
+               if (isset($stored_value) && ($stored_value === $compare_value)) {
+                       return true;
+               }
+
+               $dbvalue = $this->toDbValue($value);
+
+               $result = $this->dba->update('config', ['v' => $dbvalue], ['cat' => $cat, 'k' => $key], true);
+
+               return $result;
+       }
+
+       /**
+        * Removes the configured value from the database.
+        *
+        * @param string $cat The category of the configuration value
+        * @param string $key The configuration key to delete
+        *
+        * @return bool Operation success
+        *
+        * @throws \Exception In case DB calls are invalid
+        */
+       public function delete(string $cat, string $key)
+       {
+               if (!$this->isConnected()) {
+                       return false;
+               }
+
+               return $this->dba->delete('config', ['cat' => $cat, 'k' => $key]);
+       }
+}
diff --git a/src/Model/Config/DbaConfig.php b/src/Model/Config/DbaConfig.php
new file mode 100644 (file)
index 0000000..cd6b6da
--- /dev/null
@@ -0,0 +1,86 @@
+<?php
+
+namespace Friendica\Model\Config;
+
+use Friendica\Database\Database;
+
+/**
+ * The DB-based model of (P-)Config values
+ * Encapsulates db-calls in case of config queries
+ */
+abstract class DbaConfig
+{
+       /** @var Database */
+       protected $dba;
+
+       /**
+        * @param Database $dba The database connection of this model
+        */
+       public function __construct(Database $dba)
+       {
+               $this->dba = $dba;
+       }
+
+       /**
+        * Checks if the model is currently connected
+        *
+        * @return bool
+        */
+       public function isConnected()
+       {
+               return $this->dba->isConnected();
+       }
+
+       /**
+        * 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;
+               }
+       }
+}
diff --git a/src/Model/Config/PConfig.php b/src/Model/Config/PConfig.php
new file mode 100644 (file)
index 0000000..2d496af
--- /dev/null
@@ -0,0 +1,135 @@
+<?php
+
+namespace Friendica\Model\Config;
+
+
+/**
+ * The Config model backend for users, which is using the general DB-model backend for user-configs
+ */
+class PConfig extends DbaConfig
+{
+       /**
+        * Loads all configuration values and returns the loaded category as an array.
+        *
+        * @param int         $uid The id of the user to load
+        * @param string|null $cat The category of the configuration values to load
+        *
+        * @return array The config array
+        *
+        * @throws \Exception In case DB calls are invalid
+        */
+       public function load(int $uid, string $cat = null)
+       {
+               $return = [];
+
+               if (empty($cat)) {
+                       $configs = $this->dba->select('pconfig', ['cat', 'v', 'k'], ['uid' => $uid]);
+               } else {
+                       $configs = $this->dba->select('pconfig', ['cat', 'v', 'k'], ['cat' => $cat, 'uid' => $uid]);
+               }
+
+               while ($config = $this->dba->fetch($configs)) {
+                       $key   = $config['k'];
+                       $value = $this->toConfigValue($config['v']);
+
+                       // just save it in case it is set
+                       if (isset($value)) {
+                               $return[$config['cat']][$key] = $value;
+                       }
+               }
+               $this->dba->close($configs);
+
+               return $return;
+       }
+
+       /**
+        * Get a particular user config variable out of the DB with the
+        * given category name ($cat) and a key ($key).
+        *
+        * Note: Boolean variables are defined as 0/1 in the database
+        *
+        * @param int         $uid The id of the user to load
+        * @param string $cat The category of the configuration value
+        * @param string $key The configuration key to query
+        *
+        * @return array|string|null Stored value or null if it does not exist
+        *
+        * @throws \Exception In case DB calls are invalid
+        */
+       public function get(int $uid, string $cat, string $key)
+       {
+               if (!$this->isConnected()) {
+                       return null;
+               }
+
+               $config = $this->dba->selectFirst('pconfig', ['v'], ['uid' => $uid, 'cat' => $cat, 'k' => $key]);
+               if ($this->dba->isResult($config)) {
+                       $value = $this->toConfigValue($config['v']);
+
+                       // just return it in case it is set
+                       if (isset($value)) {
+                               return $value;
+                       }
+               }
+
+               return null;
+       }
+
+       /**
+        * Stores a config value ($value) in the category ($cat) under the key ($key) for a
+        * given user ($uid).
+        *
+        * Note: Please do not store booleans - convert to 0/1 integer values!
+        *
+        * @param int    $uid   The id of the user to load
+        * @param string $cat   The category of the configuration value
+        * @param string $key   The configuration key to set
+        * @param mixed  $value The value to store
+        *
+        * @return bool Operation success
+        *
+        * @throws \Exception In case DB calls are invalid
+        */
+       public function set(int $uid, string $cat, string $key, $value)
+       {
+               if (!$this->isConnected()) {
+                       return false;
+               }
+
+               // 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.
+               $compare_value = (!is_array($value) ? (string)$value : $value);
+               $stored_value  = $this->get($uid, $cat, $key);
+
+               if (isset($stored_value) && ($stored_value === $compare_value)) {
+                       return true;
+               }
+
+               $dbvalue = $this->toDbValue($value);
+
+               $result = $this->dba->update('pconfig', ['v' => $dbvalue], ['uid' => $uid, 'cat' => $cat, 'k' => $key], true);
+
+               return $result;
+       }
+
+       /**
+        * Removes the configured value of the given user.
+        *
+        * @param int    $uid The id of the user to load
+        * @param string $cat The category of the configuration value
+        * @param string $key The configuration key to delete
+        *
+        * @return bool Operation success
+        *
+        * @throws \Exception In case DB calls are invalid
+        */
+       public function delete(int $uid, string $cat, string $key)
+       {
+               if (!$this->isConnected()) {
+                       return false;
+               }
+
+               return $this->dba->delete('pconfig', ['uid' => $uid, 'cat' => $cat, 'k' => $key]);
+       }
+}
index a6026d6440bf22519a806f4e0b28034cc0e76070..df3efa0c57036567144ddf536b707e0a9ed0a6c7 100644 (file)
@@ -4,6 +4,7 @@
  */
 namespace Friendica\Model;
 
+use Friendica\App\BaseURL;
 use Friendica\BaseObject;
 use Friendica\Content\Pager;
 use Friendica\Core\Config;
@@ -22,7 +23,6 @@ use Friendica\Protocol\Diaspora;
 use Friendica\Protocol\OStatus;
 use Friendica\Protocol\PortableContact;
 use Friendica\Protocol\Salmon;
-use Friendica\Util\BaseURL;
 use Friendica\Util\DateTimeFormat;
 use Friendica\Util\Network;
 use Friendica\Util\Strings;
@@ -117,11 +117,9 @@ class Contact extends BaseObject
         * @return array
         * @throws \Exception
         */
-       public static function select(array $fields = [], array $condition = [], array $params = [])
+       public static function selectToArray(array $fields = [], array $condition = [], array $params = [])
        {
-               $statement = DBA::select('contact', $fields, $condition, $params);
-
-               return DBA::toArray($statement);
+               return DBA::selectToArray('contact', $fields, $condition, $params);
        }
 
        /**
@@ -174,9 +172,75 @@ class Contact extends BaseObject
                return DBA::exists('contact', $condition);
        }
 
+       /**
+        * @brief Tests if the given contact url is a follower
+        *
+        * @param string $url Contact URL
+        * @param int    $uid User ID
+        *
+        * @return boolean is the contact id a follower?
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws \ImagickException
+        */
+       public static function isFollowerByURL($url, $uid)
+       {
+               $cid = self::getIdForURL($url, $uid, true);
+
+               if (empty($cid)) {
+                       return false;
+               }
+
+               return self::isFollower($cid, $uid);
+       }
+
+       /**
+        * @brief Tests if the given user follow the given contact
+        *
+        * @param int $cid Either public contact id or user's contact id
+        * @param int $uid User ID
+        *
+        * @return boolean is the contact url being followed?
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws \ImagickException
+        */
+       public static function isSharing($cid, $uid)
+       {
+               if (self::isBlockedByUser($cid, $uid)) {
+                       return false;
+               }
+
+               $cdata = self::getPublicAndUserContacID($cid, $uid);
+               if (empty($cdata['user'])) {
+                       return false;
+               }
+
+               $condition = ['id' => $cdata['user'], 'rel' => [self::SHARING, self::FRIEND]];
+               return DBA::exists('contact', $condition);
+       }
+
+       /**
+        * @brief Tests if the given user follow the given contact url
+        *
+        * @param string $url Contact URL
+        * @param int    $uid User ID
+        *
+        * @return boolean is the contact url being followed?
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws \ImagickException
+        */
+       public static function isSharingByURL($url, $uid)
+       {
+               $cid = self::getIdForURL($url, $uid, true);
+
+               if (empty($cid)) {
+                       return false;
+               }
+
+               return self::isSharing($cid, $uid);
+       }
+
        /**
         * @brief Get the basepath for a given contact link
-        * @todo  Add functionality to store this value in the contact table
         *
         * @param string $url The contact link
         *
@@ -186,13 +250,19 @@ class Contact extends BaseObject
         */
        public static function getBasepath($url)
        {
-               $data = Probe::uri($url);
-               if (!empty($data['baseurl'])) {
-                       return $data['baseurl'];
+               $contact = DBA::selectFirst('contact', ['baseurl'], ['uid' => 0, 'nurl' => Strings::normaliseLink($url)]);
+               if (!empty($contact['baseurl'])) {
+                       return $contact['baseurl'];
                }
 
-               // When we can't probe the server, we use some ugly function that does some pattern matching
-               return PortableContact::detectServer($url);
+               self::updateFromProbeByURL($url, true);
+
+               $contact = DBA::selectFirst('contact', ['baseurl'], ['uid' => 0, 'nurl' => Strings::normaliseLink($url)]);
+               if (!empty($contact['baseurl'])) {
+                       return $contact['baseurl'];
+               }
+
+               return '';
        }
 
        /**
@@ -792,6 +862,7 @@ class Contact extends BaseObject
                                 */
                                DBA::update('contact', ['archive' => 1], ['id' => $contact['id']]);
                                DBA::update('contact', ['archive' => 1], ['nurl' => Strings::normaliseLink($contact['url']), 'self' => false]);
+                               GContact::updateFromPublicContactURL($contact['url']);
                        }
                }
        }
@@ -829,6 +900,7 @@ class Contact extends BaseObject
                $fields = ['term-date' => DBA::NULL_DATETIME, 'archive' => false];
                DBA::update('contact', $fields, ['id' => $contact['id']]);
                DBA::update('contact', $fields, ['nurl' => Strings::normaliseLink($contact['url'])]);
+               GContact::updateFromPublicContactURL($contact['url']);
 
                if (!empty($contact['batch'])) {
                        $condition = ['batch' => $contact['batch'], 'contact-type' => self::TYPE_RELAY];
@@ -963,9 +1035,9 @@ class Contact extends BaseObject
                }
 
                if ((empty($profile["addr"]) || empty($profile["name"])) && (defaults($profile, "gid", 0) != 0)
-                       && in_array($profile["network"], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS])
+                       && in_array($profile["network"], Protocol::FEDERATED)
                ) {
-                       Worker::add(PRIORITY_LOW, "UpdateGContact", $profile["gid"]);
+                       Worker::add(PRIORITY_LOW, "UpdateGContact", $url);
                }
 
                // Show contact details of Diaspora contacts only if connected
@@ -1300,11 +1372,13 @@ class Contact extends BaseObject
 
                /// @todo Verify if we can't use Contact::getDetailsByUrl instead of the following
                // We first try the nurl (http://server.tld/nick), most common case
-               $contact = DBA::selectFirst('contact', ['id', 'avatar', 'updated', 'network'], ['nurl' => Strings::normaliseLink($url), 'uid' => $uid, 'deleted' => false]);
+               $fields = ['id', 'avatar', 'updated', 'network'];
+               $options = ['order' => ['id']];
+               $contact = DBA::selectFirst('contact', $fields, ['nurl' => Strings::normaliseLink($url), 'uid' => $uid, 'deleted' => false], $options);
 
                // Then the addr (nick@server.tld)
                if (!DBA::isResult($contact)) {
-                       $contact = DBA::selectFirst('contact', ['id', 'avatar', 'updated', 'network'], ['addr' => $url, 'uid' => $uid, 'deleted' => false]);
+                       $contact = DBA::selectFirst('contact', $fields, ['addr' => str_replace('acct:', '', $url), 'uid' => $uid, 'deleted' => false], $options);
                }
 
                // Then the alias (which could be anything)
@@ -1312,7 +1386,7 @@ class Contact extends BaseObject
                        // The link could be provided as http although we stored it as https
                        $ssl_url = str_replace('http://', 'https://', $url);
                        $condition = ['`alias` IN (?, ?, ?) AND `uid` = ? AND NOT `deleted`', $url, Strings::normaliseLink($url), $ssl_url, $uid];
-                       $contact = DBA::selectFirst('contact', ['id', 'avatar', 'updated', 'network'], $condition);
+                       $contact = DBA::selectFirst('contact', $fields, $condition, $options);
                }
 
                if (DBA::isResult($contact)) {
@@ -1328,7 +1402,7 @@ class Contact extends BaseObject
 
                        // Update the contact in the background if needed but it is called by the frontend
                        if ($update_contact && $no_update && in_array($contact['network'], Protocol::NATIVE_SUPPORT)) {
-                               Worker::add(PRIORITY_LOW, "UpdateContact", $contact_id);
+                               Worker::add(PRIORITY_LOW, "UpdateContact", $contact_id, ($uid == 0 ? 'force' : ''));
                        }
 
                        if (!$update_contact || $no_update) {
@@ -1339,10 +1413,14 @@ class Contact extends BaseObject
                        return 0;
                }
 
-               // When we don't want to update, we look if we know this contact in any way
                if ($no_update && empty($default)) {
+                       // When we don't want to update, we look if we know this contact in any way
                        $data = self::getProbeDataFromDatabase($url, $contact_id);
                        $background_update = true;
+               } elseif ($no_update && !empty($default['network'])) {
+                       // If there are default values, take these
+                       $data = $default;
+                       $background_update = false;
                } else {
                        $data = [];
                        $background_update = false;
@@ -1357,18 +1435,9 @@ class Contact extends BaseObject
                        }
                }
 
-               // Last try in gcontact for unsupported networks
-               if (!in_array($data["network"], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::OSTATUS, Protocol::DIASPORA, Protocol::PUMPIO, Protocol::MAIL, Protocol::FEED])) {
-                       if ($uid != 0) {
-                               return 0;
-                       }
-
-                       $contact = array_merge(self::getProbeDataFromDatabase($url, $contact_id), $default);
-                       if (empty($contact)) {
-                               return 0;
-                       }
-
-                       $data = array_merge($data, $contact);
+               // Take the default values when probing failed
+               if (!empty($default) && !in_array($data["network"], array_merge(Protocol::NATIVE_SUPPORT, [Protocol::PUMPIO]))) {
+                       $data = array_merge($data, $default);
                }
 
                if (empty($data)) {
@@ -1403,6 +1472,7 @@ class Contact extends BaseObject
                                'request'   => defaults($data, 'request', ''),
                                'confirm'   => defaults($data, 'confirm', ''),
                                'poco'      => defaults($data, 'poco', ''),
+                               'baseurl'   => defaults($data, 'baseurl', ''),
                                'name-date' => DateTimeFormat::utcNow(),
                                'uri-date'  => DateTimeFormat::utcNow(),
                                'avatar-date' => DateTimeFormat::utcNow(),
@@ -1413,108 +1483,75 @@ class Contact extends BaseObject
 
                        $condition = ['nurl' => Strings::normaliseLink($data["url"]), 'uid' => $uid, 'deleted' => false];
 
-                       DBA::update('contact', $fields, $condition, true);
-
-                       $s = DBA::select('contact', ['id'], $condition, ['order' => ['id'], 'limit' => 2]);
-                       $contacts = DBA::toArray($s);
-                       if (!DBA::isResult($contacts)) {
-                               return 0;
-                       }
-
-                       $contact_id = $contacts[0]["id"];
+                       // Before inserting we do check if the entry does exist now.
+                       $contact = DBA::selectFirst('contact', ['id'], $condition, ['order' => ['id']]);
+                       if (!DBA::isResult($contact)) {
+                               Logger::info('Create new contact', $fields);
 
-                       // Update in the background when we fetched the data solely from the database
-                       if ($background_update) {
-                               Worker::add(PRIORITY_LOW, "UpdateContact", $contact_id);
-                       }
+                               DBA::insert('contact', $fields);
 
-                       // Update the newly created contact from data in the gcontact table
-                       $gcontact = DBA::selectFirst('gcontact', ['location', 'about', 'keywords', 'gender'], ['nurl' => Strings::normaliseLink($data["url"])]);
-                       if (DBA::isResult($gcontact)) {
-                               // Only use the information when the probing hadn't fetched these values
-                               if (!empty($data['keywords'])) {
-                                       unset($gcontact['keywords']);
-                               }
-                               if (!empty($data['location'])) {
-                                       unset($gcontact['location']);
+                               // We intentionally aren't using lastInsertId here. There is a chance for duplicates.
+                               $contact = DBA::selectFirst('contact', ['id'], $condition, ['order' => ['id']]);
+                               if (!DBA::isResult($contact)) {
+                                       Logger::info('Contact creation failed', $fields);
+                                       // Shouldn't happen
+                                       return 0;
                                }
-                               if (!empty($data['about'])) {
-                                       unset($gcontact['about']);
-                               }
-                               DBA::update('contact', $gcontact, ['id' => $contact_id]);
+                       } else {
+                               Logger::info('Contact had been created before', ['id' => $contact["id"], 'url' => $url, 'contact' => $fields]);
                        }
 
-                       if (count($contacts) > 1 && $uid == 0 && $contact_id != 0 && $data["url"] != "") {
-                               $condition = ["`nurl` = ? AND `uid` = ? AND `id` != ? AND NOT `self`",
-                                       Strings::normaliseLink($data["url"]), 0, $contact_id];
-                               Logger::log('Deleting duplicate contact ' . json_encode($condition), Logger::DEBUG);
-                               DBA::delete('contact', $condition);
-                       }
+                       $contact_id = $contact["id"];
                }
 
-               if (!empty($data['photo'])) {
+               if (!empty($data['photo']) && ($data['network'] != Protocol::FEED)) {
                        self::updateAvatar($data['photo'], $uid, $contact_id);
                }
 
-               $fields = ['url', 'nurl', 'addr', 'alias', 'name', 'nick', 'keywords', 'location', 'about', 'avatar-date', 'pubkey'];
-               $contact = DBA::selectFirst('contact', $fields, ['id' => $contact_id]);
+               if (in_array($data["network"], array_merge(Protocol::NATIVE_SUPPORT, [Protocol::PUMPIO]))) {
+                       if ($background_update) {
+                               // Update in the background when we fetched the data solely from the database
+                               Worker::add(PRIORITY_MEDIUM, "UpdateContact", $contact_id, ($uid == 0 ? 'force' : ''));
+                       } else {
+                               // Else do a direct update
+                               self::updateFromProbe($contact_id, '', false);
 
-               // This condition should always be true
-               if (!DBA::isResult($contact)) {
-                       return $contact_id;
-               }
+                               // Update the gcontact entry
+                               if ($uid == 0) {
+                                       GContact::updateFromPublicContactID($contact_id);
+                               }
+                       }
+               } else {
+                       $fields = ['url', 'nurl', 'addr', 'alias', 'name', 'nick', 'keywords', 'location', 'about', 'avatar-date', 'baseurl'];
+                       $contact = DBA::selectFirst('contact', $fields, ['id' => $contact_id]);
 
-               $updated = [
-                       'addr' => $data['addr'] ?? '',
-                       'alias' => defaults($data, 'alias', ''),
-                       'url' => $data['url'],
-                       'nurl' => Strings::normaliseLink($data['url']),
-                       'name' => $data['name'],
-                       'nick' => $data['nick']
-               ];
+                       // This condition should always be true
+                       if (!DBA::isResult($contact)) {
+                               return $contact_id;
+                       }
 
-               if (!empty($data['keywords'])) {
-                       $updated['keywords'] = $data['keywords'];
-               }
-               if (!empty($data['location'])) {
-                       $updated['location'] = $data['location'];
-               }
+                       $updated = [
+                               'url' => $data['url'],
+                               'nurl' => Strings::normaliseLink($data['url']),
+                               'updated' => DateTimeFormat::utcNow()
+                       ];
 
-               // Update the technical stuff as well - if filled
-               if (!empty($data['notify'])) {
-                       $updated['notify'] = $data['notify'];
-               }
-               if (!empty($data['poll'])) {
-                       $updated['poll'] = $data['poll'];
-               }
-               if (!empty($data['batch'])) {
-                       $updated['batch'] = $data['batch'];
-               }
-               if (!empty($data['request'])) {
-                       $updated['request'] = $data['request'];
-               }
-               if (!empty($data['confirm'])) {
-                       $updated['confirm'] = $data['confirm'];
-               }
-               if (!empty($data['poco'])) {
-                       $updated['poco'] = $data['poco'];
-               }
+                       $fields = ['addr', 'alias', 'name', 'nick', 'keywords', 'location', 'about', 'baseurl'];
 
-               // Only fill the pubkey if it had been empty before. We have to prevent identity theft.
-               if (empty($contact['pubkey'])) {
-                       $updated['pubkey'] = $data['pubkey'];
-               }
+                       foreach ($fields as $field) {
+                               $updated[$field] = defaults($data, $field, $contact[$field]);
+                       }
 
-               if (($updated['addr'] != $contact['addr']) || (!empty($data['alias']) && ($data['alias'] != $contact['alias']))) {
-                       $updated['uri-date'] = DateTimeFormat::utcNow();
-               }
-               if (($data["name"] != $contact["name"]) || ($data["nick"] != $contact["nick"])) {
-                       $updated['name-date'] = DateTimeFormat::utcNow();
-               }
+                       if (($updated['addr'] != $contact['addr']) || (!empty($data['alias']) && ($data['alias'] != $contact['alias']))) {
+                               $updated['uri-date'] = DateTimeFormat::utcNow();
+                       }
 
-               $updated['updated'] = DateTimeFormat::utcNow();
+                       if (($data['name'] != $contact['name']) || ($data['nick'] != $contact['nick'])) {
+                               $updated['name-date'] = DateTimeFormat::utcNow();
+                       }
 
-               DBA::update('contact', $updated, ['id' => $contact_id], $contact);
+                       DBA::update('contact', $updated, ['id' => $contact_id], $contact);
+               }
 
                return $contact_id;
        }
@@ -1587,7 +1624,7 @@ class Contact extends BaseObject
                        return '';
                }
 
-               if (in_array($contact["network"], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS, ""])) {
+               if (empty($contact["network"]) || in_array($contact["network"], Protocol::FEDERATED)) {
                        $sql = "(`item`.`uid` = 0 OR (`item`.`uid` = ? AND NOT `item`.`global`))";
                } else {
                        $sql = "`item`.`uid` = ?";
@@ -1605,7 +1642,7 @@ class Contact extends BaseObject
 
                $pager = new Pager($a->query_string);
 
-               $params = ['order' => ['created' => true],
+               $params = ['order' => ['received' => true],
                        'limit' => [$pager->getStart(), $pager->getItemsPerPage()]];
 
                if ($thread_mode) {
@@ -1755,6 +1792,104 @@ class Contact extends BaseObject
                return $data;
        }
 
+        /**
+        * @brief Helper function for "updateFromProbe". Updates personal and public contact
+        *
+        * @param array $contact The personal contact entry
+        * @param array $fields  The fields that are updated
+        * @throws \Exception
+        */
+       private static function updateContact($id, $uid, $url, array $fields)
+       {
+               DBA::update('contact', $fields, ['id' => $id]);
+
+               // Search for duplicated contacts and get rid of them
+               if (self::handleDuplicates(Strings::normaliseLink($url), $uid, $id) || ($uid != 0)) {
+                       return;
+               }
+
+               // Update the corresponding gcontact entry
+               GContact::updateFromPublicContactID($id);
+
+               // Archive or unarchive the contact. We only need to do this for the public contact.
+               // The archive/unarchive function will update the personal contacts by themselves.
+               $contact = DBA::selectFirst('contact', [], ['id' => $id]);
+               if (!empty($fields['success_update'])) {
+                       self::unmarkForArchival($contact);
+               } elseif (!empty($fields['failure_update'])) {
+                       self::markForArchival($contact);
+               }
+
+               $condition = ['self' => false, 'nurl' => Strings::normaliseLink($url), 'network' => Protocol::FEDERATED];
+
+               // These contacts are sharing with us, we don't poll them.
+               // This means that we don't set the update fields in "OnePoll.php".
+               $condition['rel'] = self::SHARING;
+               DBA::update('contact', $fields, $condition);
+
+               unset($fields['last-update']);
+               unset($fields['success_update']);
+               unset($fields['failure_update']);
+
+               if (empty($fields)) {
+                       return;
+               }
+
+               // We are polling these contacts, so we mustn't set the update fields here.
+               $condition['rel'] = [self::FOLLOWER, self::FRIEND];
+               DBA::update('contact', $fields, $condition);
+       }
+
+        /**
+        * @brief Helper function for "updateFromProbe". Remove duplicated contacts
+        *
+        * @param string  $nurl  Normalised contact url
+        * @param integer $uid   User id
+        * @param integer $id    Contact id of a duplicate
+        * @return boolean
+        * @throws \Exception
+        */
+       private static function handleDuplicates($nurl, $uid, $id)
+       {
+               $condition = ['nurl' => $nurl, 'uid' => $uid, 'deleted' => false];
+               $count = DBA::count('contact', $condition);
+               if ($count <= 1) {
+                       return false;
+               }
+
+               $first_contact = DBA::selectFirst('contact', ['id'], $condition, ['order' => ['id']]);
+               if (!DBA::isResult($first_contact)) {
+                       // Shouldn't happen - so we handle it
+                       return false;
+               }
+
+               $first = $first_contact['id'];
+               Logger::info('Found duplicates', ['count' => $count, 'id' => $id, 'first' => $first, 'uid' => $uid, 'nurl' => $nurl]);
+               if ($uid != 0) {
+                       // Don't handle non public duplicates by now
+                       Logger::info('Not handling non public duplicate', ['uid' => $uid, 'nurl' => $nurl]);
+                       return false;
+               }
+
+               // Find all duplicates
+               $condition = ["`nurl` = ? AND `uid` = ? AND `id` != ? AND NOT `self` AND NOT `deleted`", $nurl, $uid, $first];
+               $duplicates = DBA::select('contact', ['id'], $condition);
+               while ($duplicate = DBA::fetch($duplicates)) {
+                       $dup_id = $duplicate['id'];
+                       Logger::info('Handling duplicate', ['search' => $dup_id, 'replace' => $first]);
+
+                       // Search and replace
+                       DBA::update('item', ['author-id' => $first], ['author-id' => $dup_id]);
+                       DBA::update('item', ['owner-id' => $first], ['owner-id' => $dup_id]);
+                       DBA::update('item', ['contact-id' => $first], ['contact-id' => $dup_id]);
+
+                       // Remove the duplicate
+                       DBA::delete('contact', ['id' => $dup_id]);
+               }
+               Logger::info('Duplicates handled', ['uid' => $uid, 'nurl' => $nurl]);
+               return true;
+       }
+
        /**
         * @param integer $id      contact id
         * @param string  $network Optional network we are probing for
@@ -1767,11 +1902,15 @@ class Contact extends BaseObject
        {
                /*
                  Warning: Never ever fetch the public key via Probe::uri and write it into the contacts.
-                 This will reliably kill your communication with Friendica contacts.
+                 This will reliably kill your communication with old Friendica contacts.
                 */
 
-               $fields = ['avatar', 'uid', 'name', 'nick', 'url', 'addr', 'batch', 'notify',
-                       'poll', 'request', 'confirm', 'poco', 'network', 'alias'];
+               // These fields aren't updated by this routine:
+               // 'xmpp', 'sensitive'
+
+               $fields = ['uid', 'avatar', 'name', 'nick', 'location', 'keywords', 'about', 'gender',
+                       'unsearchable', 'url', 'addr', 'batch', 'notify', 'poll', 'request', 'confirm', 'poco',
+                       'network', 'alias', 'baseurl', 'forum', 'prv', 'contact-type', 'pubkey'];
                $contact = DBA::selectFirst('contact', $fields, ['id' => $id]);
                if (!DBA::isResult($contact)) {
                        return false;
@@ -1780,51 +1919,119 @@ class Contact extends BaseObject
                $uid = $contact['uid'];
                unset($contact['uid']);
 
+               $pubkey = $contact['pubkey'];
+               unset($contact['pubkey']);
+
                $contact['photo'] = $contact['avatar'];
                unset($contact['avatar']);
 
                $ret = Probe::uri($contact['url'], $network, $uid, !$force);
 
+               $updated = DateTimeFormat::utcNow();
+
+               // We must not try to update relay contacts via probe. They are no real contacts.
+               // We check after the probing to be able to correct falsely detected contact types.
+               if (($contact['contact-type'] == self::TYPE_RELAY) &&
+                       (!Strings::compareLink($ret['url'], $contact['url']) || in_array($ret['network'], [Protocol::FEED, Protocol::PHANTOM]))) {
+                       self::updateContact($id, $uid, $contact['url'], ['last-update' => $updated, 'success_update' => $updated]);
+                       Logger::info('Not updating relais', ['id' => $id, 'url' => $contact['url']]);
+                       return true;
+               }
+
                // If Probe::uri fails the network code will be different (mostly "feed" or "unkn")
-               if (in_array($ret['network'], [Protocol::FEED, Protocol::PHANTOM]) && ($ret['network'] != $contact['network'])) {
+               if (!in_array($ret['network'], Protocol::NATIVE_SUPPORT) ||
+                       (in_array($ret['network'], [Protocol::FEED, Protocol::PHANTOM]) && ($ret['network'] != $contact['network']))) {
+                       if ($force && ($uid == 0)) {
+                               self::updateContact($id, $uid, $ret['url'], ['last-update' => $updated, 'failure_update' => $updated]);
+                       }
                        return false;
                }
 
-               if (!in_array($ret['network'], Protocol::NATIVE_SUPPORT)) {
-                       return false;
+               if (isset($ret['hide']) && is_bool($ret['hide'])) {
+                       $ret['unsearchable'] = $ret['hide'];
+               }
+
+               if (isset($ret['account-type']) && is_int($ret['account-type'])) {
+                       $ret['forum'] = false;
+                       $ret['prv'] = false;
+                       $ret['contact-type'] = $ret['account-type'];
+                       if ($ret['contact-type'] == User::ACCOUNT_TYPE_COMMUNITY) {
+                               $apcontact = APContact::getByURL($ret['url'], false);
+                               if (isset($apcontact['manually-approve'])) {
+                                       $ret['forum'] = (bool)!$apcontact['manually-approve'];
+                                       $ret['prv'] = (bool)!$ret['forum'];
+                               }
+                       }
                }
 
+               $new_pubkey = $ret['pubkey'];
+
                $update = false;
 
-               // make sure to not overwrite existing values with blank entries
+               // make sure to not overwrite existing values with blank entries except some technical fields
+               $keep = ['batch', 'notify', 'poll', 'request', 'confirm', 'poco', 'baseurl'];
                foreach ($ret as $key => $val) {
-                       if (!isset($contact[$key])) {
+                       if (!array_key_exists($key, $contact)) {
                                unset($ret[$key]);
-                       } elseif (($contact[$key] != '') && ($val == '')) {
+                       } elseif (($contact[$key] != '') && ($val === '') && !is_bool($ret[$key]) && !in_array($key, $keep)) {
                                $ret[$key] = $contact[$key];
                        } elseif ($ret[$key] != $contact[$key]) {
                                $update = true;
                        }
                }
 
+               if ($ret['network'] != Protocol::FEED) {
+                       self::updateAvatar($ret['photo'], $uid, $id, $update || $force);
+               }
+
                if (!$update) {
+                       if ($force && ($uid == 0)) {
+                               self::updateContact($id, $uid, $ret['url'], ['last-update' => $updated, 'success_update' => $updated]);
+                       }
                        return true;
                }
 
                $ret['nurl'] = Strings::normaliseLink($ret['url']);
-               $ret['updated'] = DateTimeFormat::utcNow();
+               $ret['updated'] = $updated;
 
-               self::updateAvatar($ret['photo'], $uid, $id, true);
+               // Only fill the pubkey if it had been empty before. We have to prevent identity theft.
+               if (empty($pubkey) && !empty($new_pubkey)) {
+                       $ret['pubkey'] = $new_pubkey;
+               }
+
+               if (($ret['addr'] != $contact['addr']) || (!empty($ret['alias']) && ($ret['alias'] != $contact['alias']))) {
+                       $ret['uri-date'] = DateTimeFormat::utcNow();
+               }
+
+               if (($ret['name'] != $contact['name']) || ($ret['nick'] != $contact['nick'])) {
+                       $ret['name-date'] = $updated;
+               }
+
+               if ($force && ($uid == 0)) {
+                       $ret['last-update'] = $updated;
+                       $ret['success_update'] = $updated;
+               }
 
                unset($ret['photo']);
-               DBA::update('contact', $ret, ['id' => $id]);
 
-               // Update the corresponding gcontact entry
-               PortableContact::lastUpdated($ret["url"]);
+               self::updateContact($id, $uid, $ret['url'], $ret);
 
                return true;
        }
 
+       public static function updateFromProbeByURL($url, $force = false)
+       {
+               $id = self::getIdForURL($url);
+
+               if (empty($id)) {
+                       return $id;
+               }
+
+               self::updateFromProbe($id, '', $force);
+
+               return $id;
+       }
+
        /**
         * Detects if a given contact array belongs to a legacy DFRN connection
         *
@@ -2023,6 +2230,7 @@ class Contact extends BaseObject
                                'name'    => $ret['name'],
                                'nick'    => $ret['nick'],
                                'network' => $ret['network'],
+                               'baseurl' => $ret['baseurl'],
                                'protocol' => $protocol,
                                'pubkey'  => $ret['pubkey'],
                                'rel'     => $new_relation,
index 8c647128125d5fb32167d38173f92e12c64ae68b..6b0ebab7aab765f5bca52788aba77977e7c92f66 100644 (file)
@@ -140,7 +140,7 @@ class GContact
                }
 
                // Assure that there are no parameter fragments in the profile url
-               if (in_array($gcontact['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS, ""])) {
+               if (empty($gcontact["network"]) || in_array($gcontact["network"], Protocol::FEDERATED)) {
                        $gcontact['url'] = self::cleanContactUrl($gcontact['url']);
                }
 
@@ -216,7 +216,7 @@ class GContact
                        throw new Exception('No name and photo for URL '.$gcontact['url']);
                }
 
-               if (!in_array($gcontact['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::OSTATUS, Protocol::DIASPORA])) {
+               if (!in_array($gcontact['network'], Protocol::FEDERATED)) {
                        throw new Exception('No federated network ('.$gcontact['network'].') detected for URL '.$gcontact['url']);
                }
 
@@ -664,7 +664,7 @@ class GContact
                self::fixAlternateContactAddress($contact);
 
                // Remove unwanted parts from the contact url (e.g. "?zrl=...")
-               if (in_array($contact["network"], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS])) {
+               if (in_array($contact["network"], Protocol::FEDERATED)) {
                        $contact["url"] = self::cleanContactUrl($contact["url"]);
                }
 
@@ -746,160 +746,243 @@ class GContact
                        return false;
                }
 
-               $public_contact = q(
-                       "SELECT `name`, `nick`, `photo`, `location`, `about`, `addr`, `generation`, `birthday`, `gender`, `keywords`,
-                               `contact-type`, `hide`, `nsfw`, `network`, `alias`, `notify`, `server_url`, `connect`, `updated`, `url`
-                       FROM `gcontact` WHERE `id` = %d LIMIT 1",
-                       intval($gcontact_id)
-               );
+               $public_contact = DBA::selectFirst('gcontact', [
+                       'name', 'nick', 'photo', 'location', 'about', 'addr', 'generation', 'birthday', 'gender', 'keywords',
+                       'contact-type', 'hide', 'nsfw', 'network', 'alias', 'notify', 'server_url', 'connect', 'updated', 'url'
+               ], ['id' => $gcontact_id]);
+
+               if (!DBA::isResult($public_contact)) {
+                       return false;
+               }
 
                // Get all field names
                $fields = [];
-               foreach ($public_contact[0] as $field => $data) {
+               foreach ($public_contact as $field => $data) {
                        $fields[$field] = $data;
                }
 
-               unset($fields["url"]);
-               unset($fields["updated"]);
-               unset($fields["hide"]);
+               unset($fields['url']);
+               unset($fields['updated']);
+               unset($fields['hide']);
 
                // Bugfix: We had an error in the storing of keywords which lead to the "0"
                // This value is still transmitted via poco.
-               if (!empty($contact["keywords"]) && ($contact["keywords"] == "0")) {
-                       unset($contact["keywords"]);
+               if (isset($contact['keywords']) && ($contact['keywords'] == '0')) {
+                       unset($contact['keywords']);
                }
 
-               if (!empty($public_contact[0]["keywords"]) && ($public_contact[0]["keywords"] == "0")) {
-                       $public_contact[0]["keywords"] = "";
+               if (isset($public_contact['keywords']) && ($public_contact['keywords'] == '0')) {
+                       $public_contact['keywords'] = '';
                }
 
                // assign all unassigned fields from the database entry
                foreach ($fields as $field => $data) {
-                       if (!isset($contact[$field]) || ($contact[$field] == "")) {
-                               $contact[$field] = $public_contact[0][$field];
+                       if (empty($contact[$field])) {
+                               $contact[$field] = $public_contact[$field];
                        }
                }
 
-               if (!isset($contact["hide"])) {
-                       $contact["hide"] = $public_contact[0]["hide"];
+               if (!isset($contact['hide'])) {
+                       $contact['hide'] = $public_contact['hide'];
                }
 
-               $fields["hide"] = $public_contact[0]["hide"];
+               $fields['hide'] = $public_contact['hide'];
 
-               if ($contact["network"] == Protocol::STATUSNET) {
-                       $contact["network"] = Protocol::OSTATUS;
+               if ($contact['network'] == Protocol::STATUSNET) {
+                       $contact['network'] = Protocol::OSTATUS;
                }
 
                // Replace alternate OStatus user format with the primary one
                self::fixAlternateContactAddress($contact);
 
-               if (!isset($contact["updated"])) {
-                       $contact["updated"] = DateTimeFormat::utcNow();
+               if (!isset($contact['updated'])) {
+                       $contact['updated'] = DateTimeFormat::utcNow();
                }
 
-               if ($contact["network"] == Protocol::TWITTER) {
-                       $contact["server_url"] = 'http://twitter.com';
+               if ($contact['network'] == Protocol::TWITTER) {
+                       $contact['server_url'] = 'http://twitter.com';
                }
 
-               if ($contact["server_url"] == "") {
-                       $data = Probe::uri($contact["url"]);
-                       if ($data["network"] != Protocol::PHANTOM) {
-                               $contact["server_url"] = $data['baseurl'];
+               if (empty($contact['server_url'])) {
+                       $data = Probe::uri($contact['url']);
+                       if ($data['network'] != Protocol::PHANTOM) {
+                               $contact['server_url'] = $data['baseurl'];
                        }
                } else {
-                       $contact["server_url"] = Strings::normaliseLink($contact["server_url"]);
+                       $contact['server_url'] = Strings::normaliseLink($contact['server_url']);
                }
 
-               if (($contact["addr"] == "") && ($contact["server_url"] != "") && ($contact["nick"] != "")) {
-                       $hostname = str_replace("http://", "", $contact["server_url"]);
-                       $contact["addr"] = $contact["nick"]."@".$hostname;
+               if (empty($contact['addr']) && !empty($contact['server_url']) && !empty($contact['nick'])) {
+                       $hostname = str_replace('http://', '', $contact['server_url']);
+                       $contact['addr'] = $contact['nick'] . '@' . $hostname;
                }
 
                // Check if any field changed
                $update = false;
-               unset($fields["generation"]);
+               unset($fields['generation']);
 
-               if ((($contact["generation"] > 0) && ($contact["generation"] <= $public_contact[0]["generation"])) || ($public_contact[0]["generation"] == 0)) {
+               if ((($contact['generation'] > 0) && ($contact['generation'] <= $public_contact['generation'])) || ($public_contact['generation'] == 0)) {
                        foreach ($fields as $field => $data) {
-                               if ($contact[$field] != $public_contact[0][$field]) {
-                                       Logger::log("Difference for contact ".$contact["url"]." in field '".$field."'. New value: '".$contact[$field]."', old value '".$public_contact[0][$field]."'", Logger::DEBUG);
+                               if ($contact[$field] != $public_contact[$field]) {
+                                       Logger::debug('Difference found.', ['contact' => $contact["url"], 'field' => $field, 'new' => $contact[$field], 'old' => $public_contact[$field]]);
                                        $update = true;
                                }
                        }
 
-                       if ($contact["generation"] < $public_contact[0]["generation"]) {
-                               Logger::log("Difference for contact ".$contact["url"]." in field 'generation'. new value: '".$contact["generation"]."', old value '".$public_contact[0]["generation"]."'", Logger::DEBUG);
+                       if ($contact['generation'] < $public_contact['generation']) {
+                               Logger::debug('Difference found.', ['contact' => $contact["url"], 'field' => 'generation', 'new' => $contact['generation'], 'old' => $public_contact['generation']]);
                                $update = true;
                        }
                }
 
                if ($update) {
-                       Logger::log("Update gcontact for ".$contact["url"], Logger::DEBUG);
+                       Logger::debug('Update gcontact.', ['contact' => $contact['url']]);
                        $condition = ['`nurl` = ? AND (`generation` = 0 OR `generation` >= ?)',
                                        Strings::normaliseLink($contact["url"]), $contact["generation"]];
                        $contact["updated"] = DateTimeFormat::utc($contact["updated"]);
 
-                       $updated = ['photo' => $contact['photo'], 'name' => $contact['name'],
-                                       'nick' => $contact['nick'], 'addr' => $contact['addr'],
-                                       'network' => $contact['network'], 'birthday' => $contact['birthday'],
-                                       'gender' => $contact['gender'], 'keywords' => $contact['keywords'],
-                                       'hide' => $contact['hide'], 'nsfw' => $contact['nsfw'],
-                                       'contact-type' => $contact['contact-type'], 'alias' => $contact['alias'],
-                                       'notify' => $contact['notify'], 'url' => $contact['url'],
-                                       'location' => $contact['location'], 'about' => $contact['about'],
-                                       'generation' => $contact['generation'], 'updated' => $contact['updated'],
-                                       'server_url' => $contact['server_url'], 'connect' => $contact['connect']];
+                       $updated = [
+                               'photo' => $contact['photo'], 'name' => $contact['name'],
+                               'nick' => $contact['nick'], 'addr' => $contact['addr'],
+                               'network' => $contact['network'], 'birthday' => $contact['birthday'],
+                               'gender' => $contact['gender'], 'keywords' => $contact['keywords'],
+                               'hide' => $contact['hide'], 'nsfw' => $contact['nsfw'],
+                               'contact-type' => $contact['contact-type'], 'alias' => $contact['alias'],
+                               'notify' => $contact['notify'], 'url' => $contact['url'],
+                               'location' => $contact['location'], 'about' => $contact['about'],
+                               'generation' => $contact['generation'], 'updated' => $contact['updated'],
+                               'server_url' => $contact['server_url'], 'connect' => $contact['connect']
+                       ];
 
                        DBA::update('gcontact', $updated, $condition, $fields);
+               }
 
-                       // Now update the contact entry with the user id "0" as well.
-                       // This is used for the shadow copies of public items.
-                       /// @todo Check if we really should do this.
-                       // The quality of the gcontact table is mostly lower than the public contact
-                       $public_contact = DBA::selectFirst('contact', ['id'], ['nurl' => Strings::normaliseLink($contact["url"]), 'uid' => 0]);
-                       if (DBA::isResult($public_contact)) {
-                               Logger::log("Update public contact ".$public_contact["id"], Logger::DEBUG);
-
-                               Contact::updateAvatar($contact["photo"], 0, $public_contact["id"]);
-
-                               $fields = ['name', 'nick', 'addr',
-                                               'network', 'bd', 'gender',
-                                               'keywords', 'alias', 'contact-type',
-                                               'url', 'location', 'about'];
-                               $old_contact = DBA::selectFirst('contact', $fields, ['id' => $public_contact["id"]]);
-
-                               // Update it with the current values
-                               $fields = ['name' => $contact['name'], 'nick' => $contact['nick'],
-                                               'addr' => $contact['addr'], 'network' => $contact['network'],
-                                               'bd' => $contact['birthday'], 'gender' => $contact['gender'],
-                                               'keywords' => $contact['keywords'], 'alias' => $contact['alias'],
-                                               'contact-type' => $contact['contact-type'], 'url' => $contact['url'],
-                                               'location' => $contact['location'], 'about' => $contact['about']];
-
-                               // Don't update the birthday field if not set or invalid
-                               if (empty($contact['birthday']) || ($contact['birthday'] <= DBA::NULL_DATE)) {
-                                       unset($fields['bd']);
-                               }
+               return $gcontact_id;
+       }
+
+       /**
+        * @brief Updates the gcontact entry from a given public contact id
+        *
+        * @param integer $cid contact id
+        * @return void
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws \ImagickException
+        */
+       public static function updateFromPublicContactID($cid)
+       {
+               self::updateFromPublicContact(['id' => $cid]);
+       }
 
+       /**
+        * @brief Updates the gcontact entry from a given public contact url
+        *
+        * @param string $url contact url
+        * @return integer gcontact id
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws \ImagickException
+        */
+       public static function updateFromPublicContactURL($url)
+       {
+               return self::updateFromPublicContact(['nurl' => Strings::normaliseLink($url)]);
+       }
 
-                               DBA::update('contact', $fields, ['id' => $public_contact["id"]], $old_contact);
+       /**
+        * @brief Helper function for updateFromPublicContactID and updateFromPublicContactURL
+        *
+        * @param array $condition contact condition
+        * @return integer gcontact id
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws \ImagickException
+        */
+       private static function updateFromPublicContact($condition)
+       {
+               $fields = ['name', 'nick', 'url', 'nurl', 'location', 'about', 'keywords', 'gender',
+                       'bd', 'contact-type', 'network', 'addr', 'notify', 'alias', 'archive', 'term-date',
+                       'created', 'updated', 'avatar', 'success_update', 'failure_update', 'forum', 'prv',
+                       'baseurl', 'sensitive', 'unsearchable'];
+
+               $contact = DBA::selectFirst('contact', $fields, array_merge($condition, ['uid' => 0, 'network' => Protocol::FEDERATED]));
+               if (!DBA::isResult($contact)) {
+                       return 0;
+               }
+
+               $fields = ['name', 'nick', 'url', 'nurl', 'location', 'about', 'keywords', 'gender', 'generation',
+                       'birthday', 'contact-type', 'network', 'addr', 'notify', 'alias', 'archived', 'archive_date',
+                       'created', 'updated', 'photo', 'last_contact', 'last_failure', 'community', 'connect',
+                       'server_url', 'nsfw', 'hide', 'id'];
+
+               $old_gcontact = DBA::selectFirst('gcontact', $fields, ['nurl' => $contact['nurl']]);
+               $do_insert = !DBA::isResult($old_gcontact);
+               if ($do_insert) {
+                       $old_gcontact = [];
+               }
+
+               $gcontact = [];
+
+               // These fields are identical in both contact and gcontact
+               $fields = ['name', 'nick', 'url', 'nurl', 'location', 'about', 'keywords', 'gender',
+                       'contact-type', 'network', 'addr', 'notify', 'alias', 'created', 'updated'];
+
+               foreach ($fields as $field) {
+                       $gcontact[$field] = $contact[$field];
+               }
+
+               // These fields are having different names but the same content
+               $gcontact['server_url'] = $contact['baseurl'] ?? ''; // "baseurl" can be null, "server_url" not
+               $gcontact['nsfw'] = $contact['sensitive'];
+               $gcontact['hide'] = $contact['unsearchable'];
+               $gcontact['archived'] = $contact['archive'];
+               $gcontact['archive_date'] = $contact['term-date'];
+               $gcontact['birthday'] = $contact['bd'];
+               $gcontact['photo'] = $contact['avatar'];
+               $gcontact['last_contact'] = $contact['success_update'];
+               $gcontact['last_failure'] = $contact['failure_update'];
+               $gcontact['community'] = ($contact['forum'] || $contact['prv']);
+
+               foreach (['last_contact', 'last_failure', 'updated'] as $field) {
+                       if (!empty($old_gcontact[$field]) && ($old_gcontact[$field] >= $gcontact[$field])) {
+                               unset($gcontact[$field]);
                        }
                }
 
-               return $gcontact_id;
+               if (!$gcontact['archived']) {
+                       $gcontact['archive_date'] = DBA::NULL_DATETIME;
+               }
+
+               if (!empty($old_gcontact['created']) && ($old_gcontact['created'] > DBA::NULL_DATETIME)
+                       && ($old_gcontact['created'] <= $gcontact['created'])) {
+                       unset($gcontact['created']);
+               }
+
+               if (empty($gcontact['birthday']) && ($gcontact['birthday'] <= DBA::NULL_DATETIME)) {
+                       unset($gcontact['birthday']);
+               }
+
+               if (empty($old_gcontact['generation']) || ($old_gcontact['generation'] > 2)) {
+                       $gcontact['generation'] = 2; // We fetched the data directly from the other server
+               }
+
+               if (!$do_insert) {
+                       DBA::update('gcontact', $gcontact, ['nurl' => $contact['nurl']], $old_gcontact);
+                       return $old_gcontact['id'];
+               } elseif (!$gcontact['archived']) {
+                       DBA::insert('gcontact', $gcontact);
+                       return DBA::lastInsertId();
+               }
        }
 
        /**
         * @brief Updates the gcontact entry from probe
         *
-        * @param string $url profile link
+        * @param string  $url   profile link
+        * @param boolean $force Optional forcing of network probing (otherwise we use the cached data)
         * @return void
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function updateFromProbe($url)
+       public static function updateFromProbe($url, $force = false)
        {
-               $data = Probe::uri($url);
+               $data = Probe::uri($url, $force);
 
                if (in_array($data["network"], [Protocol::PHANTOM])) {
                        Logger::log("Invalid network for contact url ".$data["url"]." - Called by: ".System::callstack(), Logger::DEBUG);
index feff4661ab6f8856fb916d7b12ffe0eacd7a2099..64b868466a589d4c3203935db09bf64fbd8211fa 100644 (file)
@@ -2,12 +2,14 @@
 /**
  * @file src/Model/Group.php
  */
+
 namespace Friendica\Model;
 
 use Friendica\BaseModule;
 use Friendica\BaseObject;
 use Friendica\Core\L10n;
 use Friendica\Core\Logger;
+use Friendica\Core\Protocol;
 use Friendica\Core\Renderer;
 use Friendica\Database\DBA;
 
@@ -16,9 +18,21 @@ use Friendica\Database\DBA;
  */
 class Group extends BaseObject
 {
+       const FOLLOWERS = '~';
+       const MUTUALS = '&';
+
+       public static function getByUserId($uid, $includesDeleted = false)
+       {
+               $conditions = ['uid' => $uid];
+
+               if (!$includesDeleted) {
+                       $conditions['deleted'] = false;
+               }
+
+               return DBA::selectToArray('group', [], $conditions);
+       }
+
        /**
-        *
-        *
         * @param int $group_id
         * @return bool
         * @throws \Exception
@@ -76,8 +90,8 @@ class Group extends BaseObject
        /**
         * Update group information.
         *
-        * @param  int    $id   Group ID
-        * @param  string $name Group name
+        * @param int    $id   Group ID
+        * @param string $name Group name
         *
         * @return bool Was the update successful?
         * @throws \Exception
@@ -96,14 +110,13 @@ class Group extends BaseObject
         */
        public static function getIdsByContactId($cid)
        {
-               $condition = ['contact-id' => $cid];
-               $stmt = DBA::select('group_member', ['gid'], $condition);
-
                $return = [];
 
+               $stmt = DBA::select('group_member', ['gid'], ['contact-id' => $cid]);
                while ($group = DBA::fetch($stmt)) {
                        $return[] = $group['gid'];
                }
+               DBA::close($stmt);
 
                return $return;
        }
@@ -170,8 +183,9 @@ class Group extends BaseObject
         * @return boolean
         * @throws \Exception
         */
-       public static function remove($gid) {
-               if (! $gid) {
+       public static function remove($gid)
+       {
+               if (!$gid) {
                        return false;
                }
 
@@ -215,14 +229,15 @@ class Group extends BaseObject
        /**
         * @brief      Mark a group as deleted based on its name
         *
-        * @deprecated Use Group::remove instead
-        *
         * @param int    $uid
         * @param string $name
         * @return bool
         * @throws \Exception
+        * @deprecated Use Group::remove instead
+        *
         */
-       public static function removeByName($uid, $name) {
+       public static function removeByName($uid, $name)
+       {
                $return = false;
                if (!empty($uid) && !empty($name)) {
                        $gid = self::getIdByName($uid, $name);
@@ -280,13 +295,13 @@ class Group extends BaseObject
        /**
         * @brief      Removes a contact from a group based on its name
         *
-        * @deprecated Use Group::removeMember instead
-        *
         * @param int    $uid
         * @param string $name
         * @param int    $cid
         * @return boolean
         * @throws \Exception
+        * @deprecated Use Group::removeMember instead
+        *
         */
        public static function removeMemberByName($uid, $name, $cid)
        {
@@ -300,23 +315,55 @@ class Group extends BaseObject
        /**
         * @brief Returns the combined list of contact ids from a group id list
         *
+        * @param int     $uid
         * @param array   $group_ids
         * @param boolean $check_dead
         * @return array
         * @throws \Exception
         */
-       public static function expand($group_ids, $check_dead = false)
+       public static function expand($uid, array $group_ids, $check_dead = false)
        {
                if (!is_array($group_ids) || !count($group_ids)) {
                        return [];
                }
 
-               $stmt = DBA::select('group_member', ['contact-id'], ['gid' => $group_ids]);
-
                $return = [];
-               while($group_member = DBA::fetch($stmt)) {
+
+               $key = array_search(self::FOLLOWERS, $group_ids);
+               if ($key !== false) {
+                       $followers = Contact::selectToArray(['id'], [
+                               'uid' => $uid,
+                               'rel' => [Contact::FOLLOWER, Contact::FRIEND],
+                               'network' => Protocol::SUPPORT_PRIVATE,
+                       ]);
+
+                       foreach ($followers as $follower) {
+                               $return[] = $follower['id'];
+                       }
+
+                       unset($group_ids[$key]);
+               }
+
+               $key = array_search(self::MUTUALS, $group_ids);
+               if ($key !== false) {
+                       $mutuals = Contact::selectToArray(['id'], [
+                               'uid' => $uid,
+                               'rel' => [Contact::FRIEND],
+                               'network' => Protocol::SUPPORT_PRIVATE,
+                       ]);
+
+                       foreach ($mutuals as $mutual) {
+                               $return[] = $mutual['id'];
+                       }
+
+                       unset($group_ids[$key]);
+               }
+
+               $stmt = DBA::select('group_member', ['contact-id'], ['gid' => $group_ids]);
+               while ($group_member = DBA::fetch($stmt)) {
                        $return[] = $group_member['contact-id'];
                }
+               DBA::close($stmt);
 
                if ($check_dead) {
                        Contact::pruneUnavailable($return);
@@ -332,12 +379,10 @@ class Group extends BaseObject
         * @param int    $gid   An optional pre-selected group
         * @param string $label An optional label of the list
         * @return string
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws \Exception
         */
        public static function displayGroupSelection($uid, $gid = 0, $label = '')
        {
-               $stmt = DBA::select('group', [], ['deleted' => 0, 'uid' => $uid], ['order' => ['name']]);
-
                $display_groups = [
                        [
                                'name' => '',
@@ -345,6 +390,8 @@ class Group extends BaseObject
                                'selected' => ''
                        ]
                ];
+
+               $stmt = DBA::select('group', [], ['deleted' => 0, 'uid' => $uid], ['order' => ['name']]);
                while ($group = DBA::fetch($stmt)) {
                        $display_groups[] = [
                                'name' => $group['name'],
@@ -352,7 +399,9 @@ class Group extends BaseObject
                                'selected' => $gid == $group['id'] ? 'true' : ''
                        ];
                }
-               Logger::log('groups: ' . print_r($display_groups, true));
+               DBA::close($stmt);
+
+               Logger::info('Got groups', $display_groups);
 
                if ($label == '') {
                        $label = L10n::t('Default privacy group for new contacts');
@@ -377,7 +426,7 @@ class Group extends BaseObject
         * @param string $group_id
         * @param int    $cid
         * @return string
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws \Exception
         */
        public static function sidebarWidget($every = 'contact', $each = 'group', $editmode = 'standard', $group_id = '', $cid = 0)
        {
@@ -394,13 +443,12 @@ class Group extends BaseObject
                        ]
                ];
 
-               $stmt = DBA::select('group', [], ['deleted' => 0, 'uid' => local_user()], ['order' => ['name']]);
-
                $member_of = [];
                if ($cid) {
                        $member_of = self::getIdsByContactId($cid);
                }
 
+               $stmt = DBA::select('group', [], ['deleted' => 0, 'uid' => local_user()], ['order' => ['name']]);
                while ($group = DBA::fetch($stmt)) {
                        $selected = (($group_id == $group['id']) ? ' group-selected' : '');
 
@@ -423,6 +471,7 @@ class Group extends BaseObject
                                'ismember' => in_array($group['id'], $member_of),
                        ];
                }
+               DBA::close($stmt);
 
                // Don't show the groups on the network page when there is only one
                if ((count($display_groups) <= 2) && ($each == 'network')) {
@@ -445,7 +494,6 @@ class Group extends BaseObject
                        '$form_security_token' => BaseModule::getFormSecurityToken('group_edit'),
                ]);
 
-
                return $o;
        }
 }
index 3c503dd670c454f40870bddf60a3471e5e779ce1..8ac88e96db30a9d00e8ca54d05442e1bab0dce93 100644 (file)
@@ -20,6 +20,7 @@ use Friendica\Core\Renderer;
 use Friendica\Core\System;
 use Friendica\Core\Worker;
 use Friendica\Database\DBA;
+use Friendica\Protocol\ActivityPub;
 use Friendica\Protocol\Diaspora;
 use Friendica\Protocol\OStatus;
 use Friendica\Util\DateTimeFormat;
@@ -177,7 +178,7 @@ class Item extends BaseObject
 
                // We can always comment on posts from these networks
                if (array_key_exists('writable', $row) &&
-                       in_array($row['internal-network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS])) {
+                       in_array($row['internal-network'], Protocol::FEDERATED)) {
                        $row['writable'] = true;
                }
 
@@ -367,6 +368,33 @@ class Item extends BaseObject
                }
        }
 
+       /**
+        * @brief Select rows from the item table and returns them as an array
+        *
+        * @param array $selected  Array of selected fields, empty for all
+        * @param array $condition Array of fields for condition
+        * @param array $params    Array of several parameters
+        *
+        * @return array
+        * @throws \Exception
+        */
+       public static function selectToArray(array $fields = [], array $condition = [], $params = [])
+       {
+               $result = self::select($fields, $condition, $params);
+
+               if (is_bool($result)) {
+                       return [];
+               }
+
+               $data = [];
+               while ($row = self::fetch($result)) {
+                       $data[] = $row;
+               }
+               DBA::close($result);
+
+               return $data;
+       }
+
        /**
         * @brief Select rows from the item table
         *
@@ -855,6 +883,8 @@ class Item extends BaseObject
                // When there is no content for the "old" item table, this will count the fetched items
                $rows = DBA::affectedRows();
 
+               $notify_items = [];
+
                while ($item = DBA::fetch($items)) {
                        if (!empty($item['iaid']) || (!empty($content_fields['verb']) && (self::activityToIndex($content_fields['verb']) >= 0))) {
                                self::updateActivity($content_fields, ['uri-id' => $item['uri-id']]);
@@ -926,12 +956,17 @@ class Item extends BaseObject
                        // We only need to notfiy others when it is an original entry from us.
                        // Only call the notifier when the item has some content relevant change.
                        if ($item['origin'] && in_array('edited', array_keys($fields))) {
-                               Worker::add(PRIORITY_HIGH, "Notifier", Delivery::POST, $item['id']);
+                               $notify_items[] = $item['id'];
                        }
                }
 
                DBA::close($items);
                DBA::commit();
+
+               foreach ($notify_items as $notify_item) {
+                       Worker::add(PRIORITY_HIGH, "Notifier", Delivery::POST, $notify_item);
+               }
+
                return $rows;
        }
 
@@ -1206,35 +1241,21 @@ class Item extends BaseObject
 
        private static function contactId($item)
        {
-               $contact_id = (int)$item["contact-id"];
-
-               if (!empty($contact_id)) {
-                       return $contact_id;
-               }
-               Logger::log('Missing contact-id. Called by: '.System::callstack(), Logger::DEBUG);
-               /*
-                * First we are looking for a suitable contact that matches with the author of the post
-                * This is done only for comments
-                */
-               if ($item['parent-uri'] != $item['uri']) {
+               if (!empty($item['contact-id']) && DBA::exists('contact', ['self' => true, 'id' => $item['contact-id']])) {
+                       return $item['contact-id'];
+               } elseif (($item['gravity'] == GRAVITY_PARENT) && !empty($item['uid']) && !empty($item['contact-id']) && Contact::isSharing($item['contact-id'], $item['uid'])) {
+                       return $item['contact-id'];
+               } elseif (!empty($item['uid']) && !Contact::isSharing($item['author-id'], $item['uid'])) {
+                       return $item['author-id'];
+               } elseif (!empty($item['contact-id'])) {
+                       return $item['contact-id'];
+               } else {
                        $contact_id = Contact::getIdForURL($item['author-link'], $item['uid']);
-               }
-
-               // If not present then maybe the owner was found
-               if ($contact_id == 0) {
-                       $contact_id = Contact::getIdForURL($item['owner-link'], $item['uid']);
-               }
-
-               // Still missing? Then use the "self" contact of the current user
-               if ($contact_id == 0) {
-                       $self = DBA::selectFirst('contact', ['id'], ['self' => true, 'uid' => $item['uid']]);
-                       if (DBA::isResult($self)) {
-                               $contact_id = $self["id"];
+                       if (!empty($contact_id)) {
+                               return $contact_id;
                        }
                }
-               Logger::log("Contact-id was missing for post ".$item['guid']." from user id ".$item['uid']." - now set to ".$contact_id, Logger::DEBUG);
-
-               return $contact_id;
+               return $item['author-id'];
        }
 
        // This function will finally cover most of the preparation functionality in mod/item.php
@@ -1252,6 +1273,28 @@ class Item extends BaseObject
                 */
        }
 
+       /**
+        * Write an item array into a spool file to be inserted later.
+        * This command is called whenever there are issues storing an item.
+        *
+        * @param array $item The item fields that are to be inserted
+        * @throws \Exception
+        */
+       private static function spool($orig_item)
+       {
+               // Now we store the data in the spool directory
+               // We use "microtime" to keep the arrival order and "mt_rand" to avoid duplicates
+               $file = 'item-' . round(microtime(true) * 10000) . '-' . mt_rand() . '.msg';
+
+               $spoolpath = get_spoolpath();
+               if ($spoolpath != "") {
+                       $spool = $spoolpath . '/' . $file;
+
+                       file_put_contents($spool, json_encode($orig_item));
+                       Logger::warning("Item wasn't stored - Item was spooled into file", ['file' => $file]);
+               }
+       }
+
        public static function insert($item, $force_parent = false, $notify = false, $dontcache = false)
        {
                $orig_item = $item;
@@ -1354,7 +1397,7 @@ class Item extends BaseObject
                 * We have to check several networks since Friendica posts could be repeated
                 * via OStatus (maybe Diasporsa as well)
                 */
-               if (in_array($item['network'], [Protocol::ACTIVITYPUB, Protocol::DIASPORA, Protocol::DFRN, Protocol::OSTATUS, ""])) {
+               if (empty($item['network']) || in_array($item['network'], Protocol::FEDERATED)) {
                        $condition = ["`uri` = ? AND `uid` = ? AND `network` IN (?, ?, ?)",
                                trim($item['uri']), $item['uid'],
                                Protocol::DIASPORA, Protocol::DFRN, Protocol::OSTATUS];
@@ -1437,9 +1480,6 @@ class Item extends BaseObject
 
                $item['plink'] = defaults($item, 'plink', System::baseUrl() . '/display/' . urlencode($item['guid']));
 
-               // The contact-id should be set before "self::insert" was called - but there seems to be issues sometimes
-               $item["contact-id"] = self::contactId($item);
-
                $default = ['url' => $item['author-link'], 'name' => $item['author-name'],
                        'photo' => $item['author-avatar'], 'network' => $item['network']];
 
@@ -1495,6 +1535,9 @@ class Item extends BaseObject
                unset($item['causer-id']);
                unset($item['causer-link']);
 
+               // The contact-id should be set before "self::insert" was called - but there seems to be issues sometimes
+               $item["contact-id"] = self::contactId($item);
+
                if ($item['network'] == Protocol::PHANTOM) {
                        $item['network'] = Protocol::DFRN;
                        Logger::notice('Missing network, setting to {network}.', [
@@ -1650,7 +1693,7 @@ class Item extends BaseObject
                                Logger::log('duplicated item with the same guid found. '.print_r($item,true));
                                return 0;
                        }
-               } else {
+               } elseif ($item['network'] == Protocol::OSTATUS) {
                        // Check for an existing post with the same content. There seems to be a problem with OStatus.
                        $condition = ["`body` = ? AND `network` = ? AND `created` = ? AND `contact-id` = ? AND `uid` = ?",
                                        $item['body'], $item['network'], $item['created'], $item['contact-id'], $item['uid']];
@@ -1757,6 +1800,8 @@ class Item extends BaseObject
                unset($item['owner-name']);
                unset($item['owner-avatar']);
 
+               $like_no_comment = Config::get('system', 'like_no_comment');
+
                DBA::transaction();
                $ret = DBA::insert('item', $item);
 
@@ -1768,23 +1813,7 @@ class Item extends BaseObject
                        DBA::rollback();
 
                        // Store the data into a spool file so that we can try again later.
-
-                       // At first we restore the Diaspora signature that we removed above.
-                       if (isset($encoded_signature)) {
-                               $item['dsprsig'] = $encoded_signature;
-                       }
-
-                       // Now we store the data in the spool directory
-                       // We use "microtime" to keep the arrival order and "mt_rand" to avoid duplicates
-                       $file = 'item-'.round(microtime(true) * 10000).'-'.mt_rand().'.msg';
-
-                       $spoolpath = get_spoolpath();
-                       if ($spoolpath != "") {
-                               $spool = $spoolpath.'/'.$file;
-
-                               file_put_contents($spool, json_encode($orig_item));
-                               Logger::log("Item wasn't stored - Item was spooled into file ".$file, Logger::DEBUG);
-                       }
+                       self::spool($orig_item);
                        return 0;
                }
 
@@ -1815,7 +1844,6 @@ class Item extends BaseObject
                }
 
                Logger::log('created item '.$current_post);
-               self::updateContact($item);
 
                if (!$parent_id || ($item['parent-uri'] === $item['uri'])) {
                        $parent_id = $current_post;
@@ -1829,7 +1857,7 @@ class Item extends BaseObject
 
                // update the commented timestamp on the parent
                // Only update "commented" if it is really a comment
-               if (($item['gravity'] != GRAVITY_ACTIVITY) || !Config::get("system", "like_no_comment")) {
+               if (($item['gravity'] != GRAVITY_ACTIVITY) || !$like_no_comment) {
                        DBA::update('item', ['commented' => DateTimeFormat::utcNow(), 'changed' => DateTimeFormat::utcNow()], ['id' => $parent_id]);
                } else {
                        DBA::update('item', ['changed' => DateTimeFormat::utcNow()], ['id' => $parent_id]);
@@ -1858,32 +1886,15 @@ class Item extends BaseObject
                        DBA::insert('diaspora-interaction', ['uri-id' => $item['uri-id'], 'interaction' => $diaspora_signed_text], true);
                }
 
-               self::tagDeliver($item['uid'], $current_post);
-
-               /*
-                * current post can be deleted if is for a community page and no mention are
-                * in it.
-                */
-               if (!$dontcache) {
-                       $posted_item = self::selectFirst(self::ITEM_FIELDLIST, ['id' => $current_post]);
-                       if (DBA::isResult($posted_item)) {
-                               if ($notify) {
-                                       Hook::callAll('post_local_end', $posted_item);
-                               } else {
-                                       Hook::callAll('post_remote_end', $posted_item);
-                               }
-                       } else {
-                               Logger::log('new item not found in DB, id ' . $current_post);
-                       }
-               }
-
                if ($item['parent-uri'] === $item['uri']) {
                        self::addThread($current_post);
                } else {
                        self::updateThread($parent_id);
                }
 
-               ItemDeliveryData::insert($current_post, $delivery_data);
+               if (!empty($item['origin']) || !empty($item['wall']) || !empty($delivery_data['postopts']) || !empty($delivery_data['inform'])) {
+                       ItemDeliveryData::insert($current_post, $delivery_data);
+               }
 
                DBA::commit();
 
@@ -1899,12 +1910,36 @@ class Item extends BaseObject
                        Term::insertFromFileFieldByItemId($current_post, $files);
                }
 
+               // In that function we check if this is a forum post. Additionally we delete the item under certain circumstances
+               if (self::tagDeliver($item['uid'], $current_post)) {
+                       // Get the user information for the logging
+                       $user = User::getById($uid);
+
+                       Logger::notice('Item had been deleted', ['id' => $current_post, 'user' => $uid, 'account-type' => $user['account-type']]);
+                       return 0;
+               }
+
+               if (!$dontcache) {
+                       $posted_item = self::selectFirst(self::ITEM_FIELDLIST, ['id' => $current_post]);
+                       if (DBA::isResult($posted_item)) {
+                               if ($notify) {
+                                       Hook::callAll('post_local_end', $posted_item);
+                               } else {
+                                       Hook::callAll('post_remote_end', $posted_item);
+                               }
+                       } else {
+                               Logger::log('new item not found in DB, id ' . $current_post);
+                       }
+               }
+
                if ($item['parent-uri'] === $item['uri']) {
                        self::addShadow($current_post);
                } else {
                        self::addShadowPost($current_post);
                }
 
+               self::updateContact($item);
+
                check_user_notification($current_post);
 
                if ($notify || ($item['visible'] && ((!empty($parent) && $parent['origin']) || $item['origin']))) {
@@ -2075,7 +2110,7 @@ class Item extends BaseObject
 
                // Only distribute public items from native networks
                $condition = ['id' => $itemid, 'uid' => 0,
-                       'network' => [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS, ""],
+                       'network' => array_merge(Protocol::FEDERATED ,['']),
                        'visible' => true, 'deleted' => false, 'moderated' => false, 'private' => false];
                $item = self::selectFirst(self::ITEM_FIELDLIST, $condition);
                if (!DBA::isResult($item)) {
@@ -2231,7 +2266,7 @@ class Item extends BaseObject
                }
 
                // is it an entry from a connector? Only add an entry for natively connected networks
-               if (!in_array($item["network"], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS, ""])) {
+               if (!in_array($item["network"], array_merge(Protocol::FEDERATED ,['']))) {
                        return;
                }
 
@@ -2534,7 +2569,7 @@ class Item extends BaseObject
         *
         * @param int $uid
         * @param int $item_id
-        * @return void true if item was deleted, else false
+        * @return boolean true if item was deleted, else false
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
@@ -2544,7 +2579,7 @@ class Item extends BaseObject
 
                $user = DBA::selectFirst('user', [], ['uid' => $uid]);
                if (!DBA::isResult($user)) {
-                       return;
+                       return false;
                }
 
                $community_page = (($user['page-flags'] == User::PAGE_FLAGS_COMMUNITY) ? true : false);
@@ -2552,7 +2587,7 @@ class Item extends BaseObject
 
                $item = self::selectFirst(self::ITEM_FIELDLIST, ['id' => $item_id]);
                if (!DBA::isResult($item)) {
-                       return;
+                       return false;
                }
 
                $link = Strings::normaliseLink(System::baseUrl() . '/profile/' . $user['nickname']);
@@ -2582,7 +2617,7 @@ class Item extends BaseObject
                                DBA::delete('item', ['id' => $item_id]);
                                return true;
                        }
-                       return;
+                       return false;
                }
 
                $arr = ['item' => $item, 'user' => $user];
@@ -2590,7 +2625,7 @@ class Item extends BaseObject
                Hook::callAll('tagged', $arr);
 
                if (!$community_page && !$prvgroup) {
-                       return;
+                       return false;
                }
 
                /*
@@ -2599,13 +2634,13 @@ class Item extends BaseObject
                 * if the message originated elsewhere and is a top-level post
                 */
                if ($item['wall'] || $item['origin'] || ($item['id'] != $item['parent'])) {
-                       return;
+                       return false;
                }
 
                // now change this copy of the post to a forum head message and deliver to all the tgroup members
                $self = DBA::selectFirst('contact', ['id', 'name', 'url', 'thumb'], ['uid' => $uid, 'self' => true]);
                if (!DBA::isResult($self)) {
-                       return;
+                       return false;
                }
 
                $owner_id = Contact::getIdForURL($self['url']);
@@ -2625,6 +2660,8 @@ class Item extends BaseObject
                self::updateThread($item_id);
 
                Worker::add(['priority' => PRIORITY_HIGH, 'dont_fork' => true], 'Notifier', Delivery::POST, $item_id);
+
+               return false;
        }
 
        public static function isRemoteSelf($contact, &$datarray)
@@ -2774,7 +2811,7 @@ class Item extends BaseObject
                                                                        $replace = true;
                                                                }
                                                        } elseif ($item) {
-                                                               if (self::samePermissions($item, $photo)) {
+                                                               if (self::samePermissions($uid, $item, $photo)) {
                                                                        $replace = true;
                                                                }
                                                        }
@@ -2824,7 +2861,7 @@ class Item extends BaseObject
                        !empty($obj['deny_cid']) || !empty($obj['deny_gid']);
        }
 
-       private static function samePermissions($obj1, $obj2)
+       private static function samePermissions($uid, $obj1, $obj2)
        {
                // first part is easy. Check that these are exactly the same.
                if (($obj1['allow_cid'] == $obj2['allow_cid'])
@@ -2844,13 +2881,20 @@ class Item extends BaseObject
                return ($recipients1 == $recipients2);
        }
 
-       // returns an array of contact-ids that are allowed to see this object
-       public static function enumeratePermissions($obj)
+       /**
+        * Returns an array of contact-ids that are allowed to see this object
+        *
+        * @param array $obj        Item array with at least uid, allow_cid, allow_gid, deny_cid and deny_gid
+        * @param bool  $check_dead Prunes unavailable contacts from the result
+        * @return array
+        * @throws \Exception
+        */
+       public static function enumeratePermissions(array $obj, bool $check_dead = false)
        {
                $allow_people = expand_acl($obj['allow_cid']);
-               $allow_groups = Group::expand(expand_acl($obj['allow_gid']));
+               $allow_groups = Group::expand($obj['uid'], expand_acl($obj['allow_gid']), $check_dead);
                $deny_people  = expand_acl($obj['deny_cid']);
-               $deny_groups  = Group::expand(expand_acl($obj['deny_gid']));
+               $deny_groups  = Group::expand($obj['uid'], expand_acl($obj['deny_gid']), $check_dead);
                $recipients   = array_unique(array_merge($allow_people, $allow_groups));
                $deny         = array_unique(array_merge($deny_people, $deny_groups));
                $recipients   = array_diff($recipients, $deny);
@@ -2903,19 +2947,11 @@ class Item extends BaseObject
                if ($network != "") {
                        $condition[0] .= " AND `network` = ?";
                        $condition[] = $network;
-
-                       /*
-                        * There is an index "uid_network_received" but not "uid_network_created"
-                        * This avoids the creation of another index just for one purpose.
-                        * And it doesn't really matter wether to look at "received" or "created"
-                        */
-                       $condition[0] .= " AND `received` < UTC_TIMESTAMP() - INTERVAL ? DAY";
-                       $condition[] = $days;
-               } else {
-                       $condition[0] .= " AND `created` < UTC_TIMESTAMP() - INTERVAL ? DAY";
-                       $condition[] = $days;
                }
 
+               $condition[0] .= " AND `received` < UTC_TIMESTAMP() - INTERVAL ? DAY";
+               $condition[] = $days;
+
                $items = self::select(['file', 'resource-id', 'starred', 'type', 'id', 'post-type'], $condition);
 
                if (!DBA::isResult($items)) {
@@ -2965,10 +3001,10 @@ class Item extends BaseObject
        public static function firstPostDate($uid, $wall = false)
        {
                $condition = ['uid' => $uid, 'wall' => $wall, 'deleted' => false, 'visible' => true, 'moderated' => false];
-               $params = ['order' => ['created' => false]];
-               $thread = DBA::selectFirst('thread', ['created'], $condition, $params);
+               $params = ['order' => ['received' => false]];
+               $thread = DBA::selectFirst('thread', ['received'], $condition, $params);
                if (DBA::isResult($thread)) {
-                       return substr(DateTimeFormat::local($thread['created']), 0, 10);
+                       return substr(DateTimeFormat::local($thread['received']), 0, 10);
                }
                return false;
        }
@@ -3581,4 +3617,68 @@ class Item extends BaseObject
 
                return Contact::isForum($item['contact-id']);
        }
+
+       /**
+        * Search item id for given URI or plink
+        *
+        * @param string $uri
+        * @param integer $uid
+        *
+        * @return integer item id
+        */
+       public static function searchByLink($uri, $uid = 0)
+       {
+               $ssl_uri = str_replace('http://', 'https://', $uri);
+               $uris = [$uri, $ssl_uri, Strings::normaliseLink($uri)];
+
+               $item = DBA::selectFirst('item', ['id'], ['uri' => $uris, 'uid' => $uid]);
+               if (DBA::isResult($item)) {
+                       return $item['id'];
+               }
+
+               $itemcontent = DBA::selectFirst('item-content', ['uri-id'], ['plink' => $uris]);
+               if (!DBA::isResult($itemcontent)) {
+                       return 0;
+               }
+
+               $itemuri = DBA::selectFirst('item-uri', ['uri'], ['id' => $itemcontent['uri-id']]);
+               if (!DBA::isResult($itemuri)) {
+                       return 0;
+               }
+
+               $item = DBA::selectFirst('item', ['id'], ['uri' => $itemuri['uri'], 'uid' => $uid]);
+               if (DBA::isResult($item)) {
+                       return $item['id'];
+               }
+
+               return 0;
+       }
+
+       /**
+        * Fetches item for given URI or plink
+        *
+        * @param string $uri
+        * @param integer $uid
+        *
+        * @return integer item id
+        */
+       public static function fetchByLink($uri, $uid = 0)
+       {
+               $item_id = self::searchByLink($uri, $uid);
+               if (!empty($item_id)) {
+                       return $item_id;
+               }
+
+               if (ActivityPub\Processor::fetchMissingActivity($uri)) {
+                       $item_id = self::searchByLink($uri, $uid);
+               } else {
+                       $item_id = Diaspora::fetchByURL($uri);
+               }
+
+               if (!empty($item_id)) {
+                       return $item_id;
+               }
+
+               return 0;
+       }
 }
index b1fd28e3cb19b181ade9c168d900b7bd41cb62f5..1d5c37de2d0164dc19e699a4a74602a02cdaec54 100644 (file)
@@ -23,6 +23,12 @@ class ItemDeliveryData
                'queue_done'  => 'delivery_queue_done',
        ];
 
+       const ACTIVITYPUB = 1;
+       const DFRN = 2;
+       const LEGACY_DFRN = 3;
+       const DIASPORA = 4;
+       const OSTATUS = 5;
+
        /**
         * Extract delivery data from the provided item fields
         *
@@ -53,12 +59,33 @@ class ItemDeliveryData
         * Avoids racing condition between multiple delivery threads.
         *
         * @param integer $item_id
+        * @param integer $protocol
         * @return bool
         * @throws \Exception
         */
-       public static function incrementQueueDone($item_id)
+       public static function incrementQueueDone($item_id, $protocol = 0)
        {
-               return DBA::e('UPDATE `item-delivery-data` SET `queue_done` = `queue_done` + 1 WHERE `iid` = ?', $item_id);
+               $sql = '';
+
+               switch ($protocol) {
+                       case self::ACTIVITYPUB:
+                               $sql = ", `activitypub` = `activitypub` + 1";
+                               break;
+                       case self::DFRN:
+                               $sql = ", `dfrn` = `dfrn` + 1";
+                               break;
+                       case self::LEGACY_DFRN:
+                               $sql = ", `legacy_dfrn` = `legacy_dfrn` + 1";
+                               break;
+                       case self::DIASPORA:
+                               $sql = ", `diaspora` = `diaspora` + 1";
+                               break;
+                       case self::OSTATUS:
+                               $sql = ", `ostatus` = `ostatus` + 1";
+                               break;
+               }
+
+               return DBA::e('UPDATE `item-delivery-data` SET `queue_done` = `queue_done` + 1' . $sql . ' WHERE `iid` = ?', $item_id);
        }
 
        /**
index 7df96fccdb4bef8d954fbc42fa9b795512d45578..e722444b18378c6b173aafef03a120470f513834 100644 (file)
@@ -10,6 +10,7 @@ use Friendica\BaseObject;
 use Friendica\Core\Cache;
 use Friendica\Core\Config;
 use Friendica\Core\L10n;
+use Friendica\Core\Logger;
 use Friendica\Core\StorageManager;
 use Friendica\Core\System;
 use Friendica\Database\DBA;
@@ -20,6 +21,7 @@ use Friendica\Protocol\DFRN;
 use Friendica\Util\DateTimeFormat;
 use Friendica\Util\Network;
 use Friendica\Util\Security;
+use Friendica\Util\Strings;
 
 require_once "include/dba.php";
 
@@ -29,7 +31,7 @@ require_once "include/dba.php";
 class Photo extends BaseObject
 {
        /**
-        * @brief Select rows from the photo table
+        * @brief Select rows from the photo table and returns them as array
         *
         * @param array $fields     Array of selected fields, empty for all
         * @param array $conditions Array of fields for conditions
@@ -38,16 +40,15 @@ class Photo extends BaseObject
         * @return boolean|array
         *
         * @throws \Exception
-        * @see   \Friendica\Database\DBA::select
+        * @see   \Friendica\Database\DBA::selectToArray
         */
-       public static function select(array $fields = [], array $conditions = [], array $params = [])
+       public static function selectToArray(array $fields = [], array $conditions = [], array $params = [])
        {
                if (empty($fields)) {
                        $fields = self::getFields();
                }
 
-               $r = DBA::select("photo", $fields, $conditions, $params);
-               return DBA::toArray($r);
+               return DBA::selectToArray('photo', $fields, $conditions, $params);
        }
 
        /**
@@ -89,7 +90,7 @@ class Photo extends BaseObject
                $conditions["resource-id"] = $resourceid;
                $conditions["uid"] = $uid;
 
-               return self::select([], $conditions, $params);
+               return self::selectToArray([], $conditions, $params);
        }
 
        /**
@@ -130,18 +131,21 @@ class Photo extends BaseObject
         */
        public static function getPhoto($resourceid, $scale = 0)
        {
-               $r = self::selectFirst(["uid"], ["resource-id" => $resourceid]);
+               $r = self::selectFirst(["uid", "allow_cid", "allow_gid", "deny_cid", "deny_gid"], ["resource-id" => $resourceid]);
                if ($r === false) {
                        return false;
                }
                $uid = $r["uid"];
 
                // This is the first place, when retrieving just a photo, that we know who owns the photo.
-               // Make sure that the requester's session is appropriately authenticated to that user
+               // Check if the photo is public (empty allow and deny means public), if so, skip auth attempt, if not
+               // make sure that the requester's session is appropriately authenticated to that user
                // otherwise permissions checks done by getPermissionsSQLByUserId() won't work correctly
-               $r = DBA::selectFirst("user", ["nickname"], ["uid" => $uid], []);
-               // this will either just return (if auth all ok) or will redirect and exit (starting over)
-               DFRN::autoRedir(self::getApp(), $r["nickname"]);
+               if (!empty($r["allow_cid"]) || !empty($r["allow_gid"]) || !empty($r["deny_cid"]) || !empty($r["deny_gid"])) {
+                       $r = DBA::selectFirst("user", ["nickname"], ["uid" => $uid], []);
+                       // this will either just return (if auth all ok) or will redirect and exit (starting over)
+                       DFRN::autoRedir(self::getApp(), $r["nickname"]);
+               }
 
                $sql_acl = Security::getPermissionsSQLByUserId($uid);
 
@@ -347,7 +351,7 @@ class Photo extends BaseObject
        public static function delete(array $conditions, array $options = [])
        {
                // get photo to delete data info
-               $photos = self::select(["backend-class","backend-ref"], $conditions);
+               $photos = self::selectToArray(['backend-class', 'backend-ref'], $conditions);
 
                foreach($photos as $photo) {
                        /** @var IStorage $backend_class */
@@ -377,7 +381,7 @@ class Photo extends BaseObject
        {
                if (!is_null($img)) {
                        // get photo to update
-                       $photos = self::select(["backend-class","backend-ref"], $conditions);
+                       $photos = self::selectToArray(['backend-class', 'backend-ref'], $conditions);
 
                        foreach($photos as $photo) {
                                /** @var IStorage $backend_class */
@@ -605,4 +609,122 @@ class Photo extends BaseObject
        {
                return System::createGUID(32, false);
        }
+
+       /**
+        * Changes photo permissions that had been embedded in a post
+        *
+        * @todo This function currently does have some flaws:
+        * - Sharing a post with a forum will create a photo that only the forum can see.
+        * - Sharing a photo again that been shared non public before doesn't alter the permissions.
+        *
+        * @return string
+        * @throws \Exception
+        */
+       public static function setPermissionFromBody($body, $uid, $original_contact_id, $str_contact_allow, $str_group_allow, $str_contact_deny, $str_group_deny)
+       {
+               // Simplify image codes
+               $img_body = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '[img]$3[/img]', $body);
+               $img_body = preg_replace("/\[img\=(.*?)\](.*?)\[\/img\]/ism", '[img]$1[/img]', $img_body);
+
+               // Search for images
+               if (!preg_match_all("/\[img\](.*?)\[\/img\]/", $img_body, $match)) {
+                       return false;
+               }
+               $images = $match[1];
+               if (empty($images)) {
+                       return false;
+               }
+
+               foreach ($images as $image) {
+                       if (!stristr($image, System::baseUrl() . '/photo/')) {
+                               continue;
+                       }
+                       $image_uri = substr($image,strrpos($image,'/') + 1);
+                       $image_uri = substr($image_uri,0, strpos($image_uri,'-'));
+                       if (!strlen($image_uri)) {
+                               continue;
+                       }
+
+                       // Ensure to only modify photos that you own
+                       $srch = '<' . intval($original_contact_id) . '>';
+
+                       $condition = [
+                               'allow_cid' => $srch, 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => '',
+                               'resource-id' => $image_uri, 'uid' => $uid
+                       ];
+                       if (!Photo::exists($condition)) {
+                               continue;
+                       }
+
+                       $fields = ['allow_cid' => $str_contact_allow, 'allow_gid' => $str_group_allow,
+                                       'deny_cid' => $str_contact_deny, 'deny_gid' => $str_group_deny];
+                       $condition = ['resource-id' => $image_uri, 'uid' => $uid];
+                       Logger::info('Set permissions', ['condition' => $condition, 'permissions' => $fields]);
+                       Photo::update($fields, $condition);
+               }
+
+               return true;
+       }
+
+       /**
+        * Strips known picture extensions from picture links
+        *
+        * @param string $name Picture link
+        * @return string stripped picture link
+        * @throws \Exception
+        */
+       public static function stripExtension($name)
+       {
+               $name = str_replace([".jpg", ".png", ".gif"], ["", "", ""], $name);
+               foreach (Image::supportedTypes() as $m => $e) {
+                       $name = str_replace("." . $e, "", $name);
+               }
+               return $name;
+       }
+
+       /**
+        * Returns the GUID from picture links
+        *
+        * @param string $name Picture link
+        * @return string GUID
+        * @throws \Exception
+        */
+       public static function getGUID($name)
+       {
+               $a = \get_app();
+               $base = $a->getBaseURL();
+
+               $guid = str_replace([Strings::normaliseLink($base), '/photo/'], '', Strings::normaliseLink($name));
+
+               $guid = self::stripExtension($guid);
+               if (substr($guid, -2, 1) != "-") {
+                       return '';
+               }
+
+               $scale = intval(substr($guid, -1, 1));
+               if (empty($scale)) {
+                       return '';
+               }
+
+               $guid = substr($guid, 0, -2);
+               return $guid;
+       }
+
+       /**
+        * Tests if the picture link points to a locally stored picture
+        *
+        * @param string $name Picture link
+        * @return boolean
+        * @throws \Exception
+        */
+       public static function isLocal($name)
+       {
+               $guid = self::getGUID($name);
+
+               if (empty($guid)) {
+                       return false;
+               }
+
+               return DBA::exists('photo', ['resource-id' => $guid]);
+       }
 }
index 62d56798fc85257f7c266552b3e3737ba0823ea6..b82d47d3133966b781d8c5d7ad34884dba26581c 100644 (file)
@@ -45,6 +45,35 @@ class Profile
                return $profile;
        }
 
+       /**
+        * @brief Returns default profile for a given user ID and ID
+        *
+        * @param int $uid The contact ID
+        * @param int $id The contact owner ID
+        * @param array $fields The selected fields
+        *
+        * @return array Profile data for the ID
+        * @throws \Exception
+        */
+       public static function getById(int $uid, int $id, array $fields = [])
+       {
+               return DBA::selectFirst('profile', $fields, ['uid' => $uid, 'id' => $id]);
+       }
+
+       /**
+        * @brief Returns profile data for the contact owner
+        *
+        * @param int $uid The User ID
+        * @param array $fields The fields to retrieve
+        *
+        * @return array Array of profile data
+        * @throws \Exception
+        */
+       public static function getListByUser(int $uid, array $fields = [])
+       {
+               return DBA::selectToArray('profile', $fields, ['uid' => $uid]);
+       }
+
        /**
         * @brief Returns a formatted location string from the given profile array
         *
@@ -471,7 +500,7 @@ class Profile
                                        'pending' => false,
                                        'hidden' => false,
                                        'archive' => false,
-                                       'network' => [Protocol::DFRN, Protocol::ACTIVITYPUB, Protocol::OSTATUS, Protocol::DIASPORA],
+                                       'network' => Protocol::FEDERATED,
                                ]);
                        }
                }
@@ -717,7 +746,7 @@ class Profile
 
        public static function getAdvanced(App $a)
        {
-               $uid = $a->profile['uid'];
+               $uid = intval($a->profile['uid']);
 
                if ($a->profile['name']) {
                        $tpl = Renderer::getMarkupTemplate('profile_advanced.tpl');
@@ -1195,29 +1224,6 @@ class Profile
                return $uid;
        }
 
-       /**
-       * Strip zrl parameter from a string.
-       *
-       * @param string $s The input string.
-       * @return string The zrl.
-       */
-       public static function stripZrls($s)
-       {
-               return preg_replace('/[\?&]zrl=(.*?)([\?&]|$)/is', '', $s);
-       }
-
-       /**
-        * Strip query parameter from a string.
-        *
-        * @param string $s The input string.
-        * @param        $param
-        * @return string The query parameter.
-        */
-       public static function stripQueryParam($s, $param)
-       {
-               return preg_replace('/[\?&]' . $param . '=(.*?)(&|$)/ism', '$2', $s);
-       }
-
        /**
         * search for Profiles
         *
index f196974a8f66d10279c286a4be23fcf6931e2ff2..1de93fb05b64faffd1d174456923fb4bd27dd562 100644 (file)
@@ -4,6 +4,7 @@
  */
 namespace Friendica\Model;
 
+use Friendica\Core\Cache;
 use Friendica\Core\Logger;
 use Friendica\Core\System;
 use Friendica\Database\DBA;
@@ -47,6 +48,94 @@ class Term
     const OBJECT_TYPE_POST  = 1;
     const OBJECT_TYPE_PHOTO = 2;
 
+       /**
+        * Returns a list of the most frequent global hashtags over the given period
+        *
+        * @param int $period Period in hours to consider posts
+        * @return array
+        * @throws \Exception
+        */
+       public static function getGlobalTrendingHashtags(int $period, $limit = 10)
+       {
+               $tags = Cache::get('global_trending_tags');
+
+               if (!$tags) {
+                       $tagsStmt = DBA::p("SELECT t.`term`, COUNT(*) AS `score`
+                               FROM `term` t
+                                JOIN `item` i ON i.`id` = t.`oid` AND i.`uid` = t.`uid`
+                                JOIN `thread` ON `thread`.`iid` = i.`id`
+                               WHERE `thread`.`visible`
+                                 AND NOT `thread`.`deleted`
+                                 AND NOT `thread`.`moderated`
+                                 AND NOT `thread`.`private`
+                                 AND t.`uid` = 0
+                                 AND t.`otype` = ?
+                                 AND t.`type` = ?
+                                 AND t.`term` != ''
+                                 AND i.`received` > DATE_SUB(NOW(), INTERVAL ? HOUR)
+                               GROUP BY `term`
+                               ORDER BY `score` DESC
+                               LIMIT ?",
+                               Term::OBJECT_TYPE_POST,
+                               Term::HASHTAG,
+                               $period,
+                               $limit
+                       );
+
+                       if (DBA::isResult($tagsStmt)) {
+                               $tags = DBA::toArray($tagsStmt);
+                               Cache::set('global_trending_tags', $tags, Cache::HOUR);
+                       }
+               }
+
+               return $tags ?: [];
+       }
+
+       /**
+        * Returns a list of the most frequent local hashtags over the given period
+        *
+        * @param int $period Period in hours to consider posts
+        * @return array
+        * @throws \Exception
+        */
+       public static function getLocalTrendingHashtags(int $period, $limit = 10)
+       {
+               $tags = Cache::get('local_trending_tags');
+
+               if (!$tags) {
+                       $tagsStmt = DBA::p("SELECT t.`term`, COUNT(*) AS `score`
+                               FROM `term` t
+                               JOIN `item` i ON i.`id` = t.`oid` AND i.`uid` = t.`uid`
+                               JOIN `thread` ON `thread`.`iid` = i.`id`
+                               JOIN `user` ON `user`.`uid` = `thread`.`uid` AND NOT `user`.`hidewall`
+                               WHERE `thread`.`visible`
+                                 AND NOT `thread`.`deleted`
+                                 AND NOT `thread`.`moderated`
+                                 AND NOT `thread`.`private`
+                                 AND `thread`.`wall`
+                                 AND `thread`.`origin`
+                                 AND t.`otype` = ?
+                                 AND t.`type` = ?
+                                 AND t.`term` != ''
+                                 AND i.`received` > DATE_SUB(NOW(), INTERVAL ? HOUR)
+                               GROUP BY `term`
+                               ORDER BY `score` DESC
+                               LIMIT ?",
+                               Term::OBJECT_TYPE_POST,
+                               Term::HASHTAG,
+                               $period,
+                               $limit
+                       );
+
+                       if (DBA::isResult($tagsStmt)) {
+                               $tags = DBA::toArray($tagsStmt);
+                               Cache::set('local_trending_tags', $tags, Cache::HOUR);
+                       }
+               }
+
+               return $tags ?: [];
+       }
+
        /**
         * Generates the legacy item.tag field comma-separated BBCode string from an item ID.
         * Includes only hashtags, implicit and explicit mentions.
diff --git a/src/Model/TwoFactor/AppSpecificPassword.php b/src/Model/TwoFactor/AppSpecificPassword.php
new file mode 100644 (file)
index 0000000..41b1e3b
--- /dev/null
@@ -0,0 +1,137 @@
+<?php
+
+namespace Friendica\Model\TwoFactor;
+
+use Friendica\BaseObject;
+use Friendica\Database\DBA;
+use Friendica\Model\User;
+use Friendica\Util\DateTimeFormat;
+use Friendica\Util\Temporal;
+use PragmaRX\Random\Random;
+
+/**
+ * Manages users' two-factor recovery hashed_passwords in the 2fa_app_specific_passwords table
+ *
+ * @package Friendica\Model
+ */
+class AppSpecificPassword extends BaseObject
+{
+       public static function countForUser($uid)
+       {
+               return DBA::count('2fa_app_specific_password', ['uid' => $uid]);
+       }
+
+       public static function checkDuplicateForUser($uid, $description)
+       {
+               return DBA::exists('2fa_app_specific_password', ['uid' => $uid, 'description' => $description]);
+       }
+
+       /**
+        * Checks the provided hashed_password is available to use for login by the provided user
+        *
+        * @param int    $uid User ID
+        * @param string $plaintextPassword
+        * @return bool
+        * @throws \Exception
+        */
+       public static function authenticateUser($uid, $plaintextPassword)
+       {
+               $appSpecificPasswords = self::getListForUser($uid);
+
+               $return = false;
+
+               foreach ($appSpecificPasswords as $appSpecificPassword) {
+                       if (password_verify($plaintextPassword, $appSpecificPassword['hashed_password'])) {
+                               $fields = ['last_used' => DateTimeFormat::utcNow()];
+                               if (password_needs_rehash($appSpecificPassword['hashed_password'], PASSWORD_DEFAULT)) {
+                                       $fields['hashed_password'] = User::hashPassword($plaintextPassword);
+                               }
+
+                               self::update($appSpecificPassword['id'], $fields);
+
+                               $return |= true;
+                       }
+               }
+
+               return $return;
+       }
+
+    /**
+     * Returns a complete list of all recovery hashed_passwords for the provided user, including the used status
+     *
+     * @param  int $uid User ID
+     * @return array
+     * @throws \Exception
+     */
+       public static function getListForUser($uid)
+       {
+               $appSpecificPasswordsStmt = DBA::select('2fa_app_specific_password', ['id', 'description', 'hashed_password', 'last_used'], ['uid' => $uid]);
+
+               $appSpecificPasswords = DBA::toArray($appSpecificPasswordsStmt);
+
+               array_walk($appSpecificPasswords, function (&$value) {
+                       $value['ago'] = Temporal::getRelativeDate($value['last_used']);
+               });
+
+               return $appSpecificPasswords;
+       }
+
+    /**
+     * Generates a new app specific password for the provided user and hashes it in the database.
+     *
+     * @param  int    $uid         User ID
+     * @param  string $description Password description
+     * @return array The new app-specific password data structure with the plaintext password added
+     * @throws \Exception
+     */
+       public static function generateForUser(int $uid, $description)
+       {
+               $Random = (new Random())->size(40);
+
+               $plaintextPassword = $Random->get();
+
+               $generated = DateTimeFormat::utcNow();
+
+               $fields = [
+                       'uid' => $uid,
+                       'description' => $description,
+                       'hashed_password' => User::hashPassword($plaintextPassword),
+                       'generated' => $generated,
+               ];
+
+               DBA::insert('2fa_app_specific_password', $fields);
+
+               $fields['id'] = DBA::lastInsertId();
+               $fields['plaintext_password'] = $plaintextPassword;
+
+               return $fields;
+       }
+
+       private static function update($appSpecificPasswordId, $fields)
+       {
+               return DBA::update('2fa_app_specific_password', $fields, ['id' => $appSpecificPasswordId]);
+       }
+
+       /**
+        * Deletes all the recovery hashed_passwords for the provided user.
+        *
+        * @param int $uid User ID
+        * @return bool
+        * @throws \Exception
+        */
+       public static function deleteAllForUser(int $uid)
+       {
+               return DBA::delete('2fa_app_specific_password', ['uid' => $uid]);
+       }
+
+       /**
+        * @param int $uid
+        * @param int $app_specific_password_id
+        * @return bool
+        * @throws \Exception
+        */
+       public static function deleteForUser(int $uid, int $app_specific_password_id)
+       {
+               return DBA::delete('2fa_app_specific_password', ['id' => $app_specific_password_id, 'uid' => $uid]);
+       }
+}
diff --git a/src/Model/TwoFactor/RecoveryCode.php b/src/Model/TwoFactor/RecoveryCode.php
new file mode 100644 (file)
index 0000000..676b538
--- /dev/null
@@ -0,0 +1,125 @@
+<?php
+
+namespace Friendica\Model\TwoFactor;
+
+use Friendica\BaseObject;
+use Friendica\Database\DBA;
+use Friendica\Util\DateTimeFormat;
+use PragmaRX\Random\Random;
+use PragmaRX\Recovery\Recovery;
+
+/**
+ * Manages users' two-factor recovery codes in the 2fa_recovery_codes table
+ *
+ * @package Friendica\Model
+ */
+class RecoveryCode extends BaseObject
+{
+    /**
+     * Returns the number of code the provided users can still use to replace a TOTP code
+     *
+     * @param int $uid User ID
+     * @return int
+     * @throws \Exception
+     */
+    public static function countValidForUser($uid)
+       {
+               return DBA::count('2fa_recovery_codes', ['uid' => $uid, 'used' => null]);
+       }
+
+    /**
+     * Checks the provided code is available to use for login by the provided user
+     *
+     * @param  int $uid User ID
+     * @param string $code
+     * @return bool
+     * @throws \Exception
+     */
+       public static function existsForUser($uid, $code)
+       {
+               return DBA::exists('2fa_recovery_codes', ['uid' => $uid, 'code' => $code, 'used' => null]);
+       }
+
+    /**
+     * Returns a complete list of all recovery codes for the provided user, including the used status
+     *
+     * @param  int $uid User ID
+     * @return array
+     * @throws \Exception
+     */
+       public static function getListForUser($uid)
+       {
+               $codesStmt = DBA::select('2fa_recovery_codes', ['code', 'used'], ['uid' => $uid]);
+
+               return DBA::toArray($codesStmt);
+       }
+
+    /**
+     * Marks the provided code as used for the provided user.
+     * Returns false if the code doesn't exist for the user or it has been used already.
+     *
+     * @param  int $uid User ID
+     * @param string $code
+     * @return bool
+     * @throws \Exception
+     */
+       public static function markUsedForUser($uid, $code)
+       {
+               DBA::update('2fa_recovery_codes', ['used' => DateTimeFormat::utcNow()], ['uid' => $uid, 'code' => $code, 'used' => null]);
+
+               return DBA::affectedRows() > 0;
+       }
+
+    /**
+     * Generates a fresh set of recovery codes for the provided user.
+     * Generates 12 codes constituted of 2 blocks of 6 characters separated by a dash.
+     *
+     * @param  int $uid User ID
+     * @throws \Exception
+     */
+       public static function generateForUser($uid)
+       {
+               $Random = (new Random())->pattern('[a-z0-9]');
+
+               $RecoveryGenerator = new Recovery($Random);
+
+               $codes = $RecoveryGenerator
+                       ->setCount(12)
+                       ->setBlocks(2)
+                       ->setChars(6)
+                       ->lowercase(true)
+                       ->toArray();
+
+               $generated = DateTimeFormat::utcNow();
+               foreach ($codes as $code) {
+                       DBA::insert('2fa_recovery_codes', [
+                               'uid' => $uid,
+                               'code' => $code,
+                               'generated' => $generated
+                       ]);
+               }
+       }
+
+    /**
+     * Deletes all the recovery codes for the provided user.
+     *
+     * @param  int $uid User ID
+     * @throws \Exception
+     */
+       public static function deleteForUser($uid)
+       {
+               DBA::delete('2fa_recovery_codes', ['uid' => $uid]);
+       }
+
+    /**
+     * Replaces the existing recovery codes for the provided user by a freshly generated set.
+     *
+     * @param  int $uid User ID
+     * @throws \Exception
+     */
+       public static function regenerateForUser($uid)
+       {
+               self::deleteForUser($uid);
+               self::generateForUser($uid);
+       }
+}
diff --git a/src/Model/TwoFactorRecoveryCode.php b/src/Model/TwoFactorRecoveryCode.php
deleted file mode 100644 (file)
index 74dead3..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-<?php
-
-namespace Friendica\Model;
-
-use Friendica\BaseObject;
-use Friendica\Database\DBA;
-use Friendica\Util\DateTimeFormat;
-use PragmaRX\Random\Random;
-use PragmaRX\Recovery\Recovery;
-
-/**
- * Manages users' two-factor recovery codes in the 2fa_recovery_codes table
- *
- * @package Friendica\Model
- */
-class TwoFactorRecoveryCode extends BaseObject
-{
-    /**
-     * Returns the number of code the provided users can still use to replace a TOTP code
-     *
-     * @param int $uid User ID
-     * @return int
-     * @throws \Exception
-     */
-    public static function countValidForUser($uid)
-       {
-               return DBA::count('2fa_recovery_codes', ['uid' => $uid, 'used' => null]);
-       }
-
-    /**
-     * Checks the provided code is available to use for login by the provided user
-     *
-     * @param  int $uid User ID
-     * @param string $code
-     * @return bool
-     * @throws \Exception
-     */
-       public static function existsForUser($uid, $code)
-       {
-               return DBA::exists('2fa_recovery_codes', ['uid' => $uid, 'code' => $code, 'used' => null]);
-       }
-
-    /**
-     * Returns a complete list of all recovery codes for the provided user, including the used status
-     *
-     * @param  int $uid User ID
-     * @return array
-     * @throws \Exception
-     */
-       public static function getListForUser($uid)
-       {
-               $codesStmt = DBA::select('2fa_recovery_codes', ['code', 'used'], ['uid' => $uid]);
-
-               return DBA::toArray($codesStmt);
-       }
-
-    /**
-     * Marks the provided code as used for the provided user.
-     * Returns false if the code doesn't exist for the user or it has been used already.
-     *
-     * @param  int $uid User ID
-     * @param string $code
-     * @return bool
-     * @throws \Exception
-     */
-       public static function markUsedForUser($uid, $code)
-       {
-               DBA::update('2fa_recovery_codes', ['used' => DateTimeFormat::utcNow()], ['uid' => $uid, 'code' => $code, 'used' => null]);
-
-               return DBA::affectedRows() > 0;
-       }
-
-    /**
-     * Generates a fresh set of recovery codes for the provided user.
-     * Generates 12 codes constituted of 2 blocks of 6 characters separated by a dash.
-     *
-     * @param  int $uid User ID
-     * @throws \Exception
-     */
-       public static function generateForUser($uid)
-       {
-               $Random = (new Random())->pattern('[a-z0-9]');
-
-               $RecoveryGenerator = new Recovery($Random);
-
-               $codes = $RecoveryGenerator
-                       ->setCount(12)
-                       ->setBlocks(2)
-                       ->setChars(6)
-                       ->lowercase(true)
-                       ->toArray();
-
-               $generated = DateTimeFormat::utcNow();
-               foreach ($codes as $code) {
-                       DBA::insert('2fa_recovery_codes', [
-                               'uid' => $uid,
-                               'code' => $code,
-                               'generated' => $generated
-                       ]);
-               }
-       }
-
-    /**
-     * Deletes all the recovery codes for the provided user.
-     *
-     * @param  int $uid User ID
-     * @throws \Exception
-     */
-       public static function deleteForUser($uid)
-       {
-               DBA::delete('2fa_recovery_codes', ['uid' => $uid]);
-       }
-
-    /**
-     * Replaces the existing recovery codes for the provided user by a freshly generated set.
-     *
-     * @param  int $uid User ID
-     * @throws \Exception
-     */
-       public static function regenerateForUser($uid)
-       {
-               self::deleteForUser($uid);
-               self::generateForUser($uid);
-       }
-}
index de6931052f50bb3c46a302fd654a921ff50be399..141ecf059802d88d7956801262b593e6ec8c925d 100644 (file)
@@ -17,6 +17,7 @@ use Friendica\Core\System;
 use Friendica\Core\Worker;
 use Friendica\Database\DBA;
 use Friendica\Model\Photo;
+use Friendica\Model\TwoFactor\AppSpecificPassword;
 use Friendica\Object\Image;
 use Friendica\Util\Crypto;
 use Friendica\Util\DateTimeFormat;
@@ -267,17 +268,18 @@ class User
        /**
         * Authenticate a user with a clear text password
         *
-        * @brief Authenticate a user with a clear text password
-        * @param mixed $user_info
+        * @brief      Authenticate a user with a clear text password
+        * @param mixed  $user_info
         * @param string $password
+        * @param bool   $third_party
         * @return int|boolean
         * @deprecated since version 3.6
-        * @see User::getIdFromPasswordAuthentication()
+        * @see        User::getIdFromPasswordAuthentication()
         */
-       public static function authenticate($user_info, $password)
+       public static function authenticate($user_info, $password, $third_party = false)
        {
                try {
-                       return self::getIdFromPasswordAuthentication($user_info, $password);
+                       return self::getIdFromPasswordAuthentication($user_info, $password, $third_party);
                } catch (Exception $ex) {
                        return false;
                }
@@ -287,16 +289,22 @@ class User
         * Returns the user id associated with a successful password authentication
         *
         * @brief Authenticate a user with a clear text password
-        * @param mixed $user_info
+        * @param mixed  $user_info
         * @param string $password
+        * @param bool   $third_party
         * @return int User Id if authentication is successful
         * @throws Exception
         */
-       public static function getIdFromPasswordAuthentication($user_info, $password)
+       public static function getIdFromPasswordAuthentication($user_info, $password, $third_party = false)
        {
                $user = self::getAuthenticationInfo($user_info);
 
-               if (strpos($user['password'], '$') === false) {
+               if ($third_party && PConfig::get($user['uid'], '2fa', 'verified')) {
+                       // Third-party apps can't verify two-factor authentication, we use app-specific passwords instead
+                       if (AppSpecificPassword::authenticateUser($user['uid'], $password)) {
+                               return $user['uid'];
+                       }
+               } elseif (strpos($user['password'], '$') === false) {
                        //Legacy hash that has not been replaced by a new hash yet
                        if (self::hashPasswordLegacy($password) === $user['password']) {
                                self::updatePasswordHashed($user['uid'], self::hashPassword($password));
index 60fe04bf7a721b74f2eb273a76452b4ab5c2fa21..de3c717e37d06e93ba5d00ea81087a00729521ed 100644 (file)
@@ -53,7 +53,7 @@ class Contact extends BaseAdminModule
 
                $pager = new Pager($a->query_string, 30);
 
-               $contacts = Model\Contact::select([], $condition, ['limit' => [$pager->getStart(), $pager->getItemsPerPage()]]);
+               $contacts = Model\Contact::selectToArray([], $condition, ['limit' => [$pager->getStart(), $pager->getItemsPerPage()]]);
 
                $t = Renderer::getMarkupTemplate('admin/blocklist/contact.tpl');
                $o = Renderer::replaceMacros($t, [
index 754d1aad512494695a36c5514a04cde8dd992ee7..384e346b0d67c5db1f26d6d2163e48b8a1688e7d 100644 (file)
@@ -28,7 +28,7 @@ class Server extends BaseAdminModule
                                'reason' => Strings::escapeTags(trim($_POST['newentry_reason']))
                        ];
                        Config::set('system', 'blocklist', $blocklist);
-                       info(L10n::t('Server added to blocklist.') . EOL);
+                       info(L10n::t('Server domain pattern added to blocklist.') . EOL);
                } else {
                        // Edit the entries from blocklist
                        $blocklist = [];
@@ -61,9 +61,9 @@ class Server extends BaseAdminModule
                if (is_array($blocklist)) {
                        foreach ($blocklist as $id => $b) {
                                $blocklistform[] = [
-                                       'domain' => ["domain[$id]", L10n::t('Blocked domain'), $b['domain'], '', L10n::t('The blocked domain'), 'required', '', ''],
-                                       'reason' => ["reason[$id]", L10n::t("Reason for the block"), $b['reason'], L10n::t('The reason why you blocked this domain.') . '(' . $b['domain'] . ')', 'required', '', ''],
-                                       'delete' => ["delete[$id]", L10n::t("Delete domain") . ' (' . $b['domain'] . ')', false, L10n::t("Check to delete this entry from the blocklist")]
+                                       'domain' => ["domain[$id]", L10n::t('Blocked server domain pattern'), $b['domain'], '', 'required', '', ''],
+                                       'reason' => ["reason[$id]", L10n::t("Reason for the block"), $b['reason'], '', 'required', '', ''],
+                                       'delete' => ["delete[$id]", L10n::t("Delete server domain pattern") . ' (' . $b['domain'] . ')', false, L10n::t("Check to delete this entry from the blocklist")]
                                ];
                        }
                }
@@ -71,16 +71,22 @@ class Server extends BaseAdminModule
                $t = Renderer::getMarkupTemplate('admin/blocklist/server.tpl');
                return Renderer::replaceMacros($t, [
                        '$title' => L10n::t('Administration'),
-                       '$page' => L10n::t('Server Blocklist'),
-                       '$intro' => L10n::t('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 domains you should also give a reason why you have blocked the remote server.'),
-                       '$public' => L10n::t('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.'),
+                       '$page' => L10n::t('Server Domain Pattern Blocklist'),
+                       '$intro' => L10n::t('This page can be used to define a blacklist of server domain patterns from the federated network that are not allowed to interact with your node. For each domain pattern you should also provide the reason why you block it.'),
+                       '$public' => L10n::t('The list of blocked server domain patterns will be made publically available on the <a href="/friendica">/friendica</a> page so that your users and people investigating communication problems can find the reason easily.'),
+                       '$syntax' => L10n::t('<p>The server domain pattern syntax is case-insensitive shell wildcard, comprising the following special characters:</p>
+<ul>
+       <li><code>*</code>: Any number of characters</li>
+       <li><code>?</code>: Any single character</li>
+       <li><code>[&lt;char1&gt;&lt;char2&gt;...]</code>: char1 or char2</li>
+</ul>'),
                        '$addtitle' => L10n::t('Add new entry to block list'),
-                       '$newdomain' => ['newentry_domain', L10n::t('Server Domain'), '', L10n::t('The domain of the new server to add to the block list. Do not include the protocol.'), 'required', '', ''],
-                       '$newreason' => ['newentry_reason', L10n::t('Block reason'), '', L10n::t('The reason why you blocked this domain.'), 'required', '', ''],
+                       '$newdomain' => ['newentry_domain', L10n::t('Server Domain Pattern'), '', L10n::t('The domain pattern of the new server to add to the block list. Do not include the protocol.'), 'required', '', ''],
+                       '$newreason' => ['newentry_reason', L10n::t('Block reason'), '', L10n::t('The reason why you blocked this server domain pattern.'), 'required', '', ''],
                        '$submit' => L10n::t('Add Entry'),
                        '$savechanges' => L10n::t('Save changes to the blocklist'),
                        '$currenttitle' => L10n::t('Current Entries in the Blocklist'),
-                       '$thurl' => L10n::t('Blocked domain'),
+                       '$thurl' => L10n::t('Blocked server domain pattern'),
                        '$threason' => L10n::t('Reason for the block'),
                        '$delentry' => L10n::t('Delete entry from blocklist'),
                        '$entries' => $blocklistform,
index 1e85b7dc706913398b80a9fb63a15fa6b3fe1ba5..6da9eec6d320da91c94dc261f1db3e3abacd034e 100644 (file)
@@ -20,11 +20,12 @@ class Source extends BaseAdminModule
                $a = self::getApp();
 
                $guid = null;
-               if (!empty($a->argv[1])) {
-                       $guid = $a->argv[1];
+               // @TODO: Replace with parameter from router
+               if (!empty($a->argv[3])) {
+                       $guid = $a->argv[3];
                }
 
-               $guid = defaults($_REQUEST['guid'], $guid);
+               $guid = $_REQUEST['guid'] ?? $guid;
 
                $source = '';
                $item_uri = '';
index e89aa53c620e4e65e789ae1baaea6c6ad215581e..aadd5b768d42fb9ce5928ce107d9026496134bef 100644 (file)
@@ -30,17 +30,17 @@ class Queue extends BaseAdminModule
 
                // get jobs from the workerqueue table
                if ($deferred) {
-                       $condition = ["NOT `done` AND `next_try` > ?", DateTimeFormat::utcNow()];
+                       $condition = ["NOT `done` AND `retrial` > ?", 0];
                        $sub_title = L10n::t('Inspect Deferred Worker Queue');
                        $info = L10n::t("This page lists the deferred worker jobs. This are jobs that couldn't be executed at the first time.");
                } else {
-                       $condition = ["NOT `done` AND `next_try` < ?", DateTimeFormat::utcNow()];
+                       $condition = ["NOT `done` AND `retrial` = ?", 0];
                        $sub_title = L10n::t('Inspect Worker Queue');
                        $info = L10n::t('This page lists the currently queued worker jobs. These jobs are handled by the worker cronjob you\'ve set up during install.');
                }
 
                // @TODO Move to Model\WorkerQueue::getEntries()
-               $entries = DBA::select('workerqueue', ['id', 'parameter', 'created', 'priority'], $condition, ['order' => ['priority']]);
+               $entries = DBA::select('workerqueue', ['id', 'parameter', 'created', 'priority'], $condition, ['limit' => 999, 'order' => ['created']]);
 
                $r = [];
                while ($entry = DBA::fetch($entries)) {
index 78576efe3bce0f710a926fc9074a729f8f6616b8..dff869df20ae2a7912c25ea611bc60a64fe2cd44 100644 (file)
@@ -14,7 +14,6 @@ use Friendica\Module\BaseAdminModule;
 use Friendica\Module\Register;
 use Friendica\Protocol\PortableContact;
 use Friendica\Util\BasePath;
-use Friendica\Util\BaseURL;
 use Friendica\Util\Strings;
 use Friendica\Worker\Delivery;
 
@@ -166,7 +165,6 @@ class Site extends BaseAdminModule
                $nodeinfo               = !empty($_POST['nodeinfo']);
                $dfrn_only              = !empty($_POST['dfrn_only']);
                $ostatus_disabled       = !empty($_POST['ostatus_disabled']);
-               $ostatus_full_threads   = !empty($_POST['ostatus_full_threads']);
                $diaspora_enabled       = !empty($_POST['diaspora_enabled']);
                $ssl_policy             = (!empty($_POST['ssl_policy'])             ? intval($_POST['ssl_policy'])                    : 0);
                $force_ssl              = !empty($_POST['force_ssl']);
@@ -247,7 +245,7 @@ class Site extends BaseAdminModule
                        $diaspora_enabled = false;
                }
                if ($ssl_policy != intval(Config::get('system', 'ssl_policy'))) {
-                       if ($ssl_policy == BaseURL::SSL_POLICY_FULL) {
+                       if ($ssl_policy == App\BaseURL::SSL_POLICY_FULL) {
                                DBA::e("UPDATE `contact` SET
                                `url`     = REPLACE(`url`    , 'http:' , 'https:'),
                                `photo`   = REPLACE(`photo`  , 'http:' , 'https:'),
@@ -265,7 +263,7 @@ class Site extends BaseAdminModule
                                `thumb`   = REPLACE(`thumb`  , 'http:' , 'https:')
                                WHERE 1 "
                                );
-                       } elseif ($ssl_policy == BaseURL::SSL_POLICY_SELFSIGN) {
+                       } elseif ($ssl_policy == App\BaseURL::SSL_POLICY_SELFSIGN) {
                                DBA::e("UPDATE `contact` SET
                                `url`     = REPLACE(`url`    , 'https:' , 'http:'),
                                `photo`   = REPLACE(`photo`  , 'https:' , 'http:'),
@@ -361,7 +359,6 @@ class Site extends BaseAdminModule
                Config::set('system', 'curl_timeout'           , $timeout);
                Config::set('system', 'dfrn_only'              , $dfrn_only);
                Config::set('system', 'ostatus_disabled'       , $ostatus_disabled);
-               Config::set('system', 'ostatus_full_threads'   , $ostatus_full_threads);
                Config::set('system', 'diaspora_enabled'       , $diaspora_enabled);
 
                Config::set('config', 'private_addons'         , $private_addons);
@@ -514,9 +511,9 @@ class Site extends BaseAdminModule
                ];
 
                $ssl_choices = [
-                       BaseURL::SSL_POLICY_NONE => L10n::t('No SSL policy, links will track page SSL state'),
-                       BaseURL::SSL_POLICY_FULL => L10n::t('Force all links to use SSL'),
-                       BaseURL::SSL_POLICY_SELFSIGN => L10n::t('Self-signed certificate, use SSL for local links only (discouraged)')
+                       App\BaseURL::SSL_POLICY_NONE => L10n::t('No SSL policy, links will track page SSL state'),
+                       App\BaseURL::SSL_POLICY_FULL => L10n::t('Force all links to use SSL'),
+                       App\BaseURL::SSL_POLICY_SELFSIGN => L10n::t('Self-signed certificate, use SSL for local links only (discouraged)')
                ];
 
                $check_git_version_choices = [
@@ -627,7 +624,6 @@ class Site extends BaseAdminModule
                        '$community_page_style'   => ['community_page_style', L10n::t('Community pages for visitors'), Config::get('system', 'community_page_style'), L10n::t('Which community pages should be available for visitors. Local users always see both pages.'), $community_page_style_choices],
                        '$max_author_posts_community_page' => ['max_author_posts_community_page', L10n::t('Posts per user on community page'), Config::get('system', 'max_author_posts_community_page'), L10n::t('The maximum number of posts per user on the community page. (Not valid for "Global Community")')],
                        '$ostatus_disabled'       => ['ostatus_disabled', L10n::t('Disable OStatus support'), Config::get('system', 'ostatus_disabled'), L10n::t('Disable built-in OStatus (StatusNet, GNU Social etc.) compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed.')],
-                       '$ostatus_full_threads'   => ['ostatus_full_threads', L10n::t('Only import OStatus/ActivityPub threads from our contacts'), Config::get('system', 'ostatus_full_threads'), L10n::t('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.')],
                        '$ostatus_not_able'       => L10n::t('OStatus support can only be enabled if threading is enabled.'),
                        '$diaspora_able'          => $diaspora_able,
                        '$diaspora_not_able'      => L10n::t('Diaspora support can\'t be enabled because Friendica was installed into a sub directory.'),
index ca042c6fa7616175b8741a1f6a71c4eff03af898..d0bb4347a17ae016a6596e84b1112858bd941893 100644 (file)
@@ -12,7 +12,7 @@ use Friendica\Database\DBA;
 use Friendica\Database\DBStructure;
 use Friendica\Model\Register;
 use Friendica\Module\BaseAdminModule;
-use Friendica\Util\Config\ConfigFileLoader;
+use Friendica\Util\ConfigFileLoader;
 use Friendica\Util\DateTimeFormat;
 use Friendica\Util\Network;
 
@@ -146,11 +146,9 @@ class Summary extends BaseAdminModule
 
                $pending = Register::getPendingCount();
 
-               $deferred = DBA::count('workerqueue', ['`executed` <= ? AND NOT `done` AND `next_try` > ?',
-                       DBA::NULL_DATETIME, DateTimeFormat::utcNow()]);
+               $deferred = DBA::count('workerqueue', ['NOT `done` AND `retrial` > ?', 0]);
 
-               $workerqueue = DBA::count('workerqueue', ['`executed` <= ? AND NOT `done` AND `next_try` < ?',
-                       DBA::NULL_DATETIME, DateTimeFormat::utcNow()]);
+               $workerqueue = DBA::count('workerqueue', ['NOT `done` AND `retrial` = ?', 0]);
 
                // We can do better, but this is a quick queue status
                $queues = ['label' => L10n::t('Message queues'), 'deferred' => $deferred, 'workerq' => $workerqueue];
index dc41d11a485a3c802f5fb25ec5b1af34aaafc950..904d9eb46e8dcc1f6098b624c745bdba0388e1eb 100644 (file)
@@ -77,6 +77,9 @@ class Embed extends BaseAdminModule
                                }
                        }
 
+                       // Overrides normal theme style include to strip user param to show embedded theme settings
+                       Renderer::$theme['stylesheet'] = 'view/theme/' . $theme . '/style.pcss';
+
                        $t = Renderer::getMarkupTemplate('admin/addons/embed.tpl');
                        return Renderer::replaceMacros($t, [
                                '$action' => '/admin/themes/' . $theme . '/embed?mode=minimal',
index 71a91919bd26e389b07ac27cce7aae17f5bcd59b..d29b4c33caea64b438d477887dc7ccb198fda47b 100644 (file)
@@ -25,10 +25,12 @@ class Index extends BaseAdminModule
 
                        switch ($_GET['action']) {
                                case 'reload':
+                                       $allowed_themes = array_unique($allowed_themes);
                                        foreach ($allowed_themes as $theme) {
-                                               Theme::uninstall($theme['name']);
-                                               Theme::install($theme['name']);
+                                               Theme::uninstall($theme);
+                                               Theme::install($theme);
                                        }
+                                       Theme::setAllowedList($allowed_themes);
 
                                        info('Themes reloaded');
                                        break;
index feae601fddf0acc9a97dcff4e9f1abe79400020a..04156daba9276b10d660dfd5a60f88a5b71d2ecd 100644 (file)
@@ -521,7 +521,7 @@ class Contact extends BaseModule
                                $relation_text = '';
                        }
 
-                       if (!in_array($contact['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::OSTATUS, Protocol::DIASPORA])) {
+                       if (!in_array($contact['network'], Protocol::FEDERATED)) {
                                $relation_text = '';
                        }
 
@@ -668,19 +668,19 @@ class Contact extends BaseModule
 
                switch ($type) {
                        case 'blocked':
-                               $sql_extra = " AND `blocked` = 1";
+                               $sql_extra = " AND `blocked`";
                                break;
                        case 'hidden':
-                               $sql_extra = " AND `hidden` = 1 AND `blocked` = 0";
+                               $sql_extra = " AND `hidden` AND NOT `blocked`";
                                break;
                        case 'ignored':
-                               $sql_extra = " AND `readonly` = 1 AND `blocked` = 0";
+                               $sql_extra = " AND `readonly` AND NOT `blocked`";
                                break;
                        case 'archived':
-                               $sql_extra = " AND `archive` = 1 AND `blocked` = 0";
+                               $sql_extra = " AND `archive` AND NOT `blocked`";
                                break;
                        default:
-                               $sql_extra = " AND `blocked` = 0";
+                               $sql_extra = " AND NOT `archive` AND NOT `blocked`";
                }
 
                $sql_extra .= sprintf(" AND `network` != '%s' ", Protocol::PHANTOM);
@@ -968,7 +968,7 @@ class Contact extends BaseModule
 
                        $profiledata = Model\Contact::getDetailsByURL($contact['url']);
 
-                       if (local_user() && in_array($profiledata['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS])) {
+                       if (local_user() && in_array($profiledata['network'], Protocol::FEDERATED)) {
                                $profiledata['remoteconnect'] = System::baseUrl() . '/follow?url=' . urlencode($profiledata['url']);
                        }
 
@@ -984,24 +984,26 @@ class Contact extends BaseModule
                $dir_icon = '';
                $alt_text = '';
 
-               switch ($rr['rel']) {
-                       case Model\Contact::FRIEND:
-                               $dir_icon = 'images/lrarrow.gif';
-                               $alt_text = L10n::t('Mutual Friendship');
-                               break;
+               if (!empty($rr['uid']) && !empty($rr['rel'])) {
+                       switch ($rr['rel']) {
+                               case Model\Contact::FRIEND:
+                                       $dir_icon = 'images/lrarrow.gif';
+                                       $alt_text = L10n::t('Mutual Friendship');
+                                       break;
 
-                       case Model\Contact::FOLLOWER;
-                               $dir_icon = 'images/larrow.gif';
-                               $alt_text = L10n::t('is a fan of yours');
-                               break;
+                               case Model\Contact::FOLLOWER;
+                                       $dir_icon = 'images/larrow.gif';
+                                       $alt_text = L10n::t('is a fan of yours');
+                                       break;
 
-                       case Model\Contact::SHARING;
-                               $dir_icon = 'images/rarrow.gif';
-                               $alt_text = L10n::t('you are a fan of');
-                               break;
+                               case Model\Contact::SHARING;
+                                       $dir_icon = 'images/rarrow.gif';
+                                       $alt_text = L10n::t('you are a fan of');
+                                       break;
 
-                       default:
-                               break;
+                               default:
+                                       break;
+                       }
                }
 
                $url = Model\Contact::magicLink($rr['url']);
index 1ce1ac4c6e92ab5f91db0235244c45c15ca6479a..19e3ec2131282248455f0676c5d7ae2b8bfb1f3c 100644 (file)
@@ -148,17 +148,29 @@ class Babel extends BaseModule
                                                'content' => htmlspecialchars($html2)
                                        ];
 
+                                       $bbcode2plain = Text\BBCode::toPlaintext($bbcode);
+                                       $results[] = [
+                                               'title'   => L10n::t('HTML::toBBCode => BBCode::toPlaintext'),
+                                               'content' => '<pre>' . $bbcode2plain . '</pre>'
+                                       ];
+
                                        $markdown = Text\HTML::toMarkdown($html);
                                        $results[] = [
                                                'title'   => L10n::t('HTML::toMarkdown'),
                                                'content' => visible_whitespace($markdown)
                                        ];
 
-                                       $text = Text\HTML::toPlaintext($html);
+                                       $text = Text\HTML::toPlaintext($html, 0);
                                        $results[] = [
                                                'title'   => L10n::t('HTML::toPlaintext'),
                                                'content' => '<pre>' . $text . '</pre>'
                                        ];
+
+                                       $text = Text\HTML::toPlaintext($html, 0, true);
+                                       $results[] = [
+                                               'title'   => L10n::t('HTML::toPlaintext (compact)'),
+                                               'content' => '<pre>' . $text . '</pre>'
+                                       ];
                        }
                }
 
index 5367adb7e1c8f9e53f55920b7cecc72ec37ab31f..2cc273b139910c647a141b42bcf484fcdcd58fee 100644 (file)
@@ -12,6 +12,7 @@ use Friendica\Core\System;
 use Friendica\Database\DBA;
 use Friendica\Protocol\ActivityPub;
 use Friendica\Util\HTTPSignature;
+use Friendica\Util\Network;
 
 /**
  * ActivityPub Inbox
@@ -22,7 +23,7 @@ class Inbox extends BaseModule
        {
                $a = self::getApp();
 
-               $postdata = file_get_contents('php://input');
+               $postdata = Network::postdata();
 
                if (empty($postdata)) {
                        throw new \Friendica\Network\HTTPException\BadRequestException();
index 54c10534ddeafd27b976fa178d674b26a56edbbe..7ba40396659927f15df9f6b28b3759c33c2d4e13 100644 (file)
@@ -5,11 +5,11 @@ namespace Friendica\Module;
 use Friendica\App;
 use Friendica\BaseModule;
 use Friendica\Core;
-use Friendica\Core\Config\Cache\IConfigCache;
+use Friendica\Core\Config\Cache\ConfigCache;
 use Friendica\Core\L10n;
 use Friendica\Core\Renderer;
+use Friendica\Network\HTTPException;
 use Friendica\Util\BasePath;
-use Friendica\Util\BaseURL;
 use Friendica\Util\Strings;
 use Friendica\Util\Temporal;
 
@@ -51,7 +51,7 @@ class Install extends BaseModule
                $a = self::getApp();
 
                if (!$a->getMode()->isInstall()) {
-                       throw new \Friendica\Network\HTTPException\ForbiddenException();
+                       throw new HTTPException\ForbiddenException();
                }
 
                // route: install/testrwrite
@@ -59,14 +59,15 @@ class Install extends BaseModule
                // @TODO: Replace with parameter from router
                if ($a->getArgumentValue(1, '') == 'testrewrite') {
                        // Status Code 204 means that it worked without content
-                       throw new \Friendica\Network\HTTPException\NoContentException();
+                       throw new HTTPException\NoContentException();
                }
 
                self::$installer = new Core\Installer();
 
                // get basic installation information and save them to the config cache
                $configCache = $a->getConfigCache();
-               self::$installer->setUpCache($configCache, BasePath::create($a->getBasePath(), $_SERVER));
+               $basePath = new BasePath($a->getBasePath());
+               self::$installer->setUpCache($configCache, $basePath->getPath());
 
                // We overwrite current theme css, because during install we may not have a working mod_rewrite
                // so we may not have a css at all. Here we set a static css file for the install procedure pages
@@ -77,7 +78,7 @@ class Install extends BaseModule
 
        public static function post()
        {
-               $a = self::getApp();
+               $a           = self::getApp();
                $configCache = $a->getConfigCache();
 
                switch (self::$currentWizardStep) {
@@ -109,7 +110,7 @@ class Install extends BaseModule
                                self::checkSetting($configCache, $_POST, 'database', 'database', '');
 
                                // If we cannot connect to the database, return to the previous step
-                               if (!self::$installer->checkDB($configCache, $a->getProfiler())) {
+                               if (!self::$installer->checkDB($a->getDBA())) {
                                        self::$currentWizardStep = self::DATABASE_CONFIG;
                                }
 
@@ -133,7 +134,7 @@ class Install extends BaseModule
                                self::checkSetting($configCache, $_POST, 'config', 'admin_email', '');
 
                                // If we cannot connect to the database, return to the Database config wizard
-                               if (!self::$installer->checkDB($configCache, $a->getProfiler())) {
+                               if (!self::$installer->checkDB($a->getDBA())) {
                                        self::$currentWizardStep = self::DATABASE_CONFIG;
                                        return;
                                }
@@ -150,7 +151,7 @@ class Install extends BaseModule
 
        public static function content()
        {
-               $a = self::getApp();
+               $a           = self::getApp();
                $configCache = $a->getConfigCache();
 
                $output = '';
@@ -163,7 +164,7 @@ class Install extends BaseModule
 
                                $status = self::$installer->checkEnvironment($a->getBaseURL(), $php_path);
 
-                               $tpl = Renderer::getMarkupTemplate('install_checks.tpl');
+                               $tpl    = Renderer::getMarkupTemplate('install_checks.tpl');
                                $output .= Renderer::replaceMacros($tpl, [
                                        '$title'       => $install_title,
                                        '$pass'        => L10n::t('System check'),
@@ -178,12 +179,12 @@ class Install extends BaseModule
 
                        case self::BASE_CONFIG:
                                $ssl_choices = [
-                                       BaseURL::SSL_POLICY_NONE     => L10n::t("No SSL policy, links will track page SSL state"),
-                                       BaseURL::SSL_POLICY_FULL     => L10n::t("Force all links to use SSL"),
-                                       BaseURL::SSL_POLICY_SELFSIGN => L10n::t("Self-signed certificate, use SSL for local links only \x28discouraged\x29")
+                                       App\BaseURL::SSL_POLICY_NONE     => L10n::t("No SSL policy, links will track page SSL state"),
+                                       App\BaseURL::SSL_POLICY_FULL     => L10n::t("Force all links to use SSL"),
+                                       App\BaseURL::SSL_POLICY_SELFSIGN => L10n::t("Self-signed certificate, use SSL for local links only \x28discouraged\x29")
                                ];
 
-                               $tpl = Renderer::getMarkupTemplate('install_base.tpl');
+                               $tpl    = Renderer::getMarkupTemplate('install_base.tpl');
                                $output .= Renderer::replaceMacros($tpl, [
                                        '$title'      => $install_title,
                                        '$pass'       => L10n::t('Base settings'),
@@ -213,7 +214,7 @@ class Install extends BaseModule
                                break;
 
                        case self::DATABASE_CONFIG:
-                               $tpl = Renderer::getMarkupTemplate('install_db.tpl');
+                               $tpl    = Renderer::getMarkupTemplate('install_db.tpl');
                                $output .= Renderer::replaceMacros($tpl, [
                                        '$title'      => $install_title,
                                        '$pass'       => L10n::t('Database connection'),
@@ -256,7 +257,7 @@ class Install extends BaseModule
                                /* Installed langs */
                                $lang_choices = L10n::getAvailableLanguages();
 
-                               $tpl = Renderer::getMarkupTemplate('install_settings.tpl');
+                               $tpl    = Renderer::getMarkupTemplate('install_settings.tpl');
                                $output .= Renderer::replaceMacros($tpl, [
                                        '$title'      => $install_title,
                                        '$checks'     => self::$installer->getChecks(),
@@ -292,12 +293,12 @@ class Install extends BaseModule
                                $db_return_text = "";
 
                                if (count(self::$installer->getChecks()) == 0) {
-                                       $txt = '<p style="font-size: 130%;">';
-                                       $txt .= L10n::t('Your Friendica site database has been installed.') . EOL;
+                                       $txt            = '<p style="font-size: 130%;">';
+                                       $txt            .= L10n::t('Your Friendica site database has been installed.') . EOL;
                                        $db_return_text .= $txt;
                                }
 
-                               $tpl = Renderer::getMarkupTemplate('install_finished.tpl');
+                               $tpl    = Renderer::getMarkupTemplate('install_finished.tpl');
                                $output .= Renderer::replaceMacros($tpl, [
                                        '$title'  => $install_title,
                                        '$checks' => self::$installer->getChecks(),
@@ -324,7 +325,7 @@ class Install extends BaseModule
                $baseurl = $a->getBaseUrl();
                return
                        L10n::t('<h1>What next</h1>')
-                       . "<p>".L10n::t('IMPORTANT: You will need to [manually] setup a scheduled task for the worker.')
+                       . "<p>" . L10n::t('IMPORTANT: You will need to [manually] setup a scheduled task for the worker.')
                        . L10n::t('Please see the file "INSTALL.txt".')
                        . "</p><p>"
                        . L10n::t('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.', $baseurl)
@@ -334,13 +335,13 @@ class Install extends BaseModule
        /**
         * Checks the $_POST settings and updates the config Cache for it
         *
-        * @param IConfigCache $configCache The current config cache
-        * @param array        $post        The $_POST data
-        * @param string       $cat         The category of the setting
-        * @param string       $key         The key of the setting
-        * @param null|string  $default     The default value
+        * @param ConfigCache $configCache The current config cache
+        * @param array       $post        The $_POST data
+        * @param string      $cat         The category of the setting
+        * @param string      $key         The key of the setting
+        * @param null|string $default     The default value
         */
-       private static function checkSetting(IConfigCache $configCache, array $post, $cat, $key, $default = null)
+       private static function checkSetting(ConfigCache $configCache, array $post, $cat, $key, $default = null)
        {
                $configCache->set($cat, $key,
                        Strings::escapeTags(
diff --git a/src/Module/Item/Compose.php b/src/Module/Item/Compose.php
new file mode 100644 (file)
index 0000000..11b886a
--- /dev/null
@@ -0,0 +1,217 @@
+<?php
+
+namespace Friendica\Module\Item;
+
+use Friendica\BaseModule;
+use Friendica\Content\Feature;
+use Friendica\Core\Config;
+use Friendica\Core\Hook;
+use Friendica\Core\L10n;
+use Friendica\Core\Renderer;
+use Friendica\Database\DBA;
+use Friendica\Model\Contact;
+use Friendica\Model\FileTag;
+use Friendica\Model\Group;
+use Friendica\Model\Item;
+use Friendica\Model\User;
+use Friendica\Module\Login;
+use Friendica\Network\HTTPException\NotImplementedException;
+use Friendica\Util\Crypto;
+
+class Compose extends BaseModule
+{
+       public static function post()
+       {
+               if (!empty($_REQUEST['body'])) {
+                       $_REQUEST['return'] = 'network';
+                       require_once 'mod/item.php';
+                       item_post(self::getApp());
+               } else {
+                       notice(L10n::t('Please enter a post body.'));
+               }
+       }
+
+       public static function content()
+       {
+               if (!local_user()) {
+                       return Login::form('compose', false);
+               }
+
+               $a = self::getApp();
+
+               if ($a->getCurrentTheme() !== 'frio') {
+                       throw new NotImplementedException(L10n::t('This feature is only available with the frio theme.'));
+               }
+
+               /// @TODO Retrieve parameter from router
+               $posttype = $a->argv[1] ?? Item::PT_ARTICLE;
+               if (!in_array($posttype, [Item::PT_ARTICLE, Item::PT_PERSONAL_NOTE])) {
+                       switch ($posttype) {
+                               case 'note':
+                                       $posttype = Item::PT_PERSONAL_NOTE;
+                                       break;
+                               default:
+                                       $posttype = Item::PT_ARTICLE;
+                                       break;
+                       }
+               }
+
+               $user = User::getById(local_user(), ['allow_cid', 'allow_gid', 'deny_cid', 'deny_gid', 'hidewall', 'default-location']);
+
+               switch ($posttype) {
+                       case Item::PT_PERSONAL_NOTE:
+                               $compose_title = L10n::t('Compose new personal note');
+                               $type = 'note';
+                               $doesFederate = false;
+                               $contact_allow = $a->contact['id'];
+                               $group_allow = '';
+                               break;
+                       default:
+                               $compose_title = L10n::t('Compose new post');
+                               $type = 'post';
+                               $doesFederate = true;
+                               $contact_allow = implode(',', expand_acl($user['allow_cid']));
+                               $group_allow = implode(',', expand_acl($user['allow_gid'])) ?: Group::FOLLOWERS;
+                               break;
+               }
+
+               $title         = $_REQUEST['title']         ?? '';
+               $category      = $_REQUEST['category']      ?? '';
+               $body          = $_REQUEST['body']          ?? '';
+               $location      = $_REQUEST['location']      ?? $user['default-location'];
+               $wall          = $_REQUEST['wall']          ?? $type == 'post';
+               $contact_allow = $_REQUEST['contact_allow'] ?? $contact_allow;
+               $group_allow   = $_REQUEST['group_allow']   ?? $group_allow;
+               $contact_deny  = $_REQUEST['contact_deny']  ?? implode(',', expand_acl($user['deny_cid']));
+               $group_deny    = $_REQUEST['group_deny']    ?? implode(',', expand_acl($user['deny_gid']));
+               $visibility    = ($contact_allow . $user['allow_gid'] . $user['deny_cid'] . $user['deny_gid']) ? 'custom' : 'public';
+
+               $acl_contacts = Contact::selectToArray(['id', 'name', 'addr', 'micro'], ['uid' => local_user(), 'pending' => false, 'rel' => [Contact::FOLLOWER, Contact::FRIEND]]);
+               array_walk($acl_contacts, function (&$value) {
+                       $value['type'] = 'contact';
+               });
+
+               $acl_groups = [
+                       [
+                               'id' => Group::FOLLOWERS,
+                               'name' => L10n::t('Followers'),
+                               'addr' => '',
+                               'micro' => 'images/twopeople.png',
+                               'type' => 'group',
+                       ],
+                       [
+                               'id' => Group::MUTUALS,
+                               'name' => L10n::t('Mutuals'),
+                               'addr' => '',
+                               'micro' => 'images/twopeople.png',
+                               'type' => 'group',
+                       ]
+               ];
+               foreach (Group::getByUserId(local_user()) as $group) {
+                       $acl_groups[] = [
+                               'id' => $group['id'],
+                               'name' => $group['name'],
+                               'addr' => '',
+                               'micro' => 'images/twopeople.png',
+                               'type' => 'group',
+                       ];
+               }
+
+               $acl = array_merge($acl_groups, $acl_contacts);
+
+               $jotnets_fields = [];
+               $mail_enabled = false;
+               $pubmail_enabled = false;
+               if (function_exists('imap_open') && !Config::get('system', 'imap_disabled')) {
+                       $mailacct = DBA::selectFirst('mailacct', ['pubmail'], ['`uid` = ? AND `server` != ""', local_user()]);
+                       if (DBA::isResult($mailacct)) {
+                               $mail_enabled = true;
+                               $pubmail_enabled = !empty($mailacct['pubmail']);
+                       }
+               }
+
+               if (empty($user['hidewall'])) {
+                       if ($mail_enabled) {
+                               $jotnets_fields[] = [
+                                       'type' => 'checkbox',
+                                       'field' => [
+                                               'pubmail_enable',
+                                               L10n::t('Post to Email'),
+                                               $pubmail_enabled
+                                       ]
+                               ];
+                       }
+
+                       Hook::callAll('jot_networks', $jotnets_fields);
+               }
+
+               $jotplugins = '';
+               Hook::callAll('jot_tool', $jotplugins);
+
+               // Output
+
+               $a->registerFooterScript('view/js/ajaxupload.js');
+               $a->registerFooterScript('view/js/linkPreview.js');
+               $a->registerFooterScript('view/asset/typeahead.js/dist/typeahead.bundle.js');
+               $a->registerFooterScript('view/theme/frio/frameworks/friendica-tagsinput/friendica-tagsinput.js');
+               $a->registerStylesheet('view/theme/frio/frameworks/friendica-tagsinput/friendica-tagsinput.css');
+               $a->registerStylesheet('view/theme/frio/frameworks/friendica-tagsinput/friendica-tagsinput-typeahead.css');
+
+               $tpl = Renderer::getMarkupTemplate('item/compose-footer.tpl');
+               $a->page['footer'] .= Renderer::replaceMacros($tpl, [
+                       '$acl_contacts' => $acl_contacts,
+                       '$acl_groups' => $acl_groups,
+                       '$acl' => $acl,
+               ]);
+
+               $tpl = Renderer::getMarkupTemplate('item/compose.tpl');
+               return Renderer::replaceMacros($tpl, [
+                       '$compose_title'=> $compose_title,
+                       '$id'           => 0,
+                       '$posttype'     => $posttype,
+                       '$type'         => $type,
+                       '$wall'         => $wall,
+                       '$default'      => '',
+                       '$mylink'       => $a->removeBaseURL($a->contact['url']),
+                       '$mytitle'      => L10n::t('This is you'),
+                       '$myphoto'      => $a->removeBaseURL($a->contact['thumb']),
+                       '$submit'       => L10n::t('Submit'),
+                       '$edbold'       => L10n::t('Bold'),
+                       '$editalic'     => L10n::t('Italic'),
+                       '$eduline'      => L10n::t('Underline'),
+                       '$edquote'      => L10n::t('Quote'),
+                       '$edcode'       => L10n::t('Code'),
+                       '$edimg'        => L10n::t('Image'),
+                       '$edurl'        => L10n::t('Link'),
+                       '$edattach'     => L10n::t('Link or Media'),
+                       '$prompttext'   => L10n::t('Please enter a image/video/audio/webpage URL:'),
+                       '$preview'      => L10n::t('Preview'),
+                       '$location_set' => L10n::t('Set your location'),
+                       '$location_clear' => L10n::t('Clear the location'),
+                       '$location_unavailable' => L10n::t('Location services are unavailable on your device'),
+                       '$location_disabled' => L10n::t('Location services are disabled. Please check the website\'s permissions on your device'),
+                       '$wait'         => L10n::t('Please wait'),
+                       '$placeholdertitle' => L10n::t('Set title'),
+                       '$placeholdercategory' => (Feature::isEnabled(local_user(),'categories') ? L10n::t('Categories (comma-separated list)') : ''),
+                       '$public_title'  => L10n::t('Public'),
+                       '$public_desc'  => L10n::t('This post will be sent to all your followers and can be seen in the community pages and by anyone with its link.'),
+                       '$custom_title' => L10n::t('Limited/Private'),
+                       '$custom_desc'  => L10n::t('This post will be sent only to the people in the first box, to the exception of the people mentioned in the second box. It won\'t appear anywhere public.'),
+                       '$emailcc'      => L10n::t('CC: email addresses'),
+                       '$title'        => $title,
+                       '$category'     => $category,
+                       '$body'         => $body,
+                       '$location'     => $location,
+                       '$visibility'   => $visibility,
+                       '$contact_allow'=> $contact_allow,
+                       '$group_allow'  => $group_allow,
+                       '$contact_deny' => $contact_deny,
+                       '$group_deny'   => $group_deny,
+                       '$jotplugins'   => $jotplugins,
+                       '$doesFederate' => $doesFederate,
+                       '$jotnets_fields'=> $jotnets_fields,
+                       '$sourceapp'    => L10n::t($a->sourcename),
+                       '$rand_num'     => Crypto::randomDigits(12)
+               ]);
+       }
+}
index 7a3b6ae45775c82e0be800ece1937ceaf953822c..966ded57faa3b94ffd6b086eb63f165914b7eb16 100644 (file)
@@ -32,26 +32,21 @@ class Login extends BaseModule
        {
                $a = self::getApp();
 
-               if (!empty($_SESSION['theme'])) {
-                       unset($_SESSION['theme']);
-               }
-
-               if (!empty($_SESSION['mobile-theme'])) {
-                       unset($_SESSION['mobile-theme']);
-               }
+               Session::remove('theme');
+               Session::remove('mobile-theme');
 
                if (local_user()) {
                        $a->internalRedirect();
                }
 
-               return self::form(defaults($_SESSION, 'return_path', null), intval(Config::get('config', 'register_policy')) !== \Friendica\Module\Register::CLOSED);
+               return self::form(Session::get('return_path'), intval(Config::get('config', 'register_policy')) !== \Friendica\Module\Register::CLOSED);
        }
 
        public static function post()
        {
-               $return_path = defaults($_SESSION, 'return_path', '');
+               $return_path = Session::get('return_path');
                session_unset();
-               $_SESSION['return_path'] = $return_path;
+               Session::set('return_path', $return_path);
 
                // OpenId Login
                if (
@@ -159,17 +154,13 @@ class Login extends BaseModule
                }
 
                // if we haven't failed up this point, log them in.
-               $_SESSION['remember'] = $remember;
-               $_SESSION['last_login_date'] = DateTimeFormat::utcNow();
+               Session::set('remember', $remember);
+               Session::set('last_login_date', DateTimeFormat::utcNow());
 
                Session::setAuthenticatedForUser($a, $record, true, true);
 
-               if (!empty($_SESSION['return_path'])) {
-                       $return_path = $_SESSION['return_path'];
-                       unset($_SESSION['return_path']);
-               } else {
-                       $return_path = '';
-               }
+               $return_path = Session::get('return_path', '');
+               Session::remove('return_path');
 
                $a->internalRedirect($return_path);
        }
@@ -290,7 +281,7 @@ class Login extends BaseModule
                $a = self::getApp();
                $o = '';
                $reg = false;
-               if ($register) {
+               if ($register && intval($a->getConfig()->get('config', 'register_policy')) !== Register::CLOSED) {
                        $reg = [
                                'title' => L10n::t('Create a New Account'),
                                'desc' => L10n::t('Register')
index bcfe13f5372e4330a2650f15caa8225a3109ab66..4ec4f204c3c4efee2973ca7f94454fbe479ba9a9 100644 (file)
@@ -53,15 +53,15 @@ class Photo extends BaseModule
                switch($a->argc) {
                        case 4:
                                $customsize = intval($a->argv[2]);
-                               $uid = self::stripExtension($a->argv[3]);
+                               $uid = MPhoto::stripExtension($a->argv[3]);
                                $photo = self::getAvatar($uid, $a->argv[1]);
                                break;
                        case 3:
-                               $uid = self::stripExtension($a->argv[2]);
+                               $uid = MPhoto::stripExtension($a->argv[2]);
                                $photo = self::getAvatar($uid, $a->argv[1]);
                                break;
                        case 2:
-                               $photoid = self::stripExtension($a->argv[1]);
+                               $photoid = MPhoto::stripExtension($a->argv[1]);
                                $scale = 0;
                                if (substr($photoid, -2, 1) == "-") {
                                        $scale = intval(substr($photoid, -1, 1));
@@ -117,15 +117,6 @@ class Photo extends BaseModule
                exit();
        }
 
-       private static function stripExtension($name)
-       {
-               $name = str_replace([".jpg", ".png", ".gif"], ["", "", ""], $name);
-               foreach (Image::supportedTypes() as $m => $e) {
-                       $name = str_replace("." . $e, "", $name);
-               }
-               return $name;
-       }
-
        private static function getAvatar($uid, $type="avatar")
        {
 
index afebede4d0dcdf155145cfa9c8c51d0340d6a943..8e5bedd847ae367252973e0375f449858048d572 100644 (file)
@@ -11,6 +11,7 @@ use Friendica\Core\Config;
 use Friendica\Core\Hook;
 use Friendica\Core\L10n;
 use Friendica\Core\PConfig;
+use Friendica\Core\Session;
 use Friendica\Core\System;
 use Friendica\Database\DBA;
 use Friendica\Model\Contact as ContactModel;
@@ -223,8 +224,10 @@ class Profile extends BaseModule
                $sql_extra = Item::getPermissionsSQLByUserId($a->profile['profile_uid'], $remote_contact, $groups, $remote_cid);
                $sql_extra2 = '';
 
+               $last_updated_array = Session::get('last_updated', []);
+
                if ($update) {
-                       $last_updated = (defaults($_SESSION['last_updated'], $last_updated_key, 0));
+                       $last_updated = $last_updated_array[$last_updated_key] ?? 0;
 
                        // If the page user is the owner of the page we should query for unseen
                        // items. Otherwise use a timestamp of the last succesful update request.
@@ -249,7 +252,7 @@ class Profile extends BaseModule
                                        AND `item`.`wall`
                                        $sql_extra4
                                        $sql_extra
-                               ORDER BY `item`.`created` DESC",
+                               ORDER BY `item`.`received` DESC",
                                $a->profile['profile_uid'],
                                GRAVITY_ACTIVITY
                        );
@@ -273,10 +276,10 @@ class Profile extends BaseModule
                        }
 
                        if (!empty($datequery)) {
-                               $sql_extra2 .= Strings::protectSprintf(sprintf(" AND `thread`.`created` <= '%s' ", DBA::escape(DateTimeFormat::convert($datequery, 'UTC', date_default_timezone_get()))));
+                               $sql_extra2 .= Strings::protectSprintf(sprintf(" AND `thread`.`received` <= '%s' ", DBA::escape(DateTimeFormat::convert($datequery, 'UTC', date_default_timezone_get()))));
                        }
                        if (!empty($datequery2)) {
-                               $sql_extra2 .= Strings::protectSprintf(sprintf(" AND `thread`.`created` >= '%s' ", DBA::escape(DateTimeFormat::convert($datequery2, 'UTC', date_default_timezone_get()))));
+                               $sql_extra2 .= Strings::protectSprintf(sprintf(" AND `thread`.`received` >= '%s' ", DBA::escape(DateTimeFormat::convert($datequery2, 'UTC', date_default_timezone_get()))));
                        }
 
                        // Does the profile page belong to a forum?
@@ -323,7 +326,7 @@ class Profile extends BaseModule
                                        $sql_extra3
                                        $sql_extra
                                        $sql_extra2
-                               ORDER BY `thread`.`created` DESC
+                               ORDER BY `thread`.`received` DESC
                                $pager_sql",
                                $a->profile['profile_uid']
                        );
@@ -331,7 +334,8 @@ class Profile extends BaseModule
 
                // Set a time stamp for this page. We will make use of it when we
                // search for new items (update routine)
-               $_SESSION['last_updated'][$last_updated_key] = time();
+               $last_updated_array[$last_updated_key] = time();
+               Session::set('last_updated', $last_updated_array);
 
                if ($is_owner && !$update && !Config::get('theme', 'hide_eventlist')) {
                        $o .= ProfileModel::getBirthdays();
@@ -347,7 +351,7 @@ class Profile extends BaseModule
 
                $items = DBA::toArray($items_stmt);
 
-               $o .= conversation($a, $items, $pager, 'profile', $update, false, 'created', $a->profile['profile_uid']);
+               $o .= conversation($a, $items, $pager, 'profile', $update, false, 'received', $a->profile['profile_uid']);
 
                if (!$update) {
                        $o .= $pager->renderMinimal(count($items));
index 06b62783f6eb8a4a9929b90879eb5562d74591ef..217581b160b01d52658e08cb894df09fcfa42a93 100644 (file)
@@ -7,10 +7,10 @@ use Friendica\Content\Text\BBCode;
 use Friendica\Core\Config;
 use Friendica\Core\Hook;
 use Friendica\Core\L10n;
+use Friendica\Core\L10n\L10n as L10nClass;
 use Friendica\Core\Logger;
 use Friendica\Core\PConfig;
 use Friendica\Core\Renderer;
-use Friendica\Core\System;
 use Friendica\Core\Worker;
 use Friendica\Database\DBA;
 use Friendica\Model;
@@ -203,7 +203,7 @@ class Register extends BaseModule
 
                $arr['blocked'] = $blocked;
                $arr['verified'] = $verified;
-               $arr['language'] = L10n::detectLanguage();
+               $arr['language'] = L10nClass::detectLanguage($a->getConfig()->get('system', 'language'));
 
                try {
                        $result = Model\User::create($arr);
index 76ada50d5925bd3d995269891812fb7ed0a913d0..20cdd5492c395e2663f5d53c4f35e74413c60844 100644 (file)
@@ -5,6 +5,7 @@ namespace Friendica\Module\Search;
 use Friendica\Content\Widget;
 use Friendica\Core\L10n;
 use Friendica\Module\BaseSearchModule;
+use Friendica\Module\Login;
 
 /**
  * Directory search module
diff --git a/src/Module/Settings/TwoFactor/AppSpecific.php b/src/Module/Settings/TwoFactor/AppSpecific.php
new file mode 100644 (file)
index 0000000..c62b0bb
--- /dev/null
@@ -0,0 +1,116 @@
+<?php
+
+
+namespace Friendica\Module\Settings\TwoFactor;
+
+
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Core\Renderer;
+use Friendica\Model\TwoFactor\AppSpecificPassword;
+use Friendica\Module\BaseSettingsModule;
+use Friendica\Module\Login;
+
+/**
+ * // Page 5: 2FA enabled, app-specific password generation
+ *
+ * @package Friendica\Module\TwoFactor
+ */
+class AppSpecific extends BaseSettingsModule
+{
+       private static $appSpecificPassword = null;
+
+       public static function init()
+       {
+               if (!local_user()) {
+                       return;
+               }
+
+               $verified = PConfig::get(local_user(), '2fa', 'verified');
+
+               if (!$verified) {
+                       self::getApp()->internalRedirect('settings/2fa');
+               }
+
+               if (!self::checkFormSecurityToken('settings_2fa_password', 't')) {
+                       notice(L10n::t('Please enter your password to access this page.'));
+                       self::getApp()->internalRedirect('settings/2fa');
+               }
+       }
+
+       public static function post()
+       {
+               if (!local_user()) {
+                       return;
+               }
+
+               if (!empty($_POST['action'])) {
+                       self::checkFormSecurityTokenRedirectOnError('settings/2fa/app_specific', 'settings_2fa_app_specific');
+
+                       switch ($_POST['action']) {
+                               case 'generate':
+                                       $description = $_POST['description'] ?? '';
+                                       if (empty($description)) {
+                                               notice(L10n::t('App-specific password generation failed: The description is empty.'));
+                                               self::getApp()->internalRedirect('settings/2fa/app_specific?t=' . self::getFormSecurityToken('settings_2fa_password'));
+                                       } elseif (AppSpecificPassword::checkDuplicateForUser(local_user(), $description)) {
+                                               notice(L10n::t('App-specific password generation failed: This description already exists.'));
+                                               self::getApp()->internalRedirect('settings/2fa/app_specific?t=' . self::getFormSecurityToken('settings_2fa_password'));
+                                       } else {
+                                               self::$appSpecificPassword = AppSpecificPassword::generateForUser(local_user(), $_POST['description'] ?? '');
+                                               notice(L10n::t('New app-specific password generated.'));
+                                       }
+
+                                       break;
+                               case 'revoke_all' :
+                                       AppSpecificPassword::deleteAllForUser(local_user());
+                                       notice(L10n::t('App-specific passwords successfully revoked.'));
+                                       self::getApp()->internalRedirect('settings/2fa/app_specific?t=' . self::getFormSecurityToken('settings_2fa_password'));
+                                       break;
+                       }
+               }
+
+               if (!empty($_POST['revoke_id'])) {
+                       self::checkFormSecurityTokenRedirectOnError('settings/2fa/app_specific', 'settings_2fa_app_specific');
+
+                       if (AppSpecificPassword::deleteForUser(local_user(), $_POST['revoke_id'])) {
+                               notice(L10n::t('App-specific password successfully revoked.'));
+                       }
+
+                       self::getApp()->internalRedirect('settings/2fa/app_specific?t=' . self::getFormSecurityToken('settings_2fa_password'));
+               }
+       }
+
+       public static function content()
+       {
+               if (!local_user()) {
+                       return Login::form('settings/2fa/app_specific');
+               }
+
+               parent::content();
+
+               $appSpecificPasswords = AppSpecificPassword::getListForUser(local_user());
+
+               return Renderer::replaceMacros(Renderer::getMarkupTemplate('settings/twofactor/app_specific.tpl'), [
+                       '$form_security_token'     => self::getFormSecurityToken('settings_2fa_app_specific'),
+                       '$password_security_token' => self::getFormSecurityToken('settings_2fa_password'),
+
+                       '$title'                  => L10n::t('Two-factor app-specific passwords'),
+                       '$help_label'             => L10n::t('Help'),
+                       '$message'                => L10n::t('<p>App-specific passwords are randomly generated passwords used instead your regular password to authenticate your account on third-party applications that don\'t support two-factor authentication.</p>'),
+                       '$generated_message'      => L10n::t('Make sure to copy your new app-specific password now. You won’t be able to see it again!'),
+                       '$generated_app_specific_password' => self::$appSpecificPassword,
+
+                       '$description_label'      => L10n::t('Description'),
+                       '$last_used_label'        => L10n::t('Last Used'),
+                       '$revoke_label'           => L10n::t('Revoke'),
+                       '$revoke_all_label'       => L10n::t('Revoke All'),
+
+                       '$app_specific_passwords' => $appSpecificPasswords,
+                       '$generate_message'       => L10n::t('When you generate a new app-specific password, you must use it right away, it will be shown to you once after you generate it.'),
+                       '$generate_title'         => L10n::t('Generate new app-specific password'),
+                       '$description_placeholder_label' => L10n::t('Friendiqa on my Fairphone 2...'),
+                       '$generate_label' => L10n::t('Generate'),
+               ]);
+       }
+}
index 9f02692706a0c72e3343702a731bf914236237f5..79b92f159291c2e94d3d434aaf5a33009fa460c2 100644 (file)
@@ -8,7 +8,8 @@ use Friendica\Core\L10n;
 use Friendica\Core\PConfig;
 use Friendica\Core\Renderer;
 use Friendica\Core\Session;
-use Friendica\Model\TwoFactorRecoveryCode;
+use Friendica\Model\TwoFactor\AppSpecificPassword;
+use Friendica\Model\TwoFactor\RecoveryCode;
 use Friendica\Model\User;
 use Friendica\Module\BaseSettingsModule;
 use Friendica\Module\Login;
@@ -42,7 +43,7 @@ class Index extends BaseSettingsModule
                                        break;
                                case 'disable':
                                        if ($has_secret) {
-                                               TwoFactorRecoveryCode::deleteForUser(local_user());
+                                               RecoveryCode::deleteForUser(local_user());
                                                PConfig::delete(local_user(), '2fa', 'secret');
                                                PConfig::delete(local_user(), '2fa', 'verified');
                                                Session::remove('2fa');
@@ -56,6 +57,11 @@ class Index extends BaseSettingsModule
                                                self::getApp()->internalRedirect('settings/2fa/recovery?t=' . self::getFormSecurityToken('settings_2fa_password'));
                                        }
                                        break;
+                               case 'app_specific':
+                                       if ($has_secret) {
+                                               self::getApp()->internalRedirect('settings/2fa/app_specific?t=' . self::getFormSecurityToken('settings_2fa_password'));
+                                       }
+                                       break;
                                case 'configure':
                                        if (!$verified) {
                                                self::getApp()->internalRedirect('settings/2fa/verify?t=' . self::getFormSecurityToken('settings_2fa_password'));
@@ -94,14 +100,20 @@ class Index extends BaseSettingsModule
 
                        '$recovery_codes_title'     => L10n::t('Recovery codes'),
                        '$recovery_codes_remaining' => L10n::t('Remaining valid codes'),
-                       '$recovery_codes_count'     => TwoFactorRecoveryCode::countValidForUser(local_user()),
+                       '$recovery_codes_count'     => RecoveryCode::countValidForUser(local_user()),
                        '$recovery_codes_message'   => L10n::t('<p>These one-use codes can replace an authenticator app code in case you have lost access to it.</p>'),
 
+                       '$app_specific_passwords_title'     => L10n::t('App-specific passwords'),
+                       '$app_specific_passwords_remaining' => L10n::t('Generated app-specific passwords'),
+                       '$app_specific_passwords_count'     => AppSpecificPassword::countForUser(local_user()),
+                       '$app_specific_passwords_message'   => L10n::t('<p>These randomly generated passwords allow you to authenticate on apps not supporting two-factor authentication.</p>'),
+
                        '$action_title'         => L10n::t('Actions'),
                        '$password'             => ['password', L10n::t('Current password:'), '', L10n::t('You need to provide your current password to change two-factor authentication settings.'), 'required', 'autofocus'],
                        '$enable_label'         => L10n::t('Enable two-factor authentication'),
                        '$disable_label'        => L10n::t('Disable two-factor authentication'),
                        '$recovery_codes_label' => L10n::t('Show recovery codes'),
+                       '$app_specific_passwords_label' => L10n::t('Manage app-specific passwords'),
                        '$configure_label'      => L10n::t('Finish app configuration'),
                ]);
        }
index a2d08cda86cb4def517a817d7a32d4007248de43..6937fa503f4eec65a0bc3bfe92cb8fff668d84c5 100644 (file)
@@ -7,7 +7,7 @@ namespace Friendica\Module\Settings\TwoFactor;
 use Friendica\Core\L10n;
 use Friendica\Core\PConfig;
 use Friendica\Core\Renderer;
-use Friendica\Model\TwoFactorRecoveryCode;
+use Friendica\Model\TwoFactor\RecoveryCode;
 use Friendica\Module\BaseSettingsModule;
 use Friendica\Module\Login;
 
@@ -46,7 +46,7 @@ class Recovery extends BaseSettingsModule
                        self::checkFormSecurityTokenRedirectOnError('settings/2fa/recovery', 'settings_2fa_recovery');
 
                        if ($_POST['action'] == 'regenerate') {
-                               TwoFactorRecoveryCode::regenerateForUser(local_user());
+                               RecoveryCode::regenerateForUser(local_user());
                                notice(L10n::t('New recovery codes successfully generated.'));
                                self::getApp()->internalRedirect('settings/2fa/recovery?t=' . self::getFormSecurityToken('settings_2fa_password'));
                        }
@@ -61,11 +61,11 @@ class Recovery extends BaseSettingsModule
 
                parent::content();
 
-               if (!TwoFactorRecoveryCode::countValidForUser(local_user())) {
-                       TwoFactorRecoveryCode::generateForUser(local_user());
+               if (!RecoveryCode::countValidForUser(local_user())) {
+                       RecoveryCode::generateForUser(local_user());
                }
 
-               $recoveryCodes = TwoFactorRecoveryCode::getListForUser(local_user());
+               $recoveryCodes = RecoveryCode::getListForUser(local_user());
 
                $verified = PConfig::get(local_user(), '2fa', 'verified');
                
index 4952d220b7ac755bd7210aed3e57aa4422c7e091..60f443c35ffe88bc54cf0658c52625c8b394f40d 100644 (file)
@@ -6,7 +6,7 @@ use Friendica\BaseModule;
 use Friendica\Core\L10n;
 use Friendica\Core\Renderer;
 use Friendica\Core\Session;
-use Friendica\Model\TwoFactorRecoveryCode;
+use Friendica\Model\TwoFactor\RecoveryCode;
 
 /**
  * // Page 1a: Recovery code verification
@@ -35,10 +35,10 @@ class Recovery extends BaseModule
 
                        $recovery_code = defaults($_POST, 'recovery_code', '');
 
-                       if (TwoFactorRecoveryCode::existsForUser(local_user(), $recovery_code)) {
-                               TwoFactorRecoveryCode::markUsedForUser(local_user(), $recovery_code);
+                       if (RecoveryCode::existsForUser(local_user(), $recovery_code)) {
+                               RecoveryCode::markUsedForUser(local_user(), $recovery_code);
                                Session::set('2fa', true);
-                               notice(L10n::t('Remaining recovery codes: %d', TwoFactorRecoveryCode::countValidForUser(local_user())));
+                               notice(L10n::t('Remaining recovery codes: %d', RecoveryCode::countValidForUser(local_user())));
 
                                // Resume normal login workflow
                                Session::setAuthenticatedForUser($a, $a->user, true, true);
index abe6077c6c7a00e3b37d8453132e9ef413e6d703..4b1c974d8ff7ddf84b4f4f5217335960b9244a51 100644 (file)
@@ -16,18 +16,20 @@ use PragmaRX\Google2FA\Google2FA;
  */
 class Verify extends BaseModule
 {
+       private static $errors = [];
+
        public static function post()
        {
                if (!local_user()) {
                        return;
                }
 
-               if (defaults($_POST, 'action', null) == 'verify') {
+               if (($_POST['action'] ?? '') == 'verify') {
                        self::checkFormSecurityTokenRedirectOnError('2fa', 'twofactor_verify');
 
                        $a = self::getApp();
 
-                       $code = defaults($_POST, 'verify_code', '');
+                       $code = $_POST['verify_code'] ?? '';
 
                        $valid = (new Google2FA())->verifyKey(PConfig::get(local_user(), '2fa', 'secret'), $code);
 
@@ -38,7 +40,7 @@ class Verify extends BaseModule
                                // Resume normal login workflow
                                Session::setAuthenticatedForUser($a, $a->user, true, true);
                        } else {
-                               notice(L10n::t('Invalid code, please retry.'));
+                               self::$errors[] = L10n::t('Invalid code, please retry.');
                        }
                }
        }
@@ -59,6 +61,8 @@ class Verify extends BaseModule
 
                        '$title'            => L10n::t('Two-factor authentication'),
                        '$message'          => L10n::t('<p>Open the two-factor authentication app on your device to get an authentication code and verify your identity.</p>'),
+                       '$errors_label'     => L10n::tt('Error', 'Errors', count(self::$errors)),
+                       '$errors'           => self::$errors,
                        '$recovery_message' => L10n::t('Don’t have your phone? <a href="%s">Enter a two-factor recovery code</a>', '2fa/recovery'),
                        '$verify_code'      => ['verify_code', L10n::t('Please enter a code from your authentication app'), '', '', 'required', 'autofocus placeholder="000000"'],
                        '$verify_label'     => L10n::t('Verify code and complete login'),
index a3fe3ca3361a4a82cf1876ac5642a27b756ea567..15235c7c26d5969f2bc58caa67721e3e560474b1 100644 (file)
@@ -17,7 +17,6 @@ use Friendica\Core\Logger;
 use Friendica\Core\Protocol;
 use Friendica\Core\System;
 use Friendica\Database\DBA;
-use Friendica\Model\Contact;
 use Friendica\Model\Profile;
 use Friendica\Protocol\ActivityPub;
 use Friendica\Protocol\Email;
@@ -46,9 +45,10 @@ class Probe
         */
        private static function rearrangeData($data)
        {
-               $fields = ["name", "nick", "guid", "url", "addr", "alias",
-                               "photo", "community", "keywords", "location", "about",
+               $fields = ["name", "nick", "guid", "url", "addr", "alias", "photo", "account-type",
+                               "community", "keywords", "location", "about", "gender", "hide",
                                "batch", "notify", "poll", "request", "confirm", "poco",
+                               "following", "followers", "inbox", "outbox", "sharedinbox",
                                "priority", "network", "pubkey", "baseurl"];
 
                $newdata = [];
@@ -348,8 +348,11 @@ class Probe
                if (!self::$istimeout) {
                        $ap_profile = ActivityPub::probeProfile($uri);
 
-                       if (!empty($ap_profile) && empty($network) && (defaults($data, 'network', '') != Protocol::DFRN)) {
+                       if (empty($data) || (!empty($ap_profile) && empty($network) && (defaults($data, 'network', '') != Protocol::DFRN))) {
                                $data = $ap_profile;
+                       } elseif (!empty($ap_profile)) {
+                               $ap_profile['batch'] = '';
+                               $data = array_merge($ap_profile, $data);
                        }
                } else {
                        Logger::notice('Time out detected. AP will not be probed.', ['uri' => $uri]);
@@ -396,114 +399,6 @@ class Probe
                // Only store into the cache if the value seems to be valid
                if (!in_array($data['network'], [Protocol::PHANTOM, Protocol::MAIL])) {
                        Cache::set('Probe::uri:' . $network . ':' . $uri, $data, Cache::DAY);
-
-                       /// @todo temporary fix - we need a real contact update function that updates only changing fields
-                       /// The biggest problem is the avatar picture that could have a reduced image size.
-                       /// It should only be updated if the existing picture isn't existing anymore.
-                       /// We only update the contact when it is no probing for a specific network.
-                       if (($data['network'] != Protocol::FEED)
-                               && ($network == '')
-                               && $data['name']
-                               && $data['nick']
-                               && $data['url']
-                               && $data['addr']
-                               && $data['poll']
-                       ) {
-                               $fields = [
-                                       'name' => $data['name'],
-                                       'nick' => $data['nick'],
-                                       'url' => $data['url'],
-                                       'addr' => $data['addr'],
-                                       'photo' => $data['photo'],
-                                       'keywords' => $data['keywords'],
-                                       'location' => $data['location'],
-                                       'about' => $data['about'],
-                                       'notify' => $data['notify'],
-                                       'network' => $data['network'],
-                                       'server_url' => $data['baseurl']
-                               ];
-
-                               // This doesn't cover the case when a community isn't a community anymore
-                               if (!empty($data['community']) && $data['community']) {
-                                       $fields['community'] = $data['community'];
-                                       $fields['contact-type'] = Contact::TYPE_COMMUNITY;
-                               }
-
-                               $fieldnames = [];
-
-                               foreach ($fields as $key => $val) {
-                                       if (empty($val)) {
-                                               unset($fields[$key]);
-                                       } else {
-                                               $fieldnames[] = $key;
-                                       }
-                               }
-
-                               $fields['updated'] = DateTimeFormat::utcNow();
-
-                               $condition = ['nurl' => Strings::normaliseLink($data['url'])];
-
-                               $old_fields = DBA::selectFirst('gcontact', $fieldnames, $condition);
-
-                               // When the gcontact doesn't exist, the value "true" will trigger an insert.
-                               // In difference to the public contacts we want to have every contact
-                               // in the world in our global contacts.
-                               if (!$old_fields) {
-                                       $old_fields = true;
-
-                                       // These values have to be set only on insert
-                                       $fields['photo'] = $data['photo'];
-                                       $fields['created'] = DateTimeFormat::utcNow();
-                               }
-
-                               DBA::update('gcontact', $fields, $condition, $old_fields);
-
-                               $fields = [
-                                       'name' => $data['name'],
-                                       'nick' => $data['nick'],
-                                       'url' => $data['url'],
-                                       'addr' => $data['addr'],
-                                       'alias' => $data['alias'],
-                                       'keywords' => $data['keywords'],
-                                       'location' => $data['location'],
-                                       'about' => $data['about'],
-                                       'batch' => $data['batch'],
-                                       'notify' => $data['notify'],
-                                       'poll' => $data['poll'],
-                                       'request' => $data['request'],
-                                       'confirm' => $data['confirm'],
-                                       'poco' => $data['poco'],
-                                       'network' => $data['network'],
-                                       'pubkey' => $data['pubkey'],
-                                       'priority' => $data['priority'],
-                                       'writable' => true,
-                                       'rel' => Contact::SHARING
-                               ];
-
-                               $fieldnames = [];
-
-                               foreach ($fields as $key => $val) {
-                                       if (empty($val)) {
-                                               unset($fields[$key]);
-                                       } else {
-                                               $fieldnames[] = $key;
-                                       }
-                               }
-
-                               $condition = ['nurl' => Strings::normaliseLink($data['url']), 'self' => false, 'uid' => 0];
-
-                               // "$old_fields" will return a "false" when the contact doesn't exist.
-                               // This won't trigger an insert. This is intended, since we only need
-                               // public contacts for everyone we store items from.
-                               // We don't need to store every contact on the planet.
-                               $old_fields = DBA::selectFirst('contact', $fieldnames, $condition);
-
-                               $fields['name-date'] = DateTimeFormat::utcNow();
-                               $fields['uri-date'] = DateTimeFormat::utcNow();
-                               $fields['success_update'] = DateTimeFormat::utcNow();
-
-                               DBA::update('contact', $fields, $condition, $old_fields);
-                       }
                }
 
                return $data;
@@ -576,7 +471,7 @@ class Probe
                        }
 
                        if ($host == 'twitter.com') {
-                               return ["network" => Protocol::TWITTER];
+                               return self::twitter($uri);
                        }
                        $lrdd = self::hostMeta($host);
 
@@ -617,7 +512,7 @@ class Probe
                        $nick = substr($uri, 0, strpos($uri, '@'));
 
                        if (strpos($uri, '@twitter.com')) {
-                               return ["network" => Protocol::TWITTER];
+                               return self::twitter($uri);
                        }
                        $lrdd = self::hostMeta($host);
 
@@ -845,7 +740,7 @@ class Probe
                }
 
                if (!empty($json["tags"])) {
-                       $keywords = implode(" ", $json["tags"]);
+                       $keywords = implode(", ", $json["tags"]);
                        if ($keywords != "") {
                                $data["keywords"] = $keywords;
                        }
@@ -860,6 +755,10 @@ class Probe
                        $data["about"] = $json["about"];
                }
 
+               if (!empty($json["gender"])) {
+                       $data["gender"] = $json["gender"];
+               }
+
                if (!empty($json["key"])) {
                        $data["pubkey"] = $json["key"];
                }
@@ -884,6 +783,12 @@ class Probe
                        $data["poll"] = $json["dfrn-poll"];
                }
 
+               if (isset($json["hide"])) {
+                       $data["hide"] = (bool)$json["hide"];
+               } else {
+                       $data["hide"] = false;
+               }
+
                return $data;
        }
 
@@ -1506,6 +1411,37 @@ class Probe
                return $data;
        }
 
+       /**
+        * @brief Check for twitter contact
+        *
+        * @param string $uri
+        *
+        * @return array twitter data
+        */
+       private static function twitter($uri)
+       {
+               if (preg_match('=(.*)@twitter.com=i', $uri, $matches)) {
+                       $nick = $matches[1];
+               } elseif (preg_match('=https?://twitter.com/(.*)=i', $uri, $matches)) {
+                       $nick = $matches[1];
+               } else {
+                       return [];
+               }
+
+               $data = [];
+               $data['url'] = 'https://twitter.com/' . $nick;
+               $data['addr'] = $nick . '@twitter.com';
+               $data['nick'] = $data['name'] = $nick;
+               $data['network'] = Protocol::TWITTER;
+               $data['baseurl'] = 'https://twitter.com';
+
+               $curlResult = Network::curl($data['url'], false);
+               if ($curlResult->isSuccess()) {
+                       return $data;
+               }
+               return [];
+       }
+
        /**
         * @brief Check page for feed link
         *
index a8577dd8bedda9ad7e62db6425b28341f71e99f7..173b1e53af6a86eecfda3abfb6c70c3d7e9c252f 100644 (file)
@@ -15,6 +15,7 @@ use Friendica\Core\Logger;
 use Friendica\Core\PConfig;
 use Friendica\Core\Protocol;
 use Friendica\Core\Renderer;
+use Friendica\Core\Session;
 use Friendica\Database\DBA;
 use Friendica\Model\Contact;
 use Friendica\Model\Item;
@@ -400,7 +401,7 @@ class Post extends BaseObject
                        'location'        => $location_e,
                        'indent'          => $indent,
                        'shiny'           => $shiny,
-                       'owner_self'      => $item['author-link'] == defaults($_SESSION, 'my_url', null),
+                       'owner_self'      => $item['author-link'] == Session::get('my_url'),
                        'owner_url'       => $this->getOwnerUrl(),
                        'owner_photo'     => $a->removeBaseURL(ProxyUtils::proxifyUrl($item['owner-avatar'], false, ProxyUtils::SIZE_THUMB)),
                        'owner_name'      => $owner_name_e,
index 8caf7ac64c97bb8bd88510d8a93f414a03459030..3a8a5e5b12ab82c7552b86d72eb1fd4b0aed1816 100644 (file)
@@ -8,6 +8,7 @@ use Friendica\Util\JsonLD;
 use Friendica\Util\Network;
 use Friendica\Core\Protocol;
 use Friendica\Model\APContact;
+use Friendica\Model\User;
 use Friendica\Util\HTTPSignature;
 
 /**
@@ -88,6 +89,31 @@ class ActivityPub
                return $content;
        }
 
+       private static function getAccountType($apcontact)
+       {
+               $accounttype = -1;
+
+               switch($apcontact['type']) {
+                       case 'Person':
+                               $accounttype = User::ACCOUNT_TYPE_PERSON;
+                               break;
+                       case 'Organization':
+                               $accounttype = User::ACCOUNT_TYPE_ORGANISATION;
+                               break;
+                       case 'Service':
+                               $accounttype = User::ACCOUNT_TYPE_NEWS;
+                               break;
+                       case 'Group':
+                               $accounttype = User::ACCOUNT_TYPE_COMMUNITY;
+                               break;
+                       case 'Application':
+                               $accounttype = User::ACCOUNT_TYPE_RELAY;
+                               break;
+               }
+
+               return $accounttype;
+       }
+
        /**
         * Fetches a profile from the given url into an array that is compatible to Probe::uri
         *
@@ -111,8 +137,14 @@ class ActivityPub
                $profile['url'] = $apcontact['url'];
                $profile['addr'] = $apcontact['addr'];
                $profile['alias'] = $apcontact['alias'];
+               $profile['following'] = $apcontact['following'];
+               $profile['followers'] = $apcontact['followers'];
+               $profile['inbox'] = $apcontact['inbox'];
+               $profile['outbox'] = $apcontact['outbox'];
+               $profile['sharedinbox'] = $apcontact['sharedinbox'];
                $profile['photo'] = $apcontact['photo'];
-               // $profile['community']
+               $profile['account-type'] = self::getAccountType($apcontact);
+               $profile['community'] = ($profile['account-type'] == User::ACCOUNT_TYPE_COMMUNITY);
                // $profile['keywords']
                // $profile['location']
                $profile['about'] = $apcontact['about'];
@@ -162,4 +194,18 @@ class ActivityPub
                        ActivityPub\Receiver::processActivity($ldactivity, '', $uid, true);
                }
        }
+
+       /**
+        * Checks if the given contact url does support ActivityPub
+        *
+        * @param string  $url    profile url
+        * @param boolean $update true = always update, false = never update, null = update when not found or outdated
+        * @return boolean
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws \ImagickException
+        */
+       public static function isSupportedByContactUrl($url, $update = null)
+       {
+               return !empty(APContact::getByURL($url, $update));
+       }
 }
index 41aed2fe3be883d03e41f8c9a03540b919b134e3..7639d0f2a325d97ee6dc3ea6a9f2fb48a4f0d6b4 100644 (file)
@@ -8,6 +8,7 @@ use Friendica\Database\DBA;
 use Friendica\Content\Text\BBCode;
 use Friendica\Content\Text\HTML;
 use Friendica\Core\Config;
+use Friendica\Core\PConfig;
 use Friendica\Core\Logger;
 use Friendica\Core\Protocol;
 use Friendica\Model\Contact;
@@ -110,7 +111,11 @@ class Processor
                                        continue;
                                }
 
-                               $item['body'] .= "\n[img]" . $attach['url'] . '[/img]';
+                               if (empty($attach['name'])) {
+                                       $item['body'] .= "\n[img]" . $attach['url'] . '[/img]';
+                               } else {
+                                       $item['body'] .= "\n[img=" . $attach['url'] . ']' . $attach['name'] . '[/img]';
+                               }
                        } else {
                                if (!empty($item["attach"])) {
                                        $item["attach"] .= ',';
@@ -373,6 +378,8 @@ class Processor
                $item['owner-link'] = $activity['actor'];
                $item['owner-id'] = Contact::getIdForURL($activity['actor'], 0, true);
 
+               $isForum = false;
+
                if (!empty($activity['thread-completion'])) {
                        // Store the original actor in the "causer" fields to enable the check for ignored or blocked contacts
                        $item['causer-link'] = $item['owner-link'];
@@ -381,6 +388,9 @@ class Processor
                        Logger::info('Ignoring actor because of thread completion.', ['actor' => $item['owner-link']]);
                        $item['owner-link'] = $item['author-link'];
                        $item['owner-id'] = $item['author-id'];
+               } else {
+                       $actor = APContact::getByURL($item['owner-link'], false);
+                       $isForum = ($actor['type'] == 'Group');
                }
 
                $item['uri'] = $activity['id'];
@@ -402,7 +412,12 @@ class Processor
 
                foreach ($activity['receiver'] as $receiver) {
                        $item['uid'] = $receiver;
-                       $item['contact-id'] = Contact::getIdForURL($activity['author'], $receiver, true);
+
+                       if ($isForum) {
+                               $item['contact-id'] = Contact::getIdForURL($activity['actor'], $receiver, true);
+                       } else {
+                               $item['contact-id'] = Contact::getIdForURL($activity['author'], $receiver, true);
+                       }
 
                        if (($receiver != 0) && empty($item['contact-id'])) {
                                $item['contact-id'] = Contact::getIdForURL($activity['author'], 0, true);
@@ -413,6 +428,21 @@ class Processor
                                continue;
                        }
 
+                       if (PConfig::get($receiver, 'system', 'accept_only_sharer', false) && ($receiver != 0) && ($item['gravity'] == GRAVITY_PARENT)) {
+                               $skip = !Contact::isSharingByURL($activity['author'], $receiver);
+
+                               if ($skip && (($activity['type'] == 'as:Announce') || $isForum)) {
+                                       $skip = !Contact::isSharingByURL($activity['actor'], $receiver);
+                               }
+
+                               if ($skip) {
+                                       Logger::info('Skipping post', ['uid' => $receiver, 'url' => $item['uri']]);
+                                       continue;
+                               }
+
+                               Logger::info('Accepting post', ['uid' => $receiver, 'url' => $item['uri']]);
+                       }
+
                        if ($activity['object_type'] == 'as:Event') {
                                self::createEvent($activity, $item);
                        }
@@ -506,27 +536,47 @@ class Processor
        /**
         * Fetches missing posts
         *
-        * @param $url
-        * @param $child
+        * @param string $url message URL
+        * @param array $child activity array with the child of this message
+        * @return boolean success
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       private static function fetchMissingActivity($url, $child)
+       public static function fetchMissingActivity($url, $child = [])
        {
-               if (Config::get('system', 'ostatus_full_threads')) {
-                       return;
+               if (!empty($child['receiver'])) {
+                       $uid = ActivityPub\Receiver::getFirstUserFromReceivers($child['receiver']);
+               } else {
+                       $uid = 0;
                }
 
-               $uid = ActivityPub\Receiver::getFirstUserFromReceivers($child['receiver']);
-
                $object = ActivityPub::fetchContent($url, $uid);
                if (empty($object)) {
                        Logger::log('Activity ' . $url . ' was not fetchable, aborting.');
-                       return;
+                       return false;
                }
 
                if (empty($object['id'])) {
                        Logger::log('Activity ' . $url . ' has got not id, aborting. ' . json_encode($object));
-                       return;
+                       return false;
+               }
+
+               if (!empty($child['author'])) {
+                       $actor = $child['author'];
+               } elseif (!empty($object['actor'])) {
+                       $actor = $object['actor'];
+               } elseif (!empty($object['attributedTo'])) {
+                       $actor = $object['attributedTo'];
+               } else {
+                       // Shouldn't happen
+                       $actor = '';
+               }
+
+               if (!empty($object['published'])) {
+                       $published = $object['published'];
+               } elseif (!empty($child['published'])) {
+                       $published = $child['published'];
+               } else {
+                       $published = DateTimeFormat::utcNow();
                }
 
                $activity = [];
@@ -535,9 +585,9 @@ class Processor
                $activity['id'] = $object['id'];
                $activity['to'] = defaults($object, 'to', []);
                $activity['cc'] = defaults($object, 'cc', []);
-               $activity['actor'] = $child['author'];
+               $activity['actor'] = $actor;
                $activity['object'] = $object;
-               $activity['published'] = defaults($object, 'published', $child['published']);
+               $activity['published'] = $published;
                $activity['type'] = 'Create';
 
                $ldactivity = JsonLD::compact($activity);
@@ -546,6 +596,8 @@ class Processor
 
                ActivityPub\Receiver::processActivity($ldactivity);
                Logger::log('Activity ' . $url . ' had been fetched and processed.');
+
+               return true;
        }
 
        /**
@@ -611,7 +663,7 @@ class Processor
                }
 
                Logger::log('Updating profile for ' . $activity['object_id'], Logger::DEBUG);
-               APContact::getByURL($activity['object_id'], true);
+               Contact::updateFromProbeByURL($activity['object_id'], true);
        }
 
        /**
index 1d425600d81b76ded4dda6f4819c1690e60e2751..bb676b396e338113ee517be084f8dfde49ec994e 100644 (file)
@@ -386,15 +386,14 @@ class Receiver
                        case 'as:Announce':
                                if (in_array($object_data['object_type'], self::CONTENT_TYPES)) {
                                        $profile = APContact::getByURL($object_data['actor']);
-                                       if ($profile['type'] == 'Person') {
-                                               // Reshared posts from persons appear as summary at the bottom
-                                               // If this isn't set, then a single reshare appears on top. This is used for groups.
-                                               $object_data['thread-completion'] = true;
-                                       }
+                                       // Reshared posts from persons appear as summary at the bottom
+                                       // If this isn't set, then a single reshare appears on top. This is used for groups.
+                                       $object_data['thread-completion'] = ($profile['type'] != 'Group');
+
                                        ActivityPub\Processor::createItem($object_data);
 
                                        // Add the bottom reshare information only for persons
-                                       if ($profile['type'] == 'Person') {
+                                       if ($profile['type'] != 'Group') {
                                                $announce_object_data = self::processObject($activity);
                                                $announce_object_data['name'] = $type;
                                                $announce_object_data['author'] = JsonLD::fetchElement($activity, 'as:actor', '@id');
@@ -556,7 +555,7 @@ class Receiver
                                // Check if the potential receiver is following the actor
                                // Exception: The receiver is targetted via "to" or this is a comment
                                if ((($element != 'as:to') && empty($replyto)) || ($contact['contact-type'] == Contact::TYPE_COMMUNITY)) {
-                                       $networks = [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS];
+                                       $networks = Protocol::FEDERATED;
                                        $condition = ['nurl' => Strings::normaliseLink($actor), 'rel' => [Contact::SHARING, Contact::FRIEND],
                                                'network' => $networks, 'archive' => false, 'pending' => false, 'uid' => $contact['uid']];
 
@@ -591,7 +590,7 @@ class Receiver
        public static function getReceiverForActor($actor, $tags)
        {
                $receivers = [];
-               $networks = [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS];
+               $networks = Protocol::FEDERATED;
                $condition = ['nurl' => Strings::normaliseLink($actor), 'rel' => [Contact::SHARING, Contact::FRIEND, Contact::FOLLOWER],
                        'network' => $networks, 'archive' => false, 'pending' => false];
                $contacts = DBA::select('contact', ['uid', 'rel'], $condition);
@@ -657,27 +656,14 @@ class Receiver
         */
        public static function switchContact($cid, $uid, $url)
        {
-               $profile = ActivityPub::probeProfile($url);
-               if (empty($profile)) {
-                       return;
-               }
-
-               Logger::log('Switch contact ' . $cid . ' (' . $profile['url'] . ') for user ' . $uid . ' to ActivityPub');
-
-               $photo = defaults($profile, 'photo', null);
-               unset($profile['photo']);
-               unset($profile['baseurl']);
-               unset($profile['guid']);
-
-               $profile['nurl'] = Strings::normaliseLink($profile['url']);
-               DBA::update('contact', $profile, ['id' => $cid]);
+               Contact::updateFromProbe($cid, '', true);
 
-               Contact::updateAvatar($photo, $uid, $cid);
+               Logger::log('Switch contact ' . $cid . ' (' . $url . ') for user ' . $uid . ' to ActivityPub');
 
                // Send a new follow request to be sure that the connection still exists
                if (($uid != 0) && DBA::exists('contact', ['id' => $cid, 'rel' => [Contact::SHARING, Contact::FRIEND]])) {
-                       ActivityPub\Transmitter::sendActivity('Follow', $profile['url'], $uid);
-                       Logger::log('Send a new follow request to ' . $profile['url'] . ' for user ' . $uid, Logger::DEBUG);
+                       ActivityPub\Transmitter::sendActivity('Follow', $url, $uid);
+                       Logger::log('Send a new follow request to ' . $url . ' for user ' . $uid, Logger::DEBUG);
                }
        }
 
index a3b8b679e3b9d0350fe6704880a49ea43992ab23..e44ae1cf66c2dfa4ff9413cc2b457d10fbb39279 100644 (file)
@@ -358,7 +358,7 @@ class Transmitter
 
                if (Config::get('debug', 'total_ap_delivery')) {
                        // Will be activated in a later step
-                       $networks = [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS];
+                       $networks = Protocol::FEDERATED;
                } else {
                        // For now only send to these contacts:
                        $networks = [Protocol::ACTIVITYPUB, Protocol::OSTATUS];
@@ -386,7 +386,7 @@ class Transmitter
                                }
                        }
                } else {
-                       $receiver_list = Item::enumeratePermissions($item);
+                       $receiver_list = Item::enumeratePermissions($item, true);
 
                        foreach ($terms as $term) {
                                $cid = Contact::getIdForURL($term['url'], $item['uid']);
@@ -530,7 +530,7 @@ class Transmitter
 
                if (Config::get('debug', 'total_ap_delivery')) {
                        // Will be activated in a later step
-                       $networks = [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS];
+                       $networks = Protocol::FEDERATED;
                } else {
                        // For now only send to these contacts:
                        $networks = [Protocol::ACTIVITYPUB, Protocol::OSTATUS];
@@ -1034,7 +1034,7 @@ class Transmitter
                // Simplify image codes
                $body = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '[img]$3[/img]', $item['body']);
 
-               // Grab all pictures and create attachments out of them
+               // Grab all pictures without alternative descriptions and create attachments out of them
                if (preg_match_all("/\[img\]([^\[\]]*)\[\/img\]/Usi", $body, $pictures)) {
                        foreach ($pictures[1] as $picture) {
                                $imgdata = Image::getInfoFromURL($picture);
@@ -1047,6 +1047,19 @@ class Transmitter
                        }
                }
 
+               // Grab all pictures with alternative description and create attachments out of them
+               if (preg_match_all("/\[img=([^\[\]]*)\]([^\[\]]*)\[\/img\]/Usi", $body, $pictures, PREG_SET_ORDER)) {
+                       foreach ($pictures as $picture) {
+                               $imgdata = Image::getInfoFromURL($picture[1]);
+                               if ($imgdata) {
+                                       $attachments[] = ['type' => 'Document',
+                                               'mediaType' => $imgdata['mime'],
+                                               'url' => $picture[1],
+                                               'name' => $picture[2]];
+                               }
+                       }
+               }
+
                return $attachments;
        }
 
@@ -1287,6 +1300,7 @@ class Transmitter
         */
        private static function createAnnounce($item, $data)
        {
+               $orig_body = $item['body'];
                $announce = api_share_as_retweet($item);
                if (empty($announce['plink'])) {
                        $data['type'] = 'Create';
@@ -1299,12 +1313,29 @@ class Transmitter
                if (!empty($activity)) {
                        $ldactivity = JsonLD::compact($activity);
                        $id = JsonLD::fetchElement($ldactivity, '@id');
+                       $type = str_replace('as:', '', JsonLD::fetchElement($ldactivity, '@type'));
                        if (!empty($id)) {
-                               $data['object'] = $id;
+                               if (empty($announce['share-pre-body'])) {
+                                       // Pure announce, without a quote
+                                       $data['type'] = 'Announce';
+                                       $data['object'] = $id;
+                                       return $data;
+                               }
+
+                               // Quote
+                               $data['type'] = 'Create';
+                               $item['body'] = trim($announce['share-pre-body']) . "\n" . $id;
+                               $data['object'] = self::createNote($item);
+
+                               /// @todo Finally descide how to implement this in AP. This is a possible way:
+                               $data['object']['attachment'][] = ['type' => $type, 'id' => $id];
+
+                               $data['object']['source']['content'] = $orig_body;
                                return $data;
                        }
                }
 
+               $item['body'] = $orig_body;
                $data['type'] = 'Create';
                $data['object'] = self::createNote($item);
                return $data;
index 91ca2545db8f0f983156f05ec978f38ab0770895..273a7c248cc2651762ed1c6fa542818328a38491 100644 (file)
@@ -11,6 +11,7 @@ namespace Friendica\Protocol;
 use DOMDocument;
 use DOMXPath;
 use Friendica\App;
+use Friendica\App\BaseURL;
 use Friendica\Content\OEmbed;
 use Friendica\Content\Text\BBCode;
 use Friendica\Content\Text\HTML;
@@ -29,8 +30,8 @@ use Friendica\Model\Mail;
 use Friendica\Model\PermissionSet;
 use Friendica\Model\Profile;
 use Friendica\Model\User;
+use Friendica\Network\Probe;
 use Friendica\Object\Image;
-use Friendica\Util\BaseURL;
 use Friendica\Util\Crypto;
 use Friendica\Util\DateTimeFormat;
 use Friendica\Util\Network;
@@ -257,7 +258,7 @@ class DFRN
                        STRAIGHT_JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
                        WHERE `item`.`uid` = %d AND `item`.`wall` AND `item`.`changed` > '%s'
                        AND `item`.`visible` $sql_extra
-                       ORDER BY `item`.`parent` ".$sort.", `item`.`created` ASC LIMIT 0, 300",
+                       ORDER BY `item`.`parent` ".$sort.", `item`.`received` ASC LIMIT 0, 300",
                        intval($owner_id),
                        DBA::escape($check_date),
                        DBA::escape($sort)
@@ -1176,23 +1177,13 @@ class DFRN
         * @param string $atom     Content that will be transmitted
         * @param bool   $dissolve (to be documented)
         *
-        * @param bool   $legacy_transport
         * @return int Deliver status. Negative values mean an error.
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         * @throws \ImagickException
         * @todo  Add array type-hint for $owner, $contact
         */
-       public static function deliver($owner, $contact, $atom, $dissolve = false, $legacy_transport = false)
+       public static function deliver($owner, $contact, $atom, $dissolve = false)
        {
-               // At first try the Diaspora transport layer
-               if (!$dissolve && !$legacy_transport) {
-                       $curlResult = self::transmit($owner, $contact, $atom);
-                       if ($curlResult >= 200) {
-                               Logger::log('Delivery via Diaspora transport layer was successful with status ' . $curlResult);
-                               return $curlResult;
-                       }
-               }
-
                $idtosend = $orig_id = (($contact['dfrn-id']) ? $contact['dfrn-id'] : $contact['issued-id']);
 
                if ($contact['duplex'] && $contact['dfrn-id']) {
@@ -1465,6 +1456,11 @@ class DFRN
 
                $dest_url = ($public_batch ? $contact["batch"] : $contact["notify"]);
 
+               if (empty($dest_url)) {
+                       Logger::info('Empty destination', ['public' => $public_batch, 'contact' => $contact]);
+                       return -24;
+               }
+
                $content_type = ($public_batch ? "application/magic-envelope+xml" : "application/json");
 
                $postResult = Network::post($dest_url, $envelope, ["Content-Type: ".$content_type]);
@@ -1694,64 +1690,26 @@ class DFRN
                                Event::createBirthday($contact, $birthday);
                        }
 
-                       // Get all field names
-                       $fields = [];
-                       foreach ($contact_old as $field => $data) {
-                               $fields[$field] = $data;
-                       }
-
-                       unset($fields["id"]);
-                       unset($fields["uid"]);
-                       unset($fields["url"]);
-                       unset($fields["avatar-date"]);
-                       unset($fields["avatar"]);
-                       unset($fields["name-date"]);
-                       unset($fields["uri-date"]);
-
-                       $update = false;
-                       // Update check for this field has to be done differently
-                       $datefields = ["name-date", "uri-date"];
-                       foreach ($datefields as $field) {
-                               // The date fields arrives as '2018-07-17T10:44:45Z' - the database return '2018-07-17 10:44:45'
-                               // The fields have to be in the same format to be comparable, since strtotime does add timezones.
-                               $contact[$field] = DateTimeFormat::utc($contact[$field]);
+                       $fields = ['name' => $contact['name'], 'nick' => $contact['nick'], 'about' => $contact['about'],
+                               'location' => $contact['location'], 'addr' => $contact['addr'], 'keywords' => $contact['keywords'],
+                               'bdyear' => $contact['bdyear'], 'bd' => $contact['bd'], 'hidden' => $contact['hidden'],
+                               'xmpp' => $contact['xmpp'], 'name-date' => DateTimeFormat::utc($contact['name-date']),
+                               'unsearchable' => $contact['hidden'], 'uri-date' => DateTimeFormat::utc($contact['uri-date'])];
 
-                               if (strtotime($contact[$field]) > strtotime($contact_old[$field])) {
-                                       Logger::log("Difference for contact " . $contact["id"] . " in field '" . $field . "'. New value: '" . $contact[$field] . "', old value '" . $contact_old[$field] . "'", Logger::DEBUG);
-                                       $update = true;
-                               }
-                       }
+                       DBA::update('contact', $fields, ['id' => $contact['id'], 'network' => $contact['network']], $contact_old);
 
-                       foreach ($fields as $field => $data) {
-                               if ($contact[$field] != $contact_old[$field]) {
-                                       Logger::log("Difference for contact " . $contact["id"] . " in field '" . $field . "'. New value: '" . $contact[$field] . "', old value '" . $contact_old[$field] . "'", Logger::DEBUG);
-                                       $update = true;
-                               }
-                       }
+                       // Update the public contact. Don't set the "hidden" value, this is used differently for public contacts
+                       unset($fields['hidden']);
+                       $condition = ['uid' => 0, 'nurl' => Strings::normaliseLink($contact_old['url'])];
+                       DBA::update('contact', $fields, $condition, true);
 
-                       if ($update) {
-                               Logger::log("Update contact data for contact " . $contact["id"] . " (" . $contact["nick"] . ")", Logger::DEBUG);
+                       Contact::updateAvatar($author['avatar'], $importer['importer_uid'], $contact['id']);
 
-                               q(
-                                       "UPDATE `contact` SET `name` = '%s', `nick` = '%s', `about` = '%s', `location` = '%s',
-                                       `addr` = '%s', `keywords` = '%s', `bdyear` = '%s', `bd` = '%s', `hidden` = %d,
-                                       `xmpp` = '%s', `name-date`  = '%s', `uri-date` = '%s'
-                                       WHERE `id` = %d AND `network` = '%s'",
-                                       DBA::escape($contact["name"]), DBA::escape($contact["nick"]), DBA::escape($contact["about"]),   DBA::escape($contact["location"]),
-                                       DBA::escape($contact["addr"]), DBA::escape($contact["keywords"]), DBA::escape($contact["bdyear"]),
-                                       DBA::escape($contact["bd"]), intval($contact["hidden"]), DBA::escape($contact["xmpp"]),
-                                       DBA::escape(DateTimeFormat::utc($contact["name-date"])), DBA::escape(DateTimeFormat::utc($contact["uri-date"])),
-                                       intval($contact["id"]), DBA::escape($contact["network"])
-                               );
+                       $pcid = Contact::getIdForURL($contact_old['url']);
+                       if (!empty($pcid)) {
+                               Contact::updateAvatar($author['avatar'], 0, $pcid);
                        }
 
-                       Contact::updateAvatar(
-                               $author['avatar'],
-                               $importer['importer_uid'],
-                               $contact['id'],
-                               (strtotime($contact['avatar-date']) > strtotime($contact_old['avatar-date']) || ($author['avatar'] != $contact_old['avatar']))
-                       );
-
                        /*
                         * The generation is a sign for the reliability of the provided data.
                         * It is used in the socgraph.php to prevent that old contact data
@@ -2219,7 +2177,7 @@ class DFRN
                if (($entrytype == DFRN::TOP_LEVEL) && !empty($importer['id'])) {
                        // The filling of the the "contact" variable is done for legcy reasons
                        // The functions below are partly used by ostatus.php as well - where we have this variable
-                       $contact = Contact::select([], ['id' => $importer['id']]);
+                       $contact = Contact::selectFirst([], ['id' => $importer['id']]);
 
                        // Big question: Do we need these functions? They were part of the "consume_feed" function.
                        // This function once was responsible for DFRN and OStatus.
@@ -3084,4 +3042,19 @@ class DFRN
 
                return (strcmp($existing_edited, $update_edited) < 0);
        }
+
+       /**
+        * Checks if the given contact url does support DFRN
+        *
+        * @param string  $url    profile url
+        * @param boolean $update Update the profile
+        * @return boolean
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws \ImagickException
+        */
+       public static function isSupportedByContactUrl($url, $update = false)
+       {
+               $probe = Probe::uri($url, Protocol::DFRN, 0, !$update);
+               return $probe['network'] == Protocol::DFRN;
+       }
 }
index f7d94256eeaea5ffd654ab39b62686d49fe25a1b..325debe7bc97d65f84d2e7e4d7cdd7ba4898ecfe 100644 (file)
@@ -180,22 +180,28 @@ class Diaspora
        public static function setRelayContact($server_url, array $network_fields = [])
        {
                $fields = ['created' => DateTimeFormat::utcNow(),
-                       'name' => 'relay', 'nick' => 'relay',
-                       'url' => $server_url, 'network' => Protocol::DIASPORA,
+                       'name' => 'relay', 'nick' => 'relay', 'url' => $server_url,
+                       'nurl' => Strings::normaliseLink($server_url),
+                       'network' => Protocol::DIASPORA, 'uid' => 0,
                        'batch' => $server_url . '/receive/public',
                        'rel' => Contact::FOLLOWER, 'blocked' => false,
-                       'pending' => false, 'writable' => true];
+                       'pending' => false, 'writable' => true,
+                       'baseurl' => $server_url, 'contact-type' => Contact::TYPE_RELAY];
 
                $fields = array_merge($fields, $network_fields);
 
-               $condition = ['uid' => 0, 'nurl' => Strings::normaliseLink($server_url),
-                       'contact-type' => Contact::TYPE_RELAY];
-
-               if (DBA::exists('contact', $condition)) {
+               $condition = ['uid' => 0, 'nurl' => Strings::normaliseLink($server_url)];
+               $old = DBA::selectFirst('contact', [], $condition);
+               if (DBA::isResult($old)) {
                        unset($fields['created']);
-               }
+                       $condition = ['id' => $old['id']];
 
-               DBA::update('contact', $fields, $condition, true);
+                       Logger::info('Update relay contact', ['fields' => $fields, 'condition' => $condition]);
+                       DBA::update('contact', $fields, $condition, $old);
+               } else {
+                       Logger::info('Create relay contact', ['fields' => $fields]);
+                       DBA::insert('contact', $fields);
+               }
        }
 
        /**
@@ -936,31 +942,41 @@ class Diaspora
         * @brief Fetches data for a given handle
         *
         * @param string $handle The handle
+        * @param boolean $update true = always update, false = never update, null = update when not found or outdated
         *
         * @return array the queried data
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function personByHandle($handle)
+       public static function personByHandle($handle, $update = null)
        {
-               $update = false;
-
                $person = DBA::selectFirst('fcontact', [], ['network' => Protocol::DIASPORA, 'addr' => $handle]);
+               if (!DBA::isResult($person)) {
+                       $urls = [$handle, str_replace('http://', 'https://', $handle), Strings::normaliseLink($handle)];
+                       $person = DBA::selectFirst('fcontact', [], ['network' => Protocol::DIASPORA, 'url' => $urls]);
+               }
+
                if (DBA::isResult($person)) {
                        Logger::debug("In cache " . print_r($person, true));
 
-                       // update record occasionally so it doesn't get stale
-                       $d = strtotime($person["updated"]." +00:00");
-                       if ($d < strtotime("now - 14 days")) {
-                               $update = true;
-                       }
+                       if (is_null($update)) {
+                               // update record occasionally so it doesn't get stale
+                               $d = strtotime($person["updated"]." +00:00");
+                               if ($d < strtotime("now - 14 days")) {
+                                       $update = true;
+                               }
 
-                       if ($person["guid"] == "") {
-                               $update = true;
+                               if ($person["guid"] == "") {
+                                       $update = true;
+                               }
                        }
+               } elseif (is_null($update)) {
+                       $update = !DBA::isResult($person);
+               } else {
+                       $person = [];
                }
 
-               if (!DBA::isResult($person) || $update) {
+               if ($update) {
                        Logger::log("create or refresh", Logger::DEBUG);
                        $r = Probe::uri($handle, Protocol::DIASPORA);
 
@@ -969,12 +985,7 @@ class Diaspora
                        if ($r && ($r["network"] === Protocol::DIASPORA)) {
                                self::updateFContact($r);
 
-                               // Fetch the updated or added contact
-                               $person = DBA::selectFirst('fcontact', [], ['network' => Protocol::DIASPORA, 'addr' => $handle]);
-                               if (!DBA::isResult($person)) {
-                                       $person = $r;
-                                       $person['id'] = 0;
-                               }
+                               $person = self::personByHandle($handle, false);
                        }
                }
 
@@ -1111,6 +1122,20 @@ class Diaspora
                return $contact;
        }
 
+       /**
+        * Checks if the given contact url does support ActivityPub
+        *
+        * @param string  $url    profile url
+        * @param boolean $update true = always update, false = never update, null = update when not found or outdated
+        * @return boolean
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws \ImagickException
+        */
+       public static function isSupportedByContactUrl($url, $update = null)
+       {
+               return !empty(self::personByHandle($url, $update));
+       }
+
        /**
         * @brief Check if posting is allowed for this contact
         *
@@ -1408,6 +1433,39 @@ class Diaspora
                return $msg;
        }
 
+       /**
+        * @brief Fetches an item with a given URL
+        *
+        * @param string $url the message url
+        *
+        * @return int the message id of the stored message or false
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws \ImagickException
+        */
+       public static function fetchByURL($url, $uid = 0)
+       {
+               // Check for Diaspora (and Friendica) typical paths
+               if (!preg_match("=(https?://.+)/(?:posts|display)/([a-zA-Z0-9-_@.:%]+[a-zA-Z0-9])=i", $url, $matches)) {
+                       return false;
+               }
+
+               $guid = urldecode($matches[2]);
+
+               $item = Item::selectFirst(['id'], ['guid' => $guid, 'uid' => $uid]);
+               if (DBA::isResult($item)) {
+                       return $item['id'];
+               }
+
+               self::storeByGuid($guid, $matches[1], $uid);
+
+               $item = Item::selectFirst(['id'], ['guid' => $guid, 'uid' => $uid]);
+               if (DBA::isResult($item)) {
+                       return $item['id'];
+               } else {
+                       return false;
+               }
+       }
+
        /**
         * @brief Fetches the item record of a given guid
         *
@@ -2258,8 +2316,8 @@ class Diaspora
                $fields = ['name' => $name, 'location' => $location,
                        'name-date' => DateTimeFormat::utcNow(),
                        'about' => $about, 'gender' => $gender,
-                       'addr' => $author, 'nick' => $nick,
-                       'keywords' => $keywords];
+                       'addr' => $author, 'nick' => $nick, 'keywords' => $keywords,
+                       'unsearchable' => !$searchable, 'sensitive' => $nsfw];
 
                if (!empty($birthday)) {
                        $fields['bd'] = $birthday;
@@ -2267,6 +2325,8 @@ class Diaspora
 
                DBA::update('contact', $fields, ['id' => $contact['id']]);
 
+               // @todo Update the public contact, then update the gcontact from that
+
                $gcontact = ["url" => $contact["url"], "network" => Protocol::DIASPORA, "generation" => 2,
                                        "photo" => $image_url, "name" => $name, "location" => $location,
                                        "about" => $about, "birthday" => $birthday, "gender" => $gender,
index 0cf1db7cb799dcafe5789157953c3767f4fe265e..65f2e7b863715ce06c5582e9dca41a74481167c7 100644 (file)
@@ -266,6 +266,9 @@ class Feed {
                        if (empty($item["title"])) {
                                $item["title"] = XML::getFirstNodeValue($xpath, 'rss:title/text()', $entry);
                        }
+
+                       $item["title"] = mb_convert_encoding($item["title"], 'HTML-ENTITIES', "UTF-8");
+
                        $published = XML::getFirstNodeValue($xpath, 'atom:published/text()', $entry);
 
                        if (empty($published)) {
index 9fa0ff43af73e9120122178142dba54257ee03e4..054eaf51b2812939153424fa80058c9485ee18d9 100644 (file)
@@ -10,6 +10,7 @@ use Friendica\Content\Text\BBCode;
 use Friendica\Content\Text\HTML;
 use Friendica\Core\Cache;
 use Friendica\Core\Config;
+use Friendica\Core\PConfig;
 use Friendica\Core\L10n;
 use Friendica\Core\Logger;
 use Friendica\Core\Lock;
@@ -19,6 +20,7 @@ use Friendica\Database\DBA;
 use Friendica\Model\Contact;
 use Friendica\Model\Conversation;
 use Friendica\Model\GContact;
+use Friendica\Model\APContact;
 use Friendica\Model\Item;
 use Friendica\Model\User;
 use Friendica\Network\Probe;
@@ -113,6 +115,8 @@ class OStatus
                if (DBA::isResult($contact)) {
                        if ($contact['blocked']) {
                                $contact['id'] = -1;
+                       } elseif (!empty(APContact::getByURL($contact['url'], false))) {
+                               ActivityPub\Receiver::switchContact($contact['id'], $importer['uid'], $contact['url']);
                        }
                        $author["contact-id"] = $contact["id"];
                }
@@ -486,10 +490,11 @@ class OStatus
                        if ($initialize && (count(self::$itemlist) > 0)) {
                                if (self::$itemlist[0]['uri'] == self::$itemlist[0]['parent-uri']) {
                                        // We will import it everytime, when it is started by our contacts
-                                       $valid = !empty(self::$itemlist[0]['contact-id']);
+                                       $valid = Contact::isSharingByURL(self::$itemlist[0]['author-link'], self::$itemlist[0]['uid']);
+
                                        if (!$valid) {
                                                // If not, then it depends on this setting
-                                               $valid = !Config::get('system', 'ostatus_full_threads');
+                                               $valid = ((self::$itemlist[0]['uid'] == 0) || !PConfig::get(self::$itemlist[0]['uid'], 'system', 'accept_only_sharer', false));
                                                if ($valid) {
                                                        Logger::log("Item with uri ".self::$itemlist[0]['uri']." will be imported due to the system settings.", Logger::DEBUG);
                                                }
@@ -501,7 +506,7 @@ class OStatus
                                                $valid = false;
                                                $verbs = [ACTIVITY_POST, ACTIVITY_SHARE];
                                                foreach (self::$itemlist as $item) {
-                                                       if (!empty($item['contact-id']) && in_array($item['verb'], $verbs)) {
+                                                       if (in_array($item['verb'], $verbs) && Contact::isSharingByURL($item['author-link'], $item['uid'])) {
                                                                $valid = true;
                                                        }
                                                }
@@ -2219,7 +2224,7 @@ class OStatus
                $check_date = DateTimeFormat::utc($last_update);
                $authorid = Contact::getIdForURL($owner["url"], 0, true);
 
-               $condition = ["`uid` = ? AND `created` > ? AND NOT `deleted`
+               $condition = ["`uid` = ? AND `received` > ? AND NOT `deleted`
                        AND NOT `private` AND `visible` AND `wall` AND `parent-network` IN (?, ?)",
                        $owner["uid"], $check_date, Protocol::OSTATUS, Protocol::DFRN];
 
@@ -2234,7 +2239,7 @@ class OStatus
                        $condition[] = $authorid;
                }
 
-               $params = ['order' => ['created' => true], 'limit' => $max_items];
+               $params = ['order' => ['received' => true], 'limit' => $max_items];
 
                if ($filter === 'posts') {
                        $ret = Item::selectThread([], $condition, $params);
@@ -2297,4 +2302,19 @@ class OStatus
 
                return trim($doc->saveXML());
        }
+
+       /**
+        * Checks if the given contact url does support OStatus
+        *
+        * @param string  $url    profile url
+        * @param boolean $update Update the profile
+        * @return boolean
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws \ImagickException
+        */
+       public static function isSupportedByContactUrl($url, $update = false)
+       {
+               $probe = Probe::uri($url, Protocol::OSTATUS, 0, !$update);
+               return $probe['network'] == Protocol::OSTATUS;
+       }
 }
index f29c2e864ec414b7d1219344e4e14d6fd0b622f9..06fa5246797028fb1bbee1dc75a5b7184db7726c 100644 (file)
@@ -4,36 +4,55 @@ namespace Friendica\Util;
 
 class BasePath
 {
+       /**
+        * @var string
+        */
+       private $baseDir;
+       /**
+        * @var array
+        */
+       private $server;
+
+       /**
+        * @param string|null $baseDir The default base path
+        * @param array       $server  server arguments
+        */
+       public function __construct(string $baseDir, array $server = [])
+       {
+               $this->baseDir = $baseDir;
+               $this->server = $server;
+       }
+
        /**
         * @brief Returns the base filesystem path of the App
         *
         * It first checks for the internal variable, then for DOCUMENT_ROOT and
         * finally for PWD
         *
-        * @param string|null $basePath The default base path
-        * @param array       $server   server arguments
-        *
         * @return string
         *
         * @throws \Exception if directory isn't usable
         */
-       public static function create($basePath, array $server = [])
+       public function getPath()
        {
-               if ((!$basePath || !is_dir($basePath)) && !empty($server['DOCUMENT_ROOT'])) {
-                       $basePath = $server['DOCUMENT_ROOT'];
+               $baseDir = $this->baseDir;
+               $server = $this->server;
+
+               if ((!$baseDir || !is_dir($baseDir)) && !empty($server['DOCUMENT_ROOT'])) {
+                       $baseDir = $server['DOCUMENT_ROOT'];
                }
 
-               if ((!$basePath || !is_dir($basePath)) && !empty($server['PWD'])) {
-                       $basePath = $server['PWD'];
+               if ((!$baseDir || !is_dir($baseDir)) && !empty($server['PWD'])) {
+                       $baseDir = $server['PWD'];
                }
 
-               $basePath = self::getRealPath($basePath);
+               $baseDir = self::getRealPath($baseDir);
 
-               if (!is_dir($basePath)) {
-                       throw new \Exception(sprintf('\'%s\' is not a valid basepath', $basePath));
+               if (!is_dir($baseDir)) {
+                       throw new \Exception(sprintf('\'%s\' is not a valid basepath', $baseDir));
                }
 
-               return $basePath;
+               return $baseDir;
        }
 
        /**
diff --git a/src/Util/BaseURL.php b/src/Util/BaseURL.php
deleted file mode 100644 (file)
index be34de3..0000000
+++ /dev/null
@@ -1,382 +0,0 @@
-<?php
-
-namespace Friendica\Util;
-
-use Friendica\Core\Config\Configuration;
-
-/**
- * A class which checks and contains the basic
- * environment for the BaseURL (url, urlpath, ssl_policy, hostname, scheme)
- */
-class BaseURL
-{
-       /**
-        * No SSL necessary
-        */
-       const SSL_POLICY_NONE = 0;
-
-       /**
-        * SSL is necessary
-        */
-       const SSL_POLICY_FULL = 1;
-
-       /**
-        * SSL is optional, but preferred
-        */
-       const SSL_POLICY_SELFSIGN = 2;
-
-       /**
-        * Define the Default SSL scheme
-        */
-       const DEFAULT_SSL_SCHEME = self::SSL_POLICY_SELFSIGN;
-
-       /**
-        * The Friendica Config
-        * @var Configuration
-        */
-       private $config;
-
-       /**
-        * The server side variables
-        * @var array
-        */
-       private $server;
-
-       /**
-        * The hostname of the Base URL
-        * @var string
-        */
-       private $hostname;
-
-       /**
-        * The SSL_POLICY of the Base URL
-        * @var int
-        */
-       private $sslPolicy;
-
-       /**
-        * The URL sub-path of the Base URL
-        * @var string
-        */
-       private $urlPath;
-
-       /**
-        * The full URL
-        * @var string
-        */
-       private $url;
-
-       /**
-        * The current scheme of this call
-        * @var string
-        */
-       private $scheme;
-
-       /**
-        * Returns the hostname of this node
-        * @return string
-        */
-       public function getHostname()
-       {
-               return $this->hostname;
-       }
-
-       /**
-        * Returns the current scheme of this call
-        * @return string
-        */
-       public function getScheme()
-       {
-               return $this->scheme;
-       }
-
-       /**
-        * Returns the SSL policy of this node
-        * @return int
-        */
-       public function getSSLPolicy()
-       {
-               return $this->sslPolicy;
-       }
-
-       /**
-        * Returns the sub-path of this URL
-        * @return string
-        */
-       public function getUrlPath()
-       {
-               return $this->urlPath;
-       }
-
-       /**
-        * Returns the full URL of this call
-        *
-        * Note: $ssl parameter value doesn't directly correlate with the resulting protocol
-        *
-        * @param bool $ssl True, if ssl should get used
-        *
-        * @return string
-        */
-       public function get($ssl = false)
-       {
-               if ($this->sslPolicy === self::SSL_POLICY_SELFSIGN && $ssl) {
-                       return Network::switchScheme($this->url);
-               }
-
-               return $this->url;
-       }
-
-       /**
-        * Save current parts of the base Url
-        *
-        * @param string? $hostname
-        * @param int?    $sslPolicy
-        * @param string? $urlPath
-        *
-        * @return bool true, if successful
-        */
-       public function save($hostname = null, $sslPolicy = null, $urlPath = null)
-       {
-               $currHostname  = $this->hostname;
-               $currSSLPolicy = $this->sslPolicy;
-               $currURLPath   = $this->urlPath;
-
-               if (!empty($hostname) && $hostname !== $this->hostname) {
-                       if ($this->config->set('config', 'hostname', $hostname)) {
-                               $this->hostname  = $hostname;
-                       } else {
-                               return false;
-                       }
-               }
-
-               if (isset($sslPolicy) && $sslPolicy !== $this->sslPolicy) {
-                       if ($this->config->set('system', 'ssl_policy', $sslPolicy)) {
-                               $this->sslPolicy = $sslPolicy;
-                       } else {
-                               $this->hostname  = $currHostname;
-                               $this->config->set('config', 'hostname', $this->hostname);
-                               return false;
-                       }
-               }
-
-               if (isset($urlPath) && $urlPath !== $this->urlPath) {
-                       if ($this->config->set('system', 'urlpath', $urlPath)) {
-                               $this->urlPath = $urlPath;
-                       } else {
-                               $this->hostname  = $currHostname;
-                               $this->sslPolicy = $currSSLPolicy;
-                               $this->config->set('config', 'hostname', $this->hostname);
-                               $this->config->set('system', 'ssl_policy', $this->sslPolicy);
-                               return false;
-                       }
-               }
-
-               $this->determineBaseUrl();
-               if (!$this->config->set('system', 'url', $this->url)) {
-                       $this->hostname  = $currHostname;
-                       $this->sslPolicy = $currSSLPolicy;
-                       $this->urlPath   = $currURLPath;
-                       $this->determineBaseUrl();
-
-                       $this->config->set('config', 'hostname', $this->hostname);
-                       $this->config->set('system', 'ssl_policy', $this->sslPolicy);
-                       $this->config->set('system', 'urlpath', $this->urlPath);
-                       return false;
-               }
-
-               return true;
-       }
-
-       /**
-        * Save the current url as base URL
-        *
-        * @param $url
-        *
-        * @return bool true, if the save was successful
-        */
-       public function saveByURL($url)
-       {
-               $parsed = @parse_url($url);
-
-               if (empty($parsed)) {
-                       return false;
-               }
-
-               $hostname = $parsed['host'];
-               if (!empty($hostname) && !empty($parsed['port'])) {
-                       $hostname .= ':' . $parsed['port'];
-               }
-
-               $urlPath = null;
-               if (!empty($parsed['path'])) {
-                       $urlPath = trim($parsed['path'], '\\/');
-               }
-
-               $sslPolicy = null;
-               if (!empty($parsed['scheme'])) {
-                       if ($parsed['scheme'] == 'https') {
-                               $sslPolicy = BaseURL::SSL_POLICY_FULL;
-                       }
-               }
-
-               return $this->save($hostname, $sslPolicy, $urlPath);
-       }
-
-       /**
-        * Checks, if a redirect to the HTTPS site would be necessary
-        *
-        * @return bool
-        */
-       public function checkRedirectHttps()
-       {
-               return $this->config->get('system', 'force_ssl')
-                       && ($this->getScheme() == "http")
-                       && intval($this->getSSLPolicy()) == BaseURL::SSL_POLICY_FULL
-                       && strpos($this->get(), 'https://') === 0
-                       && !empty($this->server['REQUEST_METHOD'])
-                       && $this->server['REQUEST_METHOD'] === 'GET';
-       }
-
-       /**
-        * @param Configuration $config The Friendica configuration
-        * @param array         $server The $_SERVER array
-        */
-       public function __construct(Configuration $config, array $server)
-       {
-               $this->config = $config;
-               $this->server = $server;
-
-               $this->determineSchema();
-               $this->checkConfig();
-       }
-
-       /**
-        * Check the current config during loading
-        */
-       public function checkConfig()
-       {
-               $this->hostname  = $this->config->get('config', 'hostname');
-               $this->urlPath   = $this->config->get('system', 'urlpath');
-               $this->sslPolicy = $this->config->get('system', 'ssl_policy');
-               $this->url       = $this->config->get('system', 'url');
-
-               if (empty($this->hostname)) {
-                       $this->determineHostname();
-
-                       if (!empty($this->hostname)) {
-                               $this->config->set('config', 'hostname', $this->hostname);
-                       }
-               }
-
-               if (!isset($this->urlPath)) {
-                       $this->determineURLPath();
-                       $this->config->set('system', 'urlpath', $this->urlPath);
-               }
-
-               if (!isset($this->sslPolicy)) {
-                       if ($this->scheme == 'https') {
-                               $this->sslPolicy = self::SSL_POLICY_FULL;
-                       } else {
-                               $this->sslPolicy = self::DEFAULT_SSL_SCHEME;
-                       }
-                       $this->config->set('system', 'ssl_policy', $this->sslPolicy);
-               }
-
-               if (empty($this->url)) {
-                       $this->determineBaseUrl();
-
-                       if (!empty($this->url)) {
-                               $this->config->set('system', 'url', $this->url);
-                       }
-               }
-       }
-
-       /**
-        * Determines the hostname of this node if not set already
-        */
-       private function determineHostname()
-       {
-               $this->hostname = '';
-
-               if (!empty($this->server['SERVER_NAME'])) {
-                       $this->hostname = $this->server['SERVER_NAME'];
-
-                       if (!empty($this->server['SERVER_PORT']) && $this->server['SERVER_PORT'] != 80 && $this->server['SERVER_PORT'] != 443) {
-                               $this->hostname .= ':' . $this->server['SERVER_PORT'];
-                       }
-               }
-       }
-
-       /**
-        * Figure out if we are running at the top of a domain or in a sub-directory
-        */
-       private function determineURLPath()
-       {
-               $this->urlPath = '';
-
-               /*
-                * 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($this->server, 'REDIRECT_URL', $relative_script_path);
-               $relative_script_path = defaults($this->server, 'REDIRECT_URI', $relative_script_path);
-               $relative_script_path = defaults($this->server, 'REDIRECT_SCRIPT_URL', $relative_script_path);
-               $relative_script_path = defaults($this->server, 'SCRIPT_URL', $relative_script_path);
-               $relative_script_path = defaults($this->server, 'REQUEST_URI', $relative_script_path);
-
-               /* $relative_script_path gives /relative/path/to/friendica/module/parameter
-                * QUERY_STRING gives pagename=module/parameter
-                *
-                * 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($this->server['QUERY_STRING'])) {
-                               $this->urlPath = trim(rdirname($relative_script_path, substr_count(trim($this->server['QUERY_STRING'], '/'), '/') + 1), '/');
-                       } else {
-                               // Root page
-                               $this->urlPath = trim($relative_script_path, '/');
-                       }
-               }
-       }
-
-       /**
-        * Determine the full URL based on all parts
-        */
-       private function determineBaseUrl()
-       {
-               $scheme = 'http';
-
-               if ($this->sslPolicy == self::SSL_POLICY_FULL) {
-                       $scheme = 'https';
-               }
-
-               $this->url = $scheme . '://' . $this->hostname . (!empty($this->urlPath) ? '/' . $this->urlPath : '' );
-       }
-
-       /**
-        * Determine the scheme of the current used link
-        */
-       private function determineSchema()
-       {
-               $this->scheme = 'http';
-
-               if (!empty($this->server['HTTPS']) ||
-                       !empty($this->server['HTTP_FORWARDED']) && preg_match('/proto=https/', $this->server['HTTP_FORWARDED']) ||
-                       !empty($this->server['HTTP_X_FORWARDED_PROTO']) && $this->server['HTTP_X_FORWARDED_PROTO'] == 'https' ||
-                       !empty($this->server['HTTP_X_FORWARDED_SSL']) && $this->server['HTTP_X_FORWARDED_SSL'] == 'on' ||
-                       !empty($this->server['FRONT_END_HTTPS']) && $this->server['FRONT_END_HTTPS'] == 'on' ||
-                       !empty($this->server['SERVER_PORT']) && (intval($this->server['SERVER_PORT']) == 443) // XXX: reasonable assumption, but isn't this hardcoding too much?
-               ) {
-                       $this->scheme = 'https';
-               }
-       }
-}
diff --git a/src/Util/Config/ConfigFileLoader.php b/src/Util/Config/ConfigFileLoader.php
deleted file mode 100644 (file)
index 3d4f31a..0000000
+++ /dev/null
@@ -1,220 +0,0 @@
-<?php
-
-namespace Friendica\Util\Config;
-
-use Friendica\App;
-use Friendica\Core\Addon;
-use Friendica\Core\Config\Cache\IConfigCache;
-
-/**
- * The ConfigFileLoader loads config-files and stores them in a IConfigCache ( @see IConfigCache )
- *
- * It is capable of loading the following config files:
- * - *.config.php   (current)
- * - *.ini.php      (deprecated)
- * - *.htconfig.php (deprecated)
- */
-class ConfigFileLoader extends ConfigFileManager
-{
-       /**
-        * @var App\Mode
-        */
-       private $appMode;
-
-       public function __construct($baseDir, App\Mode $mode)
-       {
-               parent::__construct($baseDir);
-               $this->appMode = $mode;
-       }
-
-       /**
-        * Load the configuration files into an configuration cache
-        *
-        * First loads the default value for all the configuration keys, then the legacy configuration files, then the
-        * expected local.config.php
-        *
-        * @param IConfigCache $config The config cache to load to
-        * @param bool         $raw    Setup the raw config format
-        *
-        * @throws \Exception
-        */
-       public function setupCache(IConfigCache $config, $raw = false)
-       {
-               $config->load($this->loadCoreConfig('defaults'));
-               $config->load($this->loadCoreConfig('settings'));
-
-               $config->load($this->loadLegacyConfig('htpreconfig'), true);
-               $config->load($this->loadLegacyConfig('htconfig'), true);
-
-               $config->load($this->loadCoreConfig('local'), true);
-
-               // In case of install mode, add the found basepath (because there isn't a basepath set yet
-               if (!$raw && ($this->appMode->isInstall() || empty($config->get('system', 'basepath')))) {
-                       // Setting at least the basepath we know
-                       $config->set('system', 'basepath', $this->baseDir);
-               }
-       }
-
-       /**
-        * Tries to load the specified core-configuration and returns the config array.
-        *
-        * @param string $name The name of the configuration (default is empty, which means 'local')
-        *
-        * @return array The config array (empty if no config found)
-        *
-        * @throws \Exception if the configuration file isn't readable
-        */
-       public function loadCoreConfig($name = '')
-       {
-               if (!empty($this->getConfigFullName($name))) {
-                       return $this->loadConfigFile($this->getConfigFullName($name));
-               } elseif (!empty($this->getIniFullName($name))) {
-                       return $this->loadINIConfigFile($this->getIniFullName($name));
-               } else {
-                       return [];
-               }
-       }
-
-       /**
-        * Tries to load the specified addon-configuration and returns the config array.
-        *
-        * @param string $name The name of the configuration
-        *
-        * @return array The config array (empty if no config found)
-        *
-        * @throws \Exception if the configuration file isn't readable
-        */
-       public function loadAddonConfig($name)
-       {
-               $filepath = $this->baseDir . DIRECTORY_SEPARATOR . // /var/www/html/
-                       Addon::DIRECTORY       . DIRECTORY_SEPARATOR . // addon/
-                       $name                  . DIRECTORY_SEPARATOR . // openstreetmap/
-                       self::SUBDIRECTORY     . DIRECTORY_SEPARATOR . // config/
-                       $name . ".config.php";                         // openstreetmap.config.php
-
-               if (file_exists($filepath)) {
-                       return $this->loadConfigFile($filepath);
-               } else {
-                       return [];
-               }
-       }
-
-       /**
-        * Tries to load the legacy config files (.htconfig.php, .htpreconfig.php) and returns the config array.
-        *
-        * @param string $name The name of the config file (default is empty, which means .htconfig.php)
-        *
-        * @return array The configuration array (empty if no config found)
-        *
-        * @deprecated since version 2018.09
-        */
-       private function loadLegacyConfig($name = '')
-       {
-               $config = [];
-               if (!empty($this->getHtConfigFullName($name))) {
-                       $a = new \stdClass();
-                       $a->config = [];
-                       include $this->getHtConfigFullName($name);
-
-                       $htConfigCategories = array_keys($a->config);
-
-                       // map the legacy configuration structure to the current structure
-                       foreach ($htConfigCategories as $htConfigCategory) {
-                               if (is_array($a->config[$htConfigCategory])) {
-                                       $keys = array_keys($a->config[$htConfigCategory]);
-
-                                       foreach ($keys as $key) {
-                                               $config[$htConfigCategory][$key] = $a->config[$htConfigCategory][$key];
-                                       }
-                               } else {
-                                       $config['config'][$htConfigCategory] = $a->config[$htConfigCategory];
-                               }
-                       }
-
-                       unset($a);
-
-                       if (isset($db_host)) {
-                               $config['database']['hostname'] = $db_host;
-                               unset($db_host);
-                       }
-                       if (isset($db_user)) {
-                               $config['database']['username'] = $db_user;
-                               unset($db_user);
-                       }
-                       if (isset($db_pass)) {
-                               $config['database']['password'] = $db_pass;
-                               unset($db_pass);
-                       }
-                       if (isset($db_data)) {
-                               $config['database']['database'] = $db_data;
-                               unset($db_data);
-                       }
-                       if (isset($config['system']['db_charset'])) {
-                               $config['database']['charset'] = $config['system']['db_charset'];
-                       }
-                       if (isset($pidfile)) {
-                               $config['system']['pidfile'] = $pidfile;
-                               unset($pidfile);
-                       }
-                       if (isset($default_timezone)) {
-                               $config['system']['default_timezone'] = $default_timezone;
-                               unset($default_timezone);
-                       }
-                       if (isset($lang)) {
-                               $config['system']['language'] = $lang;
-                               unset($lang);
-                       }
-               }
-
-               return $config;
-       }
-
-       /**
-        * Tries to load the specified legacy configuration file and returns the config array.
-        *
-        * @deprecated since version 2018.12
-        * @param string $filepath
-        *
-        * @return array The configuration array
-        * @throws \Exception
-        */
-       private function loadINIConfigFile($filepath)
-       {
-               $contents = include($filepath);
-
-               $config = parse_ini_string($contents, true, INI_SCANNER_TYPED);
-
-               if ($config === false) {
-                       throw new \Exception('Error parsing INI config file ' . $filepath);
-               }
-
-               return $config;
-       }
-
-       /**
-        * Tries to load the specified configuration file and returns the config array.
-        *
-        * The config format is PHP array and the template for configuration files is the following:
-        *
-        * <?php return [
-        *      'section' => [
-        *          'key' => 'value',
-        *      ],
-        * ];
-        *
-        * @param  string $filepath The filepath of the
-        * @return array The config array0
-        *
-        * @throws \Exception if the config cannot get loaded.
-        */
-       private function loadConfigFile($filepath)
-       {
-               $config = include($filepath);
-
-               if (!is_array($config)) {
-                       throw new \Exception('Error loading config file ' . $filepath);
-               }
-
-               return $config;
-       }
-}
diff --git a/src/Util/Config/ConfigFileManager.php b/src/Util/Config/ConfigFileManager.php
deleted file mode 100644 (file)
index 729e59d..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php
-
-namespace Friendica\Util\Config;
-
-/**
- * An abstract class in case of handling with config files
- */
-abstract class ConfigFileManager
-{
-       /**
-        * The Sub directory of the config-files
-        * @var string
-        */
-       const SUBDIRECTORY = 'config';
-
-       /**
-        * The default name of the user defined config file
-        * @var string
-        */
-       const CONFIG_LOCAL    = 'local';
-
-       /**
-        * The default name of the user defined ini file
-        * @var string
-        */
-       const CONFIG_INI      = 'local';
-
-       /**
-        * The default name of the user defined legacy config file
-        * @var string
-        */
-       const CONFIG_HTCONFIG = 'htconfig';
-
-       protected $baseDir;
-       protected $configDir;
-
-       /**
-        * @param string $baseDir The base directory of Friendica
-        */
-       public function __construct($baseDir)
-       {
-               $this->baseDir = $baseDir;
-               $this->configDir = $baseDir . DIRECTORY_SEPARATOR . self::SUBDIRECTORY;
-       }
-
-       /**
-        * Gets the full name (including the path) for a *.config.php (default is local.config.php)
-        *
-        * @param string $name The config name (default is empty, which means local.config.php)
-        *
-        * @return string The full name or empty if not found
-        */
-       protected function getConfigFullName($name = '')
-       {
-               $name = !empty($name) ? $name : self::CONFIG_LOCAL;
-
-               $fullName = $this->configDir . DIRECTORY_SEPARATOR . $name . '.config.php';
-               return file_exists($fullName) ? $fullName : '';
-       }
-
-       /**
-        * Gets the full name (including the path) for a *.ini.php (default is local.ini.php)
-        *
-        * @param string $name The config name (default is empty, which means local.ini.php)
-        *
-        * @return string The full name or empty if not found
-        */
-       protected function getIniFullName($name = '')
-       {
-               $name = !empty($name) ? $name : self::CONFIG_INI;
-
-               $fullName = $this->configDir . DIRECTORY_SEPARATOR . $name . '.ini.php';
-               return file_exists($fullName) ? $fullName : '';
-       }
-
-       /**
-        * Gets the full name (including the path) for a .*.php (default is .htconfig.php)
-        *
-        * @param string $name The config name (default is empty, which means .htconfig.php)
-        *
-        * @return string The full name or empty if not found
-        */
-       protected function getHtConfigFullName($name = '')
-       {
-               $name = !empty($name) ? $name : self::CONFIG_HTCONFIG;
-
-               $fullName = $this->baseDir  . DIRECTORY_SEPARATOR . '.' . $name . '.php';
-               return file_exists($fullName) ? $fullName : '';
-       }
-}
diff --git a/src/Util/ConfigFileLoader.php b/src/Util/ConfigFileLoader.php
new file mode 100644 (file)
index 0000000..80da401
--- /dev/null
@@ -0,0 +1,324 @@
+<?php
+
+namespace Friendica\Util;
+
+use Exception;
+use Friendica\Core\Addon;
+use Friendica\Core\Config\Cache\ConfigCache;
+
+/**
+ * The ConfigFileLoader loads config-files and stores them in a ConfigCache ( @see ConfigCache )
+ *
+ * It is capable of loading the following config files:
+ * - *.config.php   (current)
+ * - *.ini.php      (deprecated)
+ * - *.htconfig.php (deprecated)
+ */
+class ConfigFileLoader
+{
+       /**
+        * The Sub directory of the config-files
+        *
+        * @var string
+        */
+       const CONFIG_DIR = 'config';
+
+       /**
+        * The Sub directory of the static config-files
+        *
+        * @var string
+        */
+       const STATIC_DIR = 'static';
+
+       /**
+        * The default name of the user defined ini file
+        *
+        * @var string
+        */
+       const CONFIG_INI = 'local';
+
+       /**
+        * The default name of the user defined legacy config file
+        *
+        * @var string
+        */
+       const CONFIG_HTCONFIG = 'htconfig';
+
+       /**
+        * The sample string inside the configs, which shouldn't get loaded
+        *
+        * @var string
+        */
+       const SAMPLE_END = '-sample';
+
+       /**
+        * @var string
+        */
+       private $baseDir;
+       /**
+        * @var string
+        */
+       private $configDir;
+       /**
+        * @var string
+        */
+       private $staticDir;
+
+       public function __construct(string $basePath)
+       {
+               $this->baseDir   = $basePath;
+               $this->configDir = $this->baseDir . DIRECTORY_SEPARATOR . self::CONFIG_DIR;
+               $this->staticDir = $this->baseDir . DIRECTORY_SEPARATOR . self::STATIC_DIR;
+       }
+
+       /**
+        * Load the configuration files into an configuration cache
+        *
+        * First loads the default value for all the configuration keys, then the legacy configuration files, then the
+        * expected local.config.php
+        *
+        * @param ConfigCache $config The config cache to load to
+        * @param bool        $raw    Setup the raw config format
+        *
+        * @throws Exception
+        */
+       public function setupCache(ConfigCache $config, $raw = false)
+       {
+               // Load static config files first, the order is important
+               $config->load($this->loadStaticConfig('defaults'));
+               $config->load($this->loadStaticConfig('settings'));
+
+               // try to load the legacy config first
+               $config->load($this->loadLegacyConfig('htpreconfig'), true);
+               $config->load($this->loadLegacyConfig('htconfig'), true);
+
+               // Now load every other config you find inside the 'config/' directory
+               $this->loadCoreConfig($config);
+
+               // In case of install mode, add the found basepath (because there isn't a basepath set yet
+               if (!$raw && empty($config->get('system', 'basepath'))) {
+                       // Setting at least the basepath we know
+                       $config->set('system', 'basepath', $this->baseDir);
+               }
+       }
+
+       /**
+        * Tries to load the static core-configuration and returns the config array.
+        *
+        * @param string $name The name of the configuration
+        *
+        * @return array The config array (empty if no config found)
+        *
+        * @throws Exception if the configuration file isn't readable
+        */
+       private function loadStaticConfig($name)
+       {
+               $configName = $this->staticDir . DIRECTORY_SEPARATOR . $name . '.config.php';
+               $iniName    = $this->staticDir . DIRECTORY_SEPARATOR . $name . '.ini.php';
+
+               if (file_exists($configName)) {
+                       return $this->loadConfigFile($configName);
+               } elseif (file_exists($iniName)) {
+                       return $this->loadINIConfigFile($iniName);
+               } else {
+                       return [];
+               }
+       }
+
+       /**
+        * Tries to load the specified core-configuration into the config cache.
+        *
+        * @param ConfigCache $config The Config cache
+        *
+        * @return array The config array (empty if no config found)
+        *
+        * @throws Exception if the configuration file isn't readable
+        */
+       private function loadCoreConfig(ConfigCache $config)
+       {
+               // try to load legacy ini-files first
+               foreach ($this->getConfigFiles(true) as $configFile) {
+                       $config->load($this->loadINIConfigFile($configFile), true);
+               }
+
+               // try to load supported config at last to overwrite it
+               foreach ($this->getConfigFiles() as $configFile) {
+                       $config->load($this->loadConfigFile($configFile), true);
+               }
+
+               return [];
+       }
+
+       /**
+        * Tries to load the specified addon-configuration and returns the config array.
+        *
+        * @param string $name The name of the configuration
+        *
+        * @return array The config array (empty if no config found)
+        *
+        * @throws Exception if the configuration file isn't readable
+        */
+       public function loadAddonConfig($name)
+       {
+               $filepath = $this->baseDir . DIRECTORY_SEPARATOR .   // /var/www/html/
+                           Addon::DIRECTORY . DIRECTORY_SEPARATOR . // addon/
+                           $name . DIRECTORY_SEPARATOR .            // openstreetmap/
+                           self::CONFIG_DIR . DIRECTORY_SEPARATOR . // config/
+                           $name . ".config.php";                   // openstreetmap.config.php
+
+               if (file_exists($filepath)) {
+                       return $this->loadConfigFile($filepath);
+               } else {
+                       return [];
+               }
+       }
+
+       /**
+        * Get the config files of the config-directory
+        *
+        * @param bool $ini True, if scan for ini-files instead of config files
+        *
+        * @return array
+        */
+       private function getConfigFiles(bool $ini = false)
+       {
+               $files = scandir($this->configDir);
+               $found = array();
+
+               $filePattern = ($ini ? '*.ini.php' : '*.config.php');
+
+               // Don't load sample files
+               $sampleEnd = self::SAMPLE_END . ($ini ? '.ini.php' : '.config.php');
+
+               foreach ($files as $filename) {
+                       if (fnmatch($filePattern, $filename) && substr_compare($filename, $sampleEnd, -strlen($sampleEnd))) {
+                               $found[] = $this->configDir . '/' . $filename;
+                       }
+               }
+
+               return $found;
+       }
+
+       /**
+        * Tries to load the legacy config files (.htconfig.php, .htpreconfig.php) and returns the config array.
+        *
+        * @param string $name The name of the config file (default is empty, which means .htconfig.php)
+        *
+        * @return array The configuration array (empty if no config found)
+        *
+        * @deprecated since version 2018.09
+        */
+       private function loadLegacyConfig($name = '')
+       {
+               $name     = !empty($name) ? $name : self::CONFIG_HTCONFIG;
+               $fullName = $this->baseDir . DIRECTORY_SEPARATOR . '.' . $name . '.php';
+
+               $config = [];
+               if (file_exists($fullName)) {
+                       $a         = new \stdClass();
+                       $a->config = [];
+                       include $fullName;
+
+                       $htConfigCategories = array_keys($a->config);
+
+                       // map the legacy configuration structure to the current structure
+                       foreach ($htConfigCategories as $htConfigCategory) {
+                               if (is_array($a->config[$htConfigCategory])) {
+                                       $keys = array_keys($a->config[$htConfigCategory]);
+
+                                       foreach ($keys as $key) {
+                                               $config[$htConfigCategory][$key] = $a->config[$htConfigCategory][$key];
+                                       }
+                               } else {
+                                       $config['config'][$htConfigCategory] = $a->config[$htConfigCategory];
+                               }
+                       }
+
+                       unset($a);
+
+                       if (isset($db_host)) {
+                               $config['database']['hostname'] = $db_host;
+                               unset($db_host);
+                       }
+                       if (isset($db_user)) {
+                               $config['database']['username'] = $db_user;
+                               unset($db_user);
+                       }
+                       if (isset($db_pass)) {
+                               $config['database']['password'] = $db_pass;
+                               unset($db_pass);
+                       }
+                       if (isset($db_data)) {
+                               $config['database']['database'] = $db_data;
+                               unset($db_data);
+                       }
+                       if (isset($config['system']['db_charset'])) {
+                               $config['database']['charset'] = $config['system']['db_charset'];
+                       }
+                       if (isset($pidfile)) {
+                               $config['system']['pidfile'] = $pidfile;
+                               unset($pidfile);
+                       }
+                       if (isset($default_timezone)) {
+                               $config['system']['default_timezone'] = $default_timezone;
+                               unset($default_timezone);
+                       }
+                       if (isset($lang)) {
+                               $config['system']['language'] = $lang;
+                               unset($lang);
+                       }
+               }
+
+               return $config;
+       }
+
+       /**
+        * Tries to load the specified legacy configuration file and returns the config array.
+        *
+        * @param string $filepath
+        *
+        * @return array The configuration array
+        * @throws Exception
+        * @deprecated since version 2018.12
+        */
+       private function loadINIConfigFile($filepath)
+       {
+               $contents = include($filepath);
+
+               $config = parse_ini_string($contents, true, INI_SCANNER_TYPED);
+
+               if ($config === false) {
+                       throw new Exception('Error parsing INI config file ' . $filepath);
+               }
+
+               return $config;
+       }
+
+       /**
+        * Tries to load the specified configuration file and returns the config array.
+        *
+        * The config format is PHP array and the template for configuration files is the following:
+        *
+        * <?php return [
+        *      'section' => [
+        *          'key' => 'value',
+        *      ],
+        * ];
+        *
+        * @param string $filepath The filepath of the
+        *
+        * @return array The config array0
+        *
+        * @throws Exception if the config cannot get loaded.
+        */
+       private function loadConfigFile($filepath)
+       {
+               $config = include($filepath);
+
+               if (!is_array($config)) {
+                       throw new Exception('Error loading config file ' . $filepath);
+               }
+
+               return $config;
+       }
+}
index d341682e806d04419743f9d5f698b87d375f395e..46452f6e4e156132bbf68e9bd2044d0265cc8800 100644 (file)
@@ -228,7 +228,7 @@ class ExAuth
                        $aUser = DBA::selectFirst('user', ['uid', 'password', 'legacy_password'], ['nickname' => $sUser]);
                        if (DBA::isResult($aUser)) {
                                $uid = $aUser['uid'];
-                               $success = User::authenticate($aUser, $aCommand[3]);
+                               $success = User::authenticate($aUser, $aCommand[3], true);
                                $Error = $success === false;
                        } else {
                                $this->writeLog(LOG_WARNING, 'user not found: ' . $sUser);
index be7f82a9f4f4207e761247ef6ee2196fc5a2adfe..04edecc699ca19fbcb136756f995755f4672da50 100644 (file)
@@ -31,13 +31,23 @@ class WorkerLogger implements LoggerInterface
         * @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)
+       public function __construct(LoggerInterface $logger, $functionName = '', $idLength = 7)
        {
                $this->logger = $logger;
                $this->functionName = $functionName;
                $this->workerId = Strings::getRandomHex($idLength);
        }
 
+       /**
+        * Sets the function name for additional logging
+        *
+        * @param string $functionName
+        */
+       public function setFunctionName(string $functionName)
+       {
+               $this->functionName = $functionName;
+       }
+
        /**
         * Adds the worker context for each log entry
         *
index 92265e30e6116a8721d8f2b1f4d9db3524e1439f..cd66abe0b2864b019341bd15139fc3dd68f198d4 100644 (file)
@@ -342,6 +342,16 @@ class Network
                return $curlResponse;
        }
 
+       /**
+        * Return raw post data from a post request
+        *
+        * @return string post data
+        */
+       public static function postdata()
+       {
+               return file_get_contents('php://input');
+       }
+
        /**
         * @brief Check URL to see if it's real
         *
@@ -472,7 +482,7 @@ class Network
                }
 
                foreach ($domain_blocklist as $domain_block) {
-                       if (strcasecmp($domain_block['domain'], $host) === 0) {
+                       if (fnmatch(strtolower($domain_block['domain']), strtolower($host))) {
                                return true;
                        }
                }
index fe72efce40beec2e623598e3c6efd35c050d3f54..dc140469c671e945e42408a1b41ff5bd67fd14f9 100644 (file)
@@ -2,6 +2,8 @@
 
 namespace Friendica\Util;
 
+use Friendica\Core\Config\Cache\ConfigCache;
+use Friendica\Core\Config\Configuration;
 use Psr\Container\ContainerExceptionInterface;
 use Psr\Container\ContainerInterface;
 use Psr\Container\NotFoundExceptionInterface;
@@ -45,23 +47,21 @@ class Profiler implements ContainerInterface
        /**
         * Updates the enabling of the current profiler
         *
-        * @param bool $enabled
-        * @param bool $renderTime
+        * @param Configuration $config
         */
-       public function update($enabled = false, $renderTime = false)
+       public function update(Configuration $config)
        {
-               $this->enabled = $enabled;
-               $this->rendertime = $renderTime;
+               $this->enabled = $config->get('system', 'profiler');
+               $this->rendertime = $config->get('rendertime', 'callstack');
        }
 
        /**
-        * @param bool $enabled           True, if the Profiler is enabled
-        * @param bool $renderTime        True, if the Profiler should measure the whole rendertime including functions
+        * @param ConfigCache $configCache The configuration cache
         */
-       public function __construct($enabled = false, $renderTime = false)
+       public function __construct(ConfigCache $configCache)
        {
-               $this->enabled = $enabled;
-               $this->rendertime = $renderTime;
+               $this->enabled = $configCache->get('system', 'profiler');
+               $this->rendertime = $configCache->get('rendertime', 'callstack');
                $this->reset();
        }
 
index fcd4a76725f65dd4881a3f956fb14bf9da653b13..625ed5f2cb42f7c48d4277ef126b6625ec949aa4 100644 (file)
@@ -49,7 +49,7 @@ class APDelivery extends BaseObject
                        if (!empty($data)) {
                                $success = HTTPSignature::transmit($data, $inbox, $uid);
                                if ($success && in_array($cmd, [Delivery::POST])) {
-                                       ItemDeliveryData::incrementQueueDone($target_id);
+                                       ItemDeliveryData::incrementQueueDone($target_id, ItemDeliveryData::ACTIVITYPUB);
                                }
                        }
                }
index f7377a6e7199f4eba5995015bbffdac4be4bb974..0db70f5a8dddc801b86eafe9a6451979ce92eeeb 100644 (file)
@@ -17,16 +17,10 @@ use Friendica\Util\DateTimeFormat;
 
 class Cron
 {
-       public static function execute($parameter = '', $generation = 0)
+       public static function execute()
        {
                $a = BaseObject::getApp();
 
-               // Poll contacts with specific parameters
-               if (!empty($parameter)) {
-                       self::pollContacts($parameter, $generation);
-                       return;
-               }
-
                $last = Config::get('system', 'last_cron');
 
                $poll_interval = intval(Config::get('system', 'cron_interval'));
@@ -115,7 +109,10 @@ class Cron
                }
 
                // Poll contacts
-               self::pollContacts($parameter, $generation);
+               self::pollContacts();
+
+               // Update contact information
+               self::updatePublicContacts();
 
                Logger::log('cron: end');
 
@@ -125,98 +122,76 @@ class Cron
        }
 
        /**
-        * @brief Poll contacts for unreceived messages
-        *
-        * @todo  Currently it seems as if the following parameter aren't used at all ...
-        *
-        * @param string  $parameter Parameter (force, restart, ...) for the contact polling
-        * @param integer $generation
+        * @brief Update public contacts
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       private static function pollContacts($parameter, $generation) {
-               $manual_id  = 0;
-               $generation = 0;
-               $force      = false;
-
-               if ($parameter == 'force') {
-                       $force = true;
-               }
-               if ($parameter == 'restart') {
-                       $generation = intval($generation);
-                       if (!$generation) {
-                               exit();
+       private static function updatePublicContacts() {
+               $count = 0;
+               $last_updated = DateTimeFormat::utc('now - 1 week');
+               $condition = ["`network` IN (?, ?, ?, ?) AND `uid` = ? AND NOT `self` AND `last-update` < ?",
+                       Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS, 0, $last_updated];
+
+               $total = DBA::count('contact', $condition);
+               $oldest_date = '';
+               $oldest_id = '';
+               $contacts = DBA::select('contact', ['id', 'last-update'], $condition, ['limit' => 100, 'order' => ['last-update']]);
+               while ($contact = DBA::fetch($contacts)) {
+                       if (empty($oldest_id)) {
+                               $oldest_id = $contact['id'];
+                               $oldest_date = $contact['last-update'];
                        }
+                       Worker::add(PRIORITY_LOW, "UpdateContact", $contact['id'], 'force');
+                       ++$count;
                }
+               Logger::info('Initiated update for public contacts', ['interval' => $count, 'total' => $total, 'id' => $oldest_id, 'oldest' => $oldest_date]);
+               DBA::close($contacts);
+       }
 
-               if (intval($parameter)) {
-                       $manual_id = intval($parameter);
-                       $force     = true;
-               }
-
+       /**
+        * @brief Poll contacts for unreceived messages
+        *
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        */
+       private static function pollContacts() {
                $min_poll_interval = Config::get('system', 'min_poll_interval', 1);
 
-               $sql_extra = (($manual_id) ? " AND `id` = $manual_id " : "");
-
                Addon::reload();
 
+               $sql = "SELECT `contact`.`id`, `contact`.`nick`, `contact`.`name`, `contact`.`network`, `contact`.`archive`,
+                                       `contact`.`last-update`, `contact`.`priority`, `contact`.`rel`, `contact`.`subhub`
+                               FROM `user`
+                               STRAIGHT_JOIN `contact`
+                               ON `contact`.`uid` = `user`.`uid` AND `contact`.`poll` != ''
+                                       AND `contact`.`network` IN (?, ?, ?, ?)
+                                       AND NOT `contact`.`self` AND NOT `contact`.`blocked`
+                                       AND `contact`.`rel` != ?
+                               WHERE NOT `user`.`account_expired` AND NOT `user`.`account_removed`";
+
+               $parameters = [Protocol::DFRN, Protocol::OSTATUS, Protocol::FEED, Protocol::MAIL, Contact::FOLLOWER];
+
                // Only poll from those with suitable relationships,
                // and which have a polling address and ignore Diaspora since
                // we are unable to match those posts with a Diaspora GUID and prevent duplicates.
-
                $abandon_days = intval(Config::get('system', 'account_abandon_days'));
                if ($abandon_days < 1) {
                        $abandon_days = 0;
                }
-               $abandon_sql = (($abandon_days)
-                       ? sprintf(" AND `user`.`login_date` > UTC_TIMESTAMP() - INTERVAL %d DAY ", intval($abandon_days))
-                       : ''
-               );
 
-               $contacts = q("SELECT `contact`.`id`, `contact`.`nick`, `contact`.`name`, `contact`.`network`, `contact`.`archive`,
-                                       `contact`.`last-update`, `contact`.`priority`, `contact`.`rel`, `contact`.`subhub`
-                               FROM `user`
-                               STRAIGHT_JOIN `contact`
-                               ON `contact`.`uid` = `user`.`uid` AND `contact`.`poll` != ''
-                                       AND `contact`.`network` IN ('%s', '%s', '%s', '%s', '%s', '%s') $sql_extra
-                                       AND NOT `contact`.`self` AND NOT `contact`.`blocked`
-                               WHERE NOT `user`.`account_expired` AND NOT `user`.`account_removed` $abandon_sql",
-                       DBA::escape(Protocol::ACTIVITYPUB),
-                       DBA::escape(Protocol::DFRN),
-                       DBA::escape(Protocol::OSTATUS),
-                       DBA::escape(Protocol::DIASPORA),
-                       DBA::escape(Protocol::FEED),
-                       DBA::escape(Protocol::MAIL)
-               );
+               if (!empty($abandon_days)) {
+                       $sql .= " AND `user`.`login_date` > UTC_TIMESTAMP() - INTERVAL ? DAY";
+                       $parameters[] = $abandon_days;
+               }
+
+               $contacts = DBA::p($sql, $parameters);
 
                if (!DBA::isResult($contacts)) {
                        return;
                }
 
-               foreach ($contacts as $contact) {
-
-                       if ($manual_id) {
-                               $contact['last-update'] = DBA::NULL_DATETIME;
-                       }
-
+               while ($contact = DBA::fetch($contacts)) {
                        // Friendica and OStatus are checked once a day
                        if (in_array($contact['network'], [Protocol::DFRN, Protocol::OSTATUS])) {
-                               $contact['priority'] = 2;
-                       }
-
-                       if ($contact['subhub'] && in_array($contact['network'], [Protocol::DFRN, Protocol::OSTATUS])) {
-                               /*
-                                * We should be getting everything via a hub. But just to be sure, let's check once a day.
-                                * (You can make this more or less frequent if desired by setting 'pushpoll_frequency' appropriately)
-                                * This also lets us update our subscription to the hub, and add or replace hubs in case it
-                                * changed. We will only update hubs once a day, regardless of 'pushpoll_frequency'.
-                                */
-                               $poll_interval = Config::get('system', 'pushpoll_frequency');
-                               $contact['priority'] = (!is_null($poll_interval) ? intval($poll_interval) : 3);
-                       }
-
-                       // Check ActivityPub and Diaspora contacts or followers once a week
-                       if (in_array($contact["network"], [Protocol::ACTIVITYPUB, Protocol::DIASPORA]) || ($contact["rel"] == Contact::FOLLOWER)) {
-                               $contact['priority'] = 4;
+                               $contact['priority'] = 3;
                        }
 
                        // Check archived contacts once a month
@@ -224,7 +199,7 @@ class Cron
                                $contact['priority'] = 5;
                        }
 
-                       if (($contact['priority'] >= 0) && !$force) {
+                       if ($contact['priority'] >= 0) {
                                $update = false;
 
                                $t = $contact['last-update'];
@@ -260,7 +235,7 @@ class Cron
                                                break;
                                        case 0:
                                        default:
-                                               if (DateTimeFormat::utcNow() > DateTimeFormat::utc($t . " + ".$min_poll_interval." minute")) {
+                                               if (DateTimeFormat::utcNow() > DateTimeFormat::utc($t . " + " . $min_poll_interval . " minute")) {
                                                        $update = true;
                                                }
                                                break;
@@ -282,5 +257,6 @@ class Cron
 
                        Worker::add(['priority' => $priority, 'dont_fork' => true, 'force_priority' => true], 'OnePoll', (int)$contact['id']);
                }
+               DBA::close($contacts);
        }
 }
index 97a0968510c5cf945cfd1d3f8915a5e90d7c86dc..ab3e3a6e0bdc3023bbd66833bea917bfdd6e9ef5 100644 (file)
@@ -185,19 +185,6 @@ class Delivery extends BaseObject
                                self::deliverDiaspora($cmd, $contact, $owner, $items, $target_item, $public_message, $top_level, $followup);
                                break;
 
-                       case Protocol::OSTATUS:
-                               // Do not send to otatus if we are not configured to send to public networks
-                               if ($owner['prvnets']) {
-                                       break;
-                               }
-                               if (Config::get('system','ostatus_disabled') || Config::get('system','dfrn_only')) {
-                                       break;
-                               }
-
-                               // There is currently no code here to distribute anything to OStatus.
-                               // This is done in "notifier.php" (See "url_recipients" and "push_notify")
-                               break;
-
                        case Protocol::MAIL:
                                self::deliverMail($cmd, $contact, $owner, $target_item);
                                break;
@@ -286,12 +273,14 @@ class Delivery extends BaseObject
                        DFRN::import($atom, $target_importer);
 
                        if (in_array($cmd, [Delivery::POST, Delivery::POKE])) {
-                               Model\ItemDeliveryData::incrementQueueDone($target_item['id']);
+                               Model\ItemDeliveryData::incrementQueueDone($target_item['id'], Model\ItemDeliveryData::DFRN);
                        }
 
                        return;
                }
 
+               $protocol = Model\ItemDeliveryData::DFRN;
+
                // We don't have a relationship with contacts on a public post.
                // Se we transmit with the new method and via Diaspora as a fallback
                if (!empty($items) && (($items[0]['uid'] == 0) || ($contact['uid'] == 0))) {
@@ -312,9 +301,16 @@ class Delivery extends BaseObject
                                return;
                        }
                } elseif ($cmd != self::RELOCATION) {
-                       $deliver_status = DFRN::deliver($owner, $contact, $atom);
+                       // DFRN payload over Diaspora transport layer
+                       $deliver_status = DFRN::transmit($owner, $contact, $atom);
+                       if ($deliver_status < 200) {
+                               // Legacy DFRN
+                               $deliver_status = DFRN::deliver($owner, $contact, $atom);
+                               $protocol = Model\ItemDeliveryData::LEGACY_DFRN;
+                       }
                } else {
-                       $deliver_status = DFRN::deliver($owner, $contact, $atom, false, true);
+                       $deliver_status = DFRN::deliver($owner, $contact, $atom);
+                       $protocol = Model\ItemDeliveryData::LEGACY_DFRN;
                }
 
                Logger::info('DFRN Delivery', ['cmd' => $cmd, 'url' => $contact['url'], 'guid' => defaults($target_item, 'guid', $target_item['id']), 'return' => $deliver_status]);
@@ -324,7 +320,7 @@ class Delivery extends BaseObject
                        Model\Contact::unmarkForArchival($contact);
 
                        if (in_array($cmd, [Delivery::POST, Delivery::POKE])) {
-                               Model\ItemDeliveryData::incrementQueueDone($target_item['id']);
+                               Model\ItemDeliveryData::incrementQueueDone($target_item['id'], $protocol);
                        }
                } else {
                        // The message could not be delivered. We mark the contact as "dead"
@@ -365,6 +361,7 @@ class Delivery extends BaseObject
                if (Config::get('system', 'dfrn_only') || !Config::get('system', 'diaspora_enabled')) {
                        return;
                }
+
                if ($cmd == self::MAIL) {
                        Diaspora::sendMail($target_item, $owner, $contact);
                        return;
@@ -373,6 +370,7 @@ class Delivery extends BaseObject
                if ($cmd == self::SUGGESTION) {
                        return;
                }
+
                if (!$contact['pubkey'] && !$public_message) {
                        return;
                }
@@ -405,7 +403,7 @@ class Delivery extends BaseObject
                        Model\Contact::unmarkForArchival($contact);
 
                        if (in_array($cmd, [Delivery::POST, Delivery::POKE])) {
-                               Model\ItemDeliveryData::incrementQueueDone($target_item['id']);
+                               Model\ItemDeliveryData::incrementQueueDone($target_item['id'], Model\ItemDeliveryData::DIASPORA);
                        }
                } else {
                        // The message could not be delivered. We mark the contact as "dead"
@@ -416,7 +414,7 @@ class Delivery extends BaseObject
                                // defer message for redelivery
                                Worker::defer();
                        } elseif (in_array($cmd, [Delivery::POST, Delivery::POKE])) {
-                               Model\ItemDeliveryData::incrementQueueDone($target_item['id']);
+                               Model\ItemDeliveryData::incrementQueueDone($target_item['id'], Model\ItemDeliveryData::DIASPORA);
                        }
                }
        }
index 36c6e92a04d9a20ff7dd4cc589f365c7d9b8e621..4efd3e912622fd4e590afc0ebca29ee8af54af4d 100644 (file)
@@ -149,12 +149,19 @@ class Notifier
                                $delivery_queue_count += self::activityPubDelivery($cmd, $target_item, $parent, $a->queue['priority'], $a->queue['created'], $owner);
                        }
 
-                       $fields = ['network', 'author-id', 'owner-id'];
+                       $fields = ['network', 'author-id', 'author-link', 'owner-id'];
                        $condition = ['uri' => $target_item["thr-parent"], 'uid' => $target_item["uid"]];
                        $thr_parent = Item::selectFirst($fields, $condition);
 
                        Logger::log('GUID: ' . $target_item["guid"] . ': Parent is ' . $parent['network'] . '. Thread parent is ' . $thr_parent['network'], Logger::DEBUG);
 
+                       // Only deliver threaded replies (comment to a comment) to Diaspora
+                       // when the original comment author does support the Diaspora protocol.
+                       if ($target_item['parent-uri'] != $target_item['thr-parent']) {
+                               $diaspora_delivery = Diaspora::isSupportedByContactUrl($thr_parent['author-link']);
+                               Logger::info('Threaded comment', ['diaspora_delivery' => (int)$diaspora_delivery]);
+                       }
+
                        // This is IMPORTANT!!!!
 
                        // We will only send a "notify owner to relay" or followup message if the referenced post
@@ -264,9 +271,9 @@ class Notifier
                                }
 
                                $allow_people = expand_acl($parent['allow_cid']);
-                               $allow_groups = Group::expand(expand_acl($parent['allow_gid']),true);
+                               $allow_groups = Group::expand($uid, expand_acl($parent['allow_gid']),true);
                                $deny_people  = expand_acl($parent['deny_cid']);
-                               $deny_groups  = Group::expand(expand_acl($parent['deny_gid']));
+                               $deny_groups  = Group::expand($uid, expand_acl($parent['deny_gid']));
 
                                // if our parent is a public forum (forum_mode == 1), uplink to the origional author causing
                                // a delivery fork. private groups (forum_mode == 2) do not uplink
@@ -349,9 +356,11 @@ class Notifier
                                }
 
                                // It only makes sense to distribute answers to OStatus messages to Friendica and OStatus - but not Diaspora
-                               $networks = [Protocol::OSTATUS, Protocol::DFRN];
+                               $networks = [Protocol::DFRN];
+                       } elseif ($diaspora_delivery) {
+                               $networks = [Protocol::DFRN, Protocol::DIASPORA, Protocol::MAIL];
                        } else {
-                               $networks = [Protocol::OSTATUS, Protocol::DFRN, Protocol::DIASPORA, Protocol::MAIL];
+                               $networks = [Protocol::DFRN, Protocol::MAIL];
                        }
                } else {
                        $public_message = false;
@@ -425,14 +434,8 @@ class Notifier
                                                continue;
                                        }
 
-                                       if (in_array($rr['network'], [Protocol::DFRN, Protocol::DIASPORA]) && ($rr['protocol'] == Protocol::ACTIVITYPUB) &&
-                                               !in_array($cmd, [Delivery::SUGGESTION, Delivery::REMOVAL, Delivery::RELOCATION, Delivery::POKE])) {
-                                               Logger::info('Contact is Friendica AP, so skipping delivery via legacy DFRN', ['url' => $rr['url']]);
-                                               continue;
-                                       }
-
-                                       if (Config::get('debug', 'total_ap_delivery') && !empty($rr['url']) && ($rr['network'] == Protocol::DFRN) && !empty(APContact::getByURL($rr['url'], false))) {
-                                               Logger::log('Skipping contact ' . $rr['url'] . ' since it will be delivered via AP', Logger::DEBUG);
+                                       if (self::skipDFRN($rr, $target_item, $cmd)) {
+                                               Logger::info('Contact can be delivered via AP, so skip delivery via legacy DFRN', ['url' => $rr['url']]);
                                                continue;
                                        }
 
@@ -465,14 +468,8 @@ class Notifier
                                continue;
                        }
 
-                       if (in_array($contact['network'], [Protocol::DFRN, Protocol::DIASPORA]) && ($contact['protocol'] == Protocol::ACTIVITYPUB) &&
-                               !in_array($cmd, [Delivery::SUGGESTION, Delivery::REMOVAL, Delivery::RELOCATION, Delivery::POKE])) {
-                               Logger::info('Contact is Friendica AP, so skipping delivery via legacy DFRN', ['url' => $contact['url']]);
-                               continue;
-                       }
-
-                       if (Config::get('debug', 'total_ap_delivery') && ($contact['network'] == Protocol::DFRN) && !empty(APContact::getByURL($contact['url'], false))) {
-                               Logger::log('Skipping contact ' . $contact['url'] . ' since it will be delivered via AP', Logger::DEBUG);
+                       if (self::skipDFRN($contact, $target_item, $cmd)) {
+                               Logger::info('Contact can be delivered via AP, so skip delivery via legacy DFRN', ['url' => $contact['url']]);
                                continue;
                        }
 
@@ -514,7 +511,7 @@ class Notifier
                                Logger::log('Salmon delivery of item ' . $target_id . ' to ' . $url);
                                /// @TODO Redeliver/queue these items on failure, though there is no contact record
                                Salmon::slapper($owner, $url, $slap);
-                               ItemDeliveryData::incrementQueueDone($target_id);
+                               ItemDeliveryData::incrementQueueDone($target_id, ItemDeliveryData::OSTATUS);
                        }
                }
 
@@ -547,6 +544,37 @@ class Notifier
                return;
        }
 
+       /**
+        * Checks if the current delivery process needs to be transported via DFRN.
+        *
+        * @param array  $contact Receiver of the post
+        * @param array  $item    The post
+        * @param string $cmd     Notifier command
+        * @return bool
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws \ImagickException
+        */
+       private static function skipDFRN($contact, $item, $cmd)
+       {
+               // Don't skip when author or owner don't have AP profiles
+               if ((!empty($item['author-link']) && empty(APContact::getByURL($item['author-link'], false))) || (!empty($item['owner-link']) && empty(APContact::getByURL($item['owner-link'], false)))) {
+                       return false;
+               }
+
+               // Don't skip DFRN delivery for these commands
+               if (in_array($cmd, [Delivery::SUGGESTION, Delivery::REMOVAL, Delivery::RELOCATION, Delivery::POKE])) {
+                       return false;
+               }
+
+               // Skip DFRN when the item will be (forcefully) delivered via AP
+               if (Config::get('debug', 'total_ap_delivery') && ($contact['network'] == Protocol::DFRN) && !empty(APContact::getByURL($contact['url'], false))) {
+                       return true;
+               }
+
+               // Skip DFRN delivery if the contact speaks ActivityPub
+               return in_array($contact['network'], [Protocol::DFRN, Protocol::DIASPORA]) && ($contact['protocol'] == Protocol::ACTIVITYPUB);
+       }
+
        /**
         * Checks if the current action is a deletion command of a account removal activity
         * For Diaspora and ActivityPub we don't need to send single item deletion calls.
index a605ee92ed593b4bde77e8b3b4a68da4eccfcd36..9af4be9bed32185f964962adb43956151daf1ea3 100644 (file)
@@ -11,9 +11,9 @@ use Friendica\Core\Logger;
 use Friendica\Core\PConfig;
 use Friendica\Core\Protocol;
 use Friendica\Database\DBA;
-use Friendica\Model\APContact;
 use Friendica\Model\Contact;
 use Friendica\Model\Item;
+use Friendica\Model\User;
 use Friendica\Protocol\ActivityPub;
 use Friendica\Protocol\Email;
 use Friendica\Protocol\PortableContact;
@@ -26,11 +26,9 @@ class OnePoll
 {
        public static function execute($contact_id = 0, $command = '')
        {
-               $a = BaseObject::getApp();
-
                Logger::log('Start for contact ' . $contact_id);
 
-               $force      = false;
+               $force = false;
 
                if ($command == "force") {
                        $force = true;
@@ -41,6 +39,9 @@ class OnePoll
                        return;
                }
 
+               if ($force) {
+                       Contact::updateFromProbe($contact_id, true);
+               }
 
                $contact = DBA::selectFirst('contact', [], ['id' => $contact_id]);
                if (!DBA::isResult($contact)) {
@@ -56,99 +57,29 @@ class OnePoll
 
                $importer_uid = $contact['uid'];
 
-               // Possibly switch the remote contact to AP
-               if ($protocol === Protocol::OSTATUS) {
-                       ActivityPub\Receiver::switchContact($contact['id'], $importer_uid, $contact['url']);
-                       $contact = DBA::selectFirst('contact', [], ['id' => $contact_id]);
-               }
-
                $updated = DateTimeFormat::utcNow();
 
-               // These three networks can be able to speak AP, so we are trying to fetch AP profile data here
-               if (in_array($protocol, [Protocol::ACTIVITYPUB, Protocol::DIASPORA, Protocol::DFRN])) {
-                       $apcontact = APContact::getByURL($contact['url'], true);
-
-                       if (($protocol === Protocol::ACTIVITYPUB) && empty($apcontact)) {
-                               self::updateContact($contact, ['last-update' => $updated, 'failure_update' => $updated]);
-                               Contact::markForArchival($contact);
-                               Logger::log('Contact archived');
-                               return;
-                       } elseif (!empty($apcontact)) {
-                               $fields = ['last-update' => $updated, 'success_update' => $updated];
-                               self::updateContact($contact, $fields);
-                               Contact::unmarkForArchival($contact);
-                       }
-               }
-
-               // Diaspora users, archived users and followers are only checked if they still exist.
-               if (($protocol != Protocol::ACTIVITYPUB) && ($contact['archive'] || ($contact["network"] == Protocol::DIASPORA) || ($contact["rel"] == Contact::FOLLOWER))) {
-                       $last_updated = PortableContact::lastUpdated($contact["url"], true);
-
-                       if ($last_updated) {
-                               Logger::log('Contact '.$contact['id'].' had last update on '.$last_updated, Logger::DEBUG);
-
-                               // The last public item can be older than the last item we got
-                               if ($last_updated < $contact['last-item']) {
-                                       $last_updated = $contact['last-item'];
-                               }
+               if ($importer_uid == 0) {
+                       Logger::log('Ignore public contacts');
 
-                               $fields = ['last-item' => DateTimeFormat::utc($last_updated), 'last-update' => $updated, 'success_update' => $updated];
-                               self::updateContact($contact, $fields);
-                               Contact::unmarkForArchival($contact);
-                       } else {
-                               self::updateContact($contact, ['last-update' => $updated, 'failure_update' => $updated]);
-                               Contact::markForArchival($contact);
-                               Logger::log('Contact archived');
-                               return;
-                       }
+                       // set the last-update so we don't keep polling
+                       DBA::update('contact', ['last-update' => $updated], ['id' => $contact['id']]);
+                       return;
                }
 
-               // Update the contact entry
-               if (in_array($protocol, [Protocol::ACTIVITYPUB, Protocol::OSTATUS, Protocol::DIASPORA, Protocol::DFRN])) {
-                       // Currently we can't check every AP implementation, so we don't do it at all
-                       if (($protocol != Protocol::ACTIVITYPUB) && !PortableContact::reachable($contact['url'])) {
-                               Logger::log("Skipping probably dead contact ".$contact['url']);
-
-                               // set the last-update so we don't keep polling
-                               self::updateContact($contact, ['last-update' => $updated]);
-                               return;
-                       }
-
-                       if (!Contact::updateFromProbe($contact["id"])) {
-                               // set the last-update so we don't keep polling
-                               self::updateContact($contact, ['last-update' => $updated]);
-                               Contact::markForArchival($contact);
-                               Logger::log('Contact archived');
-                               return;
-                       } else {
-                               $fields = ['last-update' => $updated, 'success_update' => $updated];
-                               self::updateContact($contact, $fields);
-                               Contact::unmarkForArchival($contact);
-                       }
+               // Possibly switch the remote contact to AP
+               if ($protocol === Protocol::OSTATUS) {
+                       ActivityPub\Receiver::switchContact($contact['id'], $importer_uid, $contact['url']);
+                       $contact = DBA::selectFirst('contact', [], ['id' => $contact_id]);
                }
 
                // load current friends if possible.
                if (!empty($contact['poco']) && ($contact['success_update'] > $contact['failure_update'])) {
-                       $r = q("SELECT count(*) AS total FROM glink
-                               WHERE `cid` = %d AND updated > UTC_TIMESTAMP() - INTERVAL 1 DAY",
-                               intval($contact['id'])
-                       );
-                       if (DBA::isResult($r)) {
-                               if (!$r[0]['total']) {
-                                       PortableContact::loadWorker($contact['id'], $importer_uid, 0, $contact['poco']);
-                               }
+                       if (!DBA::exists('glink', ["`cid` = ? AND updated > UTC_TIMESTAMP() - INTERVAL 1 DAY", $contact['id']])) {
+                               PortableContact::loadWorker($contact['id'], $importer_uid, 0, $contact['poco']);
                        }
                }
 
-               // We don't poll our followers
-               if ($contact["rel"] == Contact::FOLLOWER) {
-                       Logger::log("Don't poll follower");
-
-                       // set the last-update so we don't keep polling
-                       DBA::update('contact', ['last-update' => $updated], ['id' => $contact['id']]);
-                       return;
-               }
-
                // Don't poll if polling is deactivated (But we poll feeds and mails anyway)
                if (!in_array($protocol, [Protocol::FEED, Protocol::MAIL]) && Config::get('system', 'disable_polling')) {
                        Logger::log('Polling is disabled');
@@ -167,19 +98,9 @@ class OnePoll
                        return;
                }
 
-               if ($importer_uid == 0) {
-                       Logger::log('Ignore public contacts');
-
-                       // set the last-update so we don't keep polling
-                       DBA::update('contact', ['last-update' => $updated], ['id' => $contact['id']]);
-                       return;
-               }
-
-               $r = q("SELECT `contact`.*, `user`.`page-flags` FROM `contact` INNER JOIN `user` on `contact`.`uid` = `user`.`uid` WHERE `user`.`uid` = %d AND `contact`.`self` = 1 LIMIT 1",
-                       intval($importer_uid)
-               );
+               $importer = User::getOwnerDataById($importer_uid);
 
-               if (!DBA::isResult($r)) {
+               if (empty($importer)) {
                        Logger::log('No self contact for user '.$importer_uid);
 
                        // set the last-update so we don't keep polling
@@ -187,7 +108,6 @@ class OnePoll
                        return;
                }
 
-               $importer = $r[0];
                $url = '';
                $xml = false;
 
@@ -203,426 +123,21 @@ class OnePoll
                        $hub_update = false;
                }
 
-               $last_update = (($contact['last-update'] <= DBA::NULL_DATETIME)
-                       ? DateTimeFormat::utc('now - 7 days', DateTimeFormat::ATOM)
-                       : DateTimeFormat::utc($contact['last-update'], DateTimeFormat::ATOM)
-               );
-
                Logger::log("poll: ({$protocol}-{$contact['id']}) IMPORTER: {$importer['name']}, CONTACT: {$contact['name']}");
 
-               if ($protocol === Protocol::DFRN) {
-                       $idtosend = $orig_id = (($contact['dfrn-id']) ? $contact['dfrn-id'] : $contact['issued-id']);
-                       if (intval($contact['duplex']) && $contact['dfrn-id']) {
-                               $idtosend = '0:' . $orig_id;
-                       }
-                       if (intval($contact['duplex']) && $contact['issued-id']) {
-                               $idtosend = '1:' . $orig_id;
-                       }
-
-                       // they have permission to write to us. We already filtered this in the contact query.
-                       $perm = 'rw';
-
-                       // But this may be our first communication, so set the writable flag if it isn't set already.
-
-                       if (!intval($contact['writable'])) {
-                               $fields = ['writable' => true];
-                               DBA::update('contact', $fields, ['id' => $contact['id']]);
-                       }
-
-                       $url = $contact['poll'] . '?dfrn_id=' . $idtosend
-                               . '&dfrn_version=' . DFRN_PROTOCOL_VERSION
-                               . '&type=data&last_update=' . $last_update
-                               . '&perm=' . $perm;
-
-                       $curlResult = Network::curl($url);
-
-                       if (!$curlResult->isSuccess() && ($curlResult->getErrorNumber() == CURLE_OPERATION_TIMEDOUT)) {
-                               // set the last-update so we don't keep polling
-                               self::updateContact($contact, ['last-update' => $updated]);
-                               Contact::markForArchival($contact);
-                               Logger::log('Contact archived');
-                               return;
-                       }
-
-                       $handshake_xml = $curlResult->getBody();
-                       $html_code = $curlResult->getReturnCode();
-
-                       Logger::log('handshake with url ' . $url . ' returns xml: ' . $handshake_xml, Logger::DATA);
-
-                       if (!strlen($handshake_xml) || ($html_code >= 400) || !$html_code) {
-                               // dead connection - might be a transient event, or this might
-                               // mean the software was uninstalled or the domain expired.
-                               // Will keep trying for one month.
-                               Logger::log("$url appears to be dead - marking for death ");
-
-                               // set the last-update so we don't keep polling
-                               $fields = ['last-update' => $updated, 'failure_update' => $updated];
-                               self::updateContact($contact, $fields);
-                               Contact::markForArchival($contact);
-                               return;
-                       }
-
-                       if (!strstr($handshake_xml, '<')) {
-                               Logger::log('response from ' . $url . ' did not contain XML.');
-
-                               $fields = ['last-update' => $updated, 'failure_update' => $updated];
-                               self::updateContact($contact, $fields);
-                               Contact::markForArchival($contact);
-                               return;
-                       }
-
-
-                       $res = XML::parseString($handshake_xml);
-
-                       if (intval($res->status) == 1) {
-                               // we may not be friends anymore. Will keep trying for one month.
-                               Logger::log("$url replied status 1 - marking for death ");
-
-                               // set the last-update so we don't keep polling
-                               $fields = ['last-update' => $updated, 'failure_update' => $updated];
-                               self::updateContact($contact, $fields);
-                               Contact::markForArchival($contact);
-                       } elseif ($contact['term-date'] > DBA::NULL_DATETIME) {
-                               Contact::unmarkForArchival($contact);
-                       }
-
-                       if ((intval($res->status) != 0) || !strlen($res->challenge) || !strlen($res->dfrn_id)) {
-                               // set the last-update so we don't keep polling
-                               DBA::update('contact', ['last-update' => $updated], ['id' => $contact['id']]);
-                               Logger::log('Contact status is ' . $res->status);
-                               return;
-                       }
-
-                       if (((float)$res->dfrn_version > 2.21) && ($contact['poco'] == '')) {
-                               $fields = ['poco' => str_replace('/profile/', '/poco/', $contact['url'])];
-                               DBA::update('contact', $fields, ['id' => $contact['id']]);
-                       }
-
-                       $postvars = [];
-
-                       $sent_dfrn_id = hex2bin((string) $res->dfrn_id);
-                       $challenge    = hex2bin((string) $res->challenge);
-
-                       $final_dfrn_id = '';
-
-                       if ($contact['duplex'] && strlen($contact['prvkey'])) {
-                               openssl_private_decrypt($sent_dfrn_id, $final_dfrn_id, $contact['prvkey']);
-                               openssl_private_decrypt($challenge, $postvars['challenge'], $contact['prvkey']);
-                       } else {
-                               openssl_public_decrypt($sent_dfrn_id, $final_dfrn_id, $contact['pubkey']);
-                               openssl_public_decrypt($challenge, $postvars['challenge'], $contact['pubkey']);
-                       }
-
-                       $final_dfrn_id = substr($final_dfrn_id, 0, strpos($final_dfrn_id, '.'));
-
-                       if (strpos($final_dfrn_id, ':') == 1) {
-                               $final_dfrn_id = substr($final_dfrn_id, 2);
-                       }
-
-                       // There are issues with the legacy DFRN transport layer.
-                       // Since we mostly don't use it anyway, we won't dig into it deeper, but simply ignore it.
-                       if (empty($final_dfrn_id) || empty($orig_id)) {
-                               Logger::log('Contact has got no ID - quitting');
-                               return;
-                       }
-
-                       if ($final_dfrn_id != $orig_id) {
-                               // did not decode properly - cannot trust this site
-                               Logger::log('ID did not decode: ' . $contact['id'] . ' orig: ' . $orig_id . ' final: ' . $final_dfrn_id);
-
-                               // set the last-update so we don't keep polling
-                               DBA::update('contact', ['last-update' => $updated], ['id' => $contact['id']]);
-                               Contact::markForArchival($contact);
-                               return;
-                       }
-
-                       $postvars['dfrn_id'] = $idtosend;
-                       $postvars['dfrn_version'] = DFRN_PROTOCOL_VERSION;
-                       $postvars['perm'] = 'rw';
-
-                       $xml = Network::post($contact['poll'], $postvars)->getBody();
+               $xml = '';
 
+               if ($protocol === Protocol::DFRN) {
+                       $xml = self::pollDFRN($contact, $updated);
                } elseif (($protocol === Protocol::OSTATUS)
                        || ($protocol === Protocol::DIASPORA)
                        || ($protocol === Protocol::FEED)) {
-
-                       // Upgrading DB fields from an older Friendica version
-                       // Will only do this once per notify-enabled OStatus contact
-                       // or if relationship changes
-
-                       $stat_writeable = ((($contact['notify']) && ($contact['rel'] == Contact::FOLLOWER || $contact['rel'] == Contact::FRIEND)) ? 1 : 0);
-
-                       // Contacts from OStatus are always writable
-                       if ($protocol === Protocol::OSTATUS) {
-                               $stat_writeable = 1;
-                       }
-
-                       if ($stat_writeable != $contact['writable']) {
-                               $fields = ['writable' => $stat_writeable];
-                               DBA::update('contact', $fields, ['id' => $contact['id']]);
-                       }
-
-                       // Are we allowed to import from this person?
-                       if ($contact['rel'] == Contact::FOLLOWER || $contact['blocked']) {
-                               // set the last-update so we don't keep polling
-                               DBA::update('contact', ['last-update' => $updated], ['id' => $contact['id']]);
-                               Logger::log('Contact is blocked or only a follower');
-                               return;
-                       }
-
-                       $cookiejar = tempnam(get_temppath(), 'cookiejar-onepoll-');
-                       $curlResult = Network::curl($contact['poll'], false, ['cookiejar' => $cookiejar]);
-                       unlink($cookiejar);
-
-                       if ($curlResult->isTimeout()) {
-                               // set the last-update so we don't keep polling
-                               self::updateContact($contact, ['last-update' => $updated]);
-                               Contact::markForArchival($contact);
-                               Logger::log('Contact archived');
-                               return;
-                       }
-
-                       $xml = $curlResult->getBody();
-
+                       $xml = self::pollFeed($contact, $protocol, $updated);
                } elseif ($protocol === Protocol::MAIL) {
-                       Logger::log("Mail: Fetching for ".$contact['addr'], Logger::DEBUG);
-
-                       $mail_disabled = ((function_exists('imap_open') && !Config::get('system', 'imap_disabled')) ? 0 : 1);
-                       if ($mail_disabled) {
-                               // set the last-update so we don't keep polling
-                               self::updateContact($contact, ['last-update' => $updated]);
-                               Contact::markForArchival($contact);
-                               Logger::log('Contact archived');
-                               return;
-                       }
-
-                       Logger::log("Mail: Enabled", Logger::DEBUG);
-
-                       $mbox = null;
-                       $user = DBA::selectFirst('user', ['prvkey'], ['uid' => $importer_uid]);
-
-                       $condition = ["`server` != '' AND `uid` = ?", $importer_uid];
-                       $mailconf = DBA::selectFirst('mailacct', [], $condition);
-                       if (DBA::isResult($user) && DBA::isResult($mailconf)) {
-                               $mailbox = Email::constructMailboxName($mailconf);
-                               $password = '';
-                               openssl_private_decrypt(hex2bin($mailconf['pass']), $password, $user['prvkey']);
-                               $mbox = Email::connect($mailbox, $mailconf['user'], $password);
-                               unset($password);
-                               Logger::log("Mail: Connect to " . $mailconf['user']);
-                               if ($mbox) {
-                                       $fields = ['last_check' => $updated];
-                                       DBA::update('mailacct', $fields, ['id' => $mailconf['id']]);
-                                       Logger::log("Mail: Connected to " . $mailconf['user']);
-                               } else {
-                                       Logger::log("Mail: Connection error ".$mailconf['user']." ".print_r(imap_errors(), true));
-                               }
-                       }
-
-                       if ($mbox) {
-                               $msgs = Email::poll($mbox, $contact['addr']);
-
-                               if (count($msgs)) {
-                                       Logger::log("Mail: Parsing ".count($msgs)." mails from ".$contact['addr']." for ".$mailconf['user'], Logger::DEBUG);
-
-                                       $metas = Email::messageMeta($mbox, implode(',', $msgs));
-
-                                       if (count($metas) != count($msgs)) {
-                                               Logger::log("for " . $mailconf['user'] . " there are ". count($msgs) . " messages but received " . count($metas) . " metas", Logger::DEBUG);
-                                       } else {
-                                               $msgs = array_combine($msgs, $metas);
-
-                                               foreach ($msgs as $msg_uid => $meta) {
-                                                       Logger::log("Mail: Parsing mail ".$msg_uid, Logger::DATA);
-
-                                                       $datarray = [];
-                                                       $datarray['verb'] = ACTIVITY_POST;
-                                                       $datarray['object-type'] = ACTIVITY_OBJ_NOTE;
-                                                       $datarray['network'] = Protocol::MAIL;
-                                                       // $meta = Email::messageMeta($mbox, $msg_uid);
-
-                                                       $datarray['uri'] = Email::msgid2iri(trim($meta->message_id, '<>'));
-
-                                                       // Have we seen it before?
-                                                       $fields = ['deleted', 'id'];
-                                                       $condition = ['uid' => $importer_uid, 'uri' => $datarray['uri']];
-                                                       $item = Item::selectFirst($fields, $condition);
-                                                       if (DBA::isResult($item)) {
-                                                               Logger::log("Mail: Seen before ".$msg_uid." for ".$mailconf['user']." UID: ".$importer_uid." URI: ".$datarray['uri'],Logger::DEBUG);
-
-                                                               // Only delete when mails aren't automatically moved or deleted
-                                                               if (($mailconf['action'] != 1) && ($mailconf['action'] != 3))
-                                                                       if ($meta->deleted && ! $item['deleted']) {
-                                                                               $fields = ['deleted' => true, 'changed' => $updated];
-                                                                               Item::update($fields, ['id' => $item['id']]);
-                                                                       }
-
-                                                               switch ($mailconf['action']) {
-                                                                       case 0:
-                                                                               Logger::log("Mail: Seen before ".$msg_uid." for ".$mailconf['user'].". Doing nothing.", Logger::DEBUG);
-                                                                               break;
-                                                                       case 1:
-                                                                               Logger::log("Mail: Deleting ".$msg_uid." for ".$mailconf['user']);
-                                                                               imap_delete($mbox, $msg_uid, FT_UID);
-                                                                               break;
-                                                                       case 2:
-                                                                               Logger::log("Mail: Mark as seen ".$msg_uid." for ".$mailconf['user']);
-                                                                               imap_setflag_full($mbox, $msg_uid, "\\Seen", ST_UID);
-                                                                               break;
-                                                                       case 3:
-                                                                               Logger::log("Mail: Moving ".$msg_uid." to ".$mailconf['movetofolder']." for ".$mailconf['user']);
-                                                                               imap_setflag_full($mbox, $msg_uid, "\\Seen", ST_UID);
-                                                                               if ($mailconf['movetofolder'] != "") {
-                                                                                       imap_mail_move($mbox, $msg_uid, $mailconf['movetofolder'], FT_UID);
-                                                                               }
-                                                                               break;
-                                                               }
-                                                               continue;
-                                                       }
-
-
-                                                       // look for a 'references' or an 'in-reply-to' header and try to match with a parent item we have locally.
-                                                       $raw_refs = ((property_exists($meta, 'references')) ? str_replace("\t", '', $meta->references) : '');
-                                                       if (!trim($raw_refs)) {
-                                                               $raw_refs = ((property_exists($meta, 'in_reply_to')) ? str_replace("\t", '', $meta->in_reply_to) : '');
-                                                       }
-                                                       $raw_refs = trim($raw_refs);  // Don't allow a blank reference in $refs_arr
-
-                                                       if ($raw_refs) {
-                                                               $refs_arr = explode(' ', $raw_refs);
-                                                               if (count($refs_arr)) {
-                                                                       for ($x = 0; $x < count($refs_arr); $x ++) {
-                                                                               $refs_arr[$x] = Email::msgid2iri(str_replace(['<', '>', ' '],['', '', ''], $refs_arr[$x]));
-                                                                       }
-                                                               }
-                                                               $condition = ['uri' => $refs_arr, 'uid' => $importer_uid];
-                                                               $parent = Item::selectFirst(['parent-uri'], $condition);
-                                                               if (DBA::isResult($parent)) {
-                                                                       $datarray['parent-uri'] = $parent['parent-uri'];  // Set the parent as the top-level item
-                                                               }
-                                                       }
-
-                                                       // Decoding the header
-                                                       $subject = imap_mime_header_decode($meta->subject);
-                                                       $datarray['title'] = "";
-                                                       foreach ($subject as $subpart) {
-                                                               if ($subpart->charset != "default") {
-                                                                       $datarray['title'] .= iconv($subpart->charset, 'UTF-8//IGNORE', $subpart->text);
-                                                               } else {
-                                                                       $datarray['title'] .= $subpart->text;
-                                                               }
-                                                       }
-                                                       $datarray['title'] = Strings::escapeTags(trim($datarray['title']));
-
-                                                       //$datarray['title'] = Strings::escapeTags(trim($meta->subject));
-                                                       $datarray['created'] = DateTimeFormat::utc($meta->date);
-
-                                                       // Is it a reply?
-                                                       $reply = ((substr(strtolower($datarray['title']), 0, 3) == "re:") ||
-                                                               (substr(strtolower($datarray['title']), 0, 3) == "re-") ||
-                                                               ($raw_refs != ""));
-
-                                                       // Remove Reply-signs in the subject
-                                                       $datarray['title'] = self::RemoveReply($datarray['title']);
-
-                                                       // If it seems to be a reply but a header couldn't be found take the last message with matching subject
-                                                       if (empty($datarray['parent-uri']) && $reply) {
-                                                               $condition = ['title' => $datarray['title'], 'uid' => $importer_uid, 'network' => Protocol::MAIL];
-                                                               $params = ['order' => ['created' => true]];
-                                                               $parent = Item::selectFirst(['parent-uri'], $condition, $params);
-                                                               if (DBA::isResult($parent)) {
-                                                                       $datarray['parent-uri'] = $parent['parent-uri'];
-                                                               }
-                                                       }
-
-                                                       if (empty($datarray['parent-uri'])) {
-                                                               $datarray['parent-uri'] = $datarray['uri'];
-                                                       }
-
-                                                       $r = Email::getMessage($mbox, $msg_uid, $reply);
-                                                       if (!$r) {
-                                                               Logger::log("Mail: can't fetch msg ".$msg_uid." for ".$mailconf['user']);
-                                                               continue;
-                                                       }
-                                                       $datarray['body'] = Strings::escapeHtml($r['body']);
-                                                       $datarray['body'] = BBCode::limitBodySize($datarray['body']);
-
-                                                       Logger::log("Mail: Importing ".$msg_uid." for ".$mailconf['user']);
-
-                                                       /// @TODO Adding a gravatar for the original author would be cool
-
-                                                       $from = imap_mime_header_decode($meta->from);
-                                                       $fromdecoded = "";
-                                                       foreach ($from as $frompart) {
-                                                               if ($frompart->charset != "default") {
-                                                                       $fromdecoded .= iconv($frompart->charset, 'UTF-8//IGNORE', $frompart->text);
-                                                               } else {
-                                                                       $fromdecoded .= $frompart->text;
-                                                               }
-                                                       }
-
-                                                       $fromarr = imap_rfc822_parse_adrlist($fromdecoded, $a->getHostName());
-
-                                                       $frommail = $fromarr[0]->mailbox."@".$fromarr[0]->host;
-
-                                                       if (isset($fromarr[0]->personal)) {
-                                                               $fromname = $fromarr[0]->personal;
-                                                       } else {
-                                                               $fromname = $frommail;
-                                                       }
-
-                                                       $datarray['author-name'] = $fromname;
-                                                       $datarray['author-link'] = "mailto:".$frommail;
-                                                       $datarray['author-avatar'] = $contact['photo'];
-
-                                                       $datarray['owner-name'] = $contact['name'];
-                                                       $datarray['owner-link'] = "mailto:".$contact['addr'];
-                                                       $datarray['owner-avatar'] = $contact['photo'];
-
-                                                       $datarray['uid'] = $importer_uid;
-                                                       $datarray['contact-id'] = $contact['id'];
-                                                       if ($datarray['parent-uri'] === $datarray['uri']) {
-                                                               $datarray['private'] = 1;
-                                                       }
-                                                       if (($protocol === Protocol::MAIL) && !PConfig::get($importer_uid, 'system', 'allow_public_email_replies')) {
-                                                               $datarray['private'] = 1;
-                                                               $datarray['allow_cid'] = '<' . $contact['id'] . '>';
-                                                       }
-
-                                                       Item::insert($datarray);
-
-                                                       switch ($mailconf['action']) {
-                                                               case 0:
-                                                                       Logger::log("Mail: Seen before ".$msg_uid." for ".$mailconf['user'].". Doing nothing.", Logger::DEBUG);
-                                                                       break;
-                                                               case 1:
-                                                                       Logger::log("Mail: Deleting ".$msg_uid." for ".$mailconf['user']);
-                                                                       imap_delete($mbox, $msg_uid, FT_UID);
-                                                                       break;
-                                                               case 2:
-                                                                       Logger::log("Mail: Mark as seen ".$msg_uid." for ".$mailconf['user']);
-                                                                       imap_setflag_full($mbox, $msg_uid, "\\Seen", ST_UID);
-                                                                       break;
-                                                               case 3:
-                                                                       Logger::log("Mail: Moving ".$msg_uid." to ".$mailconf['movetofolder']." for ".$mailconf['user']);
-                                                                       imap_setflag_full($mbox, $msg_uid, "\\Seen", ST_UID);
-                                                                       if ($mailconf['movetofolder'] != "") {
-                                                                               imap_mail_move($mbox, $msg_uid, $mailconf['movetofolder'], FT_UID);
-                                                                       }
-                                                                       break;
-                                                       }
-                                               }
-                                       }
-                               } else {
-                                       Logger::log("Mail: no mails for ".$mailconf['user']);
-                               }
-
-                               Logger::log("Mail: closing connection for ".$mailconf['user']);
-                               imap_close($mbox);
-                       }
+                       self::pollMail($contact, $importer_uid, $updated);
                }
 
-               if ($xml) {
+               if (!empty($xml)) {
                        Logger::log('received xml : ' . $xml, Logger::DATA);
                        if (!strstr($xml, '<')) {
                                Logger::log('post_handshake: response from ' . $url . ' did not contain XML.');
@@ -676,11 +191,9 @@ class OnePoll
                        }
 
                        self::updateContact($contact, ['last-update' => $updated, 'success_update' => $updated]);
-                       DBA::update('gcontact', ['last_contact' => $updated], ['nurl' => $contact['nurl']]);
                        Contact::unmarkForArchival($contact);
                } elseif (in_array($contact["network"], [Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS, Protocol::FEED])) {
                        self::updateContact($contact, ['last-update' => $updated, 'failure_update' => $updated]);
-                       DBA::update('gcontact', ['last_failure' => $updated], ['nurl' => $contact['nurl']]);
                        Contact::markForArchival($contact);
                } else {
                        self::updateContact($contact, ['last-update' => $updated]);
@@ -711,4 +224,447 @@ class OnePoll
                DBA::update('contact', $fields, ['id' => $contact['id']]);
                DBA::update('contact', $fields, ['uid' => 0, 'nurl' => $contact['nurl']]);
        }
+
+       /**
+        * @brief Poll DFRN contacts
+        *
+        * @param  array  $contact The personal contact entry
+        * @param  string $updated The updated date
+        * @return string polled XML
+        * @throws \Exception
+        */
+       private static function pollDFRN(array $contact, $updated)
+       {
+               $idtosend = $orig_id = (($contact['dfrn-id']) ? $contact['dfrn-id'] : $contact['issued-id']);
+               if (intval($contact['duplex']) && $contact['dfrn-id']) {
+                       $idtosend = '0:' . $orig_id;
+               }
+               if (intval($contact['duplex']) && $contact['issued-id']) {
+                       $idtosend = '1:' . $orig_id;
+               }
+
+               // they have permission to write to us. We already filtered this in the contact query.
+               $perm = 'rw';
+
+               // But this may be our first communication, so set the writable flag if it isn't set already.
+               if (!intval($contact['writable'])) {
+                       $fields = ['writable' => true];
+                       DBA::update('contact', $fields, ['id' => $contact['id']]);
+               }
+
+               $last_update = (($contact['last-update'] <= DBA::NULL_DATETIME)
+                       ? DateTimeFormat::utc('now - 7 days', DateTimeFormat::ATOM)
+                       : DateTimeFormat::utc($contact['last-update'], DateTimeFormat::ATOM)
+               );
+
+               $url = $contact['poll'] . '?dfrn_id=' . $idtosend
+                       . '&dfrn_version=' . DFRN_PROTOCOL_VERSION
+                       . '&type=data&last_update=' . $last_update
+                       . '&perm=' . $perm;
+
+               $curlResult = Network::curl($url);
+
+               if (!$curlResult->isSuccess() && ($curlResult->getErrorNumber() == CURLE_OPERATION_TIMEDOUT)) {
+                       // set the last-update so we don't keep polling
+                       self::updateContact($contact, ['last-update' => $updated]);
+                       Contact::markForArchival($contact);
+                       Logger::log('Contact archived');
+                       return false;
+               }
+
+               $handshake_xml = $curlResult->getBody();
+               $html_code = $curlResult->getReturnCode();
+
+               Logger::log('handshake with url ' . $url . ' returns xml: ' . $handshake_xml, Logger::DATA);
+
+               if (!strlen($handshake_xml) || ($html_code >= 400) || !$html_code) {
+                       // dead connection - might be a transient event, or this might
+                       // mean the software was uninstalled or the domain expired.
+                       // Will keep trying for one month.
+                       Logger::log("$url appears to be dead - marking for death ");
+
+                       // set the last-update so we don't keep polling
+                       $fields = ['last-update' => $updated, 'failure_update' => $updated];
+                       self::updateContact($contact, $fields);
+                       Contact::markForArchival($contact);
+                       return false;
+               }
+
+               if (!strstr($handshake_xml, '<')) {
+                       Logger::log('response from ' . $url . ' did not contain XML.');
+
+                       $fields = ['last-update' => $updated, 'failure_update' => $updated];
+                       self::updateContact($contact, $fields);
+                       Contact::markForArchival($contact);
+                       return false;
+               }
+
+               $res = XML::parseString($handshake_xml);
+
+               if (intval($res->status) == 1) {
+                       // we may not be friends anymore. Will keep trying for one month.
+                       Logger::log("$url replied status 1 - marking for death ");
+
+                       // set the last-update so we don't keep polling
+                       $fields = ['last-update' => $updated, 'failure_update' => $updated];
+                       self::updateContact($contact, $fields);
+                       Contact::markForArchival($contact);
+               } elseif ($contact['term-date'] > DBA::NULL_DATETIME) {
+                       Contact::unmarkForArchival($contact);
+               }
+
+               if ((intval($res->status) != 0) || !strlen($res->challenge) || !strlen($res->dfrn_id)) {
+                       // set the last-update so we don't keep polling
+                       DBA::update('contact', ['last-update' => $updated], ['id' => $contact['id']]);
+                       Logger::log('Contact status is ' . $res->status);
+                       return false;
+               }
+
+               if (((float)$res->dfrn_version > 2.21) && ($contact['poco'] == '')) {
+                       $fields = ['poco' => str_replace('/profile/', '/poco/', $contact['url'])];
+                       DBA::update('contact', $fields, ['id' => $contact['id']]);
+               }
+
+               $postvars = [];
+
+               $sent_dfrn_id = hex2bin((string) $res->dfrn_id);
+               $challenge    = hex2bin((string) $res->challenge);
+
+               $final_dfrn_id = '';
+
+               if ($contact['duplex'] && strlen($contact['prvkey'])) {
+                       openssl_private_decrypt($sent_dfrn_id, $final_dfrn_id, $contact['prvkey']);
+                       openssl_private_decrypt($challenge, $postvars['challenge'], $contact['prvkey']);
+               } else {
+                       openssl_public_decrypt($sent_dfrn_id, $final_dfrn_id, $contact['pubkey']);
+                       openssl_public_decrypt($challenge, $postvars['challenge'], $contact['pubkey']);
+               }
+
+               $final_dfrn_id = substr($final_dfrn_id, 0, strpos($final_dfrn_id, '.'));
+
+               if (strpos($final_dfrn_id, ':') == 1) {
+                       $final_dfrn_id = substr($final_dfrn_id, 2);
+               }
+
+               // There are issues with the legacy DFRN transport layer.
+               // Since we mostly don't use it anyway, we won't dig into it deeper, but simply ignore it.
+               if (empty($final_dfrn_id) || empty($orig_id)) {
+                       Logger::log('Contact has got no ID - quitting');
+                       return false;
+               }
+
+               if ($final_dfrn_id != $orig_id) {
+                       // did not decode properly - cannot trust this site
+                       Logger::log('ID did not decode: ' . $contact['id'] . ' orig: ' . $orig_id . ' final: ' . $final_dfrn_id);
+
+                       // set the last-update so we don't keep polling
+                       DBA::update('contact', ['last-update' => $updated], ['id' => $contact['id']]);
+                       Contact::markForArchival($contact);
+                       return false;
+               }
+
+               $postvars['dfrn_id'] = $idtosend;
+               $postvars['dfrn_version'] = DFRN_PROTOCOL_VERSION;
+               $postvars['perm'] = 'rw';
+
+               return Network::post($contact['poll'], $postvars)->getBody();
+       }
+
+       /**
+        * @brief Poll Feed/OStatus contacts
+        *
+        * @param  array  $contact The personal contact entry
+        * @param  string $protocol The used protocol of the contact
+        * @param  string $updated The updated date
+        * @return string polled XML
+        * @throws \Exception
+        */
+       private static function pollFeed(array $contact, $protocol, $updated)
+       {
+               // Upgrading DB fields from an older Friendica version
+               // Will only do this once per notify-enabled OStatus contact
+               // or if relationship changes
+
+               $stat_writeable = ((($contact['notify']) && ($contact['rel'] == Contact::FOLLOWER || $contact['rel'] == Contact::FRIEND)) ? 1 : 0);
+
+               // Contacts from OStatus are always writable
+               if ($protocol === Protocol::OSTATUS) {
+                       $stat_writeable = 1;
+               }
+
+               if ($stat_writeable != $contact['writable']) {
+                       $fields = ['writable' => $stat_writeable];
+                       DBA::update('contact', $fields, ['id' => $contact['id']]);
+               }
+
+               // Are we allowed to import from this person?
+               if ($contact['rel'] == Contact::FOLLOWER || $contact['blocked']) {
+                       // set the last-update so we don't keep polling
+                       DBA::update('contact', ['last-update' => $updated], ['id' => $contact['id']]);
+                       Logger::log('Contact is blocked or only a follower');
+                       return false;
+               }
+
+               $cookiejar = tempnam(get_temppath(), 'cookiejar-onepoll-');
+               $curlResult = Network::curl($contact['poll'], false, ['cookiejar' => $cookiejar]);
+               unlink($cookiejar);
+
+               if ($curlResult->isTimeout()) {
+                       // set the last-update so we don't keep polling
+                       self::updateContact($contact, ['last-update' => $updated]);
+                       Contact::markForArchival($contact);
+                       Logger::log('Contact archived');
+                       return false;
+               }
+
+               return $curlResult->getBody();
+       }
+
+       /**
+        * @brief Poll Mail contacts
+        *
+        * @param  array   $contact      The personal contact entry
+        * @param  integer $importer_uid The UID of the importer
+        * @param  string  $updated      The updated date
+        * @throws \Exception
+        */
+       private static function pollMail(array $contact, $importer_uid, $updated)
+       {
+               Logger::log("Mail: Fetching for ".$contact['addr'], Logger::DEBUG);
+
+               $mail_disabled = ((function_exists('imap_open') && !Config::get('system', 'imap_disabled')) ? 0 : 1);
+               if ($mail_disabled) {
+                       // set the last-update so we don't keep polling
+                       self::updateContact($contact, ['last-update' => $updated]);
+                       Contact::markForArchival($contact);
+                       Logger::log('Contact archived');
+                       return;
+               }
+
+               Logger::log("Mail: Enabled", Logger::DEBUG);
+
+               $mbox = null;
+               $user = DBA::selectFirst('user', ['prvkey'], ['uid' => $importer_uid]);
+
+               $condition = ["`server` != '' AND `uid` = ?", $importer_uid];
+               $mailconf = DBA::selectFirst('mailacct', [], $condition);
+               if (DBA::isResult($user) && DBA::isResult($mailconf)) {
+                       $mailbox = Email::constructMailboxName($mailconf);
+                       $password = '';
+                       openssl_private_decrypt(hex2bin($mailconf['pass']), $password, $user['prvkey']);
+                       $mbox = Email::connect($mailbox, $mailconf['user'], $password);
+                       unset($password);
+                       Logger::log("Mail: Connect to " . $mailconf['user']);
+                       if ($mbox) {
+                               $fields = ['last_check' => $updated];
+                               DBA::update('mailacct', $fields, ['id' => $mailconf['id']]);
+                               Logger::log("Mail: Connected to " . $mailconf['user']);
+                       } else {
+                               Logger::log("Mail: Connection error ".$mailconf['user']." ".print_r(imap_errors(), true));
+                       }
+               }
+
+               if (!$mbox) {
+                       return;
+               }
+
+               $msgs = Email::poll($mbox, $contact['addr']);
+
+               if (count($msgs)) {
+                       Logger::log("Mail: Parsing ".count($msgs)." mails from ".$contact['addr']." for ".$mailconf['user'], Logger::DEBUG);
+
+                       $metas = Email::messageMeta($mbox, implode(',', $msgs));
+
+                       if (count($metas) != count($msgs)) {
+                               Logger::log("for " . $mailconf['user'] . " there are ". count($msgs) . " messages but received " . count($metas) . " metas", Logger::DEBUG);
+                       } else {
+                               $msgs = array_combine($msgs, $metas);
+
+                               foreach ($msgs as $msg_uid => $meta) {
+                                       Logger::log("Mail: Parsing mail ".$msg_uid, Logger::DATA);
+
+                                       $datarray = [];
+                                       $datarray['verb'] = ACTIVITY_POST;
+                                       $datarray['object-type'] = ACTIVITY_OBJ_NOTE;
+                                       $datarray['network'] = Protocol::MAIL;
+                                       // $meta = Email::messageMeta($mbox, $msg_uid);
+
+                                       $datarray['uri'] = Email::msgid2iri(trim($meta->message_id, '<>'));
+
+                                       // Have we seen it before?
+                                       $fields = ['deleted', 'id'];
+                                       $condition = ['uid' => $importer_uid, 'uri' => $datarray['uri']];
+                                       $item = Item::selectFirst($fields, $condition);
+                                       if (DBA::isResult($item)) {
+                                               Logger::log("Mail: Seen before ".$msg_uid." for ".$mailconf['user']." UID: ".$importer_uid." URI: ".$datarray['uri'],Logger::DEBUG);
+
+                                               // Only delete when mails aren't automatically moved or deleted
+                                               if (($mailconf['action'] != 1) && ($mailconf['action'] != 3))
+                                                       if ($meta->deleted && ! $item['deleted']) {
+                                                               $fields = ['deleted' => true, 'changed' => $updated];
+                                                               Item::update($fields, ['id' => $item['id']]);
+                                                       }
+
+                                               switch ($mailconf['action']) {
+                                                       case 0:
+                                                               Logger::log("Mail: Seen before ".$msg_uid." for ".$mailconf['user'].". Doing nothing.", Logger::DEBUG);
+                                                               break;
+                                                       case 1:
+                                                               Logger::log("Mail: Deleting ".$msg_uid." for ".$mailconf['user']);
+                                                               imap_delete($mbox, $msg_uid, FT_UID);
+                                                               break;
+                                                       case 2:
+                                                               Logger::log("Mail: Mark as seen ".$msg_uid." for ".$mailconf['user']);
+                                                               imap_setflag_full($mbox, $msg_uid, "\\Seen", ST_UID);
+                                                               break;
+                                                       case 3:
+                                                               Logger::log("Mail: Moving ".$msg_uid." to ".$mailconf['movetofolder']." for ".$mailconf['user']);
+                                                               imap_setflag_full($mbox, $msg_uid, "\\Seen", ST_UID);
+                                                               if ($mailconf['movetofolder'] != "") {
+                                                                       imap_mail_move($mbox, $msg_uid, $mailconf['movetofolder'], FT_UID);
+                                                               }
+                                                               break;
+                                               }
+                                               continue;
+                                       }
+
+                                       // look for a 'references' or an 'in-reply-to' header and try to match with a parent item we have locally.
+                                       $raw_refs = ((property_exists($meta, 'references')) ? str_replace("\t", '', $meta->references) : '');
+                                       if (!trim($raw_refs)) {
+                                               $raw_refs = ((property_exists($meta, 'in_reply_to')) ? str_replace("\t", '', $meta->in_reply_to) : '');
+                                       }
+                                       $raw_refs = trim($raw_refs);  // Don't allow a blank reference in $refs_arr
+
+                                       if ($raw_refs) {
+                                               $refs_arr = explode(' ', $raw_refs);
+                                               if (count($refs_arr)) {
+                                                       for ($x = 0; $x < count($refs_arr); $x ++) {
+                                                               $refs_arr[$x] = Email::msgid2iri(str_replace(['<', '>', ' '],['', '', ''], $refs_arr[$x]));
+                                                       }
+                                               }
+                                               $condition = ['uri' => $refs_arr, 'uid' => $importer_uid];
+                                               $parent = Item::selectFirst(['parent-uri'], $condition);
+                                               if (DBA::isResult($parent)) {
+                                                       $datarray['parent-uri'] = $parent['parent-uri'];  // Set the parent as the top-level item
+                                               }
+                                       }
+
+                                       // Decoding the header
+                                       $subject = imap_mime_header_decode($meta->subject);
+                                       $datarray['title'] = "";
+                                       foreach ($subject as $subpart) {
+                                               if ($subpart->charset != "default") {
+                                                       $datarray['title'] .= iconv($subpart->charset, 'UTF-8//IGNORE', $subpart->text);
+                                               } else {
+                                                       $datarray['title'] .= $subpart->text;
+                                               }
+                                       }
+                                       $datarray['title'] = Strings::escapeTags(trim($datarray['title']));
+
+                                       //$datarray['title'] = Strings::escapeTags(trim($meta->subject));
+                                       $datarray['created'] = DateTimeFormat::utc($meta->date);
+
+                                       // Is it a reply?
+                                       $reply = ((substr(strtolower($datarray['title']), 0, 3) == "re:") ||
+                                               (substr(strtolower($datarray['title']), 0, 3) == "re-") ||
+                                               ($raw_refs != ""));
+
+                                       // Remove Reply-signs in the subject
+                                       $datarray['title'] = self::RemoveReply($datarray['title']);
+
+                                       // If it seems to be a reply but a header couldn't be found take the last message with matching subject
+                                       if (empty($datarray['parent-uri']) && $reply) {
+                                               $condition = ['title' => $datarray['title'], 'uid' => $importer_uid, 'network' => Protocol::MAIL];
+                                               $params = ['order' => ['created' => true]];
+                                               $parent = Item::selectFirst(['parent-uri'], $condition, $params);
+                                               if (DBA::isResult($parent)) {
+                                                       $datarray['parent-uri'] = $parent['parent-uri'];
+                                               }
+                                       }
+
+                                       if (empty($datarray['parent-uri'])) {
+                                               $datarray['parent-uri'] = $datarray['uri'];
+                                       }
+
+                                       $r = Email::getMessage($mbox, $msg_uid, $reply);
+                                       if (!$r) {
+                                               Logger::log("Mail: can't fetch msg ".$msg_uid." for ".$mailconf['user']);
+                                               continue;
+                                       }
+                                       $datarray['body'] = Strings::escapeHtml($r['body']);
+                                       $datarray['body'] = BBCode::limitBodySize($datarray['body']);
+
+                                       Logger::log("Mail: Importing ".$msg_uid." for ".$mailconf['user']);
+
+                                       /// @TODO Adding a gravatar for the original author would be cool
+
+                                       $from = imap_mime_header_decode($meta->from);
+                                       $fromdecoded = "";
+                                       foreach ($from as $frompart) {
+                                               if ($frompart->charset != "default") {
+                                                       $fromdecoded .= iconv($frompart->charset, 'UTF-8//IGNORE', $frompart->text);
+                                               } else {
+                                                       $fromdecoded .= $frompart->text;
+                                               }
+                                       }
+
+                                       $fromarr = imap_rfc822_parse_adrlist($fromdecoded, BaseObject::getApp()->getHostName());
+
+                                       $frommail = $fromarr[0]->mailbox."@".$fromarr[0]->host;
+
+                                       if (isset($fromarr[0]->personal)) {
+                                               $fromname = $fromarr[0]->personal;
+                                       } else {
+                                               $fromname = $frommail;
+                                       }
+
+                                       $datarray['author-name'] = $fromname;
+                                       $datarray['author-link'] = "mailto:".$frommail;
+                                       $datarray['author-avatar'] = $contact['photo'];
+
+                                       $datarray['owner-name'] = $contact['name'];
+                                       $datarray['owner-link'] = "mailto:".$contact['addr'];
+                                       $datarray['owner-avatar'] = $contact['photo'];
+
+                                       $datarray['uid'] = $importer_uid;
+                                       $datarray['contact-id'] = $contact['id'];
+                                       if ($datarray['parent-uri'] === $datarray['uri']) {
+                                               $datarray['private'] = 1;
+                                       }
+                                       if (!PConfig::get($importer_uid, 'system', 'allow_public_email_replies')) {
+                                               $datarray['private'] = 1;
+                                               $datarray['allow_cid'] = '<' . $contact['id'] . '>';
+                                       }
+
+                                       Item::insert($datarray);
+
+                                       switch ($mailconf['action']) {
+                                               case 0:
+                                                       Logger::log("Mail: Seen before ".$msg_uid." for ".$mailconf['user'].". Doing nothing.", Logger::DEBUG);
+                                                       break;
+                                               case 1:
+                                                       Logger::log("Mail: Deleting ".$msg_uid." for ".$mailconf['user']);
+                                                       imap_delete($mbox, $msg_uid, FT_UID);
+                                                       break;
+                                               case 2:
+                                                       Logger::log("Mail: Mark as seen ".$msg_uid." for ".$mailconf['user']);
+                                                       imap_setflag_full($mbox, $msg_uid, "\\Seen", ST_UID);
+                                                       break;
+                                               case 3:
+                                                       Logger::log("Mail: Moving ".$msg_uid." to ".$mailconf['movetofolder']." for ".$mailconf['user']);
+                                                       imap_setflag_full($mbox, $msg_uid, "\\Seen", ST_UID);
+                                                       if ($mailconf['movetofolder'] != "") {
+                                                               imap_mail_move($mbox, $msg_uid, $mailconf['movetofolder'], FT_UID);
+                                                       }
+                                                       break;
+                                       }
+                               }
+                       }
+               } else {
+                       Logger::log("Mail: no mails for ".$mailconf['user']);
+               }
+
+               Logger::log("Mail: closing connection for ".$mailconf['user']);
+               imap_close($mbox);
+       }
 }
index ae3b06b5067dc5ee2b0e22293ac2c5a2d8bf6387..f23c5c0a070ff0aa4b40345027414d77d113ce49 100644 (file)
@@ -13,16 +13,12 @@ use Friendica\Database\DBA;
 
 class UpdateContact
 {
-       public static function execute($contact_id)
+       public static function execute($contact_id, $command = '')
        {
-               $success = Contact::updateFromProbe($contact_id);
-               // Update the "updated" field if the contact could be probed.
-               // We don't do this in the function above, since we don't want to
-               // update the contact whenever that function is called from anywhere.
-               if ($success) {
-                       DBA::update('contact', ['updated' => DateTimeFormat::utcNow()], ['id' => $contact_id]);
-               }
+               $force = ($command == "force");
 
-               Logger::info('Updated from probe', ['id' => $contact_id, 'success' => $success]);
+               $success = Contact::updateFromProbe($contact_id, '', $force);
+
+               Logger::info('Updated from probe', ['id' => $contact_id, 'force' => $force, 'success' => $success]);
        }
 }
index b927e61bbd2718c1d251e8dce9dff5734783bf22..aacebcb80ae93d7482994261f06d8cd9e565ad67 100644 (file)
@@ -7,85 +7,17 @@
 namespace Friendica\Worker;
 
 use Friendica\Core\Logger;
-use Friendica\Core\Protocol;
+use Friendica\Model\GContact;
 use Friendica\Database\DBA;
-use Friendica\Network\Probe;
-use Friendica\Protocol\PortableContact;
-use Friendica\Util\DateTimeFormat;
-use Friendica\Util\Strings;
 
 class UpdateGContact
 {
-       public static function execute($contact_id)
+       public static function execute($url, $command = '')
        {
-               Logger::log('update_gcontact: start');
+               $force = ($command == "force");
 
-               if (empty($contact_id)) {
-                       Logger::log('update_gcontact: no contact');
-                       return;
-               }
+               $success = GContact::updateFromProbe($url, $force);
 
-               $r = q("SELECT * FROM `gcontact` WHERE `id` = %d", intval($contact_id));
-
-               if (!DBA::isResult($r)) {
-                       return;
-               }
-
-               if (!in_array($r[0]["network"], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS])) {
-                       return;
-               }
-
-               $data = Probe::uri($r[0]["url"]);
-
-               if (!in_array($data["network"], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS])) {
-                       if ($r[0]["server_url"] != "") {
-                               PortableContact::checkServer($r[0]["server_url"], $r[0]["network"]);
-                       }
-
-                       q("UPDATE `gcontact` SET `last_failure` = '%s' WHERE `id` = %d",
-                               DBA::escape(DateTimeFormat::utcNow()), intval($contact_id));
-                       return;
-               }
-
-               if (($data["name"] == "") && ($r[0]['name'] != "")) {
-                       $data["name"] = $r[0]['name'];
-               }
-
-               if (($data["nick"] == "") && ($r[0]['nick'] != "")) {
-                       $data["nick"] = $r[0]['nick'];
-               }
-
-               if (($data["addr"] == "") && ($r[0]['addr'] != "")) {
-                       $data["addr"] = $r[0]['addr'];
-               }
-
-               if (($data["photo"] == "") && ($r[0]['photo'] != "")) {
-                       $data["photo"] = $r[0]['photo'];
-               }
-
-
-               q("UPDATE `gcontact` SET `name` = '%s', `nick` = '%s', `addr` = '%s', `photo` = '%s'
-                                       WHERE `id` = %d",
-                                       DBA::escape($data["name"]),
-                                       DBA::escape($data["nick"]),
-                                       DBA::escape($data["addr"]),
-                                       DBA::escape($data["photo"]),
-                       intval($contact_id)
-               );
-
-               q("UPDATE `contact` SET `name` = '%s', `nick` = '%s', `addr` = '%s', `photo` = '%s'
-                                       WHERE `uid` = 0 AND `addr` = '' AND `nurl` = '%s'",
-                                       DBA::escape($data["name"]),
-                                       DBA::escape($data["nick"]),
-                                       DBA::escape($data["addr"]),
-                                       DBA::escape($data["photo"]),
-                                       DBA::escape(Strings::normaliseLink($data["url"]))
-               );
-
-               q("UPDATE `contact` SET `addr` = '%s'
-                                       WHERE `uid` != 0 AND `addr` = '' AND `nurl` = '%s'",
-                                       DBA::escape($data["addr"]),
-                                       DBA::escape(Strings::normaliseLink($data["url"]))
-               );
+               Logger::info('Updated from probe', ['url' => $url, 'force' => $force, 'success' => $success]);
        }
 }
diff --git a/static/dbstructure.config.php b/static/dbstructure.config.php
new file mode 100755 (executable)
index 0000000..aca6cf1
--- /dev/null
@@ -0,0 +1,1437 @@
+<?php
+
+/* Main database structure configuration file.
+ *
+ * Here are described all the tables, fields and indexes Friendica needs to work.
+ *
+ * Syntax (braces indicate optionale values):
+ * "<table name>" => [
+ *     "comment" => "Description of the table",
+ *     "fields" => [
+ *             "<field name>" => [
+ *                     "type" => "<field type>{(<field size>)} <unsigned>",
+ *                     "not null" => 0|1,
+ *                     {"extra" => "auto_increment",}
+ *                     {"default" => "<default value>",}
+ *                     {"default" => NULL_DATE,} (for datetime fields)
+ *                     {"primary" => "1",}
+ *                     {"relation" => ["<foreign key table name>" => "<foreign key field name>"],}
+ *                     "comment" => "Description of the fields"
+ *             ],
+ *             ...
+ *     ],
+ *     "indexes" => [
+ *             "PRIMARY" => ["<primary key field name>", ...],
+ *             "<index name>" => [{"UNIQUE",} "<field name>{(<key size>)}", ...]
+ *             ...
+ *     ],
+ * ],
+ *
+ * If you need to make any change, make sure to increment the DB_UPDATE_VERSION constant value below.
+ *
+ */
+
+use Friendica\Database\DBA;
+
+if (!defined('DB_UPDATE_VERSION')) {
+       define('DB_UPDATE_VERSION', 1320);
+}
+
+return [
+       "2fa_app_specific_password" => [
+               "comment" => "Two-factor app-specific _password",
+               "fields" => [
+                       "id" => ["type" => "mediumint unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "Password ID for revocation"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "relation" => ["user" => "uid"], "comment" => "User ID"],
+                       "description" => ["type" => "varchar(255)", "comment" => "Description of the usage of the password"],
+                       "hashed_password" => ["type" => "varchar(255)", "not null" => "1", "primary" => "1", "comment" => "Hashed password"],
+                       "generated" => ["type" => "datetime", "not null" => "1", "comment" => "Datetime the password was generated"],
+                       "last_used" => ["type" => "datetime", "comment" => "Datetime the password was last used"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uid_description" => ["uid", "description"],
+               ]
+       ],
+       "2fa_recovery_codes" => [
+               "comment" => "Two-factor authentication recovery codes",
+               "fields" => [
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "primary" => "1", "relation" => ["user" => "uid"], "comment" => "User ID"],
+                       "code" => ["type" => "varchar(50)", "not null" => "1", "primary" => "1", "comment" => "Recovery code string"],
+                       "generated" => ["type" => "datetime", "not null" => "1", "comment" => "Datetime the code was generated"],
+                       "used" => ["type" => "datetime", "comment" => "Datetime the code was used"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["uid", "code"]
+               ]
+       ],
+       "addon" => [
+               "comment" => "registered addons",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => ""],
+                       "name" => ["type" => "varchar(50)", "not null" => "1", "default" => "", "comment" => "addon base (file)name"],
+                       "version" => ["type" => "varchar(50)", "not null" => "1", "default" => "", "comment" => "currently unused"],
+                       "installed" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "currently always 1"],
+                       "hidden" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "currently unused"],
+                       "timestamp" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => "file timestamp to check for reloads"],
+                       "plugin_admin" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 = has admin config, 0 = has no admin config"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "name" => ["UNIQUE", "name"],
+               ]
+       ],
+       "apcontact" => [
+               "comment" => "ActivityPub compatible contacts - used in the ActivityPub implementation",
+               "fields" => [
+                       "url" => ["type" => "varbinary(255)", "not null" => "1", "primary" => "1", "comment" => "URL of the contact"],
+                       "uuid" => ["type" => "varchar(255)", "comment" => ""],
+                       "type" => ["type" => "varchar(20)", "not null" => "1", "comment" => ""],
+                       "following" => ["type" => "varchar(255)", "comment" => ""],
+                       "followers" => ["type" => "varchar(255)", "comment" => ""],
+                       "inbox" => ["type" => "varchar(255)", "not null" => "1", "comment" => ""],
+                       "outbox" => ["type" => "varchar(255)", "comment" => ""],
+                       "sharedinbox" => ["type" => "varchar(255)", "comment" => ""],
+                       "manually-approve" => ["type" => "boolean", "comment" => ""],
+                       "nick" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "name" => ["type" => "varchar(255)", "comment" => ""],
+                       "about" => ["type" => "text", "comment" => ""],
+                       "photo" => ["type" => "varchar(255)", "comment" => ""],
+                       "addr" => ["type" => "varchar(255)", "comment" => ""],
+                       "alias" => ["type" => "varchar(255)", "comment" => ""],
+                       "pubkey" => ["type" => "text", "comment" => ""],
+                       "baseurl" => ["type" => "varchar(255)", "comment" => "baseurl of the ap contact"],
+                       "generator" => ["type" => "varchar(255)", "comment" => "Name of the contact's system"],
+                       "updated" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""]
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["url"],
+                       "addr" => ["addr(32)"],
+                       "alias" => ["alias(190)"],
+                       "url" => ["followers(190)"]
+               ]
+       ],
+       "attach" => [
+               "comment" => "file attachments",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "generated index"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
+                       "hash" => ["type" => "varchar(64)", "not null" => "1", "default" => "", "comment" => "hash"],
+                       "filename" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "filename of original"],
+                       "filetype" => ["type" => "varchar(64)", "not null" => "1", "default" => "", "comment" => "mimetype"],
+                       "filesize" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => "size in bytes"],
+                       "data" => ["type" => "longblob", "not null" => "1", "comment" => "file data"],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "creation time"],
+                       "edited" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "last edit time"],
+                       "allow_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed contact.id '<19><78>"],
+                       "allow_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed groups"],
+                       "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"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+               ]
+       ],
+       "auth_codes" => [
+               "comment" => "OAuth usage",
+               "fields" => [
+                       "id" => ["type" => "varchar(40)", "not null" => "1", "primary" => "1", "comment" => ""],
+                       "client_id" => ["type" => "varchar(20)", "not null" => "1", "default" => "", "relation" => ["clients" => "client_id"],
+                               "comment" => ""],
+                       "redirect_uri" => ["type" => "varchar(200)", "not null" => "1", "default" => "", "comment" => ""],
+                       "expires" => ["type" => "int", "not null" => "1", "default" => "0", "comment" => ""],
+                       "scope" => ["type" => "varchar(250)", "not null" => "1", "default" => "", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+               ]
+       ],
+       "cache" => [
+               "comment" => "Stores temporary data",
+               "fields" => [
+                       "k" => ["type" => "varbinary(255)", "not null" => "1", "primary" => "1", "comment" => "cache key"],
+                       "v" => ["type" => "mediumtext", "comment" => "cached serialized value"],
+                       "expires" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "datetime of cache expiration"],
+                       "updated" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "datetime of cache insertion"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["k"],
+                       "k_expires" => ["k", "expires"],
+               ]
+       ],
+       "challenge" => [
+               "comment" => "",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "challenge" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "dfrn-id" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "expire" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "type" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "last_update" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+               ]
+       ],
+       "clients" => [
+               "comment" => "OAuth usage",
+               "fields" => [
+                       "client_id" => ["type" => "varchar(20)", "not null" => "1", "primary" => "1", "comment" => ""],
+                       "pw" => ["type" => "varchar(20)", "not null" => "1", "default" => "", "comment" => ""],
+                       "redirect_uri" => ["type" => "varchar(200)", "not null" => "1", "default" => "", "comment" => ""],
+                       "name" => ["type" => "text", "comment" => ""],
+                       "icon" => ["type" => "text", "comment" => ""],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["client_id"],
+               ]
+       ],
+       "config" => [
+               "comment" => "main configuration storage",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => ""],
+                       "cat" => ["type" => "varbinary(50)", "not null" => "1", "default" => "", "comment" => ""],
+                       "k" => ["type" => "varbinary(50)", "not null" => "1", "default" => "", "comment" => ""],
+                       "v" => ["type" => "mediumtext", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "cat_k" => ["UNIQUE", "cat", "k"],
+               ]
+       ],
+       "contact" => [
+               "comment" => "contact table",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "updated" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => "Date of last contact update"],
+                       "self" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 if the contact is the user him/her self"],
+                       "remote_self" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "rel" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => "The kind of the relation between the user and the contact"],
+                       "duplex" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "network" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => "Network of the contact"],
+                       "protocol" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => "Protocol of the contact"],
+                       "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Name that this contact is known by"],
+                       "nick" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Nick- and user name of the contact"],
+                       "location" => ["type" => "varchar(255)", "default" => "", "comment" => ""],
+                       "about" => ["type" => "text", "comment" => ""],
+                       "keywords" => ["type" => "text", "comment" => "public keywords (interests) of the contact"],
+                       "gender" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => ""],
+                       "xmpp" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "attag" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "avatar" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "photo" => ["type" => "varchar(255)", "default" => "", "comment" => "Link to the profile photo of the contact"],
+                       "thumb" => ["type" => "varchar(255)", "default" => "", "comment" => "Link to the profile photo (thumb size)"],
+                       "micro" => ["type" => "varchar(255)", "default" => "", "comment" => "Link to the profile photo (micro size)"],
+                       "site-pubkey" => ["type" => "text", "comment" => ""],
+                       "issued-id" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "dfrn-id" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "nurl" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "addr" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "alias" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "pubkey" => ["type" => "text", "comment" => "RSA public key 4096 bit"],
+                       "prvkey" => ["type" => "text", "comment" => "RSA private key 4096 bit"],
+                       "batch" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "request" => ["type" => "varchar(255)", "comment" => ""],
+                       "notify" => ["type" => "varchar(255)", "comment" => ""],
+                       "poll" => ["type" => "varchar(255)", "comment" => ""],
+                       "confirm" => ["type" => "varchar(255)", "comment" => ""],
+                       "poco" => ["type" => "varchar(255)", "comment" => ""],
+                       "aes_allow" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "ret-aes" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "usehub" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "subhub" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "hub-verify" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "last-update" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of the last try to update the contact info"],
+                       "success_update" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of the last successful contact update"],
+                       "failure_update" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of the last failed update"],
+                       "name-date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "uri-date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "avatar-date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "term-date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "last-item" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "date of the last post"],
+                       "priority" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "blocked" => ["type" => "boolean", "not null" => "1", "default" => "1", "comment" => "Node-wide block status"],
+                       "block_reason" => ["type" => "text", "comment" => "Node-wide block reason"],
+                       "readonly" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "posts of the contact are readonly"],
+                       "writable" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "forum" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "contact is a forum"],
+                       "prv" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "contact is a private group"],
+                       "contact-type" => ["type" => "tinyint", "not null" => "1", "default" => "0", "comment" => ""],
+                       "hidden" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "archive" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "pending" => ["type" => "boolean", "not null" => "1", "default" => "1", "comment" => ""],
+                       "deleted" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Contact has been deleted"],
+                       "rating" => ["type" => "tinyint", "not null" => "1", "default" => "0", "comment" => ""],
+                       "unsearchable" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Contact prefers to not be searchable"],
+                       "sensitive" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Contact posts sensitive content"],
+                       "baseurl" => ["type" => "varchar(255)", "default" => "", "comment" => "baseurl of the contact"],
+                       "reason" => ["type" => "text", "comment" => ""],
+                       "closeness" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "99", "comment" => ""],
+                       "info" => ["type" => "mediumtext", "comment" => ""],
+                       "profile-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "bdyear" => ["type" => "varchar(4)", "not null" => "1", "default" => "", "comment" => ""],
+                       "bd" => ["type" => "date", "not null" => "1", "default" => DBA::NULL_DATE, "comment" => ""],
+                       "notify_new_posts" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "fetch_further_information" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "ffi_keyword_blacklist" => ["type" => "text", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uid_name" => ["uid", "name(190)"],
+                       "self_uid" => ["self", "uid"],
+                       "alias_uid" => ["alias(32)", "uid"],
+                       "pending_uid" => ["pending", "uid"],
+                       "blocked_uid" => ["blocked", "uid"],
+                       "uid_rel_network_poll" => ["uid", "rel", "network", "poll(64)", "archive"],
+                       "uid_network_batch" => ["uid", "network", "batch(64)"],
+                       "addr_uid" => ["addr(32)", "uid"],
+                       "nurl_uid" => ["nurl(32)", "uid"],
+                       "nick_uid" => ["nick(32)", "uid"],
+                       "dfrn-id" => ["dfrn-id(64)"],
+                       "issued-id" => ["issued-id(64)"],
+               ]
+       ],
+       "conv" => [
+               "comment" => "private messages",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "guid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "A unique identifier for this conversation"],
+                       "recips" => ["type" => "text", "comment" => "sender_handle;recipient_handle"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
+                       "creator" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "handle of creator"],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "creation timestamp"],
+                       "updated" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "edited timestamp"],
+                       "subject" => ["type" => "text", "comment" => "subject of initial message"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uid" => ["uid"],
+               ]
+       ],
+       "conversation" => [
+               "comment" => "Raw data and structure information for messages",
+               "fields" => [
+                       "item-uri" => ["type" => "varbinary(255)", "not null" => "1", "primary" => "1", "comment" => "Original URI of the item - unrelated to the table with the same name"],
+                       "reply-to-uri" => ["type" => "varbinary(255)", "not null" => "1", "default" => "", "comment" => "URI to which this item is a reply"],
+                       "conversation-uri" => ["type" => "varbinary(255)", "not null" => "1", "default" => "", "comment" => "GNU Social conversation URI"],
+                       "conversation-href" => ["type" => "varbinary(255)", "not null" => "1", "default" => "", "comment" => "GNU Social conversation link"],
+                       "protocol" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "255", "comment" => "The protocol of the item"],
+                       "source" => ["type" => "mediumtext", "comment" => "Original source"],
+                       "received" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Receiving date"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["item-uri"],
+                       "conversation-uri" => ["conversation-uri"],
+                       "received" => ["received"],
+               ]
+       ],
+       "diaspora-interaction" => [
+               "comment" => "Signed Diaspora Interaction",
+               "fields" => [
+                       "uri-id" => ["type" => "int unsigned", "not null" => "1", "primary" => "1", "relation" => ["item-uri" => "id"], "comment" => "Id of the item-uri table entry that contains the item uri"],
+                       "interaction" => ["type" => "mediumtext", "comment" => "The Diaspora interaction"]
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["uri-id"]
+               ]
+       ],
+       "event" => [
+               "comment" => "Events",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "guid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
+                       "cid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "contact_id (ID of the contact in contact table)"],
+                       "uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "creation time"],
+                       "edited" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "last edit time"],
+                       "start" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "event start time"],
+                       "finish" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "event end time"],
+                       "summary" => ["type" => "text", "comment" => "short description or title of the event"],
+                       "desc" => ["type" => "text", "comment" => "event description"],
+                       "location" => ["type" => "text", "comment" => "event location"],
+                       "type" => ["type" => "varchar(20)", "not null" => "1", "default" => "", "comment" => "event or birthday"],
+                       "nofinish" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "if event does have no end this is 1"],
+                       "adjust" => ["type" => "boolean", "not null" => "1", "default" => "1", "comment" => "adjust to timezone of the recipient (0 or 1)"],
+                       "ignore" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "0 or 1"],
+                       "allow_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed contact.id '<19><78>'"],
+                       "allow_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed groups"],
+                       "deny_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied contact.id"],
+                       "deny_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied groups"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uid_start" => ["uid", "start"],
+               ]
+       ],
+       "fcontact" => [
+               "comment" => "Diaspora compatible contacts - used in the Diaspora implementation",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "guid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "unique id"],
+                       "url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "photo" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "request" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "nick" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "addr" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "batch" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "notify" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "poll" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "confirm" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "priority" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "network" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => ""],
+                       "alias" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "pubkey" => ["type" => "text", "comment" => ""],
+                       "updated" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "addr" => ["addr(32)"],
+                       "url" => ["UNIQUE", "url(190)"],
+               ]
+       ],
+       "fsuggest" => [
+               "comment" => "friend suggestion stuff",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => ""],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "cid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => ""],
+                       "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "request" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "photo" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "note" => ["type" => "text", "comment" => ""],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+               ]
+       ],
+       "gcign" => [
+               "comment" => "contacts ignored by friend suggestions",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Local User id"],
+                       "gcid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["gcontact" => "id"], "comment" => "gcontact.id of ignored contact"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uid" => ["uid"],
+                       "gcid" => ["gcid"],
+               ]
+       ],
+       "gcontact" => [
+               "comment" => "global contacts",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Name that this contact is known by"],
+                       "nick" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Nick- and user name of the contact"],
+                       "url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Link to the contacts profile page"],
+                       "nurl" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "photo" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Link to the profile photo"],
+                       "connect" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "updated" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "last_contact" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "last_failure" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "archive_date" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "archived" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "location" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "about" => ["type" => "text", "comment" => ""],
+                       "keywords" => ["type" => "text", "comment" => "puplic keywords (interests)"],
+                       "gender" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => ""],
+                       "birthday" => ["type" => "varchar(32)", "not null" => "1", "default" => DBA::NULL_DATE, "comment" => ""],
+                       "community" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 if contact is forum account"],
+                       "contact-type" => ["type" => "tinyint", "not null" => "1", "default" => "-1", "comment" => ""],
+                       "hide" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 = should be hidden from search"],
+                       "nsfw" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 = contact posts nsfw content"],
+                       "network" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => "social network protocol"],
+                       "addr" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "notify" => ["type" => "varchar(255)", "comment" => ""],
+                       "alias" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "generation" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "server_url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "baseurl of the contacts server"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "nurl" => ["UNIQUE", "nurl(190)"],
+                       "name" => ["name(64)"],
+                       "nick" => ["nick(32)"],
+                       "addr" => ["addr(64)"],
+                       "hide_network_updated" => ["hide", "network", "updated"],
+                       "updated" => ["updated"],
+               ]
+       ],
+       "glink" => [
+               "comment" => "'friends of friends' linkages derived from poco",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "cid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => ""],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "gcid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["gcontact" => "id"], "comment" => ""],
+                       "zcid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["gcontact" => "id"], "comment" => ""],
+                       "updated" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "cid_uid_gcid_zcid" => ["UNIQUE", "cid", "uid", "gcid", "zcid"],
+                       "gcid" => ["gcid"],
+               ]
+       ],
+       "group" => [
+               "comment" => "privacy groups, group info",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
+                       "visible" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 indicates the member list is not private"],
+                       "deleted" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 indicates the group has been deleted"],
+                       "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "human readable name of group"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uid" => ["uid"],
+               ]
+       ],
+       "group_member" => [
+               "comment" => "privacy groups, member info",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "gid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["group" => "id"], "comment" => "groups.id of the associated group"],
+                       "contact-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "contact.id of the member assigned to the associated group"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "contactid" => ["contact-id"],
+                       "gid_contactid" => ["UNIQUE", "gid", "contact-id"],
+               ]
+       ],
+       "gserver" => [
+               "comment" => "Global servers",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "nurl" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "version" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "site_name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "info" => ["type" => "text", "comment" => ""],
+                       "register_policy" => ["type" => "tinyint", "not null" => "1", "default" => "0", "comment" => ""],
+                       "registered-users" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => "Number of registered users"],
+                       "poco" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "noscrape" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "network" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => ""],
+                       "platform" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "relay-subscribe" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Has the server subscribed to the relay system"],
+                       "relay-scope" => ["type" => "varchar(10)", "not null" => "1", "default" => "", "comment" => "The scope of messages that the server wants to get"],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "last_poco_query" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "last_contact" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "last_failure" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "nurl" => ["UNIQUE", "nurl(190)"],
+               ]
+       ],
+       "gserver-tag" => [
+               "comment" => "Tags that the server has subscribed",
+               "fields" => [
+                       "gserver-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["gserver" => "id"], "primary" => "1",
+                               "comment" => "The id of the gserver"],
+                       "tag" => ["type" => "varchar(100)", "not null" => "1", "default" => "", "primary" => "1", "comment" => "Tag that the server has subscribed"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["gserver-id", "tag"],
+                       "tag" => ["tag"],
+               ]
+       ],
+       "hook" => [
+               "comment" => "addon hook registry",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "hook" => ["type" => "varbinary(100)", "not null" => "1", "default" => "", "comment" => "name of hook"],
+                       "file" => ["type" => "varbinary(200)", "not null" => "1", "default" => "", "comment" => "relative filename of hook handler"],
+                       "function" => ["type" => "varbinary(200)", "not null" => "1", "default" => "", "comment" => "function name of hook handler"],
+                       "priority" => ["type" => "smallint unsigned", "not null" => "1", "default" => "0", "comment" => "not yet implemented - can be used to sort conflicts in hook handling by calling handlers in priority order"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "hook_file_function" => ["UNIQUE", "hook", "file", "function"],
+               ]
+       ],
+       "inbox-status" => [
+               "comment" => "Status of ActivityPub inboxes",
+               "fields" => [
+                       "url" => ["type" => "varbinary(255)", "not null" => "1", "primary" => "1", "comment" => "URL of the inbox"],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Creation date of this entry"],
+                       "success" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of the last successful delivery"],
+                       "failure" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of the last failed delivery"],
+                       "previous" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Previous delivery date"],
+                       "archive" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Is the inbox archived?"],
+                       "shared" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Is it a shared inbox?"]
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["url"]
+               ]
+       ],
+       "intro" => [
+               "comment" => "",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "fid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["fcontact" => "id"], "comment" => ""],
+                       "contact-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => ""],
+                       "knowyou" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "duplex" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "note" => ["type" => "text", "comment" => ""],
+                       "hash" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "datetime" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "blocked" => ["type" => "boolean", "not null" => "1", "default" => "1", "comment" => ""],
+                       "ignore" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+               ]
+       ],
+       "item" => [
+               "comment" => "Structure for all posts",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "relation" => ["thread" => "iid"]],
+                       "guid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "A unique identifier for this item"],
+                       "uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "uri-id" => ["type" => "int unsigned", "relation" => ["item-uri" => "id"], "comment" => "Id of the item-uri table entry that contains the item uri"],
+                       "uri-hash" => ["type" => "varchar(80)", "not null" => "1", "default" => "", "comment" => "RIPEMD-128 hash from uri"],
+                       "parent" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["item" => "id"], "comment" => "item.id of the parent to this item if it is a reply of some form; otherwise this must be set to the id of this item"],
+                       "parent-uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "uri of the parent to this item"],
+                       "parent-uri-id" => ["type" => "int unsigned", "relation" => ["item-uri" => "id"], "comment" => "Id of the item-uri table that contains the parent uri"],
+                       "thr-parent" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "If the parent of this item is not the top-level item in the conversation, the uri of the immediate parent; otherwise set to parent-uri"],
+                       "thr-parent-id" => ["type" => "int unsigned", "relation" => ["item-uri" => "id"], "comment" => "Id of the item-uri table that contains the thread parent uri"],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Creation timestamp."],
+                       "edited" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of last edit (default is created)"],
+                       "commented" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of last comment/reply to this item"],
+                       "received" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "datetime"],
+                       "changed" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date that something in the conversation changed, indicating clients should fetch the conversation again"],
+                       "gravity" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "network" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => "Network from where the item comes from"],
+                       "owner-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "Link to the contact table with uid=0 of the owner of this item"],
+                       "author-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "Link to the contact table with uid=0 of the author of this item"],
+                       "icid" => ["type" => "int unsigned", "relation" => ["item-content" => "id"], "comment" => "Id of the item-content table entry that contains the whole item content"],
+                       "iaid" => ["type" => "int unsigned", "relation" => ["item-activity" => "id"], "comment" => "Id of the item-activity table entry that contains the activity data"],
+                       "extid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "post-type" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => "Post type (personal note, bookmark, ...)"],
+                       "global" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "private" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "distribution is restricted"],
+                       "visible" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "moderated" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "deleted" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "item has been deleted"],
+                       // User specific fields. Eventually they will move to user-item
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner id which owns this copy of the item"],
+                       "contact-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "contact.id"],
+                       "wall" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "This item was posted to the wall of uid"],
+                       "origin" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "item originated at this site"],
+                       "pubmail" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "starred" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "item has been favourited"],
+                       "unseen" => ["type" => "boolean", "not null" => "1", "default" => "1", "comment" => "item has not been seen"],
+                       "mention" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "The owner of this item was mentioned in it"],
+                       "forum_mode" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "psid" => ["type" => "int unsigned", "relation" => ["permissionset" => "id"], "comment" => "ID of the permission set of this post"],
+                       // It has to be decided whether these fields belong to the user or the structure
+                       "resource-id" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => "Used to link other tables to items, it identifies the linked resource (e.g. photo) and if set must also set resource_type"],
+                       "event-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["event" => "id"], "comment" => "Used to link to the event.id"],
+                       // Could possibly be replaced by the "attach" table?
+                       "attach" => ["type" => "mediumtext", "comment" => "JSON structure representing attachments to this item"],
+                       // Deprecated fields. Will be removed in upcoming versions
+                       "allow_cid" => ["type" => "mediumtext", "comment" => "Deprecated"],
+                       "allow_gid" => ["type" => "mediumtext", "comment" => "Deprecated"],
+                       "deny_cid" => ["type" => "mediumtext", "comment" => "Deprecated"],
+                       "deny_gid" => ["type" => "mediumtext", "comment" => "Deprecated"],
+                       "postopts" => ["type" => "text", "comment" => "Deprecated"],
+                       "inform" => ["type" => "mediumtext", "comment" => "Deprecated"],
+                       "type" => ["type" => "varchar(20)", "comment" => "Deprecated"],
+                       "bookmark" => ["type" => "boolean", "comment" => "Deprecated"],
+                       "file" => ["type" => "mediumtext", "comment" => "Deprecated"],
+                       "location" => ["type" => "varchar(255)", "comment" => "Deprecated"],
+                       "coord" => ["type" => "varchar(255)", "comment" => "Deprecated"],
+                       "tag" => ["type" => "mediumtext", "comment" => "Deprecated"],
+                       "plink" => ["type" => "varchar(255)", "comment" => "Deprecated"],
+                       "title" => ["type" => "varchar(255)", "comment" => "Deprecated"],
+                       "content-warning" => ["type" => "varchar(255)", "comment" => "Deprecated"],
+                       "body" => ["type" => "mediumtext", "comment" => "Deprecated"],
+                       "app" => ["type" => "varchar(255)", "comment" => "Deprecated"],
+                       "verb" => ["type" => "varchar(100)", "comment" => "Deprecated"],
+                       "object-type" => ["type" => "varchar(100)", "comment" => "Deprecated"],
+                       "object" => ["type" => "text", "comment" => "Deprecated"],
+                       "target-type" => ["type" => "varchar(100)", "comment" => "Deprecated"],
+                       "target" => ["type" => "text", "comment" => "Deprecated"],
+                       "author-name" => ["type" => "varchar(255)", "comment" => "Deprecated"],
+                       "author-link" => ["type" => "varchar(255)", "comment" => "Deprecated"],
+                       "author-avatar" => ["type" => "varchar(255)", "comment" => "Deprecated"],
+                       "owner-name" => ["type" => "varchar(255)", "comment" => "Deprecated"],
+                       "owner-link" => ["type" => "varchar(255)", "comment" => "Deprecated"],
+                       "owner-avatar" => ["type" => "varchar(255)", "comment" => "Deprecated"],
+                       "rendered-hash" => ["type" => "varchar(32)", "comment" => "Deprecated"],
+                       "rendered-html" => ["type" => "mediumtext", "comment" => "Deprecated"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "guid" => ["guid(191)"],
+                       "uri" => ["uri(191)"],
+                       "parent" => ["parent"],
+                       "parent-uri" => ["parent-uri(191)"],
+                       "extid" => ["extid(191)"],
+                       "uid_id" => ["uid", "id"],
+                       "uid_contactid_id" => ["uid", "contact-id", "id"],
+                       "uid_received" => ["uid", "received"],
+                       "uid_commented" => ["uid", "commented"],
+                       "uid_unseen_contactid" => ["uid", "unseen", "contact-id"],
+                       "uid_network_received" => ["uid", "network", "received"],
+                       "uid_network_commented" => ["uid", "network", "commented"],
+                       "uid_thrparent" => ["uid", "thr-parent(190)"],
+                       "uid_parenturi" => ["uid", "parent-uri(190)"],
+                       "uid_contactid_received" => ["uid", "contact-id", "received"],
+                       "authorid_received" => ["author-id", "received"],
+                       "ownerid" => ["owner-id"],
+                       "contact-id" => ["contact-id"],
+                       "uid_uri" => ["uid", "uri(190)"],
+                       "resource-id" => ["resource-id"],
+                       "deleted_changed" => ["deleted", "changed"],
+                       "uid_wall_changed" => ["uid", "wall", "changed"],
+                       "uid_eventid" => ["uid", "event-id"],
+                       "icid" => ["icid"],
+                       "iaid" => ["iaid"],
+                       "psid_wall" => ["psid", "wall"],
+               ]
+       ],
+       "item-activity" => [
+               "comment" => "Activities for items",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "relation" => ["thread" => "iid"]],
+                       "uri" => ["type" => "varchar(255)", "comment" => ""],
+                       "uri-id" => ["type" => "int unsigned", "relation" => ["item-uri" => "id"], "comment" => "Id of the item-uri table entry that contains the item uri"],
+                       "uri-hash" => ["type" => "varchar(80)", "not null" => "1", "default" => "", "comment" => "RIPEMD-128 hash from uri"],
+                       "activity" => ["type" => "smallint unsigned", "not null" => "1", "default" => "0", "comment" => ""]
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uri-hash" => ["UNIQUE", "uri-hash"],
+                       "uri" => ["uri(191)"],
+                       "uri-id" => ["uri-id"]
+               ]
+       ],
+       "item-content" => [
+               "comment" => "Content for all posts",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "relation" => ["thread" => "iid"]],
+                       "uri" => ["type" => "varchar(255)", "comment" => ""],
+                       "uri-id" => ["type" => "int unsigned", "relation" => ["item-uri" => "id"], "comment" => "Id of the item-uri table entry that contains the item uri"],
+                       "uri-plink-hash" => ["type" => "varchar(80)", "not null" => "1", "default" => "", "comment" => "RIPEMD-128 hash from uri"],
+                       "title" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "item title"],
+                       "content-warning" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "body" => ["type" => "mediumtext", "comment" => "item body content"],
+                       "location" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "text location where this item originated"],
+                       "coord" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "longitude/latitude pair representing location where this item originated"],
+                       "language" => ["type" => "text", "comment" => "Language information about this post"],
+                       "app" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "application which generated this item"],
+                       "rendered-hash" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => ""],
+                       "rendered-html" => ["type" => "mediumtext", "comment" => "item.body converted to html"],
+                       "object-type" => ["type" => "varchar(100)", "not null" => "1", "default" => "", "comment" => "ActivityStreams object type"],
+                       "object" => ["type" => "text", "comment" => "JSON encoded object structure unless it is an implied object (normal post)"],
+                       "target-type" => ["type" => "varchar(100)", "not null" => "1", "default" => "", "comment" => "ActivityStreams target type if applicable (URI)"],
+                       "target" => ["type" => "text", "comment" => "JSON encoded target structure if used"],
+                       "plink" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "permalink or URL to a displayable copy of the message at its source"],
+                       "verb" => ["type" => "varchar(100)", "not null" => "1", "default" => "", "comment" => "ActivityStreams verb"]
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uri-plink-hash" => ["UNIQUE", "uri-plink-hash"],
+                       "uri" => ["uri(191)"],
+                       "plink" => ["plink(191)"],
+                       "uri-id" => ["uri-id"]
+               ]
+       ],
+       "item-delivery-data" => [
+               "comment" => "Delivery data for items",
+               "fields" => [
+                       "iid" => ["type" => "int unsigned", "not null" => "1", "primary" => "1", "relation" => ["item" => "id"], "comment" => "Item id"],
+                       "postopts" => ["type" => "text", "comment" => "External post connectors add their network name to this comma-separated string to identify that they should be delivered to these networks during delivery"],
+                       "inform" => ["type" => "mediumtext", "comment" => "Additional receivers of the linked item"],
+                       "queue_count" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Initial number of delivery recipients, used as item.delivery_queue_count"],
+                       "queue_done" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Number of successful deliveries, used as item.delivery_queue_done"],
+                       "activitypub" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Number of successful deliveries via ActivityPub"],
+                       "dfrn" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Number of successful deliveries via DFRN"],
+                       "legacy_dfrn" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Number of successful deliveries via legacy DFRN"],
+                       "diaspora" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Number of successful deliveries via Diaspora"],
+                       "ostatus" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Number of successful deliveries via OStatus"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["iid"],
+               ]
+       ],
+       "item-uri" => [
+               "comment" => "URI and GUID for items",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1"],
+                       "uri" => ["type" => "varbinary(255)", "not null" => "1", "comment" => "URI of an item"],
+                       "guid" => ["type" => "varbinary(255)", "comment" => "A unique identifier for an item"]
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uri" => ["UNIQUE", "uri"],
+                       "guid" => ["guid"]
+               ]
+       ],
+       "locks" => [
+               "comment" => "",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "name" => ["type" => "varchar(128)", "not null" => "1", "default" => "", "comment" => ""],
+                       "locked" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "pid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => "Process ID"],
+                       "expires" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "datetime of cache expiration"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "name_expires" => ["name", "expires"]
+               ]
+       ],
+       "mail" => [
+               "comment" => "private messages",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
+                       "guid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "A unique identifier for this private message"],
+                       "from-name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "name of the sender"],
+                       "from-photo" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "contact photo link of the sender"],
+                       "from-url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "profile linke of the sender"],
+                       "contact-id" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "relation" => ["contact" => "id"], "comment" => "contact.id"],
+                       "convid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["conv" => "id"], "comment" => "conv.id"],
+                       "title" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "body" => ["type" => "mediumtext", "comment" => ""],
+                       "seen" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "if message visited it is 1"],
+                       "reply" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "replied" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "unknown" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "if sender not in the contact table this is 1"],
+                       "uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "parent-uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "creation time of the private message"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uid_seen" => ["uid", "seen"],
+                       "convid" => ["convid"],
+                       "uri" => ["uri(64)"],
+                       "parent-uri" => ["parent-uri(64)"],
+                       "contactid" => ["contact-id(32)"],
+               ]
+       ],
+       "mailacct" => [
+               "comment" => "Mail account data for fetching mails",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "server" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "port" => ["type" => "smallint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "ssltype" => ["type" => "varchar(16)", "not null" => "1", "default" => "", "comment" => ""],
+                       "mailbox" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "user" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "pass" => ["type" => "text", "comment" => ""],
+                       "reply_to" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "action" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "movetofolder" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "pubmail" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "last_check" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+               ]
+       ],
+       "manage" => [
+               "comment" => "table of accounts that can manage each other",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "mid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uid_mid" => ["UNIQUE", "uid", "mid"],
+               ]
+       ],
+       "notify" => [
+               "comment" => "notifications",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "hash" => ["type" => "varchar(64)", "not null" => "1", "default" => "", "comment" => ""],
+                       "type" => ["type" => "smallint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "photo" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "msg" => ["type" => "mediumtext", "comment" => ""],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
+                       "link" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "iid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["item" => "id"], "comment" => "item.id"],
+                       "parent" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["item" => "id"], "comment" => ""],
+                       "seen" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "verb" => ["type" => "varchar(100)", "not null" => "1", "default" => "", "comment" => ""],
+                       "otype" => ["type" => "varchar(10)", "not null" => "1", "default" => "", "comment" => ""],
+                       "name_cache" => ["type" => "tinytext", "comment" => "Cached bbcode parsing of name"],
+                       "msg_cache" => ["type" => "mediumtext", "comment" => "Cached bbcode parsing of msg"]
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "hash_uid" => ["hash", "uid"],
+                       "seen_uid_date" => ["seen", "uid", "date"],
+                       "uid_date" => ["uid", "date"],
+                       "uid_type_link" => ["uid", "type", "link(190)"],
+               ]
+       ],
+       "notify-threads" => [
+               "comment" => "",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "notify-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["notify" => "id"], "comment" => ""],
+                       "master-parent-item" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["item" => "id"],
+                               "comment" => ""],
+                       "parent-item" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "receiver-uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"],
+                               "comment" => "User id"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+               ]
+       ],
+       "oembed" => [
+               "comment" => "cache for OEmbed queries",
+               "fields" => [
+                       "url" => ["type" => "varbinary(255)", "not null" => "1", "primary" => "1", "comment" => "page url"],
+                       "maxwidth" => ["type" => "mediumint unsigned", "not null" => "1", "primary" => "1", "comment" => "Maximum width passed to Oembed"],
+                       "content" => ["type" => "mediumtext", "comment" => "OEmbed data of the page"],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "datetime of creation"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["url", "maxwidth"],
+                       "created" => ["created"],
+               ]
+       ],
+       "openwebauth-token" => [
+               "comment" => "Store OpenWebAuth token to verify contacts",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "type" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => "Verify type"],
+                       "token" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "A generated token"],
+                       "meta" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "datetime of creation"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+               ]
+       ],
+       "parsed_url" => [
+               "comment" => "cache for 'parse_url' queries",
+               "fields" => [
+                       "url" => ["type" => "varbinary(255)", "not null" => "1", "primary" => "1", "comment" => "page url"],
+                       "guessing" => ["type" => "boolean", "not null" => "1", "default" => "0", "primary" => "1", "comment" => "is the 'guessing' mode active?"],
+                       "oembed" => ["type" => "boolean", "not null" => "1", "default" => "0", "primary" => "1", "comment" => "is the data the result of oembed?"],
+                       "content" => ["type" => "mediumtext", "comment" => "page data"],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "datetime of creation"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["url", "guessing", "oembed"],
+                       "created" => ["created"],
+               ]
+       ],
+       "participation" => [
+               "comment" => "Storage for participation messages from Diaspora",
+               "fields" => [
+                       "iid" => ["type" => "int unsigned", "not null" => "1", "primary" => "1", "relation" => ["item" => "id"], "comment" => ""],
+                       "server" => ["type" => "varchar(60)", "not null" => "1", "primary" => "1", "comment" => ""],
+                       "cid" => ["type" => "int unsigned", "not null" => "1", "relation" => ["contact" => "id"], "comment" => ""],
+                       "fid" => ["type" => "int unsigned", "not null" => "1", "relation" => ["fcontact" => "id"], "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["iid", "server"],
+                       "cid" => ["cid"],
+                       "fid" => ["fid"]
+               ]
+       ],
+       "pconfig" => [
+               "comment" => "personal (per user) configuration storage",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => ""],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "cat" => ["type" => "varbinary(50)", "not null" => "1", "default" => "", "comment" => ""],
+                       "k" => ["type" => "varbinary(100)", "not null" => "1", "default" => "", "comment" => ""],
+                       "v" => ["type" => "mediumtext", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uid_cat_k" => ["UNIQUE", "uid", "cat", "k"],
+               ]
+       ],
+       "permissionset" => [
+               "comment" => "",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner id of this permission set"],
+                       "allow_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed contact.id '<19><78>'"],
+                       "allow_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed groups"],
+                       "deny_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied contact.id"],
+                       "deny_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied groups"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uid_allow_cid_allow_gid_deny_cid_deny_gid" => ["allow_cid(50)", "allow_gid(30)", "deny_cid(50)", "deny_gid(30)"],
+               ]
+       ],
+       "photo" => [
+               "comment" => "photo storage",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
+                       "contact-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "contact.id"],
+                       "guid" => ["type" => "char(16)", "not null" => "1", "default" => "", "comment" => "A unique identifier for this photo"],
+                       "resource-id" => ["type" => "char(32)", "not null" => "1", "default" => "", "comment" => ""],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "creation date"],
+                       "edited" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "last edited date"],
+                       "title" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "desc" => ["type" => "text", "comment" => ""],
+                       "album" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "The name of the album to which the photo belongs"],
+                       "filename" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "type" => ["type" => "varchar(30)", "not null" => "1", "default" => "image/jpeg"],
+                       "height" => ["type" => "smallint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "width" => ["type" => "smallint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "datasize" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "data" => ["type" => "mediumblob", "not null" => "1", "comment" => ""],
+                       "scale" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "profile" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "allow_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed contact.id '<19><78>'"],
+                       "allow_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed groups"],
+                       "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"],
+                       "updated" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""]
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "contactid" => ["contact-id"],
+                       "uid_contactid" => ["uid", "contact-id"],
+                       "uid_profile" => ["uid", "profile"],
+                       "uid_album_scale_created" => ["uid", "album(32)", "scale", "created"],
+                       "uid_album_resource-id_created" => ["uid", "album(32)", "resource-id", "created"],
+                       "resource-id" => ["resource-id"],
+               ]
+       ],
+       "poll" => [
+               "comment" => "Currently unused table for storing poll results",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => ""],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "q0" => ["type" => "text", "comment" => ""],
+                       "q1" => ["type" => "text", "comment" => ""],
+                       "q2" => ["type" => "text", "comment" => ""],
+                       "q3" => ["type" => "text", "comment" => ""],
+                       "q4" => ["type" => "text", "comment" => ""],
+                       "q5" => ["type" => "text", "comment" => ""],
+                       "q6" => ["type" => "text", "comment" => ""],
+                       "q7" => ["type" => "text", "comment" => ""],
+                       "q8" => ["type" => "text", "comment" => ""],
+                       "q9" => ["type" => "text", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uid" => ["uid"],
+               ]
+       ],
+       "poll_result" => [
+               "comment" => "data for polls - currently unused",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "poll_id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["poll" => "id"]],
+                       "choice" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "poll_id" => ["poll_id"],
+               ]
+       ],
+       "process" => [
+               "comment" => "Currently running system processes",
+               "fields" => [
+                       "pid" => ["type" => "int unsigned", "not null" => "1", "primary" => "1", "comment" => ""],
+                       "command" => ["type" => "varbinary(32)", "not null" => "1", "default" => "", "comment" => ""],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["pid"],
+                       "command" => ["command"],
+               ]
+       ],
+       "profile" => [
+               "comment" => "user profiles data",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
+                       "profile-name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Name of the profile"],
+                       "is-default" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Mark this profile as default profile"],
+                       "hide-friends" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Hide friend list from viewers of this profile"],
+                       "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "pdesc" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Title or description"],
+                       "dob" => ["type" => "varchar(32)", "not null" => "1", "default" => "0000-00-00", "comment" => "Day of birth"],
+                       "address" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "locality" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "region" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "postal-code" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => ""],
+                       "country-name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "hometown" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "gender" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => ""],
+                       "marital" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "with" => ["type" => "text", "comment" => ""],
+                       "howlong" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "sexual" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "politic" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "religion" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "pub_keywords" => ["type" => "text", "comment" => ""],
+                       "prv_keywords" => ["type" => "text", "comment" => ""],
+                       "likes" => ["type" => "text", "comment" => ""],
+                       "dislikes" => ["type" => "text", "comment" => ""],
+                       "about" => ["type" => "text", "comment" => ""],
+                       "summary" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "music" => ["type" => "text", "comment" => ""],
+                       "book" => ["type" => "text", "comment" => ""],
+                       "tv" => ["type" => "text", "comment" => ""],
+                       "film" => ["type" => "text", "comment" => ""],
+                       "interest" => ["type" => "text", "comment" => ""],
+                       "romance" => ["type" => "text", "comment" => ""],
+                       "work" => ["type" => "text", "comment" => ""],
+                       "education" => ["type" => "text", "comment" => ""],
+                       "contact" => ["type" => "text", "comment" => ""],
+                       "homepage" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "xmpp" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "photo" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "thumb" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "publish" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "publish default profile in local directory"],
+                       "net-publish" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "publish profile in global directory"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uid_is-default" => ["uid", "is-default"],
+                       "pub_keywords" => ["FULLTEXT", "pub_keywords"],
+               ]
+       ],
+       "profile_check" => [
+               "comment" => "DFRN remote auth use",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "cid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "contact.id"],
+                       "dfrn_id" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "sec" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "expire" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+               ]
+       ],
+       "push_subscriber" => [
+               "comment" => "Used for OStatus: Contains feed subscribers",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "callback_url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "topic" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "nickname" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "push" => ["type" => "tinyint", "not null" => "1", "default" => "0", "comment" => "Retrial counter"],
+                       "last_update" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of last successful trial"],
+                       "next_try" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Next retrial date"],
+                       "renewed" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of last subscription renewal"],
+                       "secret" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "next_try" => ["next_try"],
+               ]
+       ],
+       "register" => [
+               "comment" => "registrations requiring admin approval",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "hash" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "password" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "language" => ["type" => "varchar(16)", "not null" => "1", "default" => "", "comment" => ""],
+                       "note" => ["type" => "text", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+               ]
+       ],
+       "search" => [
+               "comment" => "",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "term" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uid" => ["uid"],
+               ]
+       ],
+       "session" => [
+               "comment" => "web session storage",
+               "fields" => [
+                       "id" => ["type" => "bigint unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "sid" => ["type" => "varbinary(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "data" => ["type" => "text", "comment" => ""],
+                       "expire" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "sid" => ["sid(64)"],
+                       "expire" => ["expire"],
+               ]
+       ],
+       "sign" => [
+               "comment" => "Diaspora signatures",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "iid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["item" => "id"], "comment" => "item.id"],
+                       "signed_text" => ["type" => "mediumtext", "comment" => ""],
+                       "signature" => ["type" => "text", "comment" => ""],
+                       "signer" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "iid" => ["UNIQUE", "iid"],
+               ]
+       ],
+       "term" => [
+               "comment" => "item taxonomy (categories, tags, etc.) table",
+               "fields" => [
+                       "tid" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => ""],
+                       "oid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["item" => "id"], "comment" => ""],
+                       "otype" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "type" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "term" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "guid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "received" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "global" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["tid"],
+                       "term_type" => ["term(64)", "type"],
+                       "oid_otype_type_term" => ["oid", "otype", "type", "term(32)"],
+                       "uid_otype_type_term_global_created" => ["uid", "otype", "type", "term(32)", "global", "created"],
+                       "uid_otype_type_url" => ["uid", "otype", "type", "url(64)"],
+                       "guid" => ["guid(64)"],
+               ]
+       ],
+       "thread" => [
+               "comment" => "Thread related data",
+               "fields" => [
+                       "iid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "primary" => "1", "relation" => ["item" => "id"],
+                               "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "contact-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => ""],
+                       "owner-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "Item owner"],
+                       "author-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "Item author"],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "edited" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "commented" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "received" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "changed" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "wall" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "private" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "pubmail" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "moderated" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "visible" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "starred" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "ignored" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "post-type" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => "Post type (personal note, bookmark, ...)"],
+                       "unseen" => ["type" => "boolean", "not null" => "1", "default" => "1", "comment" => ""],
+                       "deleted" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "origin" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "forum_mode" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "mention" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "network" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => ""],
+                       "bookmark" => ["type" => "boolean", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["iid"],
+                       "uid_network_commented" => ["uid", "network", "commented"],
+                       "uid_network_received" => ["uid", "network", "received"],
+                       "uid_contactid_commented" => ["uid", "contact-id", "commented"],
+                       "uid_contactid_received" => ["uid", "contact-id", "received"],
+                       "contactid" => ["contact-id"],
+                       "ownerid" => ["owner-id"],
+                       "authorid" => ["author-id"],
+                       "uid_received" => ["uid", "received"],
+                       "uid_commented" => ["uid", "commented"],
+                       "uid_wall_received" => ["uid", "wall", "received"],
+                       "private_wall_origin_commented" => ["private", "wall", "origin", "commented"],
+               ]
+       ],
+       "tokens" => [
+               "comment" => "OAuth usage",
+               "fields" => [
+                       "id" => ["type" => "varchar(40)", "not null" => "1", "primary" => "1", "comment" => ""],
+                       "secret" => ["type" => "text", "comment" => ""],
+                       "client_id" => ["type" => "varchar(20)", "not null" => "1", "default" => "", "relation" => ["clients" => "client_id"]],
+                       "expires" => ["type" => "int", "not null" => "1", "default" => "0", "comment" => ""],
+                       "scope" => ["type" => "varchar(200)", "not null" => "1", "default" => "", "comment" => ""],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+               ]
+       ],
+       "user" => [
+               "comment" => "The local users",
+               "fields" => [
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "parent-uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"],
+                               "comment" => "The parent user that has full control about this user"],
+                       "guid" => ["type" => "varchar(64)", "not null" => "1", "default" => "", "comment" => "A unique identifier for this user"],
+                       "username" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Name that this user is known by"],
+                       "password" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "encrypted password"],
+                       "legacy_password" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Is the password hash double-hashed?"],
+                       "nickname" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "nick- and user name"],
+                       "email" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "the users email address"],
+                       "openid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "timezone" => ["type" => "varchar(128)", "not null" => "1", "default" => "", "comment" => "PHP-legal timezone"],
+                       "language" => ["type" => "varchar(32)", "not null" => "1", "default" => "en", "comment" => "default language"],
+                       "register_date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "timestamp of registration"],
+                       "login_date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "timestamp of last login"],
+                       "default-location" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Default for item.location"],
+                       "allow_location" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 allows to display the location"],
+                       "theme" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "user theme preference"],
+                       "pubkey" => ["type" => "text", "comment" => "RSA public key 4096 bit"],
+                       "prvkey" => ["type" => "text", "comment" => "RSA private key 4096 bit"],
+                       "spubkey" => ["type" => "text", "comment" => ""],
+                       "sprvkey" => ["type" => "text", "comment" => ""],
+                       "verified" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "user is verified through email"],
+                       "blocked" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 for user is blocked"],
+                       "blockwall" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Prohibit contacts to post to the profile page of the user"],
+                       "hidewall" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Hide profile details from unkown viewers"],
+                       "blocktags" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Prohibit contacts to tag the post of this user"],
+                       "unkmail" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Permit unknown people to send private mails to this user"],
+                       "cntunkmail" => ["type" => "int unsigned", "not null" => "1", "default" => "10", "comment" => ""],
+                       "notify-flags" => ["type" => "smallint unsigned", "not null" => "1", "default" => "65535", "comment" => "email notification options"],
+                       "page-flags" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => "page/profile type"],
+                       "account-type" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "prvnets" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "pwdreset" => ["type" => "varchar(255)", "comment" => "Password reset request token"],
+                       "pwdreset_time" => ["type" => "datetime", "comment" => "Timestamp of the last password reset request"],
+                       "maxreq" => ["type" => "int unsigned", "not null" => "1", "default" => "10", "comment" => ""],
+                       "expire" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "account_removed" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "if 1 the account is removed"],
+                       "account_expired" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "account_expires_on" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "timestamp when account expires and will be deleted"],
+                       "expire_notification_sent" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "timestamp of last warning of account expiration"],
+                       "def_gid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "allow_cid" => ["type" => "mediumtext", "comment" => "default permission for this user"],
+                       "allow_gid" => ["type" => "mediumtext", "comment" => "default permission for this user"],
+                       "deny_cid" => ["type" => "mediumtext", "comment" => "default permission for this user"],
+                       "deny_gid" => ["type" => "mediumtext", "comment" => "default permission for this user"],
+                       "openidserver" => ["type" => "text", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["uid"],
+                       "nickname" => ["nickname(32)"],
+               ]
+       ],
+       "userd" => [
+               "comment" => "Deleted usernames",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "username" => ["type" => "varchar(255)", "not null" => "1", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "username" => ["username(32)"],
+               ]
+       ],
+       "user-contact" => [
+               "comment" => "User specific public contact data",
+               "fields" => [
+                       "cid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "primary" => "1", "relation" => ["contact" => "id"], "comment" => "Contact id of the linked public contact"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "primary" => "1", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "blocked" => ["type" => "boolean", "comment" => "Contact is completely blocked for this user"],
+                       "ignored" => ["type" => "boolean", "comment" => "Posts from this contact are ignored"],
+                       "collapsed" => ["type" => "boolean", "comment" => "Posts from this contact are collapsed"]
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["uid", "cid"]
+               ]
+       ],
+       "user-item" => [
+               "comment" => "User specific item data",
+               "fields" => [
+                       "iid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "primary" => "1", "relation" => ["item" => "id"], "comment" => "Item id"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "primary" => "1", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "hidden" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Marker to hide an item from the user"],
+                       "ignored" => ["type" => "boolean", "comment" => "Ignore this thread if set"]
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["uid", "iid"]
+               ]
+       ],
+       "worker-ipc" => [
+               "comment" => "Inter process communication between the frontend and the worker",
+               "fields" => [
+                       "key" => ["type" => "int", "not null" => "1", "primary" => "1", "comment" => ""],
+                       "jobs" => ["type" => "boolean", "comment" => "Flag for outstanding jobs"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["key"],
+               ],
+               "engine" => "MEMORY",
+       ],
+       "workerqueue" => [
+               "comment" => "Background tasks queue entries",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "Auto incremented worker task id"],
+                       "parameter" => ["type" => "mediumtext", "comment" => "Task command"],
+                       "priority" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => "Task priority"],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Creation date"],
+                       "pid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => "Process id of the worker"],
+                       "executed" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Execution date"],
+                       "next_try" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Next retrial date"],
+                       "retrial" => ["type" => "tinyint", "not null" => "1", "default" => "0", "comment" => "Retrial counter"],
+                       "done" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Marked 1 when the task was done - will be deleted later"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "done_parameter" => ["done", "parameter(64)"],
+                       "done_executed" => ["done", "executed"],
+                       "done_priority_created" => ["done", "priority", "created"],
+                       "done_priority_next_try" => ["done", "priority", "next_try"],
+                       "done_pid_next_try" => ["done", "pid", "next_try"],
+                       "done_pid_priority_created" => ["done", "pid", "priority", "created"]
+               ]
+       ],
+       "storage" => [
+               "comment" => "Data stored by Database storage backend",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "Auto incremented image data id"],
+                       "data" => ["type" => "longblob", "not null" => "1", "comment" => "file data"]
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"]
+               ]
+       ]
+];
+
diff --git a/static/defaults.config.php b/static/defaults.config.php
new file mode 100644 (file)
index 0000000..0cfb15e
--- /dev/null
@@ -0,0 +1,465 @@
+<?php
+
+// CONFIG.PHP
+
+/* This file declares the default values for the base config of Friendica.
+ *
+ * These configuration values aren't accessible from the admin settings page and custom values must be set in config/local.config.php
+ *
+ * Please don't edit this file directly as its content may change in the upcoming versions.
+ */
+
+return [
+       'database' => [
+               // host (String)
+               // Hostname or IP address of the database server.
+               // Can contain the port number with the syntax "hostname:port".
+               'hostname' => '',
+
+               // user (String)
+               // Database user name. Please don't use "root".
+               'username' => '',
+
+               // pass (String)
+               // Database user password. Please don't use empty passwords.
+               'password' => '',
+
+               // base (String)
+               // Database name.
+               'database' => '',
+
+               // charset (String)
+               // Database connexion charset. Changing this value will likely corrupt special characters.
+               'charset' => 'utf8mb4',
+       ],
+       'config' => [
+               // admin_email (Comma-separated list)
+               // In order to perform system administration via the admin panel,
+               // this must precisely match the email address of the person logged in.
+               'admin_email' => '',
+
+               // admin_nickname (String)
+               // Nickname of the main admin user, used if there are more than one admin user defined in config => admin_email.
+               'admin_nickname' => '',
+
+               // max_import_size (Integer)
+               // Maximum body size of DFRN and Mail messages in characters. 0 is unlimited.
+               'max_import_size' => 200000,
+
+               // php_path (String)
+               // Location of PHP command line processor.
+               'php_path' => 'php',
+       ],
+       'system' => [
+               // allowed_link_protocols (Array)
+               // Allowed protocols in links URLs, add at your own risk. http(s) is always allowed.
+               'allowed_link_protocols' => ['ftp://', 'ftps://', 'mailto:', 'cid:', 'gopher://'],
+
+               // always_show_preview (Boolean)
+               // Only show small preview pictures.
+               'always_show_preview' => false,
+
+               // archival_days (Integer)
+               // Number of days that we try to deliver content before we archive a contact.
+               'archival_days' => 32,
+
+               // auth_cookie_lifetime (Integer)
+               // Number of days that should pass without any activity before a user who
+               // chose "Remember me" when logging in is considered logged out.
+               'auth_cookie_lifetime' => 7,
+
+               // block_local_dir (Boolean)
+               // Deny public access to the local user directory.
+               'block_local_dir' => false,
+
+               // cron_interval (Integer)
+               // Minimal period in minutes between two calls of the "Cron" worker job.
+               'cron_interval' => 5,
+
+               // cache_driver (database|memcache|memcached|redis)
+               // Whether to use Memcache or Memcached or Redis to store temporary cache.
+               'cache_driver' => 'database',
+
+               // config_adapter (jit|preload)
+               // Allow to switch the configuration adapter to improve performances at the cost of memory consumption.
+               'config_adapter' => 'jit',
+
+               // curl_range_bytes (Integer)
+               // Maximum number of bytes that should be fetched. Default is 0, which mean "no limit".
+               'curl_range_bytes' => 0,
+
+               // crawl_permit_period (Integer)
+               // Period in seconds between allowed searches when the number of free searches is reached and "permit_crawling" is activated.
+               'crawl_permit_period' => 60,
+
+               // db_log (Path)
+               // Name of a logfile to log slow database queries.
+               'db_log' => '',
+
+               // db_log_index (Path)
+               // Name of a logfile to log queries with bad indexes.
+               'db_log_index' => '',
+
+               // db_log_index_watch (Comma-separated list)
+               // Watchlist of indexes to watch.
+               'db_log_index_watch' => '',
+
+               // db_log_index_blacklist (Comma-separated list)
+               // Blacklist of indexes that shouldn't be watched.
+               'db_log_index_blacklist' => '',
+
+               // db_loglimit (Integer)
+               // If a database call lasts longer than this value in seconds it is logged.
+               // Inactive if system => db_log is empty.
+               'db_loglimit' => 10,
+
+               // db_loglimit_index (Integer)
+               // Number of index rows needed to be logged for indexes on the watchlist. 0 to disable.
+               'db_loglimit_index' => 0,
+
+               // db_loglimit_index_high (Integer)
+               // Number of index rows to be logged anyway (for any index). 0 to disable.
+               'db_loglimit_index_high' => 0,
+
+               // dbclean_expire_conversation (Integer)
+               // When DBClean is enabled, any entry in the conversation table will be deleted after this many days.
+               // This data is used for ActivityPub, so it shouldn't be lower than the average duration of a discussion.
+               'dbclean_expire_conversation' => 90,
+
+               // dbclean-expire-limit (Integer)
+               // This defines the number of items that are to be deleted in a single call.
+               // Reduce this value when you are getting memory issues.
+               'dbclean-expire-limit' => 1000,
+
+               // diaspora_test (Boolean)
+               // For development only. Disables the message transfer.
+               'diaspora_test' => false,
+
+               // disable_email_validation (Boolean)
+               // Disables the check if a mail address is in a valid format and can be resolved via DNS.
+               'disable_email_validation' => 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.
+               'disable_url_validation' => false,
+
+               // disable_password_exposed (Boolean)
+               // Disable the exposition check against the remote haveibeenpwned API on password change.
+               'disable_password_exposed' => false,
+
+               // disable_polling (Boolean)
+               // Disable the polling of DFRN and OStatus contacts through onepoll.php.
+               'disable_polling' => false,
+
+               // dlogfile (Path)
+               // location of the developer log file.
+               'dlogfile' => '',
+
+               // dlogip (String)
+               // restricts develop log writes to requests originating from this IP address.
+               'dlogip' => '',
+
+               // free_crawls (Integer)
+               // Number of "free" searches when system => permit_crawling is enabled.
+               'free_crawls' => 10,
+
+               // frontend_worker_timeout (Integer)
+               // Value in minutes after we think that a frontend task was killed by the webserver.
+               'frontend_worker_timeout' => 10,
+
+               // groupedit_image_limit (Integer)
+               // Number of contacts at which the group editor should switch from display the profile pictures of the contacts to only display the names.
+               // This can alternatively be set on a per account basis in the pconfig table.
+               'groupedit_image_limit' => 400,
+
+               // hsts (Boolean)
+               // Enables the sending of HTTP Strict Transport Security headers.
+               'hsts' => false,
+
+               // ignore_cache (Boolean)
+               // For development only. Disables the item cache.
+               'ignore_cache' => false,
+
+               // instances_social_key (String)
+               // Key to the API of https://instances.social which retrieves data about mastodon servers.
+               // See https://instances.social/api/token to get an API key.
+               'instances_social_key' => '',
+
+               // ipv4_resolve (Boolean)
+               // Resolve IPV4 addresses only. Don't resolve to IPV6.
+               'ipv4_resolve' => false,
+
+               // invitation_only (Boolean)
+               // If set true registration is only possible after a current member of the node has send an invitation.
+               'invitation_only' => false,
+
+               // like_no_comment (Boolean)
+               // Don't update the "commented" value of an item when it is liked.
+               'like_no_comment' => false,
+
+               // local_block (Boolean)
+               // Used in conjunction with "block_public".
+               'local_block' => false,
+
+               // local_search (Boolean)
+               // Blocks search for users who are not logged in to prevent crawlers from blocking your system.
+               'local_search' => false,
+
+               // local_tags (Boolean)
+               // If activated, all hashtags will point to the local server.
+               'local_tags' => false,
+
+               // logger_config (String)
+               // Sets the logging adapter of Friendica globally (monolog, syslog, stream)
+               'logger_config' => 'stream',
+
+               // max_batch_queue (Integer)
+               // Maximum number of batched queue items for a single contact before subsequent messages are discarded.
+               'max_batch_queue' => 1000,
+
+               // max_connections (Integer)
+               // The maximum number of database connections which can be in use before the worker process is deferred to its next interval.
+               // When the system can't detect the maximum numbers of connection then this value can be used. Use 0 for auto-detection.
+               'max_connections' => 0,
+
+               // max_connections_level (Integer 0-100)
+               // The maximum percentage of connections that are allowed to let the worker start.
+               'max_connections_level' => 75,
+
+               // max_contact_queue (Integer)
+               // Maximum number of queue items for a single contact before subsequent messages are discarded.
+               'max_contact_queue' => 500,
+
+               // max_image_length (Integer)
+               // An alternate way of limiting picture upload sizes.
+               // Specify the maximum pixel  length that pictures are allowed to be (for non-square pictures, it will apply to the longest side).
+               // Pictures longer than this length will be resized to be this length (on the longest side, the other side will be scaled appropriately).
+               // If you don't want to set a maximum length, set to -1.
+               'max_image_length' => -1,
+
+               // max_processes_backend (Integer)
+               // Maximum number of concurrent database processes for background tasks.
+               'max_processes_backend' => 5,
+
+               // max_processes_frontend (Integer)
+               // Maximum number of concurrent database processes for foreground tasks.
+               'max_processes_frontend' => 20,
+
+               // maximagesize (Integer)
+               // Maximum size in bytes of an uploaded photo.
+               'maximagesize' => 800000,
+
+               // memcache_host (String)
+               // Host name of the memcache daemon.
+               'memcache_host' => '127.0.0.1',
+
+               // memcache_port (Integer)
+               // Port number of the memcache daemon.
+               'memcache_port' => 11211,
+
+               // memcached_hosts (Array)
+               // Array of Memcached servers info [host, port(, weight)], see Memcached::addServers.
+               'memcached_hosts' => [
+                       ['127.0.0.1', '11211'],
+               ],
+
+               // min_poll_interval (Integer)
+               // minimal distance in minutes between two polls for a contact. Reasonable values are between 1 and 59.
+               'min_poll_interval' => 1,
+
+               // no_count (Boolean)
+               // Don't do count calculations (currently only when showing photo albums).
+               'no_count' => false,
+
+               // no_oembed (Boolean)
+               // Don't use OEmbed to fetch more information about a link.
+               'no_oembed' => false,
+
+               // no_smilies (Boolean)
+               // Don't show smilies.
+               'no_smilies' => false,
+
+               // no_view_full_size (Boolean)
+               // Don't add the link "View full size" under a resized image.
+               'no_view_full_size' => false,
+
+               // optimize_items (Boolean)
+               // Triggers an SQL command to optimize the item table before expiring items.
+               'optimize_items' => false,
+
+               // paranoia (Boolean)
+               // Log out users if their IP address changed.
+               'paranoia' => false,
+
+               // permit_crawling (Boolean)
+               // Restricts the search for not logged in users to one search per minute.
+               'permit_crawling' => false,
+
+               // pidfile (Path)
+               // Daemon pid file path. For example: pidfile = /path/to/daemon.pid
+               'pidfile' => '',
+
+               // png_quality (Integer)
+               // Sets the ImageMagick compression level for PNG images. Values ranges from 0 (uncompressed) to 9 (most compressed).
+               'png_quality' => 8,
+
+               // profiler (Boolean)
+               // Enable internal timings to help optimize code. Needed for "rendertime" addon.
+               'profiler' => false,
+
+               // proxy_cache_time (Integer)
+               // Period in seconds after which the cache is cleared.
+               'proxy_cache_time' => 86400,
+
+               // pushpoll_frequency (Integer)
+               // Frequency of contact poll for subhub contact using the DFRM or OStatus network.
+               // Available values:
+               // - 5 = every month
+               // - 4 = every week
+               // - 3 = every day
+               // - 2 = twice a day
+               // - 1 = every hour
+               // - 0 = every minute
+               'pushpoll_frequency' => 3,
+
+               // queue_no_dead_check (Boolean)
+               // Ignore if the target contact or server seems to be dead during queue delivery.
+               'queue_no_dead_check' => false,
+
+               // redis_host (String)
+               // Host name of the redis daemon.
+               'redis_host' => '127.0.0.1',
+
+               // redis_port (String)
+               // Port number of the redis daemon.
+               'redis_port' => 6379,
+
+               // redis_db (Integer)
+               // The sub-database of redis (0 - 15 possible sub-databases)
+               'redis_db' => 0,
+
+               // redis_password (String)
+               // The authentication password for the redis database
+               'redis_password' => null,
+
+               // session_handler (database|cache|native)
+               // Whether to use Cache to store session data or to use PHP native session storage.
+               'session_handler' => 'database',
+
+               // remove_multiplicated_lines (Boolean)
+               // If enabled, multiple linefeeds in items are stripped to a single one.
+               'remove_multiplicated_lines' => false,
+
+               // sendmail_params (Boolean)
+               // Normal sendmail command parameters will be added when the PHP mail() function is called for sending e-mails.
+               // This ensures the Sender Email address setting is applied to the message envelope rather than the host's default address.
+               // Set to false if your non-sendmail agent is incompatible, or to restore old behavior of using the host address.
+               'sendmail_params' => true,
+
+               // show_global_community_hint (Boolean)
+               // When the global community page is enabled, use this option to display a hint above the stream, that this is a collection of all public top-level postings that arrive on your node.
+               'show_global_community_hint' => false,
+
+               // show_unsupported_addons (Boolean)
+               // Show all addons including the unsupported ones.
+               'show_unsupported_addons' => false,
+
+               // show_unsupported_themes (Boolean)
+               // Show all themes including the unsupported ones.
+               'show_unsupported_themes' => false,
+
+               // throttle_limit_day (Integer)
+               // Maximum number of posts that a user can send per day with the API. 0 to disable daily throttling.
+               'throttle_limit_day' => 0,
+
+               // throttle_limit_week (Integer)
+               // Maximum number of posts that a user can send per week with the API. 0 to disable weekly throttling.
+               'throttle_limit_week' => 0,
+
+               // throttle_limit_month (Integer)
+               // Maximum number of posts that a user can send per month with the API. 0 to disable monthly throttling.
+               'throttle_limit_month' => 0,
+
+               // username_min_length (Integer)
+               // The minimum character length a username can be.
+               // This length is check once the username has been trimmed and multiple spaces have been collapsed into one.
+               // Minimum for this config value is 1. Maximum is 64 as the resulting profile URL mustn't be longer than 255 chars.
+               'username_min_length' => 3,
+
+               // username_max_length (Integer)
+               // The maximum character length a username can be.
+               // This length is check once the username has been trimmed and multiple spaces have been collapsed into one.
+               // Minimum for this config value is 1. Maximum is 64 as the resulting profile URL mustn't be longer than 255 chars.
+               'username_max_length' => 48,
+
+               // worker_cooldown (Integer)
+               // Cooldown period in seconds after each worker function call.
+               'worker_cooldown' => 0,
+
+               // worker_debug (Boolean)
+               // If enabled, it prints out the number of running processes split by priority.
+               'worker_debug' => false,
+
+               // worker_fetch_limit (Integer)
+               // Number of worker tasks that are fetched in a single query.
+               'worker_fetch_limit' => 1,
+
+               // worker_jpm (Boolean)
+               // If enabled, it prints out the jobs per minute.
+               'worker_jpm' => false,
+
+               // worker_jpm_range (String)
+               // List of minutes for the jobs per minute (JPM) calculation
+               'worker_jpm_range' => '1, 10, 60',
+
+               // worker_load_exponent (Integer)
+               // Default 3, which allows only 25% of the maximum worker queues when server load reaches around 37% of maximum load.
+               // For a linear response where 25% of worker queues are allowed at 75% of maximum load, set this to 1.
+               // Setting 0 would allow maximum worker queues at all times, which is not recommended.
+               'worker_load_exponent' => 3,
+
+               // worker_defer_limit (Integer)
+               // Per default the systems tries delivering for 15 times before dropping it.
+               'worker_defer_limit' => 15,
+
+               // xrd_timeout (Integer)
+               // Timeout in seconds for fetching the XRD links.
+               'xrd_timeout' => 20,
+       ],
+       'experimental' => [
+               // exp_themes (Boolean)
+               // Show experimental themes in user settings.
+               'exp_themes' => false,
+       ],
+       'theme' => [
+               // hide_eventlist (Boolean)
+               // Don't show the birthdays and events on the profile and network page.
+               'hide_eventlist' => false,
+       ],
+       'jabber' => [
+               // debug (Boolean)
+               // Enable debug level for the jabber account synchronisation.
+               'debug' => false,
+               // lockpath (Path)
+               // Must be writable by the ejabberd process. if set then it will prevent the running of multiple processes.
+               'lockpath' => '',
+       ],
+       'debug' => [
+               // ap_inbox_log (Boolean)
+               // Logs every call to /inbox as a JSON file in Friendica's temporary directory
+               'ap_inbox_log' => false,
+
+               // total_ap_delivery (Boolean)
+               // Deliver via AP to every possible receiver and we suppress the delivery to these contacts with other protocols
+               'total_ap_delivery' => false,
+       ]
+];
diff --git a/static/dependencies.config.php b/static/dependencies.config.php
new file mode 100644 (file)
index 0000000..fc2da9c
--- /dev/null
@@ -0,0 +1,162 @@
+<?php
+
+use Dice\Dice;
+use Friendica\App;
+use Friendica\Core\Cache;
+use Friendica\Core\Config;
+use Friendica\Core\Lock\ILock;
+use Friendica\Database\Database;
+use Friendica\Factory;
+use Friendica\Util;
+use Psr\Log\LoggerInterface;
+
+/**
+ * The configuration defines "complex" dependencies inside Friendica
+ * So this classes shouldn't be simple or their dependencies are already defined here.
+ *
+ * This kind of dependencies are NOT required to be defined here:
+ *   - $a = new ClassA(new ClassB());
+ *   - $a = new ClassA();
+ *   - $a = new ClassA(Configuration $configuration);
+ *
+ * This kind of dependencies SHOULD be defined here:
+ *   - $a = new ClassA();
+ *     $b = $a->create();
+ *
+ *   - $a = new ClassA($creationPassedVariable);
+ *
+ */
+return [
+       '*'                             => [
+               // marks all class result as shared for other creations, so there's just
+               // one instance for the whole execution
+               'shared' => true,
+       ],
+       '$basepath'                     => [
+               'instanceOf'      => Util\BasePath::class,
+               'call'            => [
+                       ['getPath', [], Dice::CHAIN_CALL],
+               ],
+               'constructParams' => [
+                       dirname(__FILE__, 2),
+                       $_SERVER
+               ]
+       ],
+       Util\BasePath::class            => [
+               'constructParams' => [
+                       dirname(__FILE__, 2),
+                       $_SERVER
+               ]
+       ],
+       Util\ConfigFileLoader::class    => [
+               'shared'          => true,
+               'constructParams' => [
+                       [Dice::INSTANCE => '$basepath'],
+               ],
+       ],
+       Config\Cache\ConfigCache::class => [
+               'instanceOf' => Factory\ConfigFactory::class,
+               'call'       => [
+                       ['createCache', [], Dice::CHAIN_CALL],
+               ],
+       ],
+       App\Mode::class                 => [
+               'call' => [
+                       ['determineRunMode', [$_SERVER], Dice::CHAIN_CALL],
+                       ['determine', [], Dice::CHAIN_CALL],
+               ],
+       ],
+       Config\Configuration::class     => [
+               'instanceOf' => Factory\ConfigFactory::class,
+               'call'       => [
+                       ['createConfig', [], Dice::CHAIN_CALL],
+               ],
+       ],
+       Config\PConfiguration::class    => [
+               'instanceOf' => Factory\ConfigFactory::class,
+               'call'       => [
+                       ['createPConfig', [], Dice::CHAIN_CALL],
+               ]
+       ],
+       Database::class                 => [
+               'constructParams' => [
+                       [DICE::INSTANCE => \Psr\Log\NullLogger::class],
+                       $_SERVER,
+               ],
+       ],
+       /**
+        * Creates the App\BaseURL
+        *
+        * Same as:
+        *   $baseURL = new App\BaseURL($configuration, $_SERVER);
+        */
+       App\BaseURL::class             => [
+               'constructParams' => [
+                       $_SERVER,
+               ],
+       ],
+       App\Page::class => [
+               'constructParams' => [
+                       [Dice::INSTANCE => '$basepath'],
+               ],
+       ],
+       /**
+        * Create a Logger, which implements the LoggerInterface
+        *
+        * Same as:
+        *   $loggerFactory = new Factory\LoggerFactory();
+        *   $logger = $loggerFactory->create($channel, $configuration, $profiler);
+        *
+        * Attention1: We can use DICE for detecting dependencies inside "chained" calls too
+        * Attention2: The variable "$channel" is passed inside the creation of the dependencies per:
+        *    $app = $dice->create(App::class, [], ['$channel' => 'index']);
+        *    and is automatically passed as an argument with the same name
+        */
+       LoggerInterface::class          => [
+               'instanceOf' => Factory\LoggerFactory::class,
+               'call'       => [
+                       ['create', [], Dice::CHAIN_CALL],
+               ],
+       ],
+       '$devLogger'                    => [
+               'instanceOf' => Factory\LoggerFactory::class,
+               'call'       => [
+                       ['createDev', [], Dice::CHAIN_CALL],
+               ]
+       ],
+       Cache\ICache::class             => [
+               'instanceOf' => Factory\CacheFactory::class,
+               'call'       => [
+                       ['create', [], Dice::CHAIN_CALL],
+               ],
+       ],
+       Cache\IMemoryCache::class       => [
+               'instanceOf' => Factory\CacheFactory::class,
+               'call'       => [
+                       ['create', [], Dice::CHAIN_CALL],
+               ],
+       ],
+       ILock::class                    => [
+               'instanceOf' => Factory\LockFactory::class,
+               'call'       => [
+                       ['create', [], Dice::CHAIN_CALL],
+               ],
+       ],
+       App\Arguments::class => [
+               'instanceOf' => App\Arguments::class,
+               'call' => [
+                       ['determine', [$_SERVER, $_GET], Dice::CHAIN_CALL],
+               ],
+       ],
+       App\Module::class => [
+               'instanceOf' => App\Module::class,
+               'call' => [
+                       ['determineModule', [], Dice::CHAIN_CALL],
+               ],
+       ],
+       Friendica\Core\Process::class => [
+               'constructParams' => [
+                       [Dice::INSTANCE => '$basepath'],
+               ],
+       ],
+];
diff --git a/static/settings.config.php b/static/settings.config.php
new file mode 100644 (file)
index 0000000..bf8b62f
--- /dev/null
@@ -0,0 +1,132 @@
+<?php
+
+// SETTINGS.PHP
+
+/* This file declares the default values for the admin settings of Friendica.
+ *
+ * These values will be overridden by the admin settings page.
+ *
+ * Please don't edit this file directly as its content may change in the upcoming versions.
+ */
+
+return [
+       'config' => [
+               // info (String)
+               // Plaintext description of this node, used in the /friendica module.
+               'info' => '',
+
+               // register_policy (Constant)
+               // Your choices are OPEN, APPROVE, or CLOSED.
+               // Be certain to create your own personal account before setting CLOSED.
+               // APPROVE requires you set system.admin_email to the email address of an
+               // already registered person who can authorize and/or approve/deny the request.
+               'register_policy' => \Friendica\Module\Register::CLOSED,
+
+               // register_text (String)
+               // Will be displayed prominently on the registration page.
+               'register_text' => '',
+
+               // sitename (String)
+               // Displayed server name.
+               'sitename' => 'Friendica Social Network',
+       ],
+       'system' => [
+               // account_abandon_days (Integer)
+               // Will not waste system resources polling external sites for abandonded accounts.
+               // Enter 0 for no time limit.
+               'account_abandon_days' => 0,
+
+               // addon (Comma-separated list)
+               // Manual list of addons which are enabled on this system.
+               'addon' => '',
+
+               // allowed_themes (Comma-separated list)
+               // Themes users can change to in their settings.
+               'allowed_themes' => 'quattro,vier,duepuntozero,smoothly',
+
+               // debugging (boolean)
+               // Enable/Disable Debugging (logging)
+               'debugging' => false,
+
+               // default_timezone (String)
+               // Choose a default timezone. See https://secure.php.net/manual/en/timezones.php
+               // It only applies to timestamps for anonymous viewers.
+               'default_timezone' => 'UTC',
+
+               // directory (String)
+               // URL of the global directory.
+               'directory' => 'https://dir.friendica.social',
+
+               // forbidden_nicknames (Comma-separated list)
+               // Prevents users from registering the specified nicknames on this node.
+               // Default value comprises classic role names from RFC 2142.
+               'forbidden_nicknames' => 'info, marketing, sales, support, abuse, noc, security, postmaster, hostmaster, usenet, news, webmaster, www, uucp, ftp, root, sysop',
+
+               // jpeg_quality (Integer)
+               // Sets the ImageMagick quality level for JPEG images. Values ranges from 50 (awful) to 100 (near perfect).
+               'jpeg_quality' => 100,
+
+               // language (String)
+               // System default languague, inluding admin-created user default language.
+               // Two-letters ISO 639-1 code.
+               'language' => 'en',
+
+               // logfile (String)
+               // The logfile for storing logs.
+               // Can be a full path or a relative path to the Friendica home directory
+               'logfile' => 'log/friendica.log',
+
+               // loglevel (String)
+               // The loglevel for all logs.
+               // Has to be one of these values: emergency, alert, critical, error, warning, notice, info, debug
+               'loglevel' => 'notice',
+
+               // max_image_length (Integer)
+               // An alternate way of limiting picture upload sizes.
+               // Specify the maximum pixel  length that pictures are allowed to be (for non-square pictures, it will apply to the longest side).
+               // Pictures longer than this length will be resized to be this length (on the longest side, the other side will be scaled appropriately).
+               // If you don't want to set a maximum length, set to -1.
+               'max_image_length' => -1,
+
+               // maximagesize (Integer)
+               // Maximum size in bytes of an uploaded photo.
+               'maximagesize' => 800000,
+
+               // no_regfullname (Boolean)
+               // Allow pseudonyms (true) or enforce a space between first name and last name in Full name, as an anti spam measure (false).
+               'no_regfullname' => true,
+
+               // optimize_max_tablesize (Integer)
+               // Maximum table size (in MB) for the automatic optimization.
+               // -1 to disable automatic optimization.
+               //  0 to use internal default (100MB)
+               'optimize_max_tablesize' => -1,
+
+               // maxloadavg (Integer)
+               // Maximum system load before delivery and poll processes are deferred.
+               'maxloadavg' => 20,
+
+               // rino_encrypt (Integer)
+               // Server-to-server private message encryption (RINO).
+               // Encryption will only be provided if this setting is set to a non zero value on both servers.
+               // Set to 0 to disable, 2 to enable, 1 is deprecated but won't need mcrypt.
+               'rino_encrypt' => 2,
+
+               // temppath (String)
+               // Custom temporary file directory
+               'temppath' => '',
+
+               // theme (String)
+               // System theme name.
+               'theme' => 'vier',
+
+               // url (String)
+               // The fully-qualified URL of this Friendica node.
+               // Used by the worker in a non-HTTP execution environment.
+               'url' => '',
+       ],
+
+       // Used in the admin settings to lock certain features
+       'featurelock' => [
+       ],
+];
index b3418c20f4024878c9999ebf9f6d908d6374335b..7421f16a09c5342e313c12aa70d161577974e2ba 100644 (file)
@@ -5,73 +5,10 @@
 
 namespace Friendica\Test;
 
-use Friendica\App;
-use Friendica\Database\DBA;
-use Friendica\Factory;
-use Friendica\Util\BasePath;
-use Friendica\Util\Config\ConfigFileLoader;
-use Friendica\Util\Logger\VoidLogger;
-use Friendica\Util\Profiler;
-use PHPUnit\DbUnit\DataSet\YamlDataSet;
-use PHPUnit\DbUnit\TestCaseTrait;
-use PHPUnit_Extensions_Database_DB_IDatabaseConnection;
-
-require_once __DIR__ . '/../boot.php';
-
 /**
  * Abstract class used by tests that need a database.
  */
 abstract class DatabaseTest extends MockedTest
 {
-       use TestCaseTrait;
-
-       /**
-        * Get database connection.
-        *
-        * This function is executed before each test in order to get a database connection that can be used by tests.
-        * If no prior connection is available, it tries to create one using the USER, PASS and DB environment variables.
-        *
-        * If it could not connect to the database, the test is skipped.
-        *
-        * @return PHPUnit_Extensions_Database_DB_IDatabaseConnection
-        * @see https://phpunit.de/manual/5.7/en/database.html
-        */
-       protected function getConnection()
-       {
-               if (!getenv('MYSQL_DATABASE')) {
-                       $this->markTestSkipped('Please set the MYSQL_* environment variables to your test database credentials.');
-               }
-
-               $basePath = BasePath::create(dirname(__DIR__));
-               $mode = new App\Mode($basePath);
-               $configLoader = new ConfigFileLoader($basePath, $mode);
-               $config = Factory\ConfigFactory::createCache($configLoader);
-
-               $profiler = \Mockery::mock(Profiler::class);
-
-               DBA::connect(
-                       $config,
-                       $profiler,
-                       new VoidLogger(),
-                       getenv('MYSQL_HOST'),
-                       getenv('MYSQL_USERNAME'),
-                       getenv('MYSQL_PASSWORD'),
-                       getenv('MYSQL_DATABASE'));
-
-               if (!DBA::connected()) {
-                       $this->markTestSkipped('Could not connect to the database.');
-               }
-
-               return $this->createDefaultDBConnection(DBA::getConnection(), getenv('MYSQL_DATABASE'));
-       }
-
-       /**
-        * Get dataset to populate the database with.
-        * @return YamlDataSet
-        * @see https://phpunit.de/manual/5.7/en/database.html
-        */
-       protected function getDataSet()
-       {
-               return new YamlDataSet(__DIR__ . '/datasets/api.yml');
-       }
+       use DatabaseTestTrait;
 }
diff --git a/tests/DatabaseTestTrait.php b/tests/DatabaseTestTrait.php
new file mode 100644 (file)
index 0000000..49dc999
--- /dev/null
@@ -0,0 +1,58 @@
+<?php
+/**
+ * DatabaseTest class.
+ */
+
+namespace Friendica\Test;
+
+use Friendica\Database\Database;
+use Friendica\Test\Util\Database\StaticDatabase;
+
+/**
+ * Abstract class used by tests that need a database.
+ */
+trait DatabaseTestTrait
+{
+       protected function setUp()
+       {
+               StaticDatabase::statConnect($_SERVER);
+               // Rollbacks every DB usage (in case the test couldn't call tearDown)
+               StaticDatabase::statRollback();
+               // Start the first, outer transaction
+               StaticDatabase::getGlobConnection()->beginTransaction();
+
+               parent::setUp();
+       }
+
+       protected function tearDown()
+       {
+               // Rollbacks every DB usage so we don't commit anything into the DB
+               StaticDatabase::statRollback();
+
+               parent::tearDown();
+       }
+
+       /**
+        * Loads a given DB fixture for this DB test
+        *
+        * @param string   $fixture The path to the fixture
+        * @param Database $dba     The DB connection
+        *
+        * @throws \Exception
+        */
+       protected function loadFixture(string $fixture, Database $dba)
+       {
+               $data = include $fixture;
+
+               foreach ($data as $tableName => $rows) {
+                       if (!is_array($rows)) {
+                               $dba->p('TRUNCATE TABLE `' . $tableName . '``');
+                               continue;
+                       }
+
+                       foreach ($rows as $row) {
+                               $dba->insert($tableName, $row);
+                       }
+               }
+       }
+}
index 03e8085479b79164b9898aeec5b6dacee84b71aa..f9b026979cbdef989567538d4585374e31ae8526 100644 (file)
@@ -2,6 +2,7 @@
 
 namespace Friendica\Test\Util;
 
+use Dice\Dice;
 use Friendica\App;
 use Friendica\BaseObject;
 use Friendica\Core\Config;
@@ -35,6 +36,11 @@ trait AppMockTrait
         */
        protected $mode;
 
+       /**
+        * @var MockInterface|Dice The dependency injection library
+        */
+       protected $dice;
+
        /**
         * Mock the App
         *
@@ -43,18 +49,31 @@ trait AppMockTrait
         */
        public function mockApp(vfsStreamDirectory $root, $raw = false)
        {
-               $this->configMock = \Mockery::mock(Config\Cache\IConfigCache::class);
+               $this->dice = \Mockery::mock(Dice::class)->makePartial();
+               $this->dice = $this->dice->addRules(include __DIR__ . '/../../static/dependencies.config.php');
+
+               $this->configMock = \Mockery::mock(Config\Cache\ConfigCache::class);
+               $this->dice->shouldReceive('create')
+                          ->with(Config\Cache\ConfigCache::class)
+                          ->andReturn($this->configMock);
                $this->mode = \Mockery::mock(App\Mode::class);
-               $configAdapterMock = \Mockery::mock(Config\Adapter\IConfigAdapter::class);
+               $this->dice->shouldReceive('create')
+                          ->with(App\Mode::class)
+                          ->andReturn($this->mode);
+               $configModel= \Mockery::mock(\Friendica\Model\Config\Config::class);
                // Disable the adapter
-               $configAdapterMock->shouldReceive('isConnected')->andReturn(false);
+               $configModel->shouldReceive('isConnected')->andReturn(false);
 
-               $config = new Config\Configuration($this->configMock, $configAdapterMock);
-               // Initialize empty Config
-               Config::init($config);
+               $config = new Config\JitConfiguration($this->configMock, $configModel);
+               $this->dice->shouldReceive('create')
+                          ->with(Config\Configuration::class)
+                          ->andReturn($config);
 
                // Mocking App and most used functions
                $this->app = \Mockery::mock(App::class);
+               $this->dice->shouldReceive('create')
+                          ->with(App::class)
+                          ->andReturn($this->app);
                $this->app
                        ->shouldReceive('getBasePath')
                        ->andReturn($root->url());
@@ -65,6 +84,9 @@ trait AppMockTrait
 
                $this->profilerMock = \Mockery::mock(Profiler::class);
                $this->profilerMock->shouldReceive('saveTimestamp');
+               $this->dice->shouldReceive('create')
+                          ->with(Profiler::class)
+                          ->andReturn($this->profilerMock);
 
                $this->app
                        ->shouldReceive('getConfigCache')
@@ -87,7 +109,7 @@ trait AppMockTrait
                                return $this->configMock->get('system', 'url');
                        });
 
-               BaseObject::setApp($this->app);
+               BaseObject::setDependencyInjection($this->dice);
 
                if ($raw) {
                        return;
diff --git a/tests/Util/Database/ExtendedPDO.php b/tests/Util/Database/ExtendedPDO.php
new file mode 100644 (file)
index 0000000..6bb0251
--- /dev/null
@@ -0,0 +1,97 @@
+<?php
+
+namespace Friendica\Test\Util\Database;
+
+use PDO;
+use PDOException;
+
+/**
+ * This class extends native PDO one but allow nested transactions
+ * by using the SQL statements `SAVEPOINT', 'RELEASE SAVEPOINT' AND 'ROLLBACK SAVEPOINT'
+ */
+class ExtendedPDO extends PDO
+{
+       /**
+        * @var array Database drivers that support SAVEPOINT * statements.
+        */
+       protected static $_supportedDrivers = array("pgsql", "mysql");
+
+       /**
+        * @var int the current transaction depth
+        */
+       protected $_transactionDepth = 0;
+
+       /**
+        * @return int
+        */
+       public function getTransactionDepth()
+       {
+               return $this->_transactionDepth;
+       }
+
+       /**
+        * Test if database driver support savepoints
+        *
+        * @return bool
+        */
+       protected function hasSavepoint()
+       {
+               return in_array($this->getAttribute(PDO::ATTR_DRIVER_NAME),
+                       self::$_supportedDrivers);
+       }
+
+
+       /**
+        * Start transaction
+        *
+        * @return bool|void
+        */
+       public function beginTransaction()
+       {
+               if($this->_transactionDepth == 0 || !$this->hasSavepoint()) {
+                       parent::beginTransaction();
+               } else {
+                       $this->exec("SAVEPOINT LEVEL{$this->_transactionDepth}");
+               }
+
+               $this->_transactionDepth++;
+       }
+
+       /**
+        * Commit current transaction
+        *
+        * @return bool|void
+        */
+       public function commit()
+       {
+               $this->_transactionDepth--;
+
+               if($this->_transactionDepth == 0 || !$this->hasSavepoint()) {
+                       parent::commit();
+               } else {
+                       $this->exec("RELEASE SAVEPOINT LEVEL{$this->_transactionDepth}");
+               }
+       }
+
+       /**
+        * Rollback current transaction,
+        *
+        * @throws PDOException if there is no transaction started
+        * @return bool|void
+        */
+       public function rollBack()
+       {
+
+               if ($this->_transactionDepth == 0) {
+                       throw new PDOException('Rollback error : There is no transaction started');
+               }
+
+               $this->_transactionDepth--;
+
+               if($this->_transactionDepth == 0 || !$this->hasSavepoint()) {
+                       parent::rollBack();
+               } else {
+                       $this->exec("ROLLBACK TO SAVEPOINT LEVEL{$this->_transactionDepth}");
+               }
+       }
+}
diff --git a/tests/Util/Database/StaticDatabase.php b/tests/Util/Database/StaticDatabase.php
new file mode 100644 (file)
index 0000000..e4ea112
--- /dev/null
@@ -0,0 +1,162 @@
+<?php
+
+namespace Friendica\Test\Util\Database;
+
+use Friendica\Database\Database;
+use PDO;
+use PDOException;
+
+/**
+ * Overrides the Friendica database class for re-using the connection
+ * for different tests
+ *
+ * Overrides functionality to enforce one transaction per call (for nested transactions)
+ */
+class StaticDatabase extends Database
+{
+       /**
+        * @var ExtendedPDO
+        */
+       private static $staticConnection;
+
+       /**
+        * Override the behaviour of connect, due there is just one, static connection at all
+        *
+        * @return bool|void
+        */
+       public function connect()
+       {
+               if (!is_null($this->connection) && $this->connected()) {
+                       return true;
+               }
+
+               if (!isset(self::$staticConnection)) {
+                       self::statConnect($_SERVER);
+               }
+
+               $this->driver = 'pdo';
+               $this->connection = self::$staticConnection;
+               $this->connected = true;
+
+               return $this->connected;
+       }
+
+       /**
+        * Override the transaction since there are now hierachical transactions possible
+        *
+        * @return bool
+        */
+       public function transaction()
+       {
+               if (!$this->in_transaction && !$this->connection->beginTransaction()) {
+                       return false;
+               }
+
+               $this->in_transaction = true;
+               return true;
+       }
+
+       /**
+        * @brief Does a commit
+        *
+        * @return boolean Was the command executed successfully?
+        */
+       public function commit()
+       {
+               if (!$this->performCommit()) {
+                       return false;
+               }
+               $this->in_transaction = false;
+               return true;
+       }
+
+       /**
+        * Setup of the global, static connection
+        * Either through explicit calling or through implicit using the Database
+        *
+        * @param array $server $_SERVER variables
+        */
+       public static function statConnect(array $server)
+       {
+               // Use environment variables for mysql if they are set beforehand
+               if (!empty($server['MYSQL_HOST'])
+                   && !empty($server['MYSQL_USERNAME'] || !empty($server['MYSQL_USER']))
+                   && $server['MYSQL_PASSWORD'] !== false
+                   && !empty($server['MYSQL_DATABASE']))
+               {
+                       $db_host = $server['MYSQL_HOST'];
+                       if (!empty($server['MYSQL_PORT'])) {
+                               $db_host .= ':' . $server['MYSQL_PORT'];
+                       }
+
+                       if (!empty($server['MYSQL_USERNAME'])) {
+                               $db_user = $server['MYSQL_USERNAME'];
+                       } else {
+                               $db_user = $server['MYSQL_USER'];
+                       }
+                       $db_pw = (string) $server['MYSQL_PASSWORD'];
+                       $db_data = $server['MYSQL_DATABASE'];
+               }
+
+               $port       = 0;
+               $serveraddr = trim($db_host);
+               $serverdata = explode(':', $serveraddr);
+               $server     = $serverdata[0];
+               if (count($serverdata) > 1) {
+                       $port = trim($serverdata[1]);
+               }
+               $server  = trim($server);
+               $user    = trim($db_user);
+               $pass    = trim($db_pw);
+               $db      = trim($db_data);
+
+               if (!(strlen($server) && strlen($user))) {
+                       return;
+               }
+
+               $connect = "mysql:host=" . $server . ";dbname=" . $db;
+
+               if ($port > 0) {
+                       $connect .= ";port=" . $port;
+               }
+
+               try {
+                       self::$staticConnection = @new ExtendedPDO($connect, $user, $pass);
+                       self::$staticConnection->setAttribute(PDO::ATTR_AUTOCOMMIT,0);
+               } catch (PDOException $e) {
+                       /// @TODO At least log exception, don't ignore it!
+               }
+       }
+
+       /**
+        * @return ExtendedPDO The global, static connection
+        */
+       public static function getGlobConnection()
+       {
+               return self::$staticConnection;
+       }
+
+       /**
+        * Perform a global commit for every nested transaction of the static connection
+        */
+       public static function statCommit()
+       {
+               if (isset(self::$staticConnection)) {
+                       while (self::$staticConnection->getTransactionDepth() > 0) {
+                               self::$staticConnection->commit();
+                       }
+               }
+       }
+
+       /**
+        * Perform a global rollback for every nested transaction of the static connection
+        */
+       public static function statRollback()
+       {
+               if (isset(self::$staticConnection)) {
+                       while (self::$staticConnection->getTransactionDepth() > 0) {
+                               self::$staticConnection->rollBack();
+                       }
+               }
+       }
+}
index 87ab450c9e8311246964540e8645a5d801b5d26f..95e7cbcb1def2caf2bf3a9d4b85a4a1dcc435342 100644 (file)
@@ -4,8 +4,14 @@ namespace Friendica\Test\Util;
 
 trait DbaCacheMockTrait
 {
-       use DBAMockTrait;
-       use DateTimeFormatMockTrait;
+       /**
+        * @var
+        */
+       protected $dba;
+
+       public function __construct()
+       {
+       }
 
        protected function mockDelete($key, $return = true, $times = null)
        {
index 3f76edb884061da33ea28bd7c15335a1538b3f17..5b405dcfc275b9175267f79acb0f24ff576c8970 100644 (file)
@@ -3,7 +3,7 @@
 namespace Friendica\Test\Util;
 
 use Friendica\Core\Cache;
-use Friendica\Core\Lock\DatabaseLockDriver;
+use Friendica\Core\Lock\DatabaseLock;
 
 trait DbaLockMockTrait
 {
@@ -12,7 +12,6 @@ trait DbaLockMockTrait
 
        /**
         * Mocking acquireLock with DBA-backend
-        * @see DatabaseLockDriver::acquireLock()
         *
         * @param mixed    $key       The key to lock
         * @param int      $ttl       The TimeToLive
@@ -22,6 +21,9 @@ trait DbaLockMockTrait
         * @param bool     $rowExists True, if a row already exists in the lock table
         * @param null     $time      The current timestamp
         * @param null|int $times     How often the method will get used
+        *
+        *@see DatabaseLock::acquireLock()
+        *
         */
        public function mockAcquireLock($key, $ttl = Cache::FIVE_MINUTES, $locked = false, $pid = null, $rowExists = true, $time = null, $times = null)
        {
@@ -55,12 +57,14 @@ trait DbaLockMockTrait
 
        /**
         * Mocking isLocked with DBA-backend
-        * @see DatabaseLockDriver::isLocked()
         *
         * @param mixed     $key    The key of the lock
         * @param null|bool $return True, if the key is already locked
-        * @param null      $time      The current timestamp
+        * @param null      $time   The current timestamp
         * @param null|int  $times  How often the method will get used
+        *
+        *@see DatabaseLock::isLocked()
+        *
         */
        public function mockIsLocked($key, $return = true, $time = null, $times = null)
        {
@@ -76,10 +80,12 @@ trait DbaLockMockTrait
 
        /**
         * Mocking releaseAll with DBA-backend
-        * @see DatabaseLockDriver::releaseAll()
         *
-        * @param null     $pid    The PID which was set
-        * @param null|int $times  How often the method will get used
+        * @param null     $pid   The PID which was set
+        * @param null|int $times How often the method will get used
+        *
+        *@see DatabaseLock::releaseAll()
+        *
         */
        public function mockReleaseAll($pid = null, $times = null)
        {
@@ -92,11 +98,13 @@ trait DbaLockMockTrait
 
        /**
         * Mocking ReleaseLock with DBA-backend
-        * @see DatabaseLockDriver::releaseLock()
         *
         * @param mixed    $key    The key to release
         * @param null|int $pid    The PID which was set
         * @param null|int $times  How often the method will get used
+        *
+        *@see DatabaseLock::releaseLock()
+        *
         */
        public function mockReleaseLock($key, $pid = null, $times = null)
        {
diff --git a/tests/Util/L10nMockTrait.php b/tests/Util/L10nMockTrait.php
deleted file mode 100644 (file)
index e47a35e..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-
-namespace Friendica\Test\Util;
-
-use Friendica\Core\L10n;
-use Mockery\MockInterface;
-
-trait L10nMockTrait
-{
-       /**
-        * @var MockInterface The interface for L10n mocks
-        */
-       private $l10nMock;
-
-       /**
-        * Mocking the 'L10n::t()' method
-        *
-        * @param null|string $input Either an input (string) or null for EVERY input is possible
-        * @param null|int $times How often will it get called
-        * @param null|string $return Either an return (string) or null for return the input
-        */
-       public function mockL10nT($input = null, $times = null, $return = null)
-       {
-               if (!isset($this->l10nMock)) {
-                       $this->l10nMock = \Mockery::mock('alias:' . L10n::class);
-               }
-
-               $with = isset($input) ? $input : \Mockery::any();
-
-               $return = isset($return) ? $return : $with;
-
-               if ($return instanceof \Mockery\Matcher\Any) {
-                       $this->l10nMock
-                               ->shouldReceive('t')
-                               ->with($with)
-                               ->times($times)
-                               ->andReturnUsing(function($arg) { return $arg; });
-               } else {
-                       $this->l10nMock
-                               ->shouldReceive('t')
-                               ->with($with)
-                               ->times($times)
-                               ->andReturn($return);
-               }
-       }
-}
index e9b7dfc509a8d066ba7fc0da46ef35c7b7b3fc63..565e693c95e322d5502d794acba7341637097de2 100644 (file)
@@ -21,33 +21,35 @@ trait VFSTrait
                $structure = [
                        'config' => [],
                        'bin' => [],
-                       'test' => []
+                       'static' => [],
+                       'test' => [],
                ];
 
                // create a virtual directory and copy all needed files and folders to it
                $this->root = vfsStream::setup('friendica', 0777, $structure);
 
-               $this->setConfigFile('defaults.config.php');
-               $this->setConfigFile('settings.config.php');
+               $this->setConfigFile('dbstructure.config.php', true);
+               $this->setConfigFile('defaults.config.php', true);
+               $this->setConfigFile('settings.config.php', true);
                $this->setConfigFile('local.config.php');
-               $this->setConfigFile('dbstructure.config.php');
        }
 
        /**
         * Copying a config file from the file system to the Virtual File System
         *
         * @param string $filename The filename of the config file
+        * @param bool $static True, if the folder `static` instead of `config` should be used
         */
-       protected function setConfigFile($filename)
+       protected function setConfigFile($filename, bool $static = false)
        {
                $file = dirname(__DIR__) . DIRECTORY_SEPARATOR .
                        '..' . DIRECTORY_SEPARATOR .
-                       'config' . DIRECTORY_SEPARATOR .
+                       ($static ? 'static' : 'config') . DIRECTORY_SEPARATOR .
                        $filename;
 
                if (file_exists($file)) {
                        vfsStream::newFile($filename)
-                               ->at($this->root->getChild('config'))
+                               ->at($this->root->getChild(($static ? 'static' : 'config')))
                                ->setContent(file_get_contents($file));
                }
        }
@@ -56,11 +58,12 @@ trait VFSTrait
         * Delets a config file from the Virtual File System
         *
         * @param string $filename The filename of the config file
+        * @param bool $static True, if the folder `static` instead of `config` should be used
         */
-       protected function delConfigFile($filename)
+       protected function delConfigFile($filename, bool $static = false)
        {
-               if ($this->root->hasChild('config/' . $filename)) {
-                       $this->root->getChild('config')->removeChild($filename);
+               if ($this->root->hasChild(($static ? 'static' : 'config') . '/' . $filename)) {
+                       $this->root->getChild(($static ? 'static' : 'config'))->removeChild($filename);
                }
        }
 }
diff --git a/tests/datasets/api.fixture.php b/tests/datasets/api.fixture.php
new file mode 100644 (file)
index 0000000..475fa03
--- /dev/null
@@ -0,0 +1,242 @@
+<?php
+
+return [
+       // Empty these tables
+       'cache',
+       'conversation',
+       'pconfig',
+       'photo',
+       'workerqueue',
+       'mail',
+       'item-delivery-data',
+       // Base test config to avoid notice messages
+       'config'  => [
+               [
+                       'cat' => 'system',
+                       'k'   => 'url',
+                       'v'   => 'http://localhost',
+               ],
+               [
+                       'cat' => 'config',
+                       'k'   => 'hostname',
+                       'v'   => 'localhost',
+               ],
+               [
+                       'cat' => 'system',
+                       'k'   => 'worker_dont_fork',
+                       'v'   => '1',
+               ],
+       ],
+       'user'    => [
+               [
+                       'uid'      => 42,
+                       'username' => 'Test user',
+                       'nickname' => 'selfcontact',
+                       'verified' => 1,
+                       'password' => '$2y$10$DLRNTRmJgKe1cSrFJ5Jb0edCqvXlA9sh/RHdSnfxjbR.04yZRm4Qm',
+                       'theme'    => 'frio',
+               ],
+       ],
+       'contact' => [
+               [
+                       'id'      => 42,
+                       'uid'     => 42,
+                       'name'    => 'Self contact',
+                       'nick'    => 'selfcontact',
+                       'self'    => 1,
+                       'nurl'    => 'http://localhost/profile/selfcontact',
+                       'url'     => 'http://localhost/profile/selfcontact',
+                       'about'   => 'User used in tests',
+                       'pending' => 0,
+                       'blocked' => 0,
+                       'rel'     => 1,
+                       'network' => 'dfrn',
+               ],
+               // Having the same name and nick allows us to test
+               // the fallback to api_get_nick() in api_get_user()
+               [
+                       'id'      => 43,
+                       'uid'     => 0,
+                       'name'    => 'othercontact',
+                       'nick'    => 'othercontact',
+                       'self'    => 0,
+                       'nurl'    => 'http://localhost/profile/othercontact',
+                       'url'     => 'http://localhost/profile/othercontact',
+                       'pending' => 0,
+                       'blocked' => 0,
+                       'rel'     => 0,
+                       'network' => 'dfrn',
+               ],
+               [
+                       'id'      => 44,
+                       'uid'     => 42,
+                       'name'    => 'Friend contact',
+                       'nick'    => 'friendcontact',
+                       'self'    => 0,
+                       'nurl'    => 'http://localhost/profile/friendcontact',
+                       'url'     => 'http://localhost/profile/friendcontact',
+                       'pending' => 0,
+                       'blocked' => 0,
+                       'rel'     => 2,
+                       'network' => 'dfrn',
+               ],
+       ],
+       'item'    => [
+               [
+                       'id'          => 1,
+                       'visible'     => 1,
+                       'contact-id'  => 42,
+                       'author-id'   => 42,
+                       'owner-id'    => 42,
+                       'uid'         => 42,
+                       'verb'        => 'http://activitystrea.ms/schema/1.0/post',
+                       'unseen'      => 1,
+                       'body'        => 'Parent status',
+                       'parent'      => 1,
+                       'author-link' => 'http://localhost/profile/selfcontact',
+                       'wall'        => 1,
+                       'starred'     => 1,
+                       'origin'      => 1,
+                       'allow_cid'   => '',
+                       'allow_gid'   => '',
+                       'deny_cid'    => '',
+                       'deny_gid'    => '',
+               ],
+               [
+                       'id'          => 2,
+                       'visible'     => 1,
+                       'contact-id'  => 42,
+                       'author-id'   => 42,
+                       'owner-id'    => 42,
+                       'uid'         => 42,
+                       'verb'        => 'http://activitystrea.ms/schema/1.0/post',
+                       'unseen'      => 0,
+                       'body'        => 'Reply',
+                       'parent'      => 1,
+                       'author-link' => 'http://localhost/profile/selfcontact',
+                       'wall'        => 1,
+                       'starred'     => 0,
+                       'origin'      => 1,
+               ],
+               [
+
+                       'id'          => 3,
+                       'visible'     => 1,
+                       'contact-id'  => 43,
+                       'author-id'   => 43,
+                       'owner-id'    => 42,
+                       'uid'         => 42,
+                       'verb'        => 'http://activitystrea.ms/schema/1.0/post',
+                       'unseen'      => 0,
+                       'body'        => 'Other user status',
+                       'parent'      => 3,
+                       'author-link' => 'http://localhost/profile/othercontact',
+                       'wall'        => 1,
+                       'starred'     => 0,
+                       'origin'      => 1,
+               ],
+               [
+                       'id'          => 4,
+                       'visible'     => 1,
+                       'contact-id'  => 44,
+                       'author-id'   => 44,
+                       'owner-id'    => 42,
+                       'uid'         => 42,
+                       'verb'        => 'http://activitystrea.ms/schema/1.0/post',
+                       'unseen'      => 0,
+                       'body'        => 'Friend user reply',
+                       'parent'      => 1,
+                       'author-link' => 'http://localhost/profile/othercontact',
+                       'wall'        => 1,
+                       'starred'     => 0,
+                       'origin'      => 1,
+               ],
+               [
+
+                       'id'          => 5,
+                       'visible'     => 1,
+                       'contact-id'  => 42,
+                       'author-id'   => 42,
+                       'owner-id'    => 42,
+                       'uid'         => 42,
+                       'verb'        => 'http://activitystrea.ms/schema/1.0/post',
+                       'unseen'      => 0,
+                       'body'        => '[share]Shared status[/share]',
+                       'parent'      => 1,
+                       'author-link' => 'http://localhost/profile/othercontact',
+                       'wall'        => 1,
+                       'starred'     => 0,
+                       'origin'      => 1,
+                       'allow_cid'   => '',
+                       'allow_gid'   => '',
+                       'deny_cid'    => '',
+                       'deny_gid'    => '',
+               ],
+               [
+                       'id'          => 6,
+                       'visible'     => 1,
+                       'contact-id'  => 44,
+                       'author-id'   => 44,
+                       'owner-id'    => 42,
+                       'uid'         => 42,
+                       'verb'        => 'http://activitystrea.ms/schema/1.0/post',
+                       'unseen'      => 0,
+                       'body'        => 'Friend user status',
+                       'parent'      => 6,
+                       'author-link' => 'http://localhost/profile/othercontact',
+                       'wall'        => 1,
+                       'starred'     => 0,
+                       'origin'      => 1,
+               ],
+       ],
+       'thread'  => [
+               [
+                       'iid'        => 1,
+                       'visible'    => 1,
+                       'contact-id' => 42,
+                       'author-id'  => 42,
+                       'owner-id'   => 42,
+                       'uid'        => 42,
+                       'wall'       => 1,
+               ],
+               [
+                       'iid'        => 3,
+                       'visible'    => 1,
+                       'contact-id' => 43,
+                       'author-id'  => 43,
+                       'owner-id'   => 43,
+                       'uid'        => 0,
+                       'wall'       => 1,
+               ],
+               [
+                       'iid'        => 6,
+                       'visible'    => 1,
+                       'contact-id' => 44,
+                       'author-id'  => 44,
+                       'owner-id'   => 44,
+                       'uid'        => 0,
+                       'wall'       => 1,
+               ],
+       ],
+       'group'   => [
+               [
+                       'id'      => 1,
+                       'uid'     => 42,
+                       'visible' => 1,
+                       'name'    => 'Visible list',
+               ],
+               [
+                       'id'      => 2,
+                       'uid'     => 42,
+                       'visible' => 0,
+                       'name'    => 'Private list',
+               ],
+       ],
+       'search'  => [
+               [
+                       'id'   => 1,
+                       'term' => 'Saved search',
+                       'uid'  => 42,
+               ],
+       ],
+];
\ No newline at end of file
diff --git a/tests/datasets/api.yml b/tests/datasets/api.yml
deleted file mode 100644 (file)
index a28ae21..0000000
+++ /dev/null
@@ -1,219 +0,0 @@
----
-# Empty these tables
-cache:
-conversation:
-pconfig:
-photo:
-workerqueue:
-mail:
-item-delivery-data:
-
-# Base test config to avoid notice messages
-config:
-    -
-        cat: system
-        k: url
-        v: http://localhost
-    -
-        cat: config
-        k: hostname
-        v: localhost
-    -
-        cat: system
-        k: worker_dont_fork
-        v: 1
-
-# Populate tables with test data
-user:
-    -
-        uid: 42
-        username: Test user
-        nickname: selfcontact
-        verified: 1
-        password: $2y$10$DLRNTRmJgKe1cSrFJ5Jb0edCqvXlA9sh/RHdSnfxjbR.04yZRm4Qm
-        theme: frio
-
-contact:
-    -
-        id: 42
-        uid: 42
-        name: Self contact
-        nick: selfcontact
-        self: 1
-        nurl: http://localhost/profile/selfcontact
-        url: http://localhost/profile/selfcontact
-        about: User used in tests
-        pending: 0
-        blocked: 0
-        rel: 1
-        network: dfrn
-    -
-        id: 43
-        uid: 0
-        # Having the same name and nick allows us to test
-        # the fallback to api_get_nick() in api_get_user()
-        name: othercontact
-        nick: othercontact
-        self: 0
-        nurl: http://localhost/profile/othercontact
-        url: http://localhost/profile/othercontact
-        pending: 0
-        blocked: 0
-        rel: 0
-        network: dfrn
-    -
-        id: 44
-        uid: 42
-        name: Friend contact
-        nick: friendcontact
-        self: 0
-        nurl: http://localhost/profile/friendcontact
-        url: http://localhost/profile/friendcontact
-        pending: 0
-        blocked: 0
-        rel: 2
-        network: dfrn
-
-item:
-    -
-        id: 1
-        visible: 1
-        contact-id: 42
-        author-id: 42
-        owner-id: 45
-        uid: 42
-        verb: http://activitystrea.ms/schema/1.0/post
-        unseen: 1
-        body: Parent status
-        parent: 1
-        author-link: http://localhost/profile/selfcontact
-        wall: 1
-        starred: 1
-        origin: 1
-        allow_cid: ''
-        allow_gid: ''
-        deny_cid: ''
-        deny_gid: ''
-    -
-        id: 2
-        visible: 1
-        contact-id: 42
-        author-id: 42
-        owner-id: 45
-        uid: 42
-        verb: http://activitystrea.ms/schema/1.0/post
-        unseen: 0
-        body: Reply
-        parent: 1
-        author-link: http://localhost/profile/selfcontact
-        wall: 1
-        starred: 0
-        origin: 1
-    -
-        id: 3
-        visible: 1
-        contact-id: 43
-        author-id: 43
-        owner-id: 42
-        uid: 42
-        verb: http://activitystrea.ms/schema/1.0/post
-        unseen: 0
-        body: Other user status
-        parent: 3
-        author-link: http://localhost/profile/othercontact
-        wall: 1
-        starred: 0
-        origin: 1
-    -
-        id: 4
-        visible: 1
-        contact-id: 44
-        author-id: 44
-        owner-id: 42
-        uid: 42
-        verb: http://activitystrea.ms/schema/1.0/post
-        unseen: 0
-        body: Friend user reply
-        parent: 1
-        author-link: http://localhost/profile/othercontact
-        wall: 1
-        starred: 0
-        origin: 1
-    -
-        id: 5
-        visible: 1
-        contact-id: 42
-        author-id: 42
-        owner-id: 42
-        uid: 42
-        verb: http://activitystrea.ms/schema/1.0/post
-        unseen: 0
-        body: '[share]Shared status[/share]'
-        parent: 1
-        author-link: http://localhost/profile/othercontact
-        wall: 1
-        starred: 0
-        origin: 1
-        allow_cid: ''
-        allow_gid: ''
-        deny_cid: ''
-        deny_gid: ''
-    -
-        id: 6
-        visible: 1
-        contact-id: 44
-        author-id: 44
-        owner-id: 42
-        uid: 42
-        verb: http://activitystrea.ms/schema/1.0/post
-        unseen: 0
-        body: Friend user status
-        parent: 6
-        author-link: http://localhost/profile/othercontact
-        wall: 1
-        starred: 0
-        origin: 1
-
-thread:
-    -
-        iid: 1
-        visible: 1
-        contact-id: 42
-        author-id: 42
-        owner-id: 42
-        uid: 42
-        wall: 1
-    -
-        iid: 3
-        visible: 1
-        contact-id: 43
-        author-id: 43
-        owner-id: 43
-        uid: 0
-        wall: 1
-    -
-        iid: 6
-        visible: 1
-        contact-id: 44
-        author-id: 44
-        owner-id: 44
-        uid: 0
-        wall: 1
-
-group:
-    -
-        id: 1
-        uid: 42
-        visible: 1
-        name: Visible list
-    -
-        id: 2
-        uid: 42
-        visible: 0
-        name: Private list
-
-search:
-    -
-        id: 1
-        term: Saved search
-        uid: 42
diff --git a/tests/datasets/config/A.config.php b/tests/datasets/config/A.config.php
new file mode 100644 (file)
index 0000000..f28e1f2
--- /dev/null
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * A test file for local configuration
+ *
+ */
+
+return [
+       'database' => [
+               'hostname' => 'testhost',
+               'username' => 'testuser',
+               'password' => 'testpw',
+               'database' => 'testdb',
+               'charset' => 'utf8mb4',
+       ],
+
+       'config' => [
+               'admin_email' => 'admin@test.it',
+               'sitename' => 'Friendica Social Network',
+               'register_policy' => \Friendica\Module\Register::OPEN,
+               'register_text' => '',
+       ],
+       'system' => [
+               'default_timezone' => 'UTC',
+               'language' => 'en',
+               'theme' => 'frio',
+       ],
+];
diff --git a/tests/datasets/config/A.ini.php b/tests/datasets/config/A.ini.php
new file mode 100644 (file)
index 0000000..a9e462d
--- /dev/null
@@ -0,0 +1,19 @@
+<?php
+/**
+ * A test local ini file
+ */
+
+return <<<INI
+
+[database]
+hostname = testhost
+username = testuser
+password = testpw
+database = testdb
+
+[system]
+theme = frio
+
+[config]
+admin_email = admin@test.it
+INI;
diff --git a/tests/datasets/config/B.config.php b/tests/datasets/config/B.config.php
new file mode 100644 (file)
index 0000000..59fadcf
--- /dev/null
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * A test file for local configuration
+ *
+ */
+
+return [
+       'database' => [
+               'hostname' => 'testhost',
+               'username' => 'testuser',
+               'password' => 'testpw',
+               'database' => 'testdb',
+               'charset' => 'utf8mb4',
+       ],
+
+       'config' => [
+               'admin_email' => 'admin@overwritten.local',
+               'sitename' => 'Friendica Social Network',
+               'register_policy' => \Friendica\Module\Register::OPEN,
+               'register_text' => '',
+       ],
+       'system' => [
+               'default_timezone' => 'UTC',
+               'language' => 'en',
+               'theme' => 'frio',
+               'newKey' => 'newValue',
+       ],
+];
diff --git a/tests/datasets/config/B.ini.php b/tests/datasets/config/B.ini.php
new file mode 100644 (file)
index 0000000..b9aa311
--- /dev/null
@@ -0,0 +1,20 @@
+<?php
+/**
+ * A test local ini file
+ */
+
+return <<<INI
+
+[database]
+hostname = testhost
+username = testuser
+password = testpw
+database = testdb
+
+[system]
+theme = changed
+newKey = newValue
+
+[config]
+admin_email = admin@overwritten.local
+INI;
diff --git a/tests/datasets/config/local.config.php b/tests/datasets/config/local.config.php
deleted file mode 100644 (file)
index f28e1f2..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-/**
- * A test file for local configuration
- *
- */
-
-return [
-       'database' => [
-               'hostname' => 'testhost',
-               'username' => 'testuser',
-               'password' => 'testpw',
-               'database' => 'testdb',
-               'charset' => 'utf8mb4',
-       ],
-
-       'config' => [
-               'admin_email' => 'admin@test.it',
-               'sitename' => 'Friendica Social Network',
-               'register_policy' => \Friendica\Module\Register::OPEN,
-               'register_text' => '',
-       ],
-       'system' => [
-               'default_timezone' => 'UTC',
-               'language' => 'en',
-               'theme' => 'frio',
-       ],
-];
diff --git a/tests/datasets/config/local.ini.php b/tests/datasets/config/local.ini.php
deleted file mode 100644 (file)
index a9e462d..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-/**
- * A test local ini file
- */
-
-return <<<INI
-
-[database]
-hostname = testhost
-username = testuser
-password = testpw
-database = testdb
-
-[system]
-theme = frio
-
-[config]
-admin_email = admin@test.it
-INI;
diff --git a/tests/datasets/content/text/html/bug-7457.html b/tests/datasets/content/text/html/bug-7457.html
new file mode 100644 (file)
index 0000000..4a2d4b3
--- /dev/null
@@ -0,0 +1 @@
+<h2 data-sourcepos="1:1-1:23" dir="auto">&#x000A;<a id="user-content-104-2019-08-01" class="anchor" href="#104-2019-08-01" aria-hidden="true"></a>[1.0.4] - 2019-08-01</h2>&#x000A;<h3 data-sourcepos="2:1-2:9" dir="auto">&#x000A;<a id="user-content-fixed" class="anchor" href="#fixed" aria-hidden="true"></a>Fixed</h3>&#x000A;<ul data-sourcepos="3:1-3:116" dir="auto">&#x000A;<li data-sourcepos="3:1-3:116">Invalid SemVer version generation, when the current branch does not have commits ahead of tag/checked out on a tag</li>&#x000A;</ul>
\ No newline at end of file
diff --git a/tests/datasets/content/text/html/bug-7457.txt b/tests/datasets/content/text/html/bug-7457.txt
new file mode 100644 (file)
index 0000000..051071d
--- /dev/null
@@ -0,0 +1,5 @@
+*[1.0.4] - 2019-08-01*
+
+*Fixed*
+
+* Invalid SemVer version generation, when the current branch does not have commits ahead of tag/checked out on a tag
\ No newline at end of file
diff --git a/tests/datasets/content/text/html/bug-7474.html b/tests/datasets/content/text/html/bug-7474.html
new file mode 100644 (file)
index 0000000..0bba94e
--- /dev/null
@@ -0,0 +1 @@
+<p>I recently released a PHP package that makes executing commands over SSH super simple. You can also upload/download files via SCP.</p><p><a href="https://github.com/DivineOmega/php-ssh-connection" rel="nofollow noopener" target="_blank"><span class="invisible">https://</span><span class="ellipsis">github.com/DivineOmega/php-ssh</span><span class="invisible">-connection</span></a></p><p><a href="https://mastodon.xyz/tags/php" class="mention hashtag" rel="tag">#<span>php</span></a> <a href="https://mastodon.xyz/tags/opensource" class="mention hashtag" rel="tag">#<span>opensource</span></a> <a href="https://mastodon.xyz/tags/webdev" class="mention hashtag" rel="tag">#<span>webdev</span></a> <a href="https://mastodon.xyz/tags/ssh" class="mention hashtag" rel="tag">#<span>ssh</span></a> <a href="https://mastodon.xyz/tags/devops" class="mention hashtag" rel="tag">#<span>DevOps</span></a></p>
\ No newline at end of file
diff --git a/tests/datasets/content/text/html/bug-7474.txt b/tests/datasets/content/text/html/bug-7474.txt
new file mode 100644 (file)
index 0000000..f590db5
--- /dev/null
@@ -0,0 +1,11 @@
+I recently released a PHP package that makes executing commands over SSH super simple. You can also upload/download files via SCP.
+
+https://github.com/DivineOmega/php-ssh-connection
+
+#php #opensource #webdev #ssh #DevOps
+
+https://mastodon.xyz/tags/php
+https://mastodon.xyz/tags/opensource
+https://mastodon.xyz/tags/webdev
+https://mastodon.xyz/tags/ssh
+https://mastodon.xyz/tags/devops
\ No newline at end of file
diff --git a/tests/datasets/content/text/html/bug-7488.html b/tests/datasets/content/text/html/bug-7488.html
new file mode 100644 (file)
index 0000000..a994260
--- /dev/null
@@ -0,0 +1,14 @@
+<p>Je n'arrive pas à être sûre et certaine que c'est bien une petite guêpe.<br />
+       Tous les matins, avant 9 heures, cette bestiolette vient prendre sa part de petit-déjeuner. Elle a repéré que c'était le bon moment, je ne la vois jamais plus tard. Comme la porte est ouverte et seulement masquée d'un rideau, elle entre et va faire sa danse zigzaguante sur le comptoir, où elle sait qu'il y aura des choses sucrées dont elle est friande.<br />
+       Du coup, j'ai pris l'habitude de laisser quelques gouttes de miel ou de confiture sur l'envers des couvercles.<br />
+       Un matin, j'ai oublié... Elle est venue tourner autour de moi, comme pour dire "Alors, quoi ? Le p'tit-dèje n'est pas encore servi ?"<br />
+       Elle n'est pas agressive du tout, elle est même venue sur ma main se lisser les antennes.<br />
+       J'ai pensé que c'était un syrphe, mais non, après vérification, ce ne sont pas du tout les mêmes yeux, ni le même abdomen. Il semble bien que ce soit une sorte de petite guêpe, mais elles ne ressemble pas aux autres qui nichent derrière la lampe de jardin, et qui sont plus grandes.</p>
+
+<p>Quelqu'un.e peut confirmer, d'après les photos ?... :)</p>
+
+<p><img src="https://framapic.org/Nh4cZUUfzsZr/3TMZ1ZZYldGS" alt="" /></p>
+
+<p><img src="https://framapic.org/yLMbCcaX3s0U/PYWzYdLOzy7t" alt="" /></p>
+
+<p>#faune-sauvage #insectes #guêpes #Vespoidea</p>
\ No newline at end of file
diff --git a/tests/datasets/content/text/html/bug-7488.txt b/tests/datasets/content/text/html/bug-7488.txt
new file mode 100644 (file)
index 0000000..1e1b15c
--- /dev/null
@@ -0,0 +1,19 @@
+Je n'arrive pas à être sûre et certaine que c'est bien une petite guêpe.
+
+Tous les matins, avant 9 heures, cette bestiolette vient prendre sa part de petit-déjeuner. Elle a repéré que c'était le bon moment, je ne la vois jamais plus tard. Comme la porte est ouverte et seulement masquée d'un rideau, elle entre et va faire sa danse zigzaguante sur le comptoir, où elle sait qu'il y aura des choses sucrées dont elle est friande.
+
+Du coup, j'ai pris l'habitude de laisser quelques gouttes de miel ou de confiture sur l'envers des couvercles.
+
+Un matin, j'ai oublié... Elle est venue tourner autour de moi, comme pour dire "Alors, quoi ? Le p'tit-dèje n'est pas encore servi ?"
+
+Elle n'est pas agressive du tout, elle est même venue sur ma main se lisser les antennes.
+
+J'ai pensé que c'était un syrphe, mais non, après vérification, ce ne sont pas du tout les mêmes yeux, ni le même abdomen. Il semble bien que ce soit une sorte de petite guêpe, mais elles ne ressemble pas aux autres qui nichent derrière la lampe de jardin, et qui sont plus grandes.
+
+Quelqu'un.e peut confirmer, d'après les photos ?... :)
+
+https://framapic.org/Nh4cZUUfzsZr/3TMZ1ZZYldGS
+
+https://framapic.org/yLMbCcaX3s0U/PYWzYdLOzy7t
+
+#faune-sauvage #insectes #guêpes #Vespoidea
\ No newline at end of file
diff --git a/tests/functional/DependencyCheckTest.php b/tests/functional/DependencyCheckTest.php
new file mode 100644 (file)
index 0000000..6de2dc6
--- /dev/null
@@ -0,0 +1,166 @@
+<?php
+
+namespace functional;
+
+use Dice\Dice;
+use Friendica\App;
+use Friendica\Core\Cache\ICache;
+use Friendica\Core\Cache\IMemoryCache;
+use Friendica\Core\Config\Cache\ConfigCache;
+use Friendica\Core\Config\Configuration;
+use Friendica\Core\Lock\ILock;
+use Friendica\Database\Database;
+use Friendica\Test\Util\VFSTrait;
+use Friendica\Util\BasePath;
+use Friendica\Util\ConfigFileLoader;
+use Friendica\Util\Profiler;
+use PHPUnit\Framework\TestCase;
+use Psr\Log\LoggerInterface;
+
+class dependencyCheck extends TestCase
+{
+       use VFSTrait;
+
+       /**
+        * @var Dice
+        */
+       private $dice;
+
+       protected function setUp()
+       {
+               parent::setUp();
+
+               $this->setUpVfsDir();
+
+               $this->dice = (new Dice())
+                       ->addRules(include __DIR__ . '/../../static/dependencies.config.php');
+       }
+
+       /**
+        * Test the creation of the BasePath
+        */
+       public function testBasePath()
+       {
+               /** @var BasePath $basePath */
+               $basePath = $this->dice->create(BasePath::class, [$this->root->url()]);
+
+               $this->assertInstanceOf(BasePath::class, $basePath);
+               $this->assertEquals($this->root->url(), $basePath->getPath());
+       }
+
+       /**
+        * Test the initial config cache
+        * Should not need any other files
+        */
+       public function testConfigFileLoader()
+       {
+               /** @var ConfigFileLoader $configFileLoader */
+               $configFileLoader = $this->dice->create(ConfigFileLoader::class);
+
+               $this->assertInstanceOf(ConfigFileLoader::class, $configFileLoader);
+
+               $configCache = new ConfigCache();
+               $configFileLoader->setupCache($configCache);
+
+               $this->assertNotEmpty($configCache->getAll());
+               $this->assertArrayHasKey('database', $configCache->getAll());
+               $this->assertArrayHasKey('system', $configCache->getAll());
+       }
+
+       /**
+        * Test the construction of a profiler class with DI
+        */
+       public function testProfiler()
+       {
+               /** @var Profiler $profiler */
+               $profiler = $this->dice->create(Profiler::class);
+
+               $this->assertInstanceOf(Profiler::class, $profiler);
+
+               $configCache = new ConfigCache([
+                       'system' => [
+                               'profiler' => true,
+                       ],
+                       'rendertime' => [
+                               'callstack' => true,
+                       ]
+               ]);
+
+               // create new DI-library because of shared instance rule (so the Profiler wouldn't get created twice)
+               $this->dice = new Dice();
+               $profiler = $this->dice->create(Profiler::class, [$configCache]);
+
+               $this->assertInstanceOf(Profiler::class, $profiler);
+               $this->assertTrue($profiler->isRendertime());
+       }
+
+       public function testDatabase()
+       {
+               /** @var Database $database */
+               $database = $this->dice->create(Database::class);
+
+               $this->assertInstanceOf(Database::class, $database);
+               $this->assertTrue($database->connected());
+       }
+
+       public function testAppMode()
+       {
+               /** @var App\Mode $mode */
+               $mode = $this->dice->create(App\Mode::class);
+
+               $this->assertInstanceOf(App\Mode::class, $mode);
+
+               $this->assertTrue($mode->isNormal());
+       }
+
+       public function testConfiguration()
+       {
+               /** @var Configuration $config */
+               $config = $this->dice->create(Configuration::class);
+
+               $this->assertInstanceOf(Configuration::class, $config);
+
+               $this->assertNotEmpty($config->get('database', 'username'));
+       }
+
+       public function testLogger()
+       {
+               /** @var LoggerInterface $logger */
+               $logger = $this->dice->create(LoggerInterface::class, ['test']);
+
+               $this->assertInstanceOf(LoggerInterface::class, $logger);
+       }
+
+       public function testDevLogger()
+       {
+               /** @var LoggerInterface $logger */
+               $logger = $this->dice->create('$devLogger', ['dev']);
+
+               $this->assertInstanceOf(LoggerInterface::class, $logger);
+       }
+
+       public function testCache()
+       {
+               /** @var ICache $cache */
+               $cache = $this->dice->create(ICache::class);
+
+               $this->assertInstanceOf(ICache::class, $cache);
+       }
+
+       public function testMemoryCache()
+       {
+               /** @var IMemoryCache $cache */
+               $cache = $this->dice->create(IMemoryCache::class);
+
+               // We need to check "just" ICache, because the default Cache is DB-Cache, which isn't a memorycache
+               $this->assertInstanceOf(ICache::class, $cache);
+       }
+
+       public function testLock()
+       {
+               /** @var ILock $cache */
+               $lock = $this->dice->create(ILock::class);
+
+               $this->assertInstanceOf(ILock::class, $lock);
+       }
+}
index 6f1172666ac69613081fb7be7f76880c6a7f57b1..3410f3049df83a1660b9c7cd0c76ca1c773c653d 100644 (file)
@@ -5,16 +5,16 @@
 
 namespace Friendica\Test;
 
+use Dice\Dice;
 use Friendica\App;
-use Friendica\Core\Config;
-use Friendica\Core\PConfig;
+use Friendica\BaseObject;
+use Friendica\Core\Config\Configuration;
+use Friendica\Core\Config\PConfiguration;
 use Friendica\Core\Protocol;
 use Friendica\Core\System;
-use Friendica\Factory;
+use Friendica\Database\Database;
 use Friendica\Network\HTTPException;
-use Friendica\Util\BasePath;
-use Friendica\Util\BaseURL;
-use Friendica\Util\Config\ConfigFileLoader;
+use Friendica\Test\Util\Database\StaticDatabase;
 use Monolog\Handler\TestHandler;
 
 require_once __DIR__ . '/../../include/api.php';
@@ -32,9 +32,6 @@ class ApiTest extends DatabaseTest
         */
        protected $logOutput;
 
-       /** @var App */
-       protected $app;
-
        /** @var array */
        protected $selfUser;
        /** @var array */
@@ -44,41 +41,68 @@ class ApiTest extends DatabaseTest
 
        protected $wrongUserId;
 
+       /** @var App */
+       protected $app;
+
+       /** @var Configuration */
+       protected $config;
+
+       /** @var Dice */
+       protected $dice;
+
        /**
         * Create variables used by tests.
         */
-       public function setUp()
-       {
-               $basePath = BasePath::create(dirname(__DIR__) . '/../');
-               $mode = new App\Mode($basePath);
-               $router = new App\Router();
-               $configLoader = new ConfigFileLoader($basePath, $mode);
-               $configCache = Factory\ConfigFactory::createCache($configLoader);
-               $profiler = Factory\ProfilerFactory::create($configCache);
-               Factory\DBFactory::init($configCache, $profiler, $_SERVER);
-               $config = Factory\ConfigFactory::createConfig($configCache);
-               Factory\ConfigFactory::createPConfig($configCache);
-               $logger = Factory\LoggerFactory::create('test', $config, $profiler);
-               $baseUrl = new BaseURL($config, $_SERVER);
-               $this->app = new App($config, $mode, $router, $baseUrl, $logger, $profiler, false);
-
+       protected function setUp()
+       {
                parent::setUp();
 
+               $this->dice = (new Dice())
+                       ->addRules(include __DIR__ . '/../../static/dependencies.config.php')
+                       ->addRule(Database::class, ['instanceOf' => StaticDatabase::class, 'shared' => true]);
+               BaseObject::setDependencyInjection($this->dice);
+
+               /** @var Database $dba */
+               $dba = $this->dice->create(Database::class);
+
+               /** @var Configuration $config */
+               $this->config = $this->dice->create(Configuration::class);
+
+               $this->config->set('system', 'url', 'http://localhost');
+               $this->config->set('system', 'hostname', 'localhost');
+               $this->config->set('system', 'worker_dont_fork', true);
+
+               // Default config
+               $this->config->set('config', 'hostname', 'localhost');
+               $this->config->set('system', 'throttle_limit_day', 100);
+               $this->config->set('system', 'throttle_limit_week', 100);
+               $this->config->set('system', 'throttle_limit_month', 100);
+               $this->config->set('system', 'theme', 'system_theme');
+
+               // Load the API dataset for the whole API
+               $this->loadFixture(__DIR__ . '/../datasets/api.fixture.php', $dba);
+
+               /** @var App app */
+               $this->app = BaseObject::getApp();
+
+               $this->app->argc = 1;
+               $this->app->argv = ['home'];
+
                // User data that the test database is populated with
-               $this->selfUser = [
-                       'id' => 42,
+               $this->selfUser   = [
+                       'id'   => 42,
                        'name' => 'Self contact',
                        'nick' => 'selfcontact',
                        'nurl' => 'http://localhost/profile/selfcontact'
                ];
                $this->friendUser = [
-                       'id' => 44,
+                       'id'   => 44,
                        'name' => 'Friend contact',
                        'nick' => 'friendcontact',
                        'nurl' => 'http://localhost/profile/friendcontact'
                ];
-               $this->otherUser = [
-                       'id' => 43,
+               $this->otherUser  = [
+                       'id'   => 43,
                        'name' => 'othercontact',
                        'nick' => 'othercontact',
                        'nurl' => 'http://localhost/profile/othercontact'
@@ -89,37 +113,21 @@ class ApiTest extends DatabaseTest
 
                // Most API require login so we force the session
                $_SESSION = [
-                       'allow_api' => true,
+                       'allow_api'     => true,
                        'authenticated' => true,
-                       'uid' => $this->selfUser['id']
+                       'uid'           => $this->selfUser['id']
                ];
 
-               Config::set('system', 'url', 'http://localhost');
-               Config::set('system', 'hostname', 'localhost');
-               Config::set('system', 'worker_dont_fork', true);
-
-               // Default config
-               Config::set('config', 'hostname', 'localhost');
-               Config::set('system', 'throttle_limit_day', 100);
-               Config::set('system', 'throttle_limit_week', 100);
-               Config::set('system', 'throttle_limit_month', 100);
-               Config::set('system', 'theme', 'system_theme');
-       }
-
-       /**
-        * Cleanup variables used by tests.
-        */
-       protected function tearDown()
-       {
-               parent::tearDown();
-
-               $this->app->argc = 1;
-               $this->app->argv = ['home'];
+               $_POST   = [];
+               $_GET    = [];
+               $_SERVER = [];
        }
 
        /**
         * Assert that an user array contains expected keys.
+        *
         * @param array $user User array
+        *
         * @return void
         */
        private function assertSelfUser(array $user)
@@ -136,7 +144,9 @@ class ApiTest extends DatabaseTest
 
        /**
         * Assert that an user array contains expected keys.
+        *
         * @param array $user User array
+        *
         * @return void
         */
        private function assertOtherUser(array $user)
@@ -151,7 +161,9 @@ class ApiTest extends DatabaseTest
 
        /**
         * Assert that a status array contains expected keys.
+        *
         * @param array $status Status array
+        *
         * @return void
         */
        private function assertStatus(array $status)
@@ -163,7 +175,9 @@ class ApiTest extends DatabaseTest
 
        /**
         * Assert that a list array contains expected keys.
+        *
         * @param array $list List array
+        *
         * @return void
         */
        private function assertList(array $list)
@@ -177,19 +191,22 @@ class ApiTest extends DatabaseTest
 
        /**
         * Assert that the string is XML and contain the root element.
+        *
         * @param string $result       XML string
         * @param string $root_element Root element name
+        *
         * @return void
         */
        private function assertXml($result, $root_element)
        {
                $this->assertStringStartsWith('<?xml version="1.0"?>', $result);
-               $this->assertContains('<'.$root_element, $result);
+               $this->assertContains('<' . $root_element, $result);
                // We could probably do more checks here.
        }
 
        /**
         * Get the path to a temporary empty PNG image.
+        *
         * @return string Path
         */
        private function getTempImage()
@@ -198,7 +215,7 @@ class ApiTest extends DatabaseTest
                file_put_contents(
                        $tmpFile,
                        base64_decode(
-                               // Empty 1x1 px PNG image
+                       // Empty 1x1 px PNG image
                                'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg=='
                        )
                );
@@ -208,6 +225,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_user() function.
+        *
         * @return void
         */
        public function testApiUser()
@@ -217,6 +235,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_user() function with an unallowed user.
+        *
         * @return void
         */
        public function testApiUserWithUnallowedUser()
@@ -227,6 +246,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_source() function.
+        *
         * @return void
         */
        public function testApiSource()
@@ -236,6 +256,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_source() function with a Twidere user agent.
+        *
         * @return void
         */
        public function testApiSourceWithTwidere()
@@ -246,6 +267,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_source() function with a GET parameter.
+        *
         * @return void
         */
        public function testApiSourceWithGet()
@@ -256,6 +278,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_date() function.
+        *
         * @return void
         */
        public function testApiDate()
@@ -265,6 +288,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_register_func() function.
+        *
         * @return void
         */
        public function testApiRegisterFunc()
@@ -286,6 +310,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_login() function without any login.
+        *
         * @return void
         * @runInSeparateProcess
         * @expectedException Friendica\Network\HTTPException\UnauthorizedException
@@ -297,6 +322,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_login() function with a bad login.
+        *
         * @return void
         * @runInSeparateProcess
         * @expectedException Friendica\Network\HTTPException\UnauthorizedException
@@ -309,6 +335,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_login() function with oAuth.
+        *
         * @return void
         */
        public function testApiLoginWithOauth()
@@ -318,6 +345,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_login() function with authentication provided by an addon.
+        *
         * @return void
         */
        public function testApiLoginWithAddonAuth()
@@ -327,18 +355,20 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_login() function with a correct login.
+        *
         * @return void
         * @runInSeparateProcess
         */
        public function testApiLoginWithCorrectLogin()
        {
                $_SERVER['PHP_AUTH_USER'] = 'Test user';
-               $_SERVER['PHP_AUTH_PW'] = 'password';
+               $_SERVER['PHP_AUTH_PW']   = 'password';
                api_login($this->app);
        }
 
        /**
         * Test the api_login() function with a remote user.
+        *
         * @return void
         * @runInSeparateProcess
         * @expectedException Friendica\Network\HTTPException\UnauthorizedException
@@ -351,6 +381,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_check_method() function.
+        *
         * @return void
         */
        public function testApiCheckMethod()
@@ -360,6 +391,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_check_method() function with a correct method.
+        *
         * @return void
         */
        public function testApiCheckMethodWithCorrectMethod()
@@ -370,6 +402,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_check_method() function with a wildcard.
+        *
         * @return void
         */
        public function testApiCheckMethodWithWildcard()
@@ -379,20 +412,21 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_call() function.
+        *
         * @return void
         * @runInSeparateProcess
         */
        public function testApiCall()
        {
                global $API;
-               $API['api_path'] = [
+               $API['api_path']           = [
                        'method' => 'method',
-                       'func' => function () {
+                       'func'   => function () {
                                return ['data' => ['some_data']];
                        }
                ];
                $_SERVER['REQUEST_METHOD'] = 'method';
-               $_GET['callback'] = 'callback_name';
+               $_GET['callback']          = 'callback_name';
 
                $this->app->query_string = 'api_path';
                $this->assertEquals(
@@ -403,27 +437,28 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_call() function with the profiled enabled.
+        *
         * @return void
         * @runInSeparateProcess
         */
        public function testApiCallWithProfiler()
        {
                global $API;
-               $API['api_path'] = [
+               $API['api_path']           = [
                        'method' => 'method',
-                       'func' => function () {
+                       'func'   => function () {
                                return ['data' => ['some_data']];
                        }
                ];
                $_SERVER['REQUEST_METHOD'] = 'method';
-               Config::set('system', 'profiler', true);
-               Config::set('rendertime', 'callstack', true);
+               $this->config->set('system', 'profiler', true);
+               $this->config->set('rendertime', 'callstack', true);
                $this->app->callstack = [
-                       'database' => ['some_function' => 200],
+                       'database'       => ['some_function' => 200],
                        'database_write' => ['some_function' => 200],
-                       'cache' => ['some_function' => 200],
-                       'cache_write' => ['some_function' => 200],
-                       'network' => ['some_function' => 200]
+                       'cache'          => ['some_function' => 200],
+                       'cache_write'    => ['some_function' => 200],
+                       'network'        => ['some_function' => 200]
                ];
 
                $this->app->query_string = 'api_path';
@@ -435,15 +470,16 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_call() function without any result.
+        *
         * @return void
         * @runInSeparateProcess
         */
        public function testApiCallWithNoResult()
        {
                global $API;
-               $API['api_path'] = [
+               $API['api_path']           = [
                        'method' => 'method',
-                       'func' => function () {
+                       'func'   => function () {
                                return false;
                        }
                ];
@@ -458,6 +494,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_call() function with an unimplemented API.
+        *
         * @return void
         * @runInSeparateProcess
         */
@@ -471,15 +508,16 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_call() function with a JSON result.
+        *
         * @return void
         * @runInSeparateProcess
         */
        public function testApiCallWithJson()
        {
                global $API;
-               $API['api_path'] = [
+               $API['api_path']           = [
                        'method' => 'method',
-                       'func' => function () {
+                       'func'   => function () {
                                return ['data' => ['some_data']];
                        }
                ];
@@ -494,15 +532,16 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_call() function with an XML result.
+        *
         * @return void
         * @runInSeparateProcess
         */
        public function testApiCallWithXml()
        {
                global $API;
-               $API['api_path'] = [
+               $API['api_path']           = [
                        'method' => 'method',
-                       'func' => function () {
+                       'func'   => function () {
                                return 'some_data';
                        }
                ];
@@ -517,15 +556,16 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_call() function with an RSS result.
+        *
         * @return void
         * @runInSeparateProcess
         */
        public function testApiCallWithRss()
        {
                global $API;
-               $API['api_path'] = [
+               $API['api_path']           = [
                        'method' => 'method',
-                       'func' => function () {
+                       'func'   => function () {
                                return 'some_data';
                        }
                ];
@@ -533,23 +573,24 @@ class ApiTest extends DatabaseTest
 
                $this->app->query_string = 'api_path.rss';
                $this->assertEquals(
-                       '<?xml version="1.0" encoding="UTF-8"?>'."\n".
-                               'some_data',
+                       '<?xml version="1.0" encoding="UTF-8"?>' . "\n" .
+                       'some_data',
                        api_call($this->app)
                );
        }
 
        /**
         * Test the api_call() function with an Atom result.
+        *
         * @return void
         * @runInSeparateProcess
         */
        public function testApiCallWithAtom()
        {
                global $API;
-               $API['api_path'] = [
+               $API['api_path']           = [
                        'method' => 'method',
-                       'func' => function () {
+                       'func'   => function () {
                                return 'some_data';
                        }
                ];
@@ -557,14 +598,15 @@ class ApiTest extends DatabaseTest
 
                $this->app->query_string = 'api_path.atom';
                $this->assertEquals(
-                       '<?xml version="1.0" encoding="UTF-8"?>'."\n".
-                               'some_data',
+                       '<?xml version="1.0" encoding="UTF-8"?>' . "\n" .
+                       'some_data',
                        api_call($this->app)
                );
        }
 
        /**
         * Test the api_call() function with an unallowed method.
+        *
         * @return void
         * @runInSeparateProcess
         */
@@ -582,15 +624,16 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_call() function with an unauthorized user.
+        *
         * @return void
         * @runInSeparateProcess
         */
        public function testApiCallWithWrongAuth()
        {
                global $API;
-               $API['api_path'] = [
+               $API['api_path']           = [
                        'method' => 'method',
-                       'auth' => true
+                       'auth'   => true
                ];
                $_SERVER['REQUEST_METHOD'] = 'method';
                $_SESSION['authenticated'] = false;
@@ -604,6 +647,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_error() function with a JSON result.
+        *
         * @return void
         * @runInSeparateProcess
         */
@@ -617,72 +661,76 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_error() function with an XML result.
+        *
         * @return void
         * @runInSeparateProcess
         */
        public function testApiErrorWithXml()
        {
                $this->assertEquals(
-                       '<?xml version="1.0"?>'."\n".
-                       '<status xmlns="http://api.twitter.com" xmlns:statusnet="http://status.net/schema/api/1/" '.
-                               'xmlns:friendica="http://friendi.ca/schema/api/1/" '.
-                               'xmlns:georss="http://www.georss.org/georss">'."\n".
-                       '  <error>error_message</error>'."\n".
-                       '  <code>200 OK</code>'."\n".
-                       '  <request/>'."\n".
-                       '</status>'."\n",
+                       '<?xml version="1.0"?>' . "\n" .
+                       '<status xmlns="http://api.twitter.com" xmlns:statusnet="http://status.net/schema/api/1/" ' .
+                       'xmlns:friendica="http://friendi.ca/schema/api/1/" ' .
+                       'xmlns:georss="http://www.georss.org/georss">' . "\n" .
+                       '  <error>error_message</error>' . "\n" .
+                       '  <code>200 OK</code>' . "\n" .
+                       '  <request/>' . "\n" .
+                       '</status>' . "\n",
                        api_error('xml', new HTTPException\OKException('error_message'))
                );
        }
 
        /**
         * Test the api_error() function with an RSS result.
+        *
         * @return void
         * @runInSeparateProcess
         */
        public function testApiErrorWithRss()
        {
                $this->assertEquals(
-                       '<?xml version="1.0"?>'."\n".
-                       '<status xmlns="http://api.twitter.com" xmlns:statusnet="http://status.net/schema/api/1/" '.
-                               'xmlns:friendica="http://friendi.ca/schema/api/1/" '.
-                               'xmlns:georss="http://www.georss.org/georss">'."\n".
-                       '  <error>error_message</error>'."\n".
-                       '  <code>200 OK</code>'."\n".
-                       '  <request/>'."\n".
-                       '</status>'."\n",
+                       '<?xml version="1.0"?>' . "\n" .
+                       '<status xmlns="http://api.twitter.com" xmlns:statusnet="http://status.net/schema/api/1/" ' .
+                       'xmlns:friendica="http://friendi.ca/schema/api/1/" ' .
+                       'xmlns:georss="http://www.georss.org/georss">' . "\n" .
+                       '  <error>error_message</error>' . "\n" .
+                       '  <code>200 OK</code>' . "\n" .
+                       '  <request/>' . "\n" .
+                       '</status>' . "\n",
                        api_error('rss', new HTTPException\OKException('error_message'))
                );
        }
 
        /**
         * Test the api_error() function with an Atom result.
+        *
         * @return void
         * @runInSeparateProcess
         */
        public function testApiErrorWithAtom()
        {
                $this->assertEquals(
-                       '<?xml version="1.0"?>'."\n".
-                       '<status xmlns="http://api.twitter.com" xmlns:statusnet="http://status.net/schema/api/1/" '.
-                               'xmlns:friendica="http://friendi.ca/schema/api/1/" '.
-                               'xmlns:georss="http://www.georss.org/georss">'."\n".
-                       '  <error>error_message</error>'."\n".
-                       '  <code>200 OK</code>'."\n".
-                       '  <request/>'."\n".
-                       '</status>'."\n",
+                       '<?xml version="1.0"?>' . "\n" .
+                       '<status xmlns="http://api.twitter.com" xmlns:statusnet="http://status.net/schema/api/1/" ' .
+                       'xmlns:friendica="http://friendi.ca/schema/api/1/" ' .
+                       'xmlns:georss="http://www.georss.org/georss">' . "\n" .
+                       '  <error>error_message</error>' . "\n" .
+                       '  <code>200 OK</code>' . "\n" .
+                       '  <request/>' . "\n" .
+                       '</status>' . "\n",
                        api_error('atom', new HTTPException\OKException('error_message'))
                );
        }
 
        /**
         * Test the api_rss_extra() function.
+        *
         * @return void
         */
        public function testApiRssExtra()
        {
                $user_info = ['url' => 'user_url', 'lang' => 'en'];
-               $result = api_rss_extra($this->app, [], $user_info);
+               $result    = api_rss_extra($this->app, [], $user_info);
                $this->assertEquals($user_info, $result['$user']);
                $this->assertEquals($user_info['url'], $result['$rss']['alternate']);
                $this->assertArrayHasKey('self', $result['$rss']);
@@ -695,8 +743,8 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_rss_extra() function without any user info.
+        *
         * @return void
-        * @runInSeparateProcess
         */
        public function testApiRssExtraWithoutUserInfo()
        {
@@ -713,6 +761,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_unique_id_to_nurl() function.
+        *
         * @return void
         */
        public function testApiUniqueIdToNurl()
@@ -722,6 +771,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_unique_id_to_nurl() function with a correct ID.
+        *
         * @return void
         */
        public function testApiUniqueIdToNurlWithCorrectId()
@@ -731,8 +781,8 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_get_user() function.
+        *
         * @return void
-        * @runInSeparateProcess
         */
        public function testApiGetUser()
        {
@@ -745,12 +795,13 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_get_user() function with a Frio schema.
+        *
         * @return void
-        * @runInSeparateProcess
         */
        public function testApiGetUserWithFrioSchema()
        {
-               PConfig::set($this->selfUser['id'], 'frio', 'schema', 'red');
+               $pConfig = $this->dice->create(PConfiguration::class);
+               $pConfig->set($this->selfUser['id'], 'frio', 'schema', 'red');
                $user = api_get_user($this->app);
                $this->assertSelfUser($user);
                $this->assertEquals('708fa0', $user['profile_sidebar_fill_color']);
@@ -760,15 +811,16 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_get_user() function with a custom Frio schema.
+        *
         * @return void
-        * @runInSeparateProcess
         */
        public function testApiGetUserWithCustomFrioSchema()
        {
-               $ret1 = PConfig::set($this->selfUser['id'], 'frio', 'schema', '---');
-               $ret2 = PConfig::set($this->selfUser['id'], 'frio', 'nav_bg', '#123456');
-               $ret3 = PConfig::set($this->selfUser['id'], 'frio', 'link_color', '#123456');
-               $ret4 = PConfig::set($this->selfUser['id'], 'frio', 'background_color', '#123456');
+               $pConfig = $this->dice->create(PConfiguration::class);
+               $pConfig->set($this->selfUser['id'], 'frio', 'schema', '---');
+               $pConfig->set($this->selfUser['id'], 'frio', 'nav_bg', '#123456');
+               $pConfig->set($this->selfUser['id'], 'frio', 'link_color', '#123456');
+               $pConfig->set($this->selfUser['id'], 'frio', 'background_color', '#123456');
                $user = api_get_user($this->app);
                $this->assertSelfUser($user);
                $this->assertEquals('123456', $user['profile_sidebar_fill_color']);
@@ -778,12 +830,13 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_get_user() function with an empty Frio schema.
+        *
         * @return void
-        * @runInSeparateProcess
         */
        public function testApiGetUserWithEmptyFrioSchema()
        {
-               PConfig::set($this->selfUser['id'], 'frio', 'schema', '---');
+               $pConfig = $this->dice->create(PConfiguration::class);
+               $pConfig->set($this->selfUser['id'], 'frio', 'schema', '---');
                $user = api_get_user($this->app);
                $this->assertSelfUser($user);
                $this->assertEquals('708fa0', $user['profile_sidebar_fill_color']);
@@ -793,21 +846,22 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_get_user() function with an user that is not allowed to use the API.
+        *
         * @return void
         * @runInSeparateProcess
         */
        public function testApiGetUserWithoutApiUser()
        {
                $_SERVER['PHP_AUTH_USER'] = 'Test user';
-               $_SERVER['PHP_AUTH_PW'] = 'password';
-               $_SESSION['allow_api'] = false;
+               $_SERVER['PHP_AUTH_PW']   = 'password';
+               $_SESSION['allow_api']    = false;
                $this->assertFalse(api_get_user($this->app));
        }
 
        /**
         * Test the api_get_user() function with an user ID in a GET parameter.
+        *
         * @return void
-        * @runInSeparateProcess
         */
        public function testApiGetUserWithGetId()
        {
@@ -817,8 +871,8 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_get_user() function with a wrong user ID in a GET parameter.
+        *
         * @return void
-        * @runInSeparateProcess
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         */
        public function testApiGetUserWithWrongGetId()
@@ -829,8 +883,8 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_get_user() function with an user name in a GET parameter.
+        *
         * @return void
-        * @runInSeparateProcess
         */
        public function testApiGetUserWithGetName()
        {
@@ -840,8 +894,8 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_get_user() function with a profile URL in a GET parameter.
+        *
         * @return void
-        * @runInSeparateProcess
         */
        public function testApiGetUserWithGetUrl()
        {
@@ -851,21 +905,21 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_get_user() function with an user ID in the API path.
+        *
         * @return void
-        * @runInSeparateProcess
         */
        public function testApiGetUserWithNumericCalledApi()
        {
                global $called_api;
-               $called_api = ['api_path'];
-               $this->app->argv[1] = $this->otherUser['id'].'.json';
+               $called_api         = ['api_path'];
+               $this->app->argv[1] = $this->otherUser['id'] . '.json';
                $this->assertOtherUser(api_get_user($this->app));
        }
 
        /**
         * Test the api_get_user() function with the $called_api global variable.
+        *
         * @return void
-        * @runInSeparateProcess
         */
        public function testApiGetUserWithCalledApi()
        {
@@ -876,8 +930,8 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_get_user() function with a valid user.
+        *
         * @return void
-        * @runInSeparateProcess
         */
        public function testApiGetUserWithCorrectUser()
        {
@@ -886,8 +940,8 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_get_user() function with a wrong user ID.
+        *
         * @return void
-        * @runInSeparateProcess
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         */
        public function testApiGetUserWithWrongUser()
@@ -897,8 +951,8 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_get_user() function with a 0 user ID.
+        *
         * @return void
-        * @runInSeparateProcess
         */
        public function testApiGetUserWithZeroUser()
        {
@@ -907,8 +961,8 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_item_get_user() function.
+        *
         * @return void
-        * @runInSeparateProcess
         */
        public function testApiItemGetUser()
        {
@@ -918,6 +972,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_item_get_user() function with a different item parent.
+        *
         * @return void
         */
        public function testApiItemGetUserWithDifferentParent()
@@ -929,6 +984,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_walk_recursive() function.
+        *
         * @return void
         */
        public function testApiWalkRecursive()
@@ -948,6 +1004,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_walk_recursive() function with an array.
+        *
         * @return void
         */
        public function testApiWalkRecursiveWithArray()
@@ -967,74 +1024,80 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_reformat_xml() function.
+        *
         * @return void
         */
        public function testApiReformatXml()
        {
                $item = true;
-               $key = '';
+               $key  = '';
                $this->assertTrue(api_reformat_xml($item, $key));
                $this->assertEquals('true', $item);
        }
 
        /**
         * Test the api_reformat_xml() function with a statusnet_api key.
+        *
         * @return void
         */
        public function testApiReformatXmlWithStatusnetKey()
        {
                $item = '';
-               $key = 'statusnet_api';
+               $key  = 'statusnet_api';
                $this->assertTrue(api_reformat_xml($item, $key));
                $this->assertEquals('statusnet:api', $key);
        }
 
        /**
         * Test the api_reformat_xml() function with a friendica_api key.
+        *
         * @return void
         */
        public function testApiReformatXmlWithFriendicaKey()
        {
                $item = '';
-               $key = 'friendica_api';
+               $key  = 'friendica_api';
                $this->assertTrue(api_reformat_xml($item, $key));
                $this->assertEquals('friendica:api', $key);
        }
 
        /**
         * Test the api_create_xml() function.
+        *
         * @return void
         */
        public function testApiCreateXml()
        {
                $this->assertEquals(
-                       '<?xml version="1.0"?>'."\n".
-                       '<root_element xmlns="http://api.twitter.com" xmlns:statusnet="http://status.net/schema/api/1/" '.
-                               'xmlns:friendica="http://friendi.ca/schema/api/1/" '.
-                               'xmlns:georss="http://www.georss.org/georss">'."\n".
-                               '  <data>some_data</data>'."\n".
-                       '</root_element>'."\n",
+                       '<?xml version="1.0"?>' . "\n" .
+                       '<root_element xmlns="http://api.twitter.com" xmlns:statusnet="http://status.net/schema/api/1/" ' .
+                       'xmlns:friendica="http://friendi.ca/schema/api/1/" ' .
+                       'xmlns:georss="http://www.georss.org/georss">' . "\n" .
+                       '  <data>some_data</data>' . "\n" .
+                       '</root_element>' . "\n",
                        api_create_xml(['data' => ['some_data']], 'root_element')
                );
        }
 
        /**
         * Test the api_create_xml() function without any XML namespace.
+        *
         * @return void
         */
        public function testApiCreateXmlWithoutNamespaces()
        {
                $this->assertEquals(
-                       '<?xml version="1.0"?>'."\n".
-                       '<ok>'."\n".
-                               '  <data>some_data</data>'."\n".
-                       '</ok>'."\n",
+                       '<?xml version="1.0"?>' . "\n" .
+                       '<ok>' . "\n" .
+                       '  <data>some_data</data>' . "\n" .
+                       '</ok>' . "\n",
                        api_create_xml(['data' => ['some_data']], 'ok')
                );
        }
 
        /**
         * Test the api_format_data() function.
+        *
         * @return void
         */
        public function testApiFormatData()
@@ -1045,23 +1108,25 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_format_data() function with an XML result.
+        *
         * @return void
         */
        public function testApiFormatDataWithXml()
        {
                $this->assertEquals(
-                       '<?xml version="1.0"?>'."\n".
-                       '<root_element xmlns="http://api.twitter.com" xmlns:statusnet="http://status.net/schema/api/1/" '.
-                               'xmlns:friendica="http://friendi.ca/schema/api/1/" '.
-                               'xmlns:georss="http://www.georss.org/georss">'."\n".
-                               '  <data>some_data</data>'."\n".
-                       '</root_element>'."\n",
+                       '<?xml version="1.0"?>' . "\n" .
+                       '<root_element xmlns="http://api.twitter.com" xmlns:statusnet="http://status.net/schema/api/1/" ' .
+                       'xmlns:friendica="http://friendi.ca/schema/api/1/" ' .
+                       'xmlns:georss="http://www.georss.org/georss">' . "\n" .
+                       '  <data>some_data</data>' . "\n" .
+                       '</root_element>' . "\n",
                        api_format_data('root_element', 'xml', ['data' => ['some_data']])
                );
        }
 
        /**
         * Test the api_account_verify_credentials() function.
+        *
         * @return void
         */
        public function testApiAccountVerifyCredentials()
@@ -1071,6 +1136,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_account_verify_credentials() function without an authenticated user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
@@ -1082,6 +1148,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the requestdata() function.
+        *
         * @return void
         */
        public function testRequestdata()
@@ -1091,6 +1158,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the requestdata() function with a POST parameter.
+        *
         * @return void
         */
        public function testRequestdataWithPost()
@@ -1101,6 +1169,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the requestdata() function with a GET parameter.
+        *
         * @return void
         */
        public function testRequestdataWithGet()
@@ -1111,21 +1180,22 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_mediap() function.
+        *
         * @return void
         */
        public function testApiStatusesMediap()
        {
                $this->app->argc = 2;
 
-               $_FILES = [
+               $_FILES         = [
                        'media' => [
-                               'id' => 666,
-                               'size' => 666,
-                               'width' => 666,
-                               'height' => 666,
+                               'id'       => 666,
+                               'size'     => 666,
+                               'width'    => 666,
+                               'height'   => 666,
                                'tmp_name' => $this->getTempImage(),
-                               'name' => 'spacer.png',
-                               'type' => 'image/png'
+                               'name'     => 'spacer.png',
+                               'type'     => 'image/png'
                        ]
                ];
                $_GET['status'] = '<b>Status content</b>';
@@ -1136,6 +1206,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_mediap() function without an authenticated user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
@@ -1147,23 +1218,24 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_update() function.
+        *
         * @return void
         */
        public function testApiStatusesUpdate()
        {
-               $_GET['status'] = 'Status content #friendica';
+               $_GET['status']                = 'Status content #friendica';
                $_GET['in_reply_to_status_id'] = -1;
-               $_GET['lat'] = 48;
-               $_GET['long'] = 7;
-               $_FILES = [
+               $_GET['lat']                   = 48;
+               $_GET['long']                  = 7;
+               $_FILES                        = [
                        'media' => [
-                               'id' => 666,
-                               'size' => 666,
-                               'width' => 666,
-                               'height' => 666,
+                               'id'       => 666,
+                               'size'     => 666,
+                               'width'    => 666,
+                               'height'   => 666,
                                'tmp_name' => $this->getTempImage(),
-                               'name' => 'spacer.png',
-                               'type' => 'image/png'
+                               'name'     => 'spacer.png',
+                               'type'     => 'image/png'
                        ]
                ];
 
@@ -1173,6 +1245,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_update() function with an HTML status.
+        *
         * @return void
         */
        public function testApiStatusesUpdateWithHtml()
@@ -1185,6 +1258,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_update() function without an authenticated user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
@@ -1196,6 +1270,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_update() function with a parent status.
+        *
         * @return void
         */
        public function testApiStatusesUpdateWithParent()
@@ -1205,6 +1280,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_update() function with a media_ids parameter.
+        *
         * @return void
         */
        public function testApiStatusesUpdateWithMediaIds()
@@ -1214,6 +1290,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_update() function with the throttle limit reached.
+        *
         * @return void
         */
        public function testApiStatusesUpdateWithDayThrottleReached()
@@ -1223,6 +1300,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_media_upload() function.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         */
@@ -1233,6 +1311,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_media_upload() function without an authenticated user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
@@ -1244,6 +1323,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_media_upload() function with an invalid uploaded media.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\InternalServerErrorException
         */
@@ -1251,7 +1331,7 @@ class ApiTest extends DatabaseTest
        {
                $_FILES = [
                        'media' => [
-                               'id' => 666,
+                               'id'       => 666,
                                'tmp_name' => 'tmp_name'
                        ]
                ];
@@ -1260,22 +1340,23 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_media_upload() function with an valid uploaded media.
+        *
         * @return void
         */
        public function testApiMediaUploadWithValidMedia()
        {
-               $_FILES = [
+               $_FILES    = [
                        'media' => [
-                               'id' => 666,
-                               'size' => 666,
-                               'width' => 666,
-                               'height' => 666,
+                               'id'       => 666,
+                               'size'     => 666,
+                               'width'    => 666,
+                               'height'   => 666,
                                'tmp_name' => $this->getTempImage(),
-                               'name' => 'spacer.png',
-                               'type' => 'image/png'
+                               'name'     => 'spacer.png',
+                               'type'     => 'image/png'
                        ]
                ];
-               $app = \get_app();
+               $app       = \get_app();
                $app->argc = 2;
 
                $result = api_media_upload();
@@ -1315,6 +1396,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_users_show() function.
+        *
         * @return void
         */
        public function testApiUsersShow()
@@ -1331,6 +1413,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_users_show() function with an XML result.
+        *
         * @return void
         */
        public function testApiUsersShowWithXml()
@@ -1341,28 +1424,31 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_users_search() function.
+        *
         * @return void
         */
        public function testApiUsersSearch()
        {
                $_GET['q'] = 'othercontact';
-               $result = api_users_search('json');
+               $result    = api_users_search('json');
                $this->assertOtherUser($result['users'][0]);
        }
 
        /**
         * Test the api_users_search() function with an XML result.
+        *
         * @return void
         */
        public function testApiUsersSearchWithXml()
        {
                $_GET['q'] = 'othercontact';
-               $result = api_users_search('xml');
+               $result    = api_users_search('xml');
                $this->assertXml($result, 'users');
        }
 
        /**
         * Test the api_users_search() function without a GET q parameter.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         */
@@ -1373,6 +1459,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_users_lookup() function.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\NotFoundException
         */
@@ -1383,24 +1470,26 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_users_lookup() function with an user ID.
+        *
         * @return void
         */
        public function testApiUsersLookupWithUserId()
        {
                $_REQUEST['user_id'] = $this->otherUser['id'];
-               $result = api_users_lookup('json');
+               $result              = api_users_lookup('json');
                $this->assertOtherUser($result['users'][0]);
        }
 
        /**
         * Test the api_search() function.
+        *
         * @return void
         */
        public function testApiSearch()
        {
-               $_REQUEST['q'] = 'reply';
+               $_REQUEST['q']      = 'reply';
                $_REQUEST['max_id'] = 10;
-               $result = api_search('json');
+               $result             = api_search('json');
                foreach ($result['status'] as $status) {
                        $this->assertStatus($status);
                        $this->assertContains('reply', $status['text'], null, true);
@@ -1409,13 +1498,14 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_search() function a count parameter.
+        *
         * @return void
         */
        public function testApiSearchWithCount()
        {
-               $_REQUEST['q'] = 'reply';
+               $_REQUEST['q']     = 'reply';
                $_REQUEST['count'] = 20;
-               $result = api_search('json');
+               $result            = api_search('json');
                foreach ($result['status'] as $status) {
                        $this->assertStatus($status);
                        $this->assertContains('reply', $status['text'], null, true);
@@ -1424,13 +1514,14 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_search() function with an rpp parameter.
+        *
         * @return void
         */
        public function testApiSearchWithRpp()
        {
-               $_REQUEST['q'] = 'reply';
+               $_REQUEST['q']   = 'reply';
                $_REQUEST['rpp'] = 20;
-               $result = api_search('json');
+               $result          = api_search('json');
                foreach ($result['status'] as $status) {
                        $this->assertStatus($status);
                        $this->assertContains('reply', $status['text'], null, true);
@@ -1439,12 +1530,13 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_search() function with an q parameter contains hashtag.
+        *
         * @return void
         */
        public function testApiSearchWithHashtag()
        {
                $_REQUEST['q'] = '%23friendica';
-               $result = api_search('json');
+               $result        = api_search('json');
                foreach ($result['status'] as $status) {
                        $this->assertStatus($status);
                        $this->assertContains('#friendica', $status['text'], null, true);
@@ -1453,14 +1545,15 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_search() function with an exclude_replies parameter.
+        *
         * @return void
         */
        public function testApiSearchWithExcludeReplies()
        {
-               $_REQUEST['max_id'] = 10;
+               $_REQUEST['max_id']          = 10;
                $_REQUEST['exclude_replies'] = true;
-               $_REQUEST['q'] = 'friendica';
-               $result = api_search('json');
+               $_REQUEST['q']               = 'friendica';
+               $result                      = api_search('json');
                foreach ($result['status'] as $status) {
                        $this->assertStatus($status);
                }
@@ -1468,18 +1561,20 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_search() function without an authenticated user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
        public function testApiSearchWithUnallowedUser()
        {
                $_SESSION['allow_api'] = false;
-               $_GET['screen_name'] = $this->selfUser['nick'];
+               $_GET['screen_name']   = $this->selfUser['nick'];
                api_search('json');
        }
 
        /**
         * Test the api_search() function without any GET query parameter.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         */
@@ -1490,14 +1585,15 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_home_timeline() function.
+        *
         * @return void
         */
        public function testApiStatusesHomeTimeline()
        {
-               $_REQUEST['max_id'] = 10;
+               $_REQUEST['max_id']          = 10;
                $_REQUEST['exclude_replies'] = true;
                $_REQUEST['conversation_id'] = 1;
-               $result = api_statuses_home_timeline('json');
+               $result                      = api_statuses_home_timeline('json');
                $this->assertNotEmpty($result['status']);
                foreach ($result['status'] as $status) {
                        $this->assertStatus($status);
@@ -1506,12 +1602,13 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_home_timeline() function with a negative page parameter.
+        *
         * @return void
         */
        public function testApiStatusesHomeTimelineWithNegativePage()
        {
                $_REQUEST['page'] = -2;
-               $result = api_statuses_home_timeline('json');
+               $result           = api_statuses_home_timeline('json');
                $this->assertNotEmpty($result['status']);
                foreach ($result['status'] as $status) {
                        $this->assertStatus($status);
@@ -1520,18 +1617,20 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_home_timeline() with an unallowed user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
        public function testApiStatusesHomeTimelineWithUnallowedUser()
        {
                $_SESSION['allow_api'] = false;
-               $_GET['screen_name'] = $this->selfUser['nick'];
+               $_GET['screen_name']   = $this->selfUser['nick'];
                api_statuses_home_timeline('json');
        }
 
        /**
         * Test the api_statuses_home_timeline() function with an RSS result.
+        *
         * @return void
         */
        public function testApiStatusesHomeTimelineWithRss()
@@ -1542,13 +1641,14 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_public_timeline() function.
+        *
         * @return void
         */
        public function testApiStatusesPublicTimeline()
        {
-               $_REQUEST['max_id'] = 10;
+               $_REQUEST['max_id']          = 10;
                $_REQUEST['conversation_id'] = 1;
-               $result = api_statuses_public_timeline('json');
+               $result                      = api_statuses_public_timeline('json');
                $this->assertNotEmpty($result['status']);
                foreach ($result['status'] as $status) {
                        $this->assertStatus($status);
@@ -1557,13 +1657,14 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_public_timeline() function with the exclude_replies parameter.
+        *
         * @return void
         */
        public function testApiStatusesPublicTimelineWithExcludeReplies()
        {
-               $_REQUEST['max_id'] = 10;
+               $_REQUEST['max_id']          = 10;
                $_REQUEST['exclude_replies'] = true;
-               $result = api_statuses_public_timeline('json');
+               $result                      = api_statuses_public_timeline('json');
                $this->assertNotEmpty($result['status']);
                foreach ($result['status'] as $status) {
                        $this->assertStatus($status);
@@ -1572,12 +1673,13 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_public_timeline() function with a negative page parameter.
+        *
         * @return void
         */
        public function testApiStatusesPublicTimelineWithNegativePage()
        {
                $_REQUEST['page'] = -2;
-               $result = api_statuses_public_timeline('json');
+               $result           = api_statuses_public_timeline('json');
                $this->assertNotEmpty($result['status']);
                foreach ($result['status'] as $status) {
                        $this->assertStatus($status);
@@ -1586,18 +1688,20 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_public_timeline() function with an unallowed user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
        public function testApiStatusesPublicTimelineWithUnallowedUser()
        {
                $_SESSION['allow_api'] = false;
-               $_GET['screen_name'] = $this->selfUser['nick'];
+               $_GET['screen_name']   = $this->selfUser['nick'];
                api_statuses_public_timeline('json');
        }
 
        /**
         * Test the api_statuses_public_timeline() function with an RSS result.
+        *
         * @return void
         */
        public function testApiStatusesPublicTimelineWithRss()
@@ -1608,12 +1712,13 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_networkpublic_timeline() function.
+        *
         * @return void
         */
        public function testApiStatusesNetworkpublicTimeline()
        {
                $_REQUEST['max_id'] = 10;
-               $result = api_statuses_networkpublic_timeline('json');
+               $result             = api_statuses_networkpublic_timeline('json');
                $this->assertNotEmpty($result['status']);
                foreach ($result['status'] as $status) {
                        $this->assertStatus($status);
@@ -1622,12 +1727,13 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_networkpublic_timeline() function with a negative page parameter.
+        *
         * @return void
         */
        public function testApiStatusesNetworkpublicTimelineWithNegativePage()
        {
                $_REQUEST['page'] = -2;
-               $result = api_statuses_networkpublic_timeline('json');
+               $result           = api_statuses_networkpublic_timeline('json');
                $this->assertNotEmpty($result['status']);
                foreach ($result['status'] as $status) {
                        $this->assertStatus($status);
@@ -1636,18 +1742,20 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_networkpublic_timeline() function with an unallowed user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
        public function testApiStatusesNetworkpublicTimelineWithUnallowedUser()
        {
                $_SESSION['allow_api'] = false;
-               $_GET['screen_name'] = $this->selfUser['nick'];
+               $_GET['screen_name']   = $this->selfUser['nick'];
                api_statuses_networkpublic_timeline('json');
        }
 
        /**
         * Test the api_statuses_networkpublic_timeline() function with an RSS result.
+        *
         * @return void
         */
        public function testApiStatusesNetworkpublicTimelineWithRss()
@@ -1658,6 +1766,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_show() function.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         */
@@ -1668,24 +1777,26 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_show() function with an ID.
+        *
         * @return void
         */
        public function testApiStatusesShowWithId()
        {
                $this->app->argv[3] = 1;
-               $result = api_statuses_show('json');
+               $result             = api_statuses_show('json');
                $this->assertStatus($result['status']);
        }
 
        /**
         * Test the api_statuses_show() function with the conversation parameter.
+        *
         * @return void
         */
        public function testApiStatusesShowWithConversation()
        {
-               $this->app->argv[3] = 1;
+               $this->app->argv[3]       = 1;
                $_REQUEST['conversation'] = 1;
-               $result = api_statuses_show('json');
+               $result                   = api_statuses_show('json');
                $this->assertNotEmpty($result['status']);
                foreach ($result['status'] as $status) {
                        $this->assertStatus($status);
@@ -1694,18 +1805,20 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_show() function with an unallowed user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
        public function testApiStatusesShowWithUnallowedUser()
        {
                $_SESSION['allow_api'] = false;
-               $_GET['screen_name'] = $this->selfUser['nick'];
+               $_GET['screen_name']   = $this->selfUser['nick'];
                api_statuses_show('json');
        }
 
        /**
         * Test the api_conversation_show() function.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         */
@@ -1716,14 +1829,15 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_conversation_show() function with an ID.
+        *
         * @return void
         */
        public function testApiConversationShowWithId()
        {
                $this->app->argv[3] = 1;
                $_REQUEST['max_id'] = 10;
-               $_REQUEST['page'] = -2;
-               $result = api_conversation_show('json');
+               $_REQUEST['page']   = -2;
+               $result             = api_conversation_show('json');
                $this->assertNotEmpty($result['status']);
                foreach ($result['status'] as $status) {
                        $this->assertStatus($status);
@@ -1732,18 +1846,20 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_conversation_show() function with an unallowed user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
        public function testApiConversationShowWithUnallowedUser()
        {
                $_SESSION['allow_api'] = false;
-               $_GET['screen_name'] = $this->selfUser['nick'];
+               $_GET['screen_name']   = $this->selfUser['nick'];
                api_conversation_show('json');
        }
 
        /**
         * Test the api_statuses_repeat() function.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
@@ -1754,6 +1870,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_repeat() function without an authenticated user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
@@ -1765,22 +1882,24 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_repeat() function with an ID.
+        *
         * @return void
         */
        public function testApiStatusesRepeatWithId()
        {
                $this->app->argv[3] = 1;
-               $result = api_statuses_repeat('json');
+               $result             = api_statuses_repeat('json');
                $this->assertStatus($result['status']);
 
                // Also test with a shared status
                $this->app->argv[3] = 5;
-               $result = api_statuses_repeat('json');
+               $result             = api_statuses_repeat('json');
                $this->assertStatus($result['status']);
        }
 
        /**
         * Test the api_statuses_destroy() function.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         */
@@ -1791,6 +1910,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_destroy() function without an authenticated user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
@@ -1802,53 +1922,58 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_destroy() function with an ID.
+        *
         * @return void
         */
        public function testApiStatusesDestroyWithId()
        {
                $this->app->argv[3] = 1;
-               $result = api_statuses_destroy('json');
+               $result             = api_statuses_destroy('json');
                $this->assertStatus($result['status']);
        }
 
        /**
         * Test the api_statuses_mentions() function.
+        *
         * @return void
         */
        public function testApiStatusesMentions()
        {
-               $this->app->user = ['nickname' => $this->selfUser['nick']];
+               $this->app->user    = ['nickname' => $this->selfUser['nick']];
                $_REQUEST['max_id'] = 10;
-               $result = api_statuses_mentions('json');
+               $result             = api_statuses_mentions('json');
                $this->assertEmpty($result['status']);
                // We should test with mentions in the database.
        }
 
        /**
         * Test the api_statuses_mentions() function with a negative page parameter.
+        *
         * @return void
         */
        public function testApiStatusesMentionsWithNegativePage()
        {
                $_REQUEST['page'] = -2;
-               $result = api_statuses_mentions('json');
+               $result           = api_statuses_mentions('json');
                $this->assertEmpty($result['status']);
        }
 
        /**
         * Test the api_statuses_mentions() function with an unallowed user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
        public function testApiStatusesMentionsWithUnallowedUser()
        {
                $_SESSION['allow_api'] = false;
-               $_GET['screen_name'] = $this->selfUser['nick'];
+               $_GET['screen_name']   = $this->selfUser['nick'];
                api_statuses_mentions('json');
        }
 
        /**
         * Test the api_statuses_mentions() function with an RSS result.
+        *
         * @return void
         */
        public function testApiStatusesMentionsWithRss()
@@ -1859,14 +1984,15 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_user_timeline() function.
+        *
         * @return void
         */
        public function testApiStatusesUserTimeline()
        {
-               $_REQUEST['max_id'] = 10;
+               $_REQUEST['max_id']          = 10;
                $_REQUEST['exclude_replies'] = true;
                $_REQUEST['conversation_id'] = 1;
-               $result = api_statuses_user_timeline('json');
+               $result                      = api_statuses_user_timeline('json');
                $this->assertNotEmpty($result['status']);
                foreach ($result['status'] as $status) {
                        $this->assertStatus($status);
@@ -1875,12 +2001,13 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_user_timeline() function with a negative page parameter.
+        *
         * @return void
         */
        public function testApiStatusesUserTimelineWithNegativePage()
        {
                $_REQUEST['page'] = -2;
-               $result = api_statuses_user_timeline('json');
+               $result           = api_statuses_user_timeline('json');
                $this->assertNotEmpty($result['status']);
                foreach ($result['status'] as $status) {
                        $this->assertStatus($status);
@@ -1889,6 +2016,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_user_timeline() function with an RSS result.
+        *
         * @return void
         */
        public function testApiStatusesUserTimelineWithRss()
@@ -1899,18 +2027,20 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_user_timeline() function with an unallowed user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
        public function testApiStatusesUserTimelineWithUnallowedUser()
        {
                $_SESSION['allow_api'] = false;
-               $_GET['screen_name'] = $this->selfUser['nick'];
+               $_GET['screen_name']   = $this->selfUser['nick'];
                api_statuses_user_timeline('json');
        }
 
        /**
         * Test the api_favorites_create_destroy() function.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         */
@@ -1923,6 +2053,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_favorites_create_destroy() function with an invalid ID.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         */
@@ -1935,6 +2066,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_favorites_create_destroy() function with an invalid action.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         */
@@ -1942,71 +2074,76 @@ class ApiTest extends DatabaseTest
        {
                $this->app->argv = ['api', '1.1', 'favorites', 'change.json'];
                $this->app->argc = count($this->app->argv);
-               $_REQUEST['id'] = 1;
+               $_REQUEST['id']  = 1;
                api_favorites_create_destroy('json');
        }
 
        /**
         * Test the api_favorites_create_destroy() function with the create action.
+        *
         * @return void
         */
        public function testApiFavoritesCreateDestroyWithCreateAction()
        {
                $this->app->argv = ['api', '1.1', 'favorites', 'create.json'];
                $this->app->argc = count($this->app->argv);
-               $_REQUEST['id'] = 3;
-               $result = api_favorites_create_destroy('json');
+               $_REQUEST['id']  = 3;
+               $result          = api_favorites_create_destroy('json');
                $this->assertStatus($result['status']);
        }
 
        /**
         * Test the api_favorites_create_destroy() function with the create action and an RSS result.
+        *
         * @return void
         */
        public function testApiFavoritesCreateDestroyWithCreateActionAndRss()
        {
                $this->app->argv = ['api', '1.1', 'favorites', 'create.rss'];
                $this->app->argc = count($this->app->argv);
-               $_REQUEST['id'] = 3;
-               $result = api_favorites_create_destroy('rss');
+               $_REQUEST['id']  = 3;
+               $result          = api_favorites_create_destroy('rss');
                $this->assertXml($result, 'status');
        }
 
        /**
         * Test the api_favorites_create_destroy() function with the destroy action.
+        *
         * @return void
         */
        public function testApiFavoritesCreateDestroyWithDestroyAction()
        {
                $this->app->argv = ['api', '1.1', 'favorites', 'destroy.json'];
                $this->app->argc = count($this->app->argv);
-               $_REQUEST['id'] = 3;
-               $result = api_favorites_create_destroy('json');
+               $_REQUEST['id']  = 3;
+               $result          = api_favorites_create_destroy('json');
                $this->assertStatus($result['status']);
        }
 
        /**
         * Test the api_favorites_create_destroy() function without an authenticated user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
        public function testApiFavoritesCreateDestroyWithoutAuthenticatedUser()
        {
-               $this->app->argv = ['api', '1.1', 'favorites', 'create.json'];
-               $this->app->argc = count($this->app->argv);
+               $this->app->argv           = ['api', '1.1', 'favorites', 'create.json'];
+               $this->app->argc           = count($this->app->argv);
                $_SESSION['authenticated'] = false;
                api_favorites_create_destroy('json');
        }
 
        /**
         * Test the api_favorites() function.
+        *
         * @return void
         */
        public function testApiFavorites()
        {
-               $_REQUEST['page'] = -1;
+               $_REQUEST['page']   = -1;
                $_REQUEST['max_id'] = 10;
-               $result = api_favorites('json');
+               $result             = api_favorites('json');
                foreach ($result['status'] as $status) {
                        $this->assertStatus($status);
                }
@@ -2014,6 +2151,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_favorites() function with an RSS result.
+        *
         * @return void
         */
        public function testApiFavoritesWithRss()
@@ -2024,18 +2162,20 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_favorites() function with an unallowed user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
        public function testApiFavoritesWithUnallowedUser()
        {
                $_SESSION['allow_api'] = false;
-               $_GET['screen_name'] = $this->selfUser['nick'];
+               $_GET['screen_name']   = $this->selfUser['nick'];
                api_favorites('json');
        }
 
        /**
         * Test the api_format_messages() function.
+        *
         * @return void
         */
        public function testApiFormatMessages()
@@ -2045,7 +2185,7 @@ class ApiTest extends DatabaseTest
                        ['id' => 2, 'screen_name' => 'recipient_name'],
                        ['id' => 3, 'screen_name' => 'sender_name']
                );
-               $this->assertEquals('item_title'."\n".'item_body', $result['text']);
+               $this->assertEquals('item_title' . "\n" . 'item_body', $result['text']);
                $this->assertEquals(1, $result['id']);
                $this->assertEquals(2, $result['recipient_id']);
                $this->assertEquals(3, $result['sender_id']);
@@ -2055,12 +2195,13 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_format_messages() function with HTML.
+        *
         * @return void
         */
        public function testApiFormatMessagesWithHtmlText()
        {
                $_GET['getText'] = 'html';
-               $result = api_format_messages(
+               $result          = api_format_messages(
                        ['id' => 1, 'title' => 'item_title', 'body' => '[b]item_body[/b]'],
                        ['id' => 2, 'screen_name' => 'recipient_name'],
                        ['id' => 3, 'screen_name' => 'sender_name']
@@ -2071,12 +2212,13 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_format_messages() function with plain text.
+        *
         * @return void
         */
        public function testApiFormatMessagesWithPlainText()
        {
                $_GET['getText'] = 'plain';
-               $result = api_format_messages(
+               $result          = api_format_messages(
                        ['id' => 1, 'title' => 'item_title', 'body' => '[b]item_body[/b]'],
                        ['id' => 2, 'screen_name' => 'recipient_name'],
                        ['id' => 3, 'screen_name' => 'sender_name']
@@ -2087,12 +2229,13 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_format_messages() function with the getUserObjects GET parameter set to false.
+        *
         * @return void
         */
        public function testApiFormatMessagesWithoutUserObjects()
        {
                $_GET['getUserObjects'] = 'false';
-               $result = api_format_messages(
+               $result                 = api_format_messages(
                        ['id' => 1, 'title' => 'item_title', 'body' => '[b]item_body[/b]'],
                        ['id' => 2, 'screen_name' => 'recipient_name'],
                        ['id' => 3, 'screen_name' => 'sender_name']
@@ -2103,6 +2246,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_convert_item() function.
+        *
         * @return void
         */
        public function testApiConvertItem()
@@ -2110,32 +2254,32 @@ class ApiTest extends DatabaseTest
                $result = api_convert_item(
                        [
                                'network' => 'feed',
-                               'title' => 'item_title',
+                               'title'   => 'item_title',
                                // We need a long string to test that it is correctly cut
-                               'body' => 'perspiciatis impedit voluptatem quis molestiae ea qui '.
-                               'reiciendis dolorum aut ducimus sunt consequatur inventore dolor '.
-                               'officiis pariatur doloremque nemo culpa aut quidem qui dolore '.
-                               'laudantium atque commodi alias voluptatem non possimus aperiam '.
-                               'ipsum rerum consequuntur aut amet fugit quia aliquid praesentium '.
-                               'repellendus quibusdam et et inventore mollitia rerum sit autem '.
-                               'pariatur maiores ipsum accusantium perferendis vel sit possimus '.
-                               'veritatis nihil distinctio qui eum repellat officia illum quos '.
-                               'impedit quam iste esse unde qui suscipit aut facilis ut inventore '.
-                               'omnis exercitationem quo magnam consequatur maxime aut illum '.
-                               'soluta quaerat natus unde aspernatur et sed beatae nihil ullam '.
-                               'temporibus corporis ratione blanditiis perspiciatis impedit '.
-                               'voluptatem quis molestiae ea qui reiciendis dolorum aut ducimus '.
-                               'sunt consequatur inventore dolor officiis pariatur doloremque '.
-                               'nemo culpa aut quidem qui dolore laudantium atque commodi alias '.
-                               'voluptatem non possimus aperiam ipsum rerum consequuntur aut '.
-                               'amet fugit quia aliquid praesentium repellendus quibusdam et et '.
-                               'inventore mollitia rerum sit autem pariatur maiores ipsum accusantium '.
-                               'perferendis vel sit possimus veritatis nihil distinctio qui eum '.
-                               'repellat officia illum quos impedit quam iste esse unde qui '.
-                               'suscipit aut facilis ut inventore omnis exercitationem quo magnam '.
-                               'consequatur maxime aut illum soluta quaerat natus unde aspernatur '.
-                               'et sed beatae nihil ullam temporibus corporis ratione blanditiis',
-                               'plink' => 'item_plink'
+                               'body'    => 'perspiciatis impedit voluptatem quis molestiae ea qui ' .
+                                            'reiciendis dolorum aut ducimus sunt consequatur inventore dolor ' .
+                                            'officiis pariatur doloremque nemo culpa aut quidem qui dolore ' .
+                                            'laudantium atque commodi alias voluptatem non possimus aperiam ' .
+                                            'ipsum rerum consequuntur aut amet fugit quia aliquid praesentium ' .
+                                            'repellendus quibusdam et et inventore mollitia rerum sit autem ' .
+                                            'pariatur maiores ipsum accusantium perferendis vel sit possimus ' .
+                                            'veritatis nihil distinctio qui eum repellat officia illum quos ' .
+                                            'impedit quam iste esse unde qui suscipit aut facilis ut inventore ' .
+                                            'omnis exercitationem quo magnam consequatur maxime aut illum ' .
+                                            'soluta quaerat natus unde aspernatur et sed beatae nihil ullam ' .
+                                            'temporibus corporis ratione blanditiis perspiciatis impedit ' .
+                                            'voluptatem quis molestiae ea qui reiciendis dolorum aut ducimus ' .
+                                            'sunt consequatur inventore dolor officiis pariatur doloremque ' .
+                                            'nemo culpa aut quidem qui dolore laudantium atque commodi alias ' .
+                                            'voluptatem non possimus aperiam ipsum rerum consequuntur aut ' .
+                                            'amet fugit quia aliquid praesentium repellendus quibusdam et et ' .
+                                            'inventore mollitia rerum sit autem pariatur maiores ipsum accusantium ' .
+                                            'perferendis vel sit possimus veritatis nihil distinctio qui eum ' .
+                                            'repellat officia illum quos impedit quam iste esse unde qui ' .
+                                            'suscipit aut facilis ut inventore omnis exercitationem quo magnam ' .
+                                            'consequatur maxime aut illum soluta quaerat natus unde aspernatur ' .
+                                            'et sed beatae nihil ullam temporibus corporis ratione blanditiis',
+                               'plink'   => 'item_plink'
                        ]
                );
                $this->assertStringStartsWith('item_title', $result['text']);
@@ -2144,6 +2288,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_convert_item() function with an empty item body.
+        *
         * @return void
         */
        public function testApiConvertItemWithoutBody()
@@ -2151,9 +2296,9 @@ class ApiTest extends DatabaseTest
                $result = api_convert_item(
                        [
                                'network' => 'feed',
-                               'title' => 'item_title',
-                               'body' => '',
-                               'plink' => 'item_plink'
+                               'title'   => 'item_title',
+                               'body'    => '',
+                               'plink'   => 'item_plink'
                        ]
                );
                $this->assertEquals('item_title', $result['text']);
@@ -2162,6 +2307,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_convert_item() function with the title in the body.
+        *
         * @return void
         */
        public function testApiConvertItemWithTitleInBody()
@@ -2169,7 +2315,7 @@ class ApiTest extends DatabaseTest
                $result = api_convert_item(
                        [
                                'title' => 'item_title',
-                               'body' => 'item_title item_body'
+                               'body'  => 'item_title item_body'
                        ]
                );
                $this->assertEquals('item_title item_body', $result['text']);
@@ -2178,6 +2324,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_get_attachments() function.
+        *
         * @return void
         */
        public function testApiGetAttachments()
@@ -2188,6 +2335,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_get_attachments() function with an img tag.
+        *
         * @return void
         */
        public function testApiGetAttachmentsWithImage()
@@ -2198,17 +2346,19 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_get_attachments() function with an img tag and an AndStatus user agent.
+        *
         * @return void
         */
        public function testApiGetAttachmentsWithImageAndAndStatus()
        {
                $_SERVER['HTTP_USER_AGENT'] = 'AndStatus';
-               $body = '[img]http://via.placeholder.com/1x1.png[/img]';
+               $body                       = '[img]http://via.placeholder.com/1x1.png[/img]';
                $this->assertInternalType('array', api_get_attachments($body));
        }
 
        /**
         * Test the api_get_entitities() function.
+        *
         * @return void
         */
        public function testApiGetEntitities()
@@ -2219,13 +2369,14 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_get_entitities() function with the include_entities parameter.
+        *
         * @return void
         */
        public function testApiGetEntititiesWithIncludeEntities()
        {
                $_REQUEST['include_entities'] = 'true';
-               $text = 'text';
-               $result = api_get_entitities($text, 'bbcode');
+               $text                         = 'text';
+               $result                       = api_get_entitities($text, 'bbcode');
                $this->assertInternalType('array', $result['hashtags']);
                $this->assertInternalType('array', $result['symbols']);
                $this->assertInternalType('array', $result['urls']);
@@ -2234,6 +2385,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_format_items_embeded_images() function.
+        *
         * @return void
         */
        public function testApiFormatItemsEmbededImages()
@@ -2246,6 +2398,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_contactlink_to_array() function.
+        *
         * @return void
         */
        public function testApiContactlinkToArray()
@@ -2253,7 +2406,7 @@ class ApiTest extends DatabaseTest
                $this->assertEquals(
                        [
                                'name' => 'text',
-                               'url' => '',
+                               'url'  => '',
                        ],
                        api_contactlink_to_array('text')
                );
@@ -2261,6 +2414,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_contactlink_to_array() function with an URL.
+        *
         * @return void
         */
        public function testApiContactlinkToArrayWithUrl()
@@ -2268,7 +2422,7 @@ class ApiTest extends DatabaseTest
                $this->assertEquals(
                        [
                                'name' => ['link_text'],
-                               'url' => ['url'],
+                               'url'  => ['url'],
                        ],
                        api_contactlink_to_array('text <a href="url">link_text</a>')
                );
@@ -2276,11 +2430,12 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_format_items_activities() function.
+        *
         * @return void
         */
        public function testApiFormatItemsActivities()
        {
-               $item = ['uid' => 0, 'uri' => ''];
+               $item   = ['uid' => 0, 'uri' => ''];
                $result = api_format_items_activities($item);
                $this->assertArrayHasKey('like', $result);
                $this->assertArrayHasKey('dislike', $result);
@@ -2291,11 +2446,12 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_format_items_activities() function with an XML result.
+        *
         * @return void
         */
        public function testApiFormatItemsActivitiesWithXml()
        {
-               $item = ['uid' => 0, 'uri' => ''];
+               $item   = ['uid' => 0, 'uri' => ''];
                $result = api_format_items_activities($item, 'xml');
                $this->assertArrayHasKey('friendica:like', $result);
                $this->assertArrayHasKey('friendica:dislike', $result);
@@ -2306,94 +2462,95 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_format_items_profiles() function.
+        *
         * @return void
         */
        public function testApiFormatItemsProfiles()
        {
                $profile_row = [
-                       'id' => 'profile_id',
+                       'id'           => 'profile_id',
                        'profile-name' => 'profile_name',
-                       'is-default' => true,
+                       'is-default'   => true,
                        'hide-friends' => true,
-                       'photo' => 'profile_photo',
-                       'thumb' => 'profile_thumb',
-                       'publish' => true,
-                       'net-publish' => true,
-                       'pdesc' => 'description',
-                       'dob' => 'date_of_birth',
-                       'address' => 'address',
-                       'locality' => 'city',
-                       'region' => 'region',
-                       'postal-code' => 'postal_code',
+                       'photo'        => 'profile_photo',
+                       'thumb'        => 'profile_thumb',
+                       'publish'      => true,
+                       'net-publish'  => true,
+                       'pdesc'        => 'description',
+                       'dob'          => 'date_of_birth',
+                       'address'      => 'address',
+                       'locality'     => 'city',
+                       'region'       => 'region',
+                       'postal-code'  => 'postal_code',
                        'country-name' => 'country',
-                       'hometown' => 'hometown',
-                       'gender' => 'gender',
-                       'marital' => 'marital',
-                       'with' => 'marital_with',
-                       'howlong' => 'marital_since',
-                       'sexual' => 'sexual',
-                       'politic' => 'politic',
-                       'religion' => 'religion',
+                       'hometown'     => 'hometown',
+                       'gender'       => 'gender',
+                       'marital'      => 'marital',
+                       'with'         => 'marital_with',
+                       'howlong'      => 'marital_since',
+                       'sexual'       => 'sexual',
+                       'politic'      => 'politic',
+                       'religion'     => 'religion',
                        'pub_keywords' => 'public_keywords',
                        'prv_keywords' => 'private_keywords',
 
-                       'likes' => 'likes',
-                       'dislikes' => 'dislikes',
-                       'about' => 'about',
-                       'music' => 'music',
-                       'book' => 'book',
-                       'tv' => 'tv',
-                       'film' => 'film',
-                       'interest' => 'interest',
-                       'romance' => 'romance',
-                       'work' => 'work',
+                       'likes'     => 'likes',
+                       'dislikes'  => 'dislikes',
+                       'about'     => 'about',
+                       'music'     => 'music',
+                       'book'      => 'book',
+                       'tv'        => 'tv',
+                       'film'      => 'film',
+                       'interest'  => 'interest',
+                       'romance'   => 'romance',
+                       'work'      => 'work',
                        'education' => 'education',
-                       'contact' => 'social_networks',
-                       'homepage' => 'homepage'
+                       'contact'   => 'social_networks',
+                       'homepage'  => 'homepage'
                ];
-               $result = api_format_items_profiles($profile_row);
+               $result      = api_format_items_profiles($profile_row);
                $this->assertEquals(
                        [
-                               'profile_id' => 'profile_id',
-                               'profile_name' => 'profile_name',
-                               'is_default' => true,
-                               'hide_friends' => true,
-                               'profile_photo' => 'profile_photo',
-                               'profile_thumb' => 'profile_thumb',
-                               'publish' => true,
-                               'net_publish' => true,
-                               'description' => 'description',
-                               'date_of_birth' => 'date_of_birth',
-                               'address' => 'address',
-                               'city' => 'city',
-                               'region' => 'region',
-                               'postal_code' => 'postal_code',
-                               'country' => 'country',
-                               'hometown' => 'hometown',
-                               'gender' => 'gender',
-                               'marital' => 'marital',
-                               'marital_with' => 'marital_with',
-                               'marital_since' => 'marital_since',
-                               'sexual' => 'sexual',
-                               'politic' => 'politic',
-                               'religion' => 'religion',
-                               'public_keywords' => 'public_keywords',
+                               'profile_id'       => 'profile_id',
+                               'profile_name'     => 'profile_name',
+                               'is_default'       => true,
+                               'hide_friends'     => true,
+                               'profile_photo'    => 'profile_photo',
+                               'profile_thumb'    => 'profile_thumb',
+                               'publish'          => true,
+                               'net_publish'      => true,
+                               'description'      => 'description',
+                               'date_of_birth'    => 'date_of_birth',
+                               'address'          => 'address',
+                               'city'             => 'city',
+                               'region'           => 'region',
+                               'postal_code'      => 'postal_code',
+                               'country'          => 'country',
+                               'hometown'         => 'hometown',
+                               'gender'           => 'gender',
+                               'marital'          => 'marital',
+                               'marital_with'     => 'marital_with',
+                               'marital_since'    => 'marital_since',
+                               'sexual'           => 'sexual',
+                               'politic'          => 'politic',
+                               'religion'         => 'religion',
+                               'public_keywords'  => 'public_keywords',
                                'private_keywords' => 'private_keywords',
 
-                               'likes' => 'likes',
-                               'dislikes' => 'dislikes',
-                               'about' => 'about',
-                               'music' => 'music',
-                               'book' => 'book',
-                               'tv' => 'tv',
-                               'film' => 'film',
-                               'interest' => 'interest',
-                               'romance' => 'romance',
-                               'work' => 'work',
-                               'education' => 'education',
+                               'likes'           => 'likes',
+                               'dislikes'        => 'dislikes',
+                               'about'           => 'about',
+                               'music'           => 'music',
+                               'book'            => 'book',
+                               'tv'              => 'tv',
+                               'film'            => 'film',
+                               'interest'        => 'interest',
+                               'romance'         => 'romance',
+                               'work'            => 'work',
+                               'education'       => 'education',
                                'social_networks' => 'social_networks',
-                               'homepage' => 'homepage',
-                               'users' => null
+                               'homepage'        => 'homepage',
+                               'users'           => null
                        ],
                        $result
                );
@@ -2401,21 +2558,22 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_format_items() function.
+        *
         * @return void
         */
        public function testApiFormatItems()
        {
-               $items = [
+               $items  = [
                        [
-                               'item_network' => 'item_network',
-                               'source' => 'web',
-                               'coord' => '5 7',
-                               'body' => '',
-                               'verb' => '',
-                               'author-id' => 43,
+                               'item_network'   => 'item_network',
+                               'source'         => 'web',
+                               'coord'          => '5 7',
+                               'body'           => '',
+                               'verb'           => '',
+                               'author-id'      => 43,
                                'author-network' => Protocol::DFRN,
-                               'author-link' => 'http://localhost/profile/othercontact',
-                               'plink' => '',
+                               'author-link'    => 'http://localhost/profile/othercontact',
+                               'plink'          => '',
                        ]
                ];
                $result = api_format_items($items, ['id' => 0], true);
@@ -2426,19 +2584,20 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_format_items() function with an XML result.
+        *
         * @return void
         */
        public function testApiFormatItemsWithXml()
        {
-               $items = [
+               $items  = [
                        [
-                               'coord' => '5 7',
-                               'body' => '',
-                               'verb' => '',
-                               'author-id' => 43,
+                               'coord'          => '5 7',
+                               'body'           => '',
+                               'verb'           => '',
+                               'author-id'      => 43,
                                'author-network' => Protocol::DFRN,
-                               'author-link' => 'http://localhost/profile/othercontact',
-                               'plink' => '',
+                               'author-link'    => 'http://localhost/profile/othercontact',
+                               'plink'          => '',
                        ]
                ];
                $result = api_format_items($items, ['id' => 0], true, 'xml');
@@ -2449,6 +2608,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_format_items() function.
+        *
         * @return void
         */
        public function testApiAccountRateLimitStatus()
@@ -2461,6 +2621,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_format_items() function with an XML result.
+        *
         * @return void
         */
        public function testApiAccountRateLimitStatusWithXml()
@@ -2471,6 +2632,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_help_test() function.
+        *
         * @return void
         */
        public function testApiHelpTest()
@@ -2481,6 +2643,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_help_test() function with an XML result.
+        *
         * @return void
         */
        public function testApiHelpTestWithXml()
@@ -2491,6 +2654,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_lists_list() function.
+        *
         * @return void
         */
        public function testApiListsList()
@@ -2501,6 +2665,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_lists_ownerships() function.
+        *
         * @return void
         */
        public function testApiListsOwnerships()
@@ -2513,6 +2678,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_lists_ownerships() function without an authenticated user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
@@ -2524,6 +2690,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_lists_statuses() function.
+        *
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         * @return void
         */
@@ -2534,14 +2701,15 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_lists_statuses() function with a list ID.
+        *
         * @return void
         */
        public function testApiListsStatusesWithListId()
        {
                $_REQUEST['list_id'] = 1;
-               $_REQUEST['page'] = -1;
-               $_REQUEST['max_id'] = 10;
-               $result = api_lists_statuses('json');
+               $_REQUEST['page']    = -1;
+               $_REQUEST['max_id']  = 10;
+               $result              = api_lists_statuses('json');
                foreach ($result['status'] as $status) {
                        $this->assertStatus($status);
                }
@@ -2549,40 +2717,44 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_lists_statuses() function with a list ID and a RSS result.
+        *
         * @return void
         */
        public function testApiListsStatusesWithListIdAndRss()
        {
                $_REQUEST['list_id'] = 1;
-               $result = api_lists_statuses('rss');
+               $result              = api_lists_statuses('rss');
                $this->assertXml($result, 'statuses');
        }
 
        /**
         * Test the api_lists_statuses() function with an unallowed user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
        public function testApiListsStatusesWithUnallowedUser()
        {
                $_SESSION['allow_api'] = false;
-               $_GET['screen_name'] = $this->selfUser['nick'];
+               $_GET['screen_name']   = $this->selfUser['nick'];
                api_lists_statuses('json');
        }
 
        /**
         * Test the api_statuses_f() function.
+        *
         * @return void
         */
        public function testApiStatusesFWithFriends()
        {
                $_GET['page'] = -1;
-               $result = api_statuses_f('friends');
+               $result       = api_statuses_f('friends');
                $this->assertArrayHasKey('user', $result);
        }
 
        /**
         * Test the api_statuses_f() function.
+        *
         * @return void
         */
        public function testApiStatusesFWithFollowers()
@@ -2593,6 +2765,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_f() function.
+        *
         * @return void
         */
        public function testApiStatusesFWithBlocks()
@@ -2603,6 +2776,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_f() function.
+        *
         * @return void
         */
        public function testApiStatusesFWithIncoming()
@@ -2613,6 +2787,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_f() function an undefined cursor GET variable.
+        *
         * @return void
         */
        public function testApiStatusesFWithUndefinedCursor()
@@ -2623,6 +2798,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_friends() function.
+        *
         * @return void
         */
        public function testApiStatusesFriends()
@@ -2633,6 +2809,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_friends() function an undefined cursor GET variable.
+        *
         * @return void
         */
        public function testApiStatusesFriendsWithUndefinedCursor()
@@ -2643,6 +2820,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_followers() function.
+        *
         * @return void
         */
        public function testApiStatusesFollowers()
@@ -2653,6 +2831,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statuses_followers() function an undefined cursor GET variable.
+        *
         * @return void
         */
        public function testApiStatusesFollowersWithUndefinedCursor()
@@ -2663,6 +2842,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_blocks_list() function.
+        *
         * @return void
         */
        public function testApiBlocksList()
@@ -2673,6 +2853,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_blocks_list() function an undefined cursor GET variable.
+        *
         * @return void
         */
        public function testApiBlocksListWithUndefinedCursor()
@@ -2683,6 +2864,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_friendships_incoming() function.
+        *
         * @return void
         */
        public function testApiFriendshipsIncoming()
@@ -2693,6 +2875,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_friendships_incoming() function an undefined cursor GET variable.
+        *
         * @return void
         */
        public function testApiFriendshipsIncomingWithUndefinedCursor()
@@ -2703,6 +2886,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statusnet_config() function.
+        *
         * @return void
         */
        public function testApiStatusnetConfig()
@@ -2722,6 +2906,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_statusnet_version() function.
+        *
         * @return void
         */
        public function testApiStatusnetVersion()
@@ -2732,6 +2917,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_ff_ids() function.
+        *
         * @return void
         */
        public function testApiFfIds()
@@ -2742,6 +2928,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_ff_ids() function with a result.
+        *
         * @return void
         */
        public function testApiFfIdsWithResult()
@@ -2751,6 +2938,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_ff_ids() function without an authenticated user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
@@ -2762,6 +2950,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_friends_ids() function.
+        *
         * @return void
         */
        public function testApiFriendsIds()
@@ -2772,6 +2961,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_followers_ids() function.
+        *
         * @return void
         */
        public function testApiFollowersIds()
@@ -2782,6 +2972,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_direct_messages_new() function.
+        *
         * @return void
         */
        public function testApiDirectMessagesNew()
@@ -2792,6 +2983,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_direct_messages_new() function without an authenticated user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
@@ -2803,26 +2995,27 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_direct_messages_new() function with an user ID.
+        *
         * @return void
         */
        public function testApiDirectMessagesNewWithUserId()
        {
-               $_POST['text'] = 'message_text';
+               $_POST['text']    = 'message_text';
                $_POST['user_id'] = $this->otherUser['id'];
-               $result = api_direct_messages_new('json');
+               $result           = api_direct_messages_new('json');
                $this->assertEquals(['direct_message' => ['error' => -1]], $result);
        }
 
        /**
         * Test the api_direct_messages_new() function with a screen name.
+        *
         * @return void
         */
        public function testApiDirectMessagesNewWithScreenName()
        {
-               $_POST['text'] = 'message_text';
+               $_POST['text']        = 'message_text';
                $_POST['screen_name'] = $this->friendUser['nick'];
-               $result = api_direct_messages_new('json');
-               $this->assertEquals(1, $result['direct_message']['id']);
+               $result               = api_direct_messages_new('json');
                $this->assertContains('message_text', $result['direct_message']['text']);
                $this->assertEquals('selfcontact', $result['direct_message']['sender_screen_name']);
                $this->assertEquals(1, $result['direct_message']['friendica_seen']);
@@ -2830,15 +3023,15 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_direct_messages_new() function with a title.
+        *
         * @return void
         */
        public function testApiDirectMessagesNewWithTitle()
        {
-               $_POST['text'] = 'message_text';
+               $_POST['text']        = 'message_text';
                $_POST['screen_name'] = $this->friendUser['nick'];
-               $_REQUEST['title'] = 'message_title';
-               $result = api_direct_messages_new('json');
-               $this->assertEquals(1, $result['direct_message']['id']);
+               $_REQUEST['title']    = 'message_title';
+               $result               = api_direct_messages_new('json');
                $this->assertContains('message_text', $result['direct_message']['text']);
                $this->assertContains('message_title', $result['direct_message']['text']);
                $this->assertEquals('selfcontact', $result['direct_message']['sender_screen_name']);
@@ -2847,18 +3040,20 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_direct_messages_new() function with an RSS result.
+        *
         * @return void
         */
        public function testApiDirectMessagesNewWithRss()
        {
-               $_POST['text'] = 'message_text';
+               $_POST['text']        = 'message_text';
                $_POST['screen_name'] = $this->friendUser['nick'];
-               $result = api_direct_messages_new('rss');
+               $result               = api_direct_messages_new('rss');
                $this->assertXml($result, 'direct-messages');
        }
 
        /**
         * Test the api_direct_messages_destroy() function.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         */
@@ -2869,16 +3064,17 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_direct_messages_destroy() function with the friendica_verbose GET param.
+        *
         * @return void
         */
        public function testApiDirectMessagesDestroyWithVerbose()
        {
                $_GET['friendica_verbose'] = 'true';
-               $result = api_direct_messages_destroy('json');
+               $result                    = api_direct_messages_destroy('json');
                $this->assertEquals(
                        [
                                '$result' => [
-                                       'result' => 'error',
+                                       'result'  => 'error',
                                        'message' => 'message id or parenturi not specified'
                                ]
                        ],
@@ -2888,6 +3084,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_direct_messages_destroy() function without an authenticated user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
@@ -2899,6 +3096,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_direct_messages_destroy() function with a non-zero ID.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         */
@@ -2910,18 +3108,19 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_direct_messages_destroy() with a non-zero ID and the friendica_verbose GET param.
+        *
         * @return void
         */
        public function testApiDirectMessagesDestroyWithIdAndVerbose()
        {
-               $_REQUEST['id'] = 1;
+               $_REQUEST['id']                  = 1;
                $_REQUEST['friendica_parenturi'] = 'parent_uri';
-               $_GET['friendica_verbose'] = 'true';
-               $result = api_direct_messages_destroy('json');
+               $_GET['friendica_verbose']       = 'true';
+               $result                          = api_direct_messages_destroy('json');
                $this->assertEquals(
                        [
                                '$result' => [
-                                       'result' => 'error',
+                                       'result'  => 'error',
                                        'message' => 'message id not in database'
                                ]
                        ],
@@ -2931,6 +3130,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_direct_messages_destroy() function with a non-zero ID.
+        *
         * @return void
         */
        public function testApiDirectMessagesDestroyWithCorrectId()
@@ -2940,18 +3140,20 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_direct_messages_box() function.
+        *
         * @return void
         */
        public function testApiDirectMessagesBoxWithSentbox()
        {
-               $_REQUEST['page'] = -1;
+               $_REQUEST['page']   = -1;
                $_REQUEST['max_id'] = 10;
-               $result = api_direct_messages_box('json', 'sentbox', 'false');
+               $result             = api_direct_messages_box('json', 'sentbox', 'false');
                $this->assertArrayHasKey('direct_message', $result);
        }
 
        /**
         * Test the api_direct_messages_box() function.
+        *
         * @return void
         */
        public function testApiDirectMessagesBoxWithConversation()
@@ -2962,6 +3164,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_direct_messages_box() function.
+        *
         * @return void
         */
        public function testApiDirectMessagesBoxWithAll()
@@ -2972,6 +3175,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_direct_messages_box() function.
+        *
         * @return void
         */
        public function testApiDirectMessagesBoxWithInbox()
@@ -2982,6 +3186,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_direct_messages_box() function.
+        *
         * @return void
         */
        public function testApiDirectMessagesBoxWithVerbose()
@@ -2990,7 +3195,7 @@ class ApiTest extends DatabaseTest
                $this->assertEquals(
                        [
                                '$result' => [
-                                       'result' => 'error',
+                                       'result'  => 'error',
                                        'message' => 'no mails available'
                                ]
                        ],
@@ -3000,6 +3205,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_direct_messages_box() function with a RSS result.
+        *
         * @return void
         */
        public function testApiDirectMessagesBoxWithRss()
@@ -3010,18 +3216,20 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_direct_messages_box() function without an authenticated user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
        public function testApiDirectMessagesBoxWithUnallowedUser()
        {
                $_SESSION['allow_api'] = false;
-               $_GET['screen_name'] = $this->selfUser['nick'];
+               $_GET['screen_name']   = $this->selfUser['nick'];
                api_direct_messages_box('json', 'sentbox', 'false');
        }
 
        /**
         * Test the api_direct_messages_sentbox() function.
+        *
         * @return void
         */
        public function testApiDirectMessagesSentbox()
@@ -3032,6 +3240,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_direct_messages_inbox() function.
+        *
         * @return void
         */
        public function testApiDirectMessagesInbox()
@@ -3042,6 +3251,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_direct_messages_all() function.
+        *
         * @return void
         */
        public function testApiDirectMessagesAll()
@@ -3052,6 +3262,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_direct_messages_conversation() function.
+        *
         * @return void
         */
        public function testApiDirectMessagesConversation()
@@ -3062,6 +3273,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_oauth_request_token() function.
+        *
         * @return void
         */
        public function testApiOauthRequestToken()
@@ -3071,6 +3283,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_oauth_access_token() function.
+        *
         * @return void
         */
        public function testApiOauthAccessToken()
@@ -3080,6 +3293,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_fr_photoalbum_delete() function.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         */
@@ -3090,6 +3304,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_fr_photoalbum_delete() function with an album name.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         */
@@ -3101,6 +3316,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_fr_photoalbum_delete() function with an album name.
+        *
         * @return void
         */
        public function testApiFrPhotoalbumDeleteWithValidAlbum()
@@ -3110,6 +3326,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_fr_photoalbum_delete() function.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         */
@@ -3120,6 +3337,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_fr_photoalbum_delete() function with an album name.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         */
@@ -3131,18 +3349,20 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_fr_photoalbum_delete() function with an album name.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         */
        public function testApiFrPhotoalbumUpdateWithAlbumAndNewAlbum()
        {
-               $_REQUEST['album'] = 'album_name';
+               $_REQUEST['album']     = 'album_name';
                $_REQUEST['album_new'] = 'album_name';
                api_fr_photoalbum_update('json');
        }
 
        /**
         * Test the api_fr_photoalbum_update() function without an authenticated user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
@@ -3154,6 +3374,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_fr_photoalbum_delete() function with an album name.
+        *
         * @return void
         */
        public function testApiFrPhotoalbumUpdateWithValidAlbum()
@@ -3163,6 +3384,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_fr_photos_list() function.
+        *
         * @return void
         */
        public function testApiFrPhotosList()
@@ -3173,6 +3395,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_fr_photos_list() function without an authenticated user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
@@ -3184,6 +3407,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_fr_photo_create_update() function.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         */
@@ -3194,6 +3418,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_fr_photo_create_update() function without an authenticated user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
@@ -3205,6 +3430,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_fr_photo_create_update() function with an album name.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         */
@@ -3216,6 +3442,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_fr_photo_create_update() function with the update mode.
+        *
         * @return void
         */
        public function testApiFrPhotoCreateUpdateWithUpdate()
@@ -3225,6 +3452,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_fr_photo_create_update() function with an uploaded file.
+        *
         * @return void
         */
        public function testApiFrPhotoCreateUpdateWithFile()
@@ -3234,6 +3462,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_fr_photo_delete() function.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         */
@@ -3244,6 +3473,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_fr_photo_delete() function without an authenticated user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
@@ -3255,6 +3485,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_fr_photo_delete() function with a photo ID.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         */
@@ -3266,6 +3497,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_fr_photo_delete() function with a correct photo ID.
+        *
         * @return void
         */
        public function testApiFrPhotoDeleteWithCorrectPhotoId()
@@ -3275,6 +3507,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_fr_photo_detail() function.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         */
@@ -3285,6 +3518,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_fr_photo_detail() function without an authenticated user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
@@ -3296,6 +3530,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_fr_photo_detail() function with a photo ID.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\NotFoundException
         */
@@ -3307,6 +3542,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_fr_photo_detail() function with a correct photo ID.
+        *
         * @return void
         */
        public function testApiFrPhotoDetailCorrectPhotoId()
@@ -3316,6 +3552,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_account_update_profile_image() function.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         */
@@ -3326,6 +3563,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_account_update_profile_image() function without an authenticated user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
@@ -3337,6 +3575,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_account_update_profile_image() function with an uploaded file.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         */
@@ -3348,13 +3587,14 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_account_update_profile() function.
+        *
         * @return void
         */
        public function testApiAccountUpdateProfile()
        {
-               $_POST['name'] = 'new_name';
+               $_POST['name']        = 'new_name';
                $_POST['description'] = 'new_description';
-               $result = api_account_update_profile('json');
+               $result               = api_account_update_profile('json');
                // We can't use assertSelfUser() here because the user object is missing some properties.
                $this->assertEquals($this->selfUser['id'], $result['user']['cid']);
                $this->assertEquals('DFRN', $result['user']['location']);
@@ -3366,6 +3606,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the check_acl_input() function.
+        *
         * @return void
         */
        public function testCheckAclInput()
@@ -3377,6 +3618,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the check_acl_input() function with an empty ACL string.
+        *
         * @return void
         */
        public function testCheckAclInputWithEmptyAclString()
@@ -3387,6 +3629,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the save_media_to_database() function.
+        *
         * @return void
         */
        public function testSaveMediaToDatabase()
@@ -3396,6 +3639,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the post_photo_item() function.
+        *
         * @return void
         */
        public function testPostPhotoItem()
@@ -3405,6 +3649,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the prepare_photo_data() function.
+        *
         * @return void
         */
        public function testPreparePhotoData()
@@ -3414,6 +3659,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_friendica_remoteauth() function.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         */
@@ -3424,41 +3670,45 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_friendica_remoteauth() function with an URL.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         */
        public function testApiFriendicaRemoteauthWithUrl()
        {
-               $_GET['url'] = 'url';
+               $_GET['url']   = 'url';
                $_GET['c_url'] = 'url';
                api_friendica_remoteauth();
        }
 
        /**
         * Test the api_friendica_remoteauth() function with a correct URL.
+        *
         * @return void
         */
        public function testApiFriendicaRemoteauthWithCorrectUrl()
        {
                $this->markTestIncomplete("We can't use an assertion here because of App->redirect().");
-               $_GET['url'] = 'url';
+               $_GET['url']   = 'url';
                $_GET['c_url'] = $this->selfUser['nurl'];
                api_friendica_remoteauth();
        }
 
        /**
         * Test the api_share_as_retweet() function.
+        *
         * @return void
         */
        public function testApiShareAsRetweet()
        {
-               $item = ['body' => '', 'author-id' => 1, 'owner-id' => 1];
+               $item   = ['body' => '', 'author-id' => 1, 'owner-id' => 1];
                $result = api_share_as_retweet($item);
                $this->assertFalse($result);
        }
 
        /**
         * Test the api_share_as_retweet() function with a valid item.
+        *
         * @return void
         */
        public function testApiShareAsRetweetWithValidItem()
@@ -3468,6 +3718,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_get_nick() function.
+        *
         * @return void
         */
        public function testApiGetNick()
@@ -3478,6 +3729,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_get_nick() function with a wrong URL.
+        *
         * @return void
         */
        public function testApiGetNickWithWrongUrl()
@@ -3488,6 +3740,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_in_reply_to() function.
+        *
         * @return void
         */
        public function testApiInReplyTo()
@@ -3502,6 +3755,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_in_reply_to() function with a valid item.
+        *
         * @return void
         */
        public function testApiInReplyToWithValidItem()
@@ -3511,17 +3765,19 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_clean_plain_items() function.
+        *
         * @return void
         */
        public function testApiCleanPlainItems()
        {
                $_REQUEST['include_entities'] = 'true';
-               $result = api_clean_plain_items('some_text [url="some_url"]some_text[/url]');
+               $result                       = api_clean_plain_items('some_text [url="some_url"]some_text[/url]');
                $this->assertEquals('some_text [url="some_url"]"some_url"[/url]', $result);
        }
 
        /**
         * Test the api_clean_attachments() function.
+        *
         * @return void
         */
        public function testApiCleanAttachments()
@@ -3531,17 +3787,19 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_best_nickname() function.
+        *
         * @return void
         */
        public function testApiBestNickname()
        {
                $contacts = [];
-               $result = api_best_nickname($contacts);
+               $result   = api_best_nickname($contacts);
                $this->assertNull($result);
        }
 
        /**
         * Test the api_best_nickname() function with contacts.
+        *
         * @return void
         */
        public function testApiBestNicknameWithContacts()
@@ -3551,6 +3809,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_friendica_group_show() function.
+        *
         * @return void
         */
        public function testApiFriendicaGroupShow()
@@ -3560,6 +3819,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_friendica_group_delete() function.
+        *
         * @return void
         */
        public function testApiFriendicaGroupDelete()
@@ -3569,6 +3829,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_lists_destroy() function.
+        *
         * @return void
         */
        public function testApiListsDestroy()
@@ -3578,6 +3839,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the group_create() function.
+        *
         * @return void
         */
        public function testGroupCreate()
@@ -3587,6 +3849,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_friendica_group_create() function.
+        *
         * @return void
         */
        public function testApiFriendicaGroupCreate()
@@ -3596,6 +3859,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_lists_create() function.
+        *
         * @return void
         */
        public function testApiListsCreate()
@@ -3605,6 +3869,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_friendica_group_update() function.
+        *
         * @return void
         */
        public function testApiFriendicaGroupUpdate()
@@ -3614,6 +3879,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_lists_update() function.
+        *
         * @return void
         */
        public function testApiListsUpdate()
@@ -3623,6 +3889,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_friendica_activity() function.
+        *
         * @return void
         */
        public function testApiFriendicaActivity()
@@ -3632,6 +3899,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_friendica_notification() function.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         */
@@ -3642,6 +3910,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_friendica_notification() function without an authenticated user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
@@ -3653,30 +3922,33 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_friendica_notification() function with an argument count.
+        *
         * @return void
         */
        public function testApiFriendicaNotificationWithArgumentCount()
        {
                $this->app->argv = ['api', 'friendica', 'notification'];
                $this->app->argc = count($this->app->argv);
-               $result = api_friendica_notification('json');
+               $result          = api_friendica_notification('json');
                $this->assertEquals(['note' => false], $result);
        }
 
        /**
         * Test the api_friendica_notification() function with an XML result.
+        *
         * @return void
         */
        public function testApiFriendicaNotificationWithXmlResult()
        {
                $this->app->argv = ['api', 'friendica', 'notification'];
                $this->app->argc = count($this->app->argv);
-               $result = api_friendica_notification('xml');
+               $result          = api_friendica_notification('xml');
                $this->assertXml($result, 'notes');
        }
 
        /**
         * Test the api_friendica_notification_seen() function.
+        *
         * @return void
         */
        public function testApiFriendicaNotificationSeen()
@@ -3686,6 +3958,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_friendica_direct_messages_setseen() function.
+        *
         * @return void
         */
        public function testApiFriendicaDirectMessagesSetseen()
@@ -3695,6 +3968,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_friendica_direct_messages_search() function.
+        *
         * @return void
         */
        public function testApiFriendicaDirectMessagesSearch()
@@ -3704,6 +3978,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_friendica_profile_show() function.
+        *
         * @return void
         */
        public function testApiFriendicaProfileShow()
@@ -3721,6 +3996,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_friendica_profile_show() function with a profile ID.
+        *
         * @return void
         */
        public function testApiFriendicaProfileShowWithProfileId()
@@ -3730,6 +4006,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_friendica_profile_show() function with a wrong profile ID.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\BadRequestException
         */
@@ -3741,6 +4018,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_friendica_profile_show() function without an authenticated user.
+        *
         * @return void
         * @expectedException Friendica\Network\HTTPException\ForbiddenException
         */
@@ -3752,6 +4030,7 @@ class ApiTest extends DatabaseTest
 
        /**
         * Test the api_saved_searches_list() function.
+        *
         * @return void
         */
        public function testApiSavedSearchesList()
index e516fe824ae3e8e23cfe24f2551fbfbee44ba2cd..5676da8f62e4a3ee6ff9a58e8ceb7fe42d3ab132 100644 (file)
@@ -5,6 +5,7 @@
 
 namespace Friendica\Test;
 
+use Friendica\Model\Group;
 use PHPUnit\Framework\TestCase;
 
 /**
@@ -55,8 +56,8 @@ class TextTest extends TestCase
         */
        public function testExpandAclNormal()
        {
-               $text='<1><2><3>';
-               $this->assertEquals(array(1, 2, 3), expand_acl($text));
+               $text='<1><2><3><' . Group::FOLLOWERS . '><' . Group::MUTUALS . '>';
+               $this->assertEquals(array('1', '2', '3', Group::FOLLOWERS, Group::MUTUALS), expand_acl($text));
        }
 
        /**
@@ -64,8 +65,8 @@ class TextTest extends TestCase
         */
        public function testExpandAclBigNumber()
        {
-               $text='<1><'.PHP_INT_MAX.'><15>';
-               $this->assertEquals(array(1, PHP_INT_MAX, 15), expand_acl($text));
+               $text='<1><' . PHP_INT_MAX . '><15>';
+               $this->assertEquals(array('1', (string)PHP_INT_MAX, '15'), expand_acl($text));
        }
 
        /**
@@ -76,7 +77,7 @@ class TextTest extends TestCase
        public function testExpandAclString()
        {
                $text="<1><279012><tt>";
-               $this->assertEquals(array(1, 279012), expand_acl($text));
+               $this->assertEquals(array('1', '279012'), expand_acl($text));
        }
 
        /**
@@ -87,7 +88,7 @@ class TextTest extends TestCase
        public function testExpandAclSpace()
        {
                $text="<1><279 012><32>";
-               $this->assertEquals(array(1, "279", "32"), expand_acl($text));
+               $this->assertEquals(array('1', '32'), expand_acl($text));
        }
 
        /**
@@ -174,7 +175,7 @@ class TextTest extends TestCase
        public function testExpandAclEmptyMatch()
        {
                $text="<1><><3>";
-               $this->assertEquals(array(1,3), expand_acl($text));
+               $this->assertEquals(array('1', '3'), expand_acl($text));
        }
 
        /**
diff --git a/tests/src/App/ArgumentsTest.php b/tests/src/App/ArgumentsTest.php
new file mode 100644 (file)
index 0000000..ee04199
--- /dev/null
@@ -0,0 +1,242 @@
+<?php
+
+namespace Friendica\Test\src\App;
+
+use Friendica\App;
+use PHPUnit\Framework\TestCase;
+
+class ArgumentsTest extends TestCase
+{
+       private function assertArguments(array $assert, App\Arguments $arguments)
+       {
+               $this->assertEquals($assert['queryString'], $arguments->getQueryString());
+               $this->assertEquals($assert['command'], $arguments->getCommand());
+               $this->assertEquals($assert['argv'], $arguments->getArgv());
+               $this->assertEquals($assert['argc'], $arguments->getArgc());
+               $this->assertCount($assert['argc'], $arguments->getArgv());
+       }
+
+       /**
+        * Test the default argument without any determinations
+        */
+       public function testDefault()
+       {
+               $arguments = new App\Arguments();
+
+               $this->assertArguments([
+                       'queryString' => '',
+                       'command'     => '',
+                       'argv'        => ['home'],
+                       'argc'        => 1,
+               ],
+                       $arguments);
+       }
+
+       public function dataArguments()
+       {
+               return [
+                       'withPagename'         => [
+                               'assert' => [
+                                       'queryString' => 'profile/test/it?arg1=value1&arg2=value2',
+                                       'command'     => 'profile/test/it',
+                                       'argv'        => ['profile', 'test', 'it'],
+                                       'argc'        => 3,
+                               ],
+                               'server' => [
+                                       'QUERY_STRING' => 'pagename=profile/test/it?arg1=value1&arg2=value2',
+                               ],
+                               'get'    => [
+                                       'pagename' => 'profile/test/it',
+                               ],
+                       ],
+                       'withQ'                => [
+                               'assert' => [
+                                       'queryString' => 'profile/test/it?arg1=value1&arg2=value2',
+                                       'command'     => 'profile/test/it',
+                                       'argv'        => ['profile', 'test', 'it'],
+                                       'argc'        => 3,
+                               ],
+                               'server' => [
+                                       'QUERY_STRING' => 'q=profile/test/it?arg1=value1&arg2=value2',
+                               ],
+                               'get'    => [
+                                       'q' => 'profile/test/it',
+                               ],
+                       ],
+                       'withWrongDelimiter'   => [
+                               'assert' => [
+                                       'queryString' => 'profile/test/it?arg1=value1&arg2=value2',
+                                       'command'     => 'profile/test/it',
+                                       'argv'        => ['profile', 'test', 'it'],
+                                       'argc'        => 3,
+                               ],
+                               'server' => [
+                                       'QUERY_STRING' => 'pagename=profile/test/it&arg1=value1&arg2=value2',
+                               ],
+                               'get'    => [
+                                       'pagename' => 'profile/test/it',
+                               ],
+                       ],
+                       'withUnixHomeDir'      => [
+                               'assert' => [
+                                       'queryString' => '~test/it?arg1=value1&arg2=value2',
+                                       'command'     => 'profile/test/it',
+                                       'argv'        => ['profile', 'test', 'it'],
+                                       'argc'        => 3,
+                               ],
+                               'server' => [
+                                       'QUERY_STRING' => 'pagename=~test/it?arg1=value1&arg2=value2',
+                               ],
+                               'get'    => [
+                                       'pagename' => '~test/it',
+                               ],
+                       ],
+                       'withDiasporaHomeDir'  => [
+                               'assert' => [
+                                       'queryString' => 'u/test/it?arg1=value1&arg2=value2',
+                                       'command'     => 'profile/test/it',
+                                       'argv'        => ['profile', 'test', 'it'],
+                                       'argc'        => 3,
+                               ],
+                               'server' => [
+                                       'QUERY_STRING' => 'pagename=u/test/it?arg1=value1&arg2=value2',
+                               ],
+                               'get'    => [
+                                       'pagename' => 'u/test/it',
+                               ],
+                       ],
+                       'withTrailingSlash'    => [
+                               'assert' => [
+                                       'queryString' => 'profile/test/it?arg1=value1&arg2=value2/',
+                                       'command'     => 'profile/test/it',
+                                       'argv'        => ['profile', 'test', 'it'],
+                                       'argc'        => 3,
+                               ],
+                               'server' => [
+                                       'QUERY_STRING' => 'pagename=profile/test/it?arg1=value1&arg2=value2/',
+                               ],
+                               'get'    => [
+                                       'pagename' => 'profile/test/it',
+                               ],
+                       ],
+                       'withWrongQueryString' => [
+                               'assert' => [
+                                       // empty query string?!
+                                       'queryString' => '',
+                                       'command'     => 'profile/test/it',
+                                       'argv'        => ['profile', 'test', 'it'],
+                                       'argc'        => 3,
+                               ],
+                               'server' => [
+                                       'QUERY_STRING' => 'wrong=profile/test/it?arg1=value1&arg2=value2/',
+                               ],
+                               'get'    => [
+                                       'pagename' => 'profile/test/it',
+                               ],
+                       ],
+                       'withMissingPageName'  => [
+                               'assert' => [
+                                       'queryString' => 'notvalid/it?arg1=value1&arg2=value2/',
+                                       'command'     => App\Module::DEFAULT,
+                                       'argv'        => [App\Module::DEFAULT],
+                                       'argc'        => 1,
+                               ],
+                               'server' => [
+                                       'QUERY_STRING' => 'pagename=notvalid/it?arg1=value1&arg2=value2/',
+                               ],
+                               'get'    => [
+                               ],
+                       ],
+               ];
+       }
+
+       /**
+        * Test all variants of argument determination
+        *
+        * @dataProvider dataArguments
+        */
+       public function testDetermine(array $assert, array $server, array $get)
+       {
+               $arguments = (new App\Arguments())
+                       ->determine($server, $get);
+
+               $this->assertArguments($assert, $arguments);
+       }
+
+       /**
+        * Test if the get/has methods are working for the determined arguments
+        *
+        * @dataProvider dataArguments
+        */
+       public function testGetHas(array $assert, array $server, array $get)
+       {
+               $arguments = (new App\Arguments())
+                       ->determine($server, $get);
+
+               for ($i = 0; $i < $arguments->getArgc(); $i++) {
+                       $this->assertTrue($arguments->has($i));
+                       $this->assertEquals($assert['argv'][$i], $arguments->get($i));
+               }
+
+               $this->assertFalse($arguments->has($arguments->getArgc()));
+               $this->assertEmpty($arguments->get($arguments->getArgc()));
+               $this->assertEquals('default', $arguments->get($arguments->getArgc(), 'default'));
+       }
+
+       public function dataStripped()
+       {
+               return [
+                       'strippedZRLFirst'  => [
+                               'assert' => '?arg1=value1',
+                               'input'  => '?zrl=nope&arg1=value1',
+                       ],
+                       'strippedZRLLast'   => [
+                               'assert' => '?arg1=value1',
+                               'input'  => '?arg1=value1&zrl=nope',
+                       ],
+                       'strippedZTLMiddle' => [
+                               'assert' => '?arg1=value1&arg2=value2',
+                               'input'  => '?arg1=value1&zrl=nope&arg2=value2',
+                       ],
+                       'strippedOWTFirst'  => [
+                               'assert' => '?arg1=value1',
+                               'input'  => '?owt=test&arg1=value1',
+                       ],
+                       'strippedOWTLast'   => [
+                               'assert' => '?arg1=value1',
+                               'input'  => '?arg1=value1&owt=test',
+                       ],
+                       'strippedOWTMiddle' => [
+                               'assert' => '?arg1=value1&arg2=value2',
+                               'input'  => '?arg1=value1&owt=test&arg2=value2',
+                       ],
+               ];
+       }
+
+       /**
+        * Test the ZRL and OWT stripping
+        *
+        * @dataProvider dataStripped
+        */
+       public function testStrippedQueries(string $assert, string $input)
+       {
+               $command = 'test/it';
+
+               $arguments = (new App\Arguments())
+                       ->determine(['QUERY_STRING' => 'q=' . $command . $input,], ['pagename' => $command]);
+
+               $this->assertEquals($command . $assert, $arguments->getQueryString());
+       }
+
+       /**
+        * Test that arguments are immutable
+        */
+       public function testImmutable()
+       {
+               $argument = new App\Arguments();
+
+               $argNew = $argument->determine([], []);
+
+               $this->assertNotSame($argument, $argNew);
+       }
+}
index 9059e8bebf4ad6b6d1ec29812dcc239a9e774f7e..fcd928e6ed2d6889b1486768a10e91681e269c68 100644 (file)
@@ -2,34 +2,58 @@
 
 namespace Friendica\Test\src\App;
 
+use Detection\MobileDetect;
 use Friendica\App\Mode;
+use Friendica\App\Module;
 use Friendica\Core\Config;
+use Friendica\Database\Database;
 use Friendica\Test\MockedTest;
 use Friendica\Test\Util\DBAMockTrait;
 use Friendica\Test\Util\VFSTrait;
+use Friendica\Util\BasePath;
+use Mockery\MockInterface;
 
 class ModeTest extends MockedTest
 {
        use VFSTrait;
        use DBAMockTrait;
 
+       /**
+        * @var BasePath|MockInterface
+        */
+       private $basePathMock;
+
+       /**
+        * @var Database|MockInterface
+        */
+       private $databaseMock;
+
+       /**
+        * @var Config\Cache\ConfigCache|MockInterface
+        */
+       private $configCacheMock;
+
        public function setUp()
        {
                parent::setUp();
 
                $this->setUpVfsDir();
+
+               $this->basePathMock = \Mockery::mock(BasePath::class);
+               $this->databaseMock = \Mockery::mock(Database::class);
+               $this->configCacheMock = \Mockery::mock(Config\Cache\ConfigCache::class);
        }
 
        public function testItEmpty()
        {
-               $mode = new Mode($this->root->url());
+               $mode = new Mode();
                $this->assertTrue($mode->isInstall());
                $this->assertFalse($mode->isNormal());
        }
 
        public function testWithoutConfig()
        {
-               $mode = new Mode($this->root->url());
+               $this->basePathMock->shouldReceive('getPath')->andReturn($this->root->url())->once();
 
                $this->assertTrue($this->root->hasChild('config/local.config.php'));
 
@@ -37,7 +61,7 @@ class ModeTest extends MockedTest
 
                $this->assertFalse($this->root->hasChild('config/local.config.php'));
 
-               $mode->determine();
+               $mode = (new Mode())->determine($this->basePathMock, $this->databaseMock, $this->configCacheMock);
 
                $this->assertTrue($mode->isInstall());
                $this->assertFalse($mode->isNormal());
@@ -45,16 +69,13 @@ class ModeTest extends MockedTest
                $this->assertFalse($mode->has(Mode::LOCALCONFIGPRESENT));
        }
 
-       /**
-        * @runInSeparateProcess
-        * @preserveGlobalState disabled
-        */
        public function testWithoutDatabase()
        {
-               $this->mockConnected(false, 1);
+               $this->basePathMock->shouldReceive('getPath')->andReturn($this->root->url())->once();
 
-               $mode = new Mode($this->root->url());
-               $mode->determine();
+               $this->databaseMock->shouldReceive('connected')->andReturn(false)->once();
+
+               $mode = (new Mode())->determine($this->basePathMock, $this->databaseMock, $this->configCacheMock);
 
                $this->assertFalse($mode->isNormal());
                $this->assertTrue($mode->isInstall());
@@ -63,17 +84,15 @@ class ModeTest extends MockedTest
                $this->assertFalse($mode->has(Mode::DBAVAILABLE));
        }
 
-       /**
-        * @runInSeparateProcess
-        * @preserveGlobalState disabled
-        */
        public function testWithoutDatabaseSetup()
        {
-               $this->mockConnected(true, 1);
-               $this->mockFetchFirst('SHOW TABLES LIKE \'config\'', false, 1);
+               $this->basePathMock->shouldReceive('getPath')->andReturn($this->root->url())->once();
 
-               $mode = new Mode($this->root->url());
-               $mode->determine();
+               $this->databaseMock->shouldReceive('connected')->andReturn(true)->once();
+               $this->databaseMock->shouldReceive('fetchFirst')
+                                  ->with('SHOW TABLES LIKE \'config\'')->andReturn(false)->once();
+
+               $mode = (new Mode())->determine($this->basePathMock, $this->databaseMock, $this->configCacheMock);
 
                $this->assertFalse($mode->isNormal());
                $this->assertTrue($mode->isInstall());
@@ -81,26 +100,17 @@ class ModeTest extends MockedTest
                $this->assertTrue($mode->has(Mode::LOCALCONFIGPRESENT));
        }
 
-       /**
-        * @runInSeparateProcess
-        * @preserveGlobalState disabled
-        */
        public function testWithMaintenanceMode()
        {
-               $this->mockConnected(true, 1);
-               $this->mockFetchFirst('SHOW TABLES LIKE \'config\'', true, 1);
+               $this->basePathMock->shouldReceive('getPath')->andReturn($this->root->url())->once();
 
-               $config = \Mockery::mock(Config\Configuration::class);
-               $config
-                       ->shouldReceive('get')
-                       ->with('system', 'maintenance', null, false)
-                       ->andReturn(true)
-                       ->once();
-               // Initialize empty Config
-               Config::init($config);
+               $this->databaseMock->shouldReceive('connected')->andReturn(true)->once();
+               $this->databaseMock->shouldReceive('fetchFirst')
+                                  ->with('SHOW TABLES LIKE \'config\'')->andReturn(true)->once();
+               $this->configCacheMock->shouldReceive('get')->with('system', 'maintenance')
+                                     ->andReturn(true)->once();
 
-               $mode = new Mode($this->root->url());
-               $mode->determine();
+               $mode = (new Mode())->determine($this->basePathMock, $this->databaseMock, $this->configCacheMock);
 
                $this->assertFalse($mode->isNormal());
                $this->assertFalse($mode->isInstall());
@@ -109,26 +119,45 @@ class ModeTest extends MockedTest
                $this->assertFalse($mode->has(Mode::MAINTENANCEDISABLED));
        }
 
+       public function testNormalMode()
+       {
+               $this->basePathMock->shouldReceive('getPath')->andReturn($this->root->url())->once();
+
+               $this->databaseMock->shouldReceive('connected')->andReturn(true)->once();
+               $this->databaseMock->shouldReceive('fetchFirst')
+                                  ->with('SHOW TABLES LIKE \'config\'')->andReturn(true)->once();
+               $this->configCacheMock->shouldReceive('get')->with('system', 'maintenance')
+                                     ->andReturn(false)->once();
+               $this->databaseMock->shouldReceive('selectFirst')
+                                  ->with('config', ['v'], ['cat' => 'system', 'k' => 'maintenance'])
+                                  ->andReturn(['v' => null])->once();
+
+               $mode = (new Mode())->determine($this->basePathMock, $this->databaseMock, $this->configCacheMock);
+
+               $this->assertTrue($mode->isNormal());
+               $this->assertFalse($mode->isInstall());
+
+               $this->assertTrue($mode->has(Mode::DBCONFIGAVAILABLE));
+               $this->assertTrue($mode->has(Mode::MAINTENANCEDISABLED));
+       }
+
        /**
-        * @runInSeparateProcess
-        * @preserveGlobalState disabled
+        * Test explicit disabled maintenance (in case you manually disable it)
         */
-       public function testNormalMode()
+       public function testDisabledMaintenance()
        {
-               $this->mockConnected(true, 1);
-               $this->mockFetchFirst('SHOW TABLES LIKE \'config\'', true, 1);
+               $this->basePathMock->shouldReceive('getPath')->andReturn($this->root->url())->once();
 
-               $config = \Mockery::mock(Config\Configuration::class);
-               $config
-                       ->shouldReceive('get')
-                       ->with('system', 'maintenance', null, false)
-                       ->andReturn(false)
-                       ->once();
-               // Initialize empty Config
-               Config::init($config);
+               $this->databaseMock->shouldReceive('connected')->andReturn(true)->once();
+               $this->databaseMock->shouldReceive('fetchFirst')
+                                  ->with('SHOW TABLES LIKE \'config\'')->andReturn(true)->once();
+               $this->configCacheMock->shouldReceive('get')->with('system', 'maintenance')
+                                     ->andReturn(false)->once();
+               $this->databaseMock->shouldReceive('selectFirst')
+                                  ->with('config', ['v'], ['cat' => 'system', 'k' => 'maintenance'])
+                                  ->andReturn(['v' => '0'])->once();
 
-               $mode = new Mode($this->root->url());
-               $mode->determine();
+               $mode = (new Mode())->determine($this->basePathMock, $this->databaseMock, $this->configCacheMock);
 
                $this->assertTrue($mode->isNormal());
                $this->assertFalse($mode->isInstall());
@@ -136,4 +165,127 @@ class ModeTest extends MockedTest
                $this->assertTrue($mode->has(Mode::DBCONFIGAVAILABLE));
                $this->assertTrue($mode->has(Mode::MAINTENANCEDISABLED));
        }
+
+       /**
+        * Test that modes are immutable
+        */
+       public function testImmutable()
+       {
+               $this->basePathMock->shouldReceive('getPath')->andReturn(null)->once();
+
+               $mode = new Mode();
+
+               $modeNew = $mode->determine($this->basePathMock, $this->databaseMock, $this->configCacheMock);
+
+               $this->assertNotSame($modeNew, $mode);
+       }
+
+       /**
+        * Test if not called by index is backend
+        */
+       public function testIsBackendNotIndex()
+       {
+               $server = ['PHP_SELF' => '/daemon.php'];
+               $module = new Module();
+               $mobileDetect = new MobileDetect();
+
+               $mode = (new Mode())->determineRunMode($module, $server, $mobileDetect);
+
+               $this->assertTrue($mode->isBackend());
+       }
+
+       /**
+        * Test is called by index but module is backend
+        */
+       public function testIsBackendButIndex()
+       {
+               $server = ['PHP_SELF' => '/index.php'];
+               $module = new Module(Module::DEFAULT, Module::DEFAULT_CLASS, true);
+               $mobileDetect = new MobileDetect();
+
+               $mode = (new Mode())->determineRunMode($module, $server, $mobileDetect);
+
+               $this->assertTrue($mode->isBackend());
+       }
+
+       /**
+        * Test is called by index and module is not backend
+        */
+       public function testIsNotBackend()
+       {
+               $server = ['PHP_SELF' => '/index.php'];
+               $module = new Module(Module::DEFAULT, Module::DEFAULT_CLASS, false);
+               $mobileDetect = new MobileDetect();
+
+               $mode = (new Mode())->determineRunMode($module, $server, $mobileDetect);
+
+               $this->assertFalse($mode->isBackend());
+       }
+
+       /**
+        * Test if the call is an ajax call
+        */
+       public function testIsAjax()
+       {
+               // This is the server environment variable to determine ajax calls
+               $server = [
+                       'HTTP_X_REQUESTED_WITH' => 'xmlhttprequest',
+               ];
+
+               $module = new Module(Module::DEFAULT, Module::DEFAULT_CLASS, false);
+               $mobileDetect = new MobileDetect();
+
+               $mode = (new Mode())->determineRunMode($module, $server, $mobileDetect);
+
+               $this->assertTrue($mode->isAjax());
+       }
+
+       /**
+        * Test if the call is not nan ajax call
+        */
+       public function testIsNotAjax()
+       {
+               $server = [];
+               $module = new Module(Module::DEFAULT, Module::DEFAULT_CLASS, false);
+               $mobileDetect = new MobileDetect();
+
+               $mode = (new Mode())->determineRunMode($module, $server, $mobileDetect);
+
+               $this->assertFalse($mode->isAjax());
+       }
+
+       /**
+        * Test if the call is a mobile and is a tablet call
+        */
+       public function testIsMobileIsTablet()
+       {
+               $server = [];
+               $module = new Module(Module::DEFAULT, Module::DEFAULT_CLASS, false);
+               $mobileDetect = \Mockery::mock(MobileDetect::class);
+               $mobileDetect->shouldReceive('isMobile')->andReturn(true);
+               $mobileDetect->shouldReceive('isTablet')->andReturn(true);
+
+               $mode = (new Mode())->determineRunMode($module, $server, $mobileDetect);
+
+               $this->assertTrue($mode->isMobile());
+               $this->assertTrue($mode->isTablet());
+       }
+
+
+       /**
+        * Test if the call is not a mobile and is not a tablet call
+        */
+       public function testIsNotMobileIsNotTablet()
+       {
+               $server = [];
+               $module = new Module(Module::DEFAULT, Module::DEFAULT_CLASS, false);
+               $mobileDetect = \Mockery::mock(MobileDetect::class);
+               $mobileDetect->shouldReceive('isMobile')->andReturn(false);
+               $mobileDetect->shouldReceive('isTablet')->andReturn(false);
+
+               $mode = (new Mode())->determineRunMode($module, $server, $mobileDetect);
+
+               $this->assertFalse($mode->isMobile());
+               $this->assertFalse($mode->isTablet());
+       }
 }
diff --git a/tests/src/App/ModuleTest.php b/tests/src/App/ModuleTest.php
new file mode 100644 (file)
index 0000000..ab4fb5b
--- /dev/null
@@ -0,0 +1,171 @@
+<?php
+
+namespace Friendica\Test\src\App;
+
+use Friendica\App;
+use Friendica\Core\Config\Configuration;
+use Friendica\LegacyModule;
+use Friendica\Module\PageNotFound;
+use Friendica\Module\WellKnown\HostMeta;
+use Friendica\Test\DatabaseTest;
+
+class ModuleTest extends DatabaseTest
+{
+       private function assertModule(array $assert, App\Module $module)
+       {
+               $this->assertEquals($assert['isBackend'], $module->isBackend());
+               $this->assertEquals($assert['name'], $module->getName());
+               $this->assertEquals($assert['class'], $module->getClassName());
+       }
+
+       /**
+        * Test the default module mode
+        */
+       public function testDefault()
+       {
+               $module = new App\Module();
+
+               $this->assertModule([
+                       'isBackend' => false,
+                       'name'      => App\Module::DEFAULT,
+                       'class'     => App\Module::DEFAULT_CLASS,
+               ], $module);
+       }
+
+       public function dataModuleName()
+       {
+               return [
+                       'default'                   => [
+                               'assert' => [
+                                       'isBackend' => false,
+                                       'name'      => 'network',
+                                       'class'     => App\Module::DEFAULT_CLASS,
+                               ],
+                               'args'   => new App\Arguments('network/data/in',
+                                       'network/data/in',
+                                       ['network', 'data', 'in'],
+                                       3),
+                       ],
+                       'withStrikeAndPoint'        => [
+                               'assert' => [
+                                       'isBackend' => false,
+                                       'name'      => 'with_strike_and_point',
+                                       'class'     => App\Module::DEFAULT_CLASS,
+                               ],
+                               'args'   => new App\Arguments('with-strike.and-point/data/in',
+                                       'with-strike.and-point/data/in',
+                                       ['with-strike.and-point', 'data', 'in'],
+                                       3),
+                       ],
+                       'withNothing'               => [
+                               'assert' => [
+                                       'isBackend' => false,
+                                       'name'      => App\Module::DEFAULT,
+                                       'class'     => App\Module::DEFAULT_CLASS,
+                               ],
+                               'args'   => new App\Arguments(),
+                       ],
+                       'withIndex'                 => [
+                               'assert' => [
+                                       'isBackend' => false,
+                                       'name'      => App\Module::DEFAULT,
+                                       'class'     => App\Module::DEFAULT_CLASS,
+                               ],
+                               'args'   => new App\Arguments(),
+                       ],
+                       'withBackendMod'    => [
+                               'assert' => [
+                                       'isBackend' => true,
+                                       'name'      => App\Module::BACKEND_MODULES[0],
+                                       'class'     => App\Module::DEFAULT_CLASS,
+                               ],
+                               'args'   => new App\Arguments(App\Module::BACKEND_MODULES[0] . '/data/in',
+                                       App\Module::BACKEND_MODULES[0] . '/data/in',
+                                       [App\Module::BACKEND_MODULES[0], 'data', 'in'],
+                                       3),
+                       ],
+                       'withFirefoxApp'            => [
+                               'assert' => [
+                                       'isBackend' => false,
+                                       'name'      => 'login',
+                                       'class'     => App\Module::DEFAULT_CLASS,
+                               ],
+                               'args'   => new App\Arguments('users/sign_in',
+                                       'users/sign_in',
+                                       ['users', 'sign_in'],
+                                       3),
+                       ],
+               ];
+       }
+
+       /**
+        * Test the module name and backend determination
+        *
+        * @dataProvider dataModuleName
+        */
+       public function testModuleName(array $assert, App\Arguments $args)
+       {
+               $module = (new App\Module())->determineModule($args);
+
+               $this->assertModule($assert, $module);
+       }
+
+       public function dataModuleClass()
+       {
+               return [
+                       'default' => [
+                               'assert'  => App\Module::DEFAULT_CLASS,
+                               'name'    => App\Module::DEFAULT,
+                               'command' => App\Module::DEFAULT,
+                               'privAdd' => false,
+                       ],
+                       'legacy'  => [
+                               'assert'  => LegacyModule::class,
+                               // API is one of the last modules to switch from legacy to new BaseModule
+                               // so this should be a stable test case until we completely switch ;-)
+                               'name'    => 'api',
+                               'command' => 'api/test/it',
+                               'privAdd' => false,
+                       ],
+                       'new'     => [
+                               'assert'  => HostMeta::class,
+                               'not_required',
+                               'command' => '.well-known/host-meta',
+                               'privAdd' => false,
+                       ],
+                       '404'     => [
+                               'assert'  => PageNotFound::class,
+                               'name'    => 'invalid',
+                               'command' => 'invalid',
+                               'privAdd' => false,
+                       ]
+               ];
+       }
+
+       /**
+        * Test the determination of the module class
+        *
+        * @dataProvider dataModuleClass
+        */
+       public function testModuleClass($assert, string $name, string $command, bool $privAdd)
+       {
+               $config = \Mockery::mock(Configuration::class);
+               $config->shouldReceive('get')->with('config', 'private_addons', false)->andReturn($privAdd)->atMost()->once();
+
+               $module = (new App\Module($name))->determineClass(new App\Arguments('', $command), new App\Router(), $config);
+
+               $this->assertEquals($assert, $module->getClassName());
+       }
+
+       /**
+        * Test that modules are immutable
+        */
+       public function testImmutable()
+       {
+               $module = new App\Module();
+
+               $moduleNew = $module->determineModule(new App\Arguments(), []);
+
+               $this->assertNotSame($moduleNew, $module);
+       }
+}
index cb980b47e90698639f71a1381ba7c19b046e2db5..6935214527ef2a3b40a0a17656a17c1e12cba77b 100644 (file)
@@ -23,20 +23,6 @@ class BaseObjectTest extends TestCase
         */
        private $baseObject;
 
-       /**
-        * Test the setApp() and getApp() function.
-        * @return void
-        */
-       public function testGetSetApp()
-       {
-               $baseObject = new BaseObject();
-               $this->setUpVfsDir();
-               $this->mockApp($this->root);
-
-               $baseObject->setApp($this->app);
-               $this->assertEquals($this->app, $baseObject->getApp());
-       }
-
        /**
         * Test the getApp() function without App
         * @expectedException Friendica\Network\HTTPException\InternalServerErrorException
index acf5dac7bdc01d192f3f45ce80cfc35696ba7b59..774db31746fd5d94f1fa4e629df7c31ea8f24334 100644 (file)
@@ -2,27 +2,27 @@
 
 namespace Friendica\Test\src\Console;
 
+use Dice\Dice;
+use Friendica\App;
+use Friendica\BaseObject;
 use Friendica\Console\AutomaticInstallation;
 use Friendica\Core\Config\Cache\ConfigCache;
 use Friendica\Core\Installer;
+use Friendica\Core\L10n\L10n;
 use Friendica\Core\Logger;
+use Friendica\Database\Database;
 use Friendica\Test\Util\DBAMockTrait;
 use Friendica\Test\Util\DBStructureMockTrait;
-use Friendica\Test\Util\L10nMockTrait;
 use Friendica\Test\Util\RendererMockTrait;
-use Friendica\Util\BaseURL;
+use Friendica\Test\Util\VFSTrait;
 use Friendica\Util\Logger\VoidLogger;
+use Mockery\MockInterface;
 use org\bovigo\vfs\vfsStream;
 use org\bovigo\vfs\vfsStreamFile;
 
-/**
- * @runTestsInSeparateProcesses
- * @preserveGlobalState disabled
- * @requires PHP 7.0
- */
 class AutomaticInstallationConsoleTest extends ConsoleTest
 {
-       use L10nMockTrait;
+       use VFSTrait;
        use DBAMockTrait;
        use DBStructureMockTrait;
        use RendererMockTrait;
@@ -41,24 +41,49 @@ class AutomaticInstallationConsoleTest extends ConsoleTest
         */
        private $configCache;
 
+       /**
+        * @var App\Mode
+        */
+       private $appMode;
+
+       /**
+        * @var Database
+        */
+       private $dba;
+
+       /**
+        * @var Dice|MockInterface
+        */
+       private $dice;
+
        public function setUp()
        {
+               $this->markTestSkipped('Needs class \'Installer\' as constructing argument for console tests');
+
                parent::setUp();
 
+               $this->setUpVfsDir();;
+
                if ($this->root->hasChild('config' . DIRECTORY_SEPARATOR . 'local.config.php')) {
                        $this->root->getChild('config')
                                ->removeChild('local.config.php');
                }
+               $this->dice = \Mockery::mock(Dice::class)->makePartial();
 
-               $this->mockL10nT();
+               $l10nMock = \Mockery::mock(L10n::class);
+               $l10nMock->shouldReceive('t')->andReturnUsing(function ($args) { return $args; });
+
+               $this->dice->shouldReceive('create')
+                          ->with(L10n::class)
+                          ->andReturn($l10nMock);
+
+               BaseObject::setDependencyInjection($this->dice);
 
                $this->configCache = new ConfigCache();
                $this->configCache->set('system', 'basepath', $this->root->url());
                $this->configCache->set('config', 'php_path', trim(shell_exec('which php')));
                $this->configCache->set('system', 'theme', 'smarty3');
 
-               $this->mockApp($this->root, true);
-
                $this->configMock->shouldReceive('set')->andReturnUsing(function ($cat, $key, $value) {
                        if ($key !== 'basepath') {
                                return $this->configCache->set($cat, $key, $value);
@@ -72,7 +97,7 @@ class AutomaticInstallationConsoleTest extends ConsoleTest
                        return $this->configCache->get($cat, $key);
                });
                $this->configMock->shouldReceive('load')->andReturnUsing(function ($config, $overwrite = false) {
-                       return $this->configCache->load($config, $overwrite);
+                       $this->configCache->load($config, $overwrite);
                });
 
                $this->mode->shouldReceive('isInstall')->andReturn(true);
@@ -327,7 +352,7 @@ FIN;
                $this->assertConfigEntry('system', 'language', $assertion, ($default) ? Installer::DEFAULT_LANG : null);
                $this->assertConfigEntry('system', 'url', $assertion);
                $this->assertConfigEntry('system', 'urlpath', $assertion);
-               $this->assertConfigEntry('system', 'ssl_policy', $assertion, ($default) ? BaseURL::DEFAULT_SSL_SCHEME : null);
+               $this->assertConfigEntry('system', 'ssl_policy', $assertion, ($default) ? App\BaseURL::DEFAULT_SSL_SCHEME : null);
                $this->assertConfigEntry('system', 'basepath', ($realBasepath) ? $this->root->url() : $assertion);
        }
 
@@ -392,7 +417,7 @@ FIN;
 
 // Local configuration
 
-// If you're unsure about what any of the config keys below do, please check the config/defaults.config.php for detailed
+// If you're unsure about what any of the config keys below do, please check the static/defaults.config.php for detailed
 // documentation of their data type and behavior.
 
 return [
index 8658097f9a12d96d9d74fad27e3d4c3391deea6e..e4206af4144302b20bd5dca0d55e0bc2b256343e 100644 (file)
@@ -2,35 +2,38 @@
 
 namespace Friendica\Test\src\Console;
 
+use Friendica\App;
 use Friendica\App\Mode;
 use Friendica\Console\Config;
+use Friendica\Core\Config\Configuration;
+use Mockery\MockInterface;
 
-/**
- * @runTestsInSeparateProcesses
- * @preserveGlobalState disabled
- * @requires PHP 7.0
- */
 class ConfigConsoleTest extends ConsoleTest
 {
+       /**
+        * @var App\Mode|MockInterface $appMode
+        */
+       private $appMode;
+
        protected function setUp()
        {
                parent::setUp();
 
-               $this->mockApp($this->root);
-
                \Mockery::getConfiguration()->setConstantsMap([
                        Mode::class => [
                                'DBCONFIGAVAILABLE' => 0
                        ]
                ]);
 
-               $this->mode
-                       ->shouldReceive('has')
-                       ->andReturn(true);
+               $this->appMode = \Mockery::mock(App\Mode::class);
+               $this->appMode->shouldReceive('has')
+                       ->andReturn(true);
 
+               $this->configMock = \Mockery::mock(Configuration::class);
        }
 
-       function testSetGetKeyValue() {
+       function testSetGetKeyValue()
+       {
                $this->configMock
                        ->shouldReceive('set')
                        ->with('config', 'test', 'now')
@@ -42,7 +45,7 @@ class ConfigConsoleTest extends ConsoleTest
                        ->andReturn('now')
                        ->twice();
 
-               $console = new Config($this->consoleArgv);
+               $console = new Config($this->appMode, $this->configMock, $this->consoleArgv);
                $console->setArgument(0, 'config');
                $console->setArgument(1, 'test');
                $console->setArgument(2, 'now');
@@ -55,7 +58,7 @@ class ConfigConsoleTest extends ConsoleTest
                        ->andReturn('now')
                        ->once();
 
-               $console = new Config($this->consoleArgv);
+               $console = new Config($this->appMode, $this->configMock, [$this->consoleArgv]);
                $console->setArgument(0, 'config');
                $console->setArgument(1, 'test');
                $txt = $this->dumpExecute($console);
@@ -67,7 +70,7 @@ class ConfigConsoleTest extends ConsoleTest
                        ->andReturn(null)
                        ->once();
 
-               $console = new Config($this->consoleArgv);
+               $console = new Config($this->appMode, $this->configMock, $this->consoleArgv);
                $console->setArgument(0, 'config');
                $console->setArgument(1, 'test');
                $txt = $this->dumpExecute($console);
@@ -82,7 +85,7 @@ class ConfigConsoleTest extends ConsoleTest
                        ->andReturn($testArray)
                        ->once();
 
-               $console = new Config($this->consoleArgv);
+               $console = new Config($this->appMode, $this->configMock, $this->consoleArgv);
                $console->setArgument(0, 'config');
                $console->setArgument(1, 'test');
                $console->setArgument(2, 'now');
@@ -92,7 +95,7 @@ class ConfigConsoleTest extends ConsoleTest
        }
 
        function testTooManyArguments() {
-               $console = new Config($this->consoleArgv);
+               $console = new Config($this->appMode, $this->configMock, $this->consoleArgv);
                $console->setArgument(0, 'config');
                $console->setArgument(1, 'test');
                $console->setArgument(2, 'it');
@@ -109,7 +112,7 @@ class ConfigConsoleTest extends ConsoleTest
                        ->with('test', 'it')
                        ->andReturn('now')
                        ->once();
-               $console = new Config($this->consoleArgv);
+               $console = new Config($this->appMode, $this->configMock, $this->consoleArgv);
                $console->setArgument(0, 'test');
                $console->setArgument(1, 'it');
                $console->setOption('v', 1);
@@ -142,7 +145,7 @@ CONF;
                        ->with('test', 'it')
                        ->andReturn(NULL)
                        ->once();
-               $console = new Config();
+               $console = new Config($this->appMode, $this->configMock, [$this->consoleArgv]);
                $console->setArgument(0, 'test');
                $console->setArgument(1, 'it');
                $console->setArgument(2, 'now');
@@ -183,7 +186,7 @@ Options
     -v           Show more debug information.
 
 HELP;
-               $console = new Config($this->consoleArgv);
+               $console = new Config($this->appMode, $this->configMock, [$this->consoleArgv]);
                $console->setOption('help', true);
 
                $txt = $this->dumpExecute($console);
index 21979e72b24fb655ede483315c044431cb3d49c8..64fab4baf6d0a9f8164fcfa2c3a9ba2b6994c7ff 100644 (file)
@@ -4,15 +4,10 @@ namespace Friendica\Test\src\Console;
 
 use Asika\SimpleConsole\Console;
 use Friendica\Test\MockedTest;
-use Friendica\Test\Util\AppMockTrait;
 use Friendica\Test\Util\Intercept;
-use Friendica\Test\Util\VFSTrait;
 
 abstract class ConsoleTest extends MockedTest
 {
-       use VFSTrait;
-       use AppMockTrait;
-
        /**
         * @var array The default argv for a Console Instance
         */
@@ -23,8 +18,6 @@ abstract class ConsoleTest extends MockedTest
                parent::setUp();
 
                Intercept::setUp();
-
-               $this->setUpVfsDir();
        }
 
        /**
diff --git a/tests/src/Console/LockConsoleTest.php b/tests/src/Console/LockConsoleTest.php
new file mode 100644 (file)
index 0000000..51c05b5
--- /dev/null
@@ -0,0 +1,215 @@
+<?php
+
+namespace Friendica\Test\src\Console;
+
+use Friendica\App;
+use Friendica\App\Mode;
+use Friendica\Console\Lock;
+use Friendica\Core\Lock\ILock;
+use Mockery\MockInterface;
+
+class LockConsoleTest extends ConsoleTest
+{
+       /**
+        * @var App\Mode|MockInterface $appMode
+        */
+       private $appMode;
+
+       /**
+        * @var ILock|MockInterface
+        */
+       private $lockMock;
+
+       protected function setUp()
+       {
+               parent::setUp();
+
+               \Mockery::getConfiguration()->setConstantsMap([
+                       Mode::class => [
+                               'DBCONFIGAVAILABLE' => 0
+                       ]
+               ]);
+
+               $this->appMode = \Mockery::mock(App\Mode::class);
+               $this->appMode->shouldReceive('has')
+                       ->andReturn(true);
+
+               $this->lockMock = \Mockery::mock(ILock::class);
+       }
+
+       public function testList()
+       {
+               $this->lockMock
+                       ->shouldReceive('getLocks')
+                       ->andReturn(['test', 'test2'])
+                       ->once();
+
+               $console = new Lock($this->appMode, $this->lockMock, $this->consoleArgv);
+               $console->setArgument(0, 'list');
+               $txt = $this->dumpExecute($console);
+               $this->assertEquals("Listing all Locks:\ntest\ntest2\n2 locks found\n", $txt);
+       }
+
+       public function testListPrefix()
+       {
+               $this->lockMock
+                       ->shouldReceive('getLocks')
+                       ->with('test')
+                       ->andReturn(['test', 'test2'])
+                       ->once();
+
+               $console = new Lock($this->appMode, $this->lockMock, $this->consoleArgv);
+               $console->setArgument(0, 'list');
+               $console->setArgument(1, 'test');
+               $txt = $this->dumpExecute($console);
+               $this->assertEquals("Listing all Locks starting with \"test\":\ntest\ntest2\n2 locks found\n", $txt);
+       }
+
+       public function testDelLock()
+       {
+               $this->lockMock
+                       ->shouldReceive('releaseLock')
+                       ->with('test', true)
+                       ->andReturn(true)
+                       ->once();
+
+               $console = new Lock($this->appMode, $this->lockMock, $this->consoleArgv);
+               $console->setArgument(0, 'del');
+               $console->setArgument(1, 'test');
+               $txt = $this->dumpExecute($console);
+               $this->assertEquals("Lock 'test' released.\n", $txt);
+       }
+
+       public function testDelUnknownLock()
+       {
+               $this->lockMock
+                       ->shouldReceive('releaseLock')
+                       ->with('test', true)
+                       ->andReturn(false)
+                       ->once();
+
+               $console = new Lock($this->appMode, $this->lockMock, $this->consoleArgv);
+               $console->setArgument(0, 'del');
+               $console->setArgument(1, 'test');
+               $txt = $this->dumpExecute($console);
+               $this->assertEquals("Couldn't release Lock 'test'\n", $txt);
+       }
+
+       public function testSetLock()
+       {
+               $this->lockMock
+                       ->shouldReceive('isLocked')
+                       ->with('test')
+                       ->andReturn(false)
+                       ->once();
+               $this->lockMock
+                       ->shouldReceive('acquireLock')
+                       ->with('test')
+                       ->andReturn(true)
+                       ->once();
+
+               $console = new Lock($this->appMode, $this->lockMock, $this->consoleArgv);
+               $console->setArgument(0, 'set');
+               $console->setArgument(1, 'test');
+               $txt = $this->dumpExecute($console);
+               $this->assertEquals("Lock 'test' acquired.\n", $txt);
+       }
+
+       public function testSetLockIsLocked()
+       {
+               $this->lockMock
+                       ->shouldReceive('isLocked')
+                       ->with('test')
+                       ->andReturn(true)
+                       ->once();
+
+               $console = new Lock($this->appMode, $this->lockMock, $this->consoleArgv);
+               $console->setArgument(0, 'set');
+               $console->setArgument(1, 'test');
+               $txt = $this->dumpExecute($console);
+               $this->assertEquals("[Error] 'test' is already set.\n", $txt);
+       }
+
+       public function testSetLockNotWorking()
+       {
+               $this->lockMock
+                       ->shouldReceive('isLocked')
+                       ->with('test')
+                       ->andReturn(false)
+                       ->once();
+               $this->lockMock
+                       ->shouldReceive('acquireLock')
+                       ->with('test')
+                       ->andReturn(false)
+                       ->once();
+
+               $console = new Lock($this->appMode, $this->lockMock, $this->consoleArgv);
+               $console->setArgument(0, 'set');
+               $console->setArgument(1, 'test');
+               $txt = $this->dumpExecute($console);
+               $this->assertEquals("[Error] Unable to lock 'test'.\n", $txt);
+       }
+
+       public function testReleaseAll()
+       {
+               $this->lockMock
+                       ->shouldReceive('releaseAll')
+                       ->andReturn(true)
+                       ->once();
+
+               $console = new Lock($this->appMode, $this->lockMock, $this->consoleArgv);
+               $console->setArgument(0, 'clear');
+               $txt = $this->dumpExecute($console);
+               $this->assertEquals("Locks successfully cleared.\n", $txt);
+       }
+
+       public function testReleaseAllFailed()
+       {
+               $this->lockMock
+                       ->shouldReceive('releaseAll')
+                       ->andReturn(false)
+                       ->once();
+
+               $console = new Lock($this->appMode, $this->lockMock, $this->consoleArgv);
+               $console->setArgument(0, 'clear');
+               $txt = $this->dumpExecute($console);
+               $this->assertEquals("[Error] Unable to clear the locks.\n", $txt);
+       }
+
+       public function testGetHelp()
+       {
+               // Usable to purposely fail if new commands are added without taking tests into account
+               $theHelp = <<<HELP
+console lock - Manage node locks
+Synopsis
+       bin/console lock list [<prefix>] [-h|--help|-?] [-v]
+       bin/console lock set <lock> [<timeout> [<ttl>]] [-h|--help|-?] [-v]
+       bin/console lock del <lock> [-h|--help|-?] [-v]
+       bin/console lock clear [-h|--help|-?] [-v]
+
+Description
+       bin/console lock list [<prefix>]
+               List all locks, optionally filtered by a prefix
+
+       bin/console lock set <lock> [<timeout> [<ttl>]]
+               Sets manually a lock, optionally with the provided TTL (time to live) with a default of five minutes.
+
+       bin/console lock del <lock>
+               Deletes a lock.
+
+       bin/console lock clear
+               Clears all locks
+
+Options
+    -h|--help|-? Show help information
+    -v           Show more debug information.
+
+HELP;
+               $console = new Lock($this->appMode, $this->lockMock, [$this->consoleArgv]);
+               $console->setOption('help', true);
+
+               $txt = $this->dumpExecute($console);
+
+               $this->assertEquals($txt, $theHelp);
+       }
+}
index 11856eac165d60d3533b0dade1f229620b142f78..d671020e6f59c458bb416d72f97ba1ddb8160604 100644 (file)
@@ -3,11 +3,8 @@
 namespace Friendica\Test\src\Console;
 
 use Friendica\Console\ServerBlock;
+use Friendica\Core\Config\Configuration;
 
-/**
- * @runTestsInSeparateProcesses
- * @preserveGlobalState disabled
- */
 class ServerBlockConsoleTest extends ConsoleTest
 {
        protected $defaultBlockList = [
@@ -25,7 +22,7 @@ class ServerBlockConsoleTest extends ConsoleTest
        {
                parent::setUp();
 
-               $this->mockApp($this->root);
+               $this->configMock = \Mockery::mock(Configuration::class);
        }
 
        /**
@@ -35,11 +32,11 @@ class ServerBlockConsoleTest extends ConsoleTest
        {
                $this->configMock
                        ->shouldReceive('get')
-                       ->with('system', 'blocklist')
+                       ->with('system', 'blocklist', [])
                        ->andReturn($this->defaultBlockList)
                        ->once();
 
-               $console = new ServerBlock($this->consoleArgv);
+               $console = new ServerBlock($this->configMock, $this->consoleArgv);
                $txt = $this->dumpExecute($console);
 
                $output = <<<CONS
@@ -63,7 +60,7 @@ CONS;
        {
                $this->configMock
                        ->shouldReceive('get')
-                       ->with('system', 'blocklist')
+                       ->with('system', 'blocklist', [])
                        ->andReturn($this->defaultBlockList)
                        ->once();
 
@@ -79,7 +76,7 @@ CONS;
                        ->andReturn(true)
                        ->once();
 
-               $console = new ServerBlock($this->consoleArgv);
+               $console = new ServerBlock($this->configMock, $this->consoleArgv);
                $console->setArgument(0, 'add');
                $console->setArgument(1, 'testme.now');
                $console->setArgument(2, 'I like it!');
@@ -95,7 +92,7 @@ CONS;
        {
                $this->configMock
                        ->shouldReceive('get')
-                       ->with('system', 'blocklist')
+                       ->with('system', 'blocklist', [])
                        ->andReturn($this->defaultBlockList)
                        ->once();
 
@@ -111,7 +108,7 @@ CONS;
                        ->andReturn(true)
                        ->once();
 
-               $console = new ServerBlock($this->consoleArgv);
+               $console = new ServerBlock($this->configMock, $this->consoleArgv);
                $console->setArgument(0, 'add');
                $console->setArgument(1, 'testme.now');
                $txt = $this->dumpExecute($console);
@@ -126,7 +123,7 @@ CONS;
        {
                $this->configMock
                        ->shouldReceive('get')
-                       ->with('system', 'blocklist')
+                       ->with('system', 'blocklist', [])
                        ->andReturn($this->defaultBlockList)
                        ->once();
 
@@ -147,7 +144,7 @@ CONS;
                        ->andReturn(true)
                        ->once();
 
-               $console = new ServerBlock($this->consoleArgv);
+               $console = new ServerBlock($this->configMock, $this->consoleArgv);
                $console->setArgument(0, 'add');
                $console->setArgument(1, 'pod.ordoevangelistarum.com');
                $console->setArgument(2, 'Other reason');
@@ -163,7 +160,7 @@ CONS;
        {
                $this->configMock
                        ->shouldReceive('get')
-                       ->with('system', 'blocklist')
+                       ->with('system', 'blocklist', [])
                        ->andReturn($this->defaultBlockList)
                        ->once();
 
@@ -180,7 +177,7 @@ CONS;
                        ->andReturn(true)
                        ->once();
 
-               $console = new ServerBlock($this->consoleArgv);
+               $console = new ServerBlock($this->configMock, $this->consoleArgv);
                $console->setArgument(0, 'remove');
                $console->setArgument(1, 'pod.ordoevangelistarum.com');
                $txt = $this->dumpExecute($console);
@@ -193,7 +190,7 @@ CONS;
         */
        public function testBlockedServersWrongCommand()
        {
-               $console = new ServerBlock($this->consoleArgv);
+               $console = new ServerBlock($this->configMock, $this->consoleArgv);
                $console->setArgument(0, 'wrongcommand');
                $txt = $this->dumpExecute($console);
 
@@ -207,11 +204,11 @@ CONS;
        {
                $this->configMock
                        ->shouldReceive('get')
-                       ->with('system', 'blocklist')
+                       ->with('system', 'blocklist', [])
                        ->andReturn($this->defaultBlockList)
                        ->once();
 
-               $console = new ServerBlock($this->consoleArgv);
+               $console = new ServerBlock($this->configMock, $this->consoleArgv);
                $console->setArgument(0, 'remove');
                $console->setArgument(1, 'not.exiting');
                $txt = $this->dumpExecute($console);
@@ -224,7 +221,7 @@ CONS;
         */
        public function testAddBlockedServerMissingArgument()
        {
-               $console = new ServerBlock($this->consoleArgv);
+               $console = new ServerBlock($this->configMock, $this->consoleArgv);
                $console->setArgument(0, 'add');
                $txt = $this->dumpExecute($console);
 
@@ -238,7 +235,7 @@ CONS;
        {
                $this->configMock
                        ->shouldReceive('get')
-                       ->with('system', 'blocklist')
+                       ->with('system', 'blocklist', [])
                        ->andReturn($this->defaultBlockList)
                        ->once();
 
@@ -254,7 +251,7 @@ CONS;
                        ->andReturn(false)
                        ->once();
 
-               $console = new ServerBlock($this->consoleArgv);
+               $console = new ServerBlock($this->configMock, $this->consoleArgv);
                $console->setArgument(0, 'add');
                $console->setArgument(1, 'testme.now');
                $txt = $this->dumpExecute($console);
@@ -269,7 +266,7 @@ CONS;
        {
                $this->configMock
                        ->shouldReceive('get')
-                       ->with('system', 'blocklist')
+                       ->with('system', 'blocklist', [])
                        ->andReturn($this->defaultBlockList)
                        ->once();
 
@@ -286,7 +283,7 @@ CONS;
                        ->andReturn(false)
                        ->once();
 
-               $console = new ServerBlock($this->consoleArgv);
+               $console = new ServerBlock($this->configMock, $this->consoleArgv);
                $console->setArgument(0, 'remove');
                $console->setArgument(1, 'pod.ordoevangelistarum.com');
                $txt = $this->dumpExecute($console);
@@ -299,7 +296,7 @@ CONS;
         */
        public function testRemoveBlockedServerMissingArgument()
        {
-               $console = new ServerBlock($this->consoleArgv);
+               $console = new ServerBlock($this->configMock, $this->consoleArgv);
                $console->setArgument(0, 'remove');
                $txt = $this->dumpExecute($console);
 
@@ -311,20 +308,25 @@ CONS;
         */
        public function testBlockedServersHelp()
        {
-               $console = new ServerBlock($this->consoleArgv);
+               $console = new ServerBlock($this->configMock, $this->consoleArgv);
                $console->setOption('help', true);
                $txt = $this->dumpExecute($console);
 
                $help = <<<HELP
-console serverblock - Manage blocked servers
+console serverblock - Manage blocked server domain patterns
 Usage
        bin/console serverblock [-h|--help|-?] [-v]
-       bin/console serverblock add <server> <reason> [-h|--help|-?] [-v]
-       bin/console serverblock remove <server> [-h|--help|-?] [-v]
+       bin/console serverblock add <pattern> <reason> [-h|--help|-?] [-v]
+       bin/console serverblock remove <pattern> [-h|--help|-?] [-v]
 
 Description
-       With this tool, you can list the current blocked servers
-    or you can add / remove a blocked server from the list
+       With this tool, you can list the current blocked server domain patterns
+    or you can add / remove a blocked server domain pattern from the list.
+    
+    Patterns are case-insensitive shell wildcard comprising the following special characters:
+    - * : Any number of characters
+    - ? : Any single character
+    - [<char1><char2>...] : char1 or char2 or...
 
 Options
     -h|--help|-? Show help information
index 40d126e005b99a7a18cb6b9efdec2a7a78c64a4a..4e0859d7c423bced2b038c531dd675a3cf3980bd 100644 (file)
@@ -1,69 +1,67 @@
-<?php\r
-/**\r
- * Created by PhpStorm.\r
- * User: benlo\r
- * Date: 25/03/19\r
- * Time: 21:36\r
- */\r
-\r
-namespace Friendica\Test\src\Content;\r
-\r
-use Friendica\Content\Smilies;\r
-use Friendica\Test\MockedTest;\r
-use Friendica\Test\Util\AppMockTrait;\r
-use Friendica\Test\Util\L10nMockTrait;\r
-use Friendica\Test\Util\VFSTrait;\r
-\r
-class SmiliesTest extends MockedTest\r
-{\r
-       use VFSTrait;\r
-       use AppMockTrait;\r
-       use L10nMockTrait;\r
-\r
-       protected function setUp()\r
-       {\r
-               parent::setUp();\r
-               $this->setUpVfsDir();\r
-               $this->mockApp($this->root);\r
-               $this->app->videowidth = 425;\r
-               $this->app->videoheight = 350;\r
-               $this->configMock->shouldReceive('get')\r
-                       ->with('system', 'no_smilies')\r
-                       ->andReturn(false);\r
-               $this->configMock->shouldReceive('get')\r
-                       ->with(false, 'system', 'no_smilies')\r
-                       ->andReturn(false);\r
-       }\r
-\r
-       public function dataLinks()\r
-       {\r
-               return [\r
-                       /** @see https://github.com/friendica/friendica/pull/6933 */\r
-                       'bug-6933-1' => [\r
-                               'data' => '<code>/</code>',\r
-                               'smilies' => ['texts' => [], 'icons' => []],\r
-                               'expected' => '<code>/</code>',\r
-                       ],\r
-                       'bug-6933-2' => [\r
-                               'data' => '<code>code</code>',\r
-                               'smilies' => ['texts' => [], 'icons' => []],\r
-                               'expected' => '<code>code</code>',\r
-                       ],\r
-               ];\r
-       }\r
-\r
-       /**\r
-        * Test replace smilies in different texts\r
-        * @dataProvider dataLinks\r
-        *\r
-        * @param string $text     Test string\r
-        * @param array  $smilies  List of smilies to replace\r
-        * @param string $expected Expected result\r
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException\r
-        */\r
-       public function testReplaceFromArray($text, $smilies, $expected)\r
-       {\r
-               $output = Smilies::replaceFromArray($text, $smilies);\r
-               $this->assertEquals($expected, $output);\r
-       }\r
-}\r
+<?php
+/**
+ * Created by PhpStorm.
+ * User: benlo
+ * Date: 25/03/19
+ * Time: 21:36
+ */
+
+namespace Friendica\Test\src\Content;
+
+use Friendica\Content\Smilies;
+use Friendica\Test\MockedTest;
+use Friendica\Test\Util\AppMockTrait;
+use Friendica\Test\Util\VFSTrait;
+
+class SmiliesTest extends MockedTest
+{
+       use VFSTrait;
+       use AppMockTrait;
+
+       protected function setUp()
+       {
+               parent::setUp();
+               $this->setUpVfsDir();
+               $this->mockApp($this->root);
+               $this->app->videowidth = 425;
+               $this->app->videoheight = 350;
+               $this->configMock->shouldReceive('get')
+                       ->with('system', 'no_smilies')
+                       ->andReturn(false);
+               $this->configMock->shouldReceive('get')
+                       ->with(false, 'system', 'no_smilies')
+                       ->andReturn(false);
+       }
+
+       public function dataLinks()
+       {
+               return [
+                       /** @see https://github.com/friendica/friendica/pull/6933 */
+                       'bug-6933-1' => [
+                               'data' => '<code>/</code>',
+                               'smilies' => ['texts' => [], 'icons' => []],
+                               'expected' => '<code>/</code>',
+                       ],
+                       'bug-6933-2' => [
+                               'data' => '<code>code</code>',
+                               'smilies' => ['texts' => [], 'icons' => []],
+                               'expected' => '<code>code</code>',
+                       ],
+               ];
+       }
+
+       /**
+        * Test replace smilies in different texts
+        * @dataProvider dataLinks
+        *
+        * @param string $text     Test string
+        * @param array  $smilies  List of smilies to replace
+        * @param string $expected Expected result
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        */
+       public function testReplaceFromArray($text, $smilies, $expected)
+       {
+               $output = Smilies::replaceFromArray($text, $smilies);
+               $this->assertEquals($expected, $output);
+       }
+}
index 3efb408937a552fde12bd182967010bbc45b16c0..899f32764dc9307546a48dae84f831d629290ce3 100644 (file)
@@ -2,21 +2,17 @@
 
 namespace Friendica\Test\src\Content\Text;
 
+use Friendica\App\BaseURL;
 use Friendica\Content\Text\BBCode;
+use Friendica\Core\L10n\L10n;
 use Friendica\Test\MockedTest;
 use Friendica\Test\Util\AppMockTrait;
-use Friendica\Test\Util\L10nMockTrait;
 use Friendica\Test\Util\VFSTrait;
 
-/**
- * @runTestsInSeparateProcesses
- * @preserveGlobalState disabled
- */
 class BBCodeTest extends MockedTest
 {
        use VFSTrait;
        use AppMockTrait;
-       use L10nMockTrait;
 
        protected function setUp()
        {
@@ -40,7 +36,21 @@ class BBCodeTest extends MockedTest
                $this->configMock->shouldReceive('get')
                        ->with('system', 'url')
                        ->andReturn('friendica.local');
-               $this->mockL10nT();
+               $this->configMock->shouldReceive('get')
+                       ->with('system', 'no_smilies')
+                       ->andReturn(false);
+
+               $l10nMock = \Mockery::mock(L10n::class);
+               $l10nMock->shouldReceive('t')->withAnyArgs()->andReturnUsing(function ($args) { return $args; });
+               $this->dice->shouldReceive('create')
+                          ->with(L10n::class)
+                          ->andReturn($l10nMock);
+
+               $baseUrlMock = \Mockery::mock(BaseURL::class);
+               $baseUrlMock->shouldReceive('get')->withAnyArgs()->andReturn('friendica.local');
+               $this->dice->shouldReceive('create')
+                          ->with(BaseURL::class)
+                          ->andReturn($baseUrlMock);
        }
 
        public function dataLinks()
diff --git a/tests/src/Content/Text/HTMLTest.php b/tests/src/Content/Text/HTMLTest.php
new file mode 100644 (file)
index 0000000..65ae052
--- /dev/null
@@ -0,0 +1,53 @@
+<?php
+
+namespace Friendica\Test\src\Content\Text;
+
+use Friendica\Content\Text\HTML;
+use Friendica\Test\MockedTest;
+use Friendica\Test\Util\AppMockTrait;
+use Friendica\Test\Util\VFSTrait;
+
+class HTMLTest extends MockedTest
+{
+       use VFSTrait;
+       use AppMockTrait;
+
+       protected function setUp()
+       {
+               parent::setUp();
+               $this->setUpVfsDir();
+               $this->mockApp($this->root);
+       }
+
+       public function dataHTML()
+       {
+               $inputFiles = glob(__DIR__ . '/../../../datasets/content/text/html/*.html');
+
+               $data = [];
+
+               foreach ($inputFiles as $file) {
+                       $data[str_replace('.html', '', $file)] = [
+                               'input'    => file_get_contents($file),
+                               'expected' => file_get_contents(str_replace('.html', '.txt', $file))
+                       ];
+               }
+
+               return $data;
+       }
+
+       /**
+        * Test convert different input Markdown text into HTML
+        *
+        * @dataProvider dataHTML
+        *
+        * @param string $input    The Markdown text to test
+        * @param string $expected The expected HTML output
+        * @throws \Exception
+        */
+       public function testToPlaintext($input, $expected)
+       {
+               $output = HTML::toPlaintext($input, 0);
+
+               $this->assertEquals($expected, $output);
+       }
+}
index e39b46b2c567be565e58bf4e1fc7c548010cb4d9..80421b5221832289f7624a4b744bed991cd2301e 100644 (file)
@@ -1,52 +1,52 @@
-<?php\r
-\r
-namespace Friendica\Test\src\Content\Text;\r
-\r
-use Friendica\Content\Text\Markdown;\r
-use Friendica\Test\MockedTest;\r
-use Friendica\Test\Util\AppMockTrait;\r
-use Friendica\Test\Util\VFSTrait;\r
-\r
-class MarkdownTest extends MockedTest\r
-{\r
-       use VFSTrait;\r
-       use AppMockTrait;\r
-\r
-       protected function setUp()\r
-       {\r
-               parent::setUp();\r
-               $this->setUpVfsDir();\r
-               $this->mockApp($this->root);\r
-       }\r
-\r
-       public function dataMarkdown()\r
-       {\r
-               $inputFiles = glob(__DIR__ . '/../../../datasets/content/text/markdown/*.md');\r
-\r
-               $data = [];\r
-\r
-               foreach ($inputFiles as $file) {\r
-                       $data[str_replace('.md', '', $file)] = [\r
-                               'input'    => file_get_contents($file),\r
-                               'expected' => file_get_contents(str_replace('.md', '.html', $file))\r
-                       ];\r
-               }\r
-\r
-               return $data;\r
-       }\r
-\r
-       /**\r
-        * Test convert different input Markdown text into HTML\r
-        * @dataProvider dataMarkdown\r
-        *\r
-        * @param string $input    The Markdown text to test\r
-        * @param string $expected The expected HTML output\r
-        * @throws \Exception\r
-        */\r
-       public function testConvert($input, $expected)\r
-       {\r
-               $output = Markdown::convert($input);\r
-\r
-               $this->assertEquals($expected, $output);\r
-       }\r
-}
\ No newline at end of file
+<?php
+
+namespace Friendica\Test\src\Content\Text;
+
+use Friendica\Content\Text\Markdown;
+use Friendica\Test\MockedTest;
+use Friendica\Test\Util\AppMockTrait;
+use Friendica\Test\Util\VFSTrait;
+
+class MarkdownTest extends MockedTest
+{
+       use VFSTrait;
+       use AppMockTrait;
+
+       protected function setUp()
+       {
+               parent::setUp();
+               $this->setUpVfsDir();
+               $this->mockApp($this->root);
+       }
+
+       public function dataMarkdown()
+       {
+               $inputFiles = glob(__DIR__ . '/../../../datasets/content/text/markdown/*.md');
+
+               $data = [];
+
+               foreach ($inputFiles as $file) {
+                       $data[str_replace('.md', '', $file)] = [
+                               'input'    => file_get_contents($file),
+                               'expected' => file_get_contents(str_replace('.md', '.html', $file))
+                       ];
+               }
+
+               return $data;
+       }
+
+       /**
+        * Test convert different input Markdown text into HTML
+        * @dataProvider dataMarkdown
+        *
+        * @param string $input    The Markdown text to test
+        * @param string $expected The expected HTML output
+        * @throws \Exception
+        */
+       public function testConvert($input, $expected)
+       {
+               $output = Markdown::convert($input);
+
+               $this->assertEquals($expected, $output);
+       }
+}
diff --git a/tests/src/Core/Cache/APCuCacheDriverTest.php b/tests/src/Core/Cache/APCuCacheDriverTest.php
deleted file mode 100644 (file)
index eac00f5..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-
-namespace Friendica\Test\src\Core\Cache;
-
-use Friendica\Core\Cache\APCuCache;
-
-class APCuCacheDriverTest extends MemoryCacheTest
-{
-       protected function setUp()
-       {
-               if (!APCuCache::isAvailable()) {
-                       $this->markTestSkipped('APCu is not available');
-               }
-
-               parent::setUp();
-       }
-
-       protected function getInstance()
-       {
-               $this->cache = new APCuCache();
-               return $this->cache;
-       }
-
-       public function tearDown()
-       {
-               $this->cache->clear(false);
-               parent::tearDown();
-       }
-}
diff --git a/tests/src/Core/Cache/APCuCacheTest.php b/tests/src/Core/Cache/APCuCacheTest.php
new file mode 100644 (file)
index 0000000..1b90be5
--- /dev/null
@@ -0,0 +1,29 @@
+<?php
+
+namespace Friendica\Test\src\Core\Cache;
+
+use Friendica\Core\Cache\APCuCache;
+
+class APCuCacheTest extends MemoryCacheTest
+{
+       protected function setUp()
+       {
+               if (!APCuCache::isAvailable()) {
+                       $this->markTestSkipped('APCu is not available');
+               }
+
+               parent::setUp();
+       }
+
+       protected function getInstance()
+       {
+               $this->cache = new APCuCache('localhost');
+               return $this->cache;
+       }
+
+       public function tearDown()
+       {
+               $this->cache->clear(false);
+               parent::tearDown();
+       }
+}
diff --git a/tests/src/Core/Cache/ArrayCacheDriverTest.php b/tests/src/Core/Cache/ArrayCacheDriverTest.php
deleted file mode 100644 (file)
index c92fb98..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-
-namespace Friendica\Test\src\Core\Cache;
-
-use Friendica\Core\Cache\ArrayCache;
-
-class ArrayCacheDriverTest extends MemoryCacheTest
-{
-       protected function getInstance()
-       {
-               $this->cache = new ArrayCache();
-               return $this->cache;
-       }
-
-       public function tearDown()
-       {
-               $this->cache->clear(false);
-               parent::tearDown();
-       }
-
-       public function testTTL()
-       {
-               // Array Cache doesn't support TTL
-               return true;
-       }
-}
diff --git a/tests/src/Core/Cache/ArrayCacheTest.php b/tests/src/Core/Cache/ArrayCacheTest.php
new file mode 100644 (file)
index 0000000..60ca276
--- /dev/null
@@ -0,0 +1,26 @@
+<?php
+
+namespace Friendica\Test\src\Core\Cache;
+
+use Friendica\Core\Cache\ArrayCache;
+
+class ArrayCacheTest extends MemoryCacheTest
+{
+       protected function getInstance()
+       {
+               $this->cache = new ArrayCache('localhost');
+               return $this->cache;
+       }
+
+       public function tearDown()
+       {
+               $this->cache->clear(false);
+               parent::tearDown();
+       }
+
+       public function testTTL()
+       {
+               // Array Cache doesn't support TTL
+               return true;
+       }
+}
index ef97f5a172214ea16ed325ca79b7ff8cb5f2d027..9071a55c402b8dda7928df54e9f109957aa42226 100644 (file)
@@ -2,34 +2,29 @@
 
 namespace Friendica\Test\src\Core\Cache;
 
-use Friendica\Core\Cache\MemcachedCacheDriver;
 use Friendica\Test\MockedTest;
-use Friendica\Test\Util\AppMockTrait;
-use Friendica\Test\Util\VFSTrait;
 use Friendica\Util\PidFile;
 
 abstract class CacheTest extends MockedTest
 {
-       use VFSTrait;
-       use AppMockTrait;
-
        /**
         * @var int Start time of the mock (used for time operations)
         */
        protected $startTime = 1417011228;
 
        /**
-        * @var \Friendica\Core\Cache\ICacheDriver
+        * @var \Friendica\Core\Cache\ICache
         */
        protected $instance;
 
        /**
-        * @var \Friendica\Core\Cache\IMemoryCacheDriver
+        * @var \Friendica\Core\Cache\IMemoryCache
         */
        protected $cache;
 
        /**
         * Dataset for test setting different types in the cache
+        *
         * @return array
         */
        public function dataTypesInCache()
@@ -48,6 +43,7 @@ abstract class CacheTest extends MockedTest
 
        /**
         * Dataset for simple value sets/gets
+        *
         * @return array
         */
        public function dataSimple()
@@ -66,12 +62,6 @@ abstract class CacheTest extends MockedTest
 
        protected function setUp()
        {
-               $this->setUpVfsDir();
-               $this->mockApp($this->root);
-               $this->app
-                       ->shouldReceive('getHostname')
-                       ->andReturn('friendica.local');
-
                parent::setUp();
 
                $this->instance = $this->getInstance();
@@ -82,10 +72,12 @@ abstract class CacheTest extends MockedTest
        /**
         * @small
         * @dataProvider dataSimple
+        *
         * @param mixed $value1 a first
         * @param mixed $value2 a second
         */
-       function testSimple($value1, $value2) {
+       function testSimple($value1, $value2)
+       {
                $this->assertNull($this->instance->get('value1'));
 
                $this->instance->set('value1', $value1);
@@ -110,12 +102,14 @@ abstract class CacheTest extends MockedTest
        /**
         * @small
         * @dataProvider dataSimple
+        *
         * @param mixed $value1 a first
         * @param mixed $value2 a second
         * @param mixed $value3 a third
         * @param mixed $value4 a fourth
         */
-       function testClear($value1, $value2, $value3, $value4) {
+       function testClear($value1, $value2, $value3, $value4)
+       {
                $value = 'ipsum lorum';
                $this->instance->set('1_value1', $value1);
                $this->instance->set('1_value2', $value2);
@@ -166,7 +160,8 @@ abstract class CacheTest extends MockedTest
        /**
         * @medium
         */
-       function testTTL() {
+       function testTTL()
+       {
                $this->markTestSkipped('taking too much time without mocking');
 
                $this->assertNull($this->instance->get('value1'));
@@ -183,10 +178,13 @@ abstract class CacheTest extends MockedTest
 
        /**
         * @small
+        *
         * @param $data mixed the data to store in the cache
+        *
         * @dataProvider dataTypesInCache
         */
-       function testDifferentTypesInCache($data) {
+       function testDifferentTypesInCache($data)
+       {
                $this->instance->set('val', $data);
                $received = $this->instance->get('val');
                $this->assertEquals($data, $received, 'Value type changed from ' . gettype($data) . ' to ' . gettype($received));
@@ -194,16 +192,15 @@ abstract class CacheTest extends MockedTest
 
        /**
         * @small
+        *
         * @param mixed $value1 a first
         * @param mixed $value2 a second
         * @param mixed $value3 a third
+        *
         * @dataProvider dataSimple
         */
-       public function testGetAllKeys($value1, $value2, $value3) {
-               if ($this->cache instanceof MemcachedCacheDriver) {
-                       $this->markTestSkipped('Memcached doesn\'t support getAllKeys anymore');
-               }
-
+       public function testGetAllKeys($value1, $value2, $value3)
+       {
                $this->assertTrue($this->instance->set('value1', $value1));
                $this->assertTrue($this->instance->set('value2', $value2));
                $this->assertTrue($this->instance->set('test_value3', $value3));
@@ -217,5 +214,7 @@ abstract class CacheTest extends MockedTest
                $list = $this->instance->getAllKeys('test');
 
                $this->assertContains('test_value3', $list);
+               $this->assertNotContains('value1', $list);
+               $this->assertNotContains('value2', $list);
        }
 }
diff --git a/tests/src/Core/Cache/DatabaseCacheDriverTest.php b/tests/src/Core/Cache/DatabaseCacheDriverTest.php
deleted file mode 100644 (file)
index 2d29c2a..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-<?php
-
-namespace Friendica\Test\src\Core\Cache;
-
-use Friendica\Core\Cache;
-use Friendica\Factory\CacheDriverFactory;
-use Friendica\Test\Util\DbaCacheMockTrait;
-
-/**
- * @runTestsInSeparateProcesses
- * @preserveGlobalState disabled
- */
-class DatabaseCacheDriverTest extends CacheTest
-{
-       use DbaCacheMockTrait;
-
-       public function setUp()
-       {
-               $this->mockUtcNow($this->startTime);
-
-               $this->mockConnected();
-               $this->mockConnect();
-
-               // The first "clear" at setup
-               $this->mockClear(false, true, 2);
-
-               parent::setUp();
-       }
-
-       protected function getInstance()
-       {
-               $this->cache = CacheDriverFactory::create('database');
-               return $this->cache;
-       }
-
-       public function tearDown()
-       {
-               $this->cache->clear(false);
-               parent::tearDown();
-       }
-
-       /**
-        * {@inheritdoc}
-        * @dataProvider dataSimple
-        */
-       public function testSimple($value1, $value2)
-       {
-               // assertNull
-               $this->mockGet('value1', null, $this->startTime, 1);
-
-               // assertEquals
-               $this->mockSet('value1', $value1, Cache::FIVE_MINUTES, $this->startTime, true, 1);
-               $this->mockGet('value1', $value1, $this->startTime, 1);
-
-               // assertEquals
-               $this->mockSet('value1', $value2, Cache::FIVE_MINUTES, $this->startTime, true, 1);
-               $this->mockGet('value1', $value2, $this->startTime, 1);
-
-               // assertEquals
-               $this->mockSet('value2', $value1, Cache::FIVE_MINUTES, $this->startTime, true, 1);
-               $this->mockGet('value2', $value1, $this->startTime, 1);
-
-               // assertNull
-               $this->mockGet('not_set', null, $this->startTime, 1);
-
-               // assertNull
-               $this->mockDelete('value1', true, 1);
-               $this->mockGet('value1', null, $this->startTime, 1);
-
-               parent::testSimple($value1, $value2);
-       }
-
-       /**
-        * {@inheritdoc}
-        * @dataProvider dataSimple
-        */
-       public function testClear($value1, $value2, $value3, $value4)
-       {
-               // assert Equals
-               $this->mockSet('1_value1', $value1, Cache::FIVE_MINUTES, $this->startTime, true, 1);
-               $this->mockSet('1_value2', $value2, Cache::FIVE_MINUTES, $this->startTime, true, 1);
-               $this->mockSet('2_value1', $value3, Cache::FIVE_MINUTES, $this->startTime, true, 1);
-               $this->mockSet('3_value1', $value4, Cache::FIVE_MINUTES, $this->startTime, true, 1);
-
-               $this->mockGet('1_value1', $value1, $this->startTime, 2);
-               $this->mockGet('1_value2', $value2, $this->startTime, 2);
-               $this->mockGet('2_value1', $value3, $this->startTime, 2);
-               $this->mockGet('3_value1', $value4, $this->startTime, 2);
-
-               // assertTrue
-               $this->mockClear(true, true, 1);
-               $this->mockClear(false, true, 1);
-
-               // assertEquals
-               $this->mockGet('1_value1', null, $this->startTime, 1);
-               $this->mockGet('1_value2', null, $this->startTime, 1);
-               $this->mockGet('2_value3', null, $this->startTime, 1);
-               $this->mockGet('3_value4', null, $this->startTime, 1);
-
-               parent::testClear($value1, $value2, $value3, $value4);
-       }
-
-       /**
-        * {@inheritdoc}
-        * @dataProvider dataTypesInCache
-        */
-       public function testDifferentTypesInCache($data)
-       {
-               $this->mockSet('val', $data, Cache::FIVE_MINUTES, $this->startTime, true, 1);
-               $this->mockGet('val', $data, $this->startTime, 1);
-
-               parent::testDifferentTypesInCache($data);
-       }
-
-       /**
-        * {@inheritdoc}
-        * @dataProvider dataSimple
-        */
-       public function testGetAllKeys($value1, $value2, $value3)
-       {
-               $this->mockSet('value1', $value1, Cache::FIVE_MINUTES, $this->startTime, true, 1);
-               $this->mockSet('value2', $value2,Cache::FIVE_MINUTES, $this->startTime, true, 1);
-               $this->mockSet('test_value3', $value3, Cache::FIVE_MINUTES, $this->startTime, true, 1);
-
-               $result = [
-                       ['k' => 'value1'],
-                       ['k' => 'value2'],
-                       ['k' => 'test_value3'],
-               ];
-
-               $this->mockGetAllKeys(null, $result, $this->startTime, 1);
-
-               $result = [
-                       ['k' => 'test_value3'],
-               ];
-
-               $this->mockGetAllKeys('test', $result, $this->startTime, 1);
-
-               parent::testGetAllKeys($value1, $value2, $value3);
-       }
-}
diff --git a/tests/src/Core/Cache/DatabaseCacheTest.php b/tests/src/Core/Cache/DatabaseCacheTest.php
new file mode 100644 (file)
index 0000000..dbc98bc
--- /dev/null
@@ -0,0 +1,48 @@
+<?php
+
+namespace Friendica\Test\src\Core\Cache;
+
+use Friendica\Core\Cache;
+use Friendica\Factory\ConfigFactory;
+use Friendica\Test\DatabaseTestTrait;
+use Friendica\Test\Util\Database\StaticDatabase;
+use Friendica\Test\Util\VFSTrait;
+use Friendica\Util\ConfigFileLoader;
+use Friendica\Util\Profiler;
+use Psr\Log\NullLogger;
+
+class DatabaseCacheTest extends CacheTest
+{
+       use DatabaseTestTrait;
+       use VFSTrait;
+
+       protected function setUp()
+       {
+               $this->setUpVfsDir();
+
+               parent::setUp();
+       }
+
+       protected function getInstance()
+       {
+               $logger = new NullLogger();
+               $profiler = \Mockery::mock(Profiler::class);
+               $profiler->shouldReceive('saveTimestamp')->withAnyArgs()->andReturn(true);
+
+               // load real config to avoid mocking every config-entry which is related to the Database class
+               $configFactory = new ConfigFactory();
+               $loader = new ConfigFileLoader($this->root->url());
+               $configCache = $configFactory->createCache($loader);
+
+               $dba = new StaticDatabase($configCache, $profiler, $logger);
+
+               $this->cache = new Cache\DatabaseCache('database', $dba);
+               return $this->cache;
+       }
+
+       public function tearDown()
+       {
+               $this->cache->clear(false);
+               parent::tearDown();
+       }
+}
diff --git a/tests/src/Core/Cache/MemcacheCacheDriverTest.php b/tests/src/Core/Cache/MemcacheCacheDriverTest.php
deleted file mode 100644 (file)
index f8de88a..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-
-
-namespace Friendica\Test\src\Core\Cache;
-
-use Friendica\Factory\CacheDriverFactory;
-
-/**
- * @requires extension memcache
- */
-class MemcacheCacheDriverTest extends MemoryCacheTest
-{
-       protected function getInstance()
-       {
-               $this->configMock
-                       ->shouldReceive('get')
-                       ->with('system', 'memcache_host')
-                       ->andReturn('localhost');
-
-               $this->configMock
-                       ->shouldReceive('get')
-                       ->with('system', 'memcache_port')
-                       ->andReturn(11211);
-
-               $this->cache = CacheDriverFactory::create('memcache');
-               return $this->cache;
-
-       }
-
-       public function tearDown()
-       {
-               $this->cache->clear(false);
-               parent::tearDown();
-       }
-}
diff --git a/tests/src/Core/Cache/MemcacheCacheTest.php b/tests/src/Core/Cache/MemcacheCacheTest.php
new file mode 100644 (file)
index 0000000..ccc3723
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+
+namespace Friendica\Test\src\Core\Cache;
+
+use Friendica\Core\Cache\MemcacheCache;
+use Friendica\Core\Config\Configuration;
+
+/**
+ * @requires extension memcache
+ */
+class MemcacheCacheTest extends MemoryCacheTest
+{
+       protected function getInstance()
+       {
+               $configMock = \Mockery::mock(Configuration::class);
+
+               $configMock
+                       ->shouldReceive('get')
+                       ->with('system', 'memcache_host')
+                       ->andReturn('localhost');
+               $configMock
+                       ->shouldReceive('get')
+                       ->with('system', 'memcache_port')
+                       ->andReturn(11211);
+
+               $this->cache = new MemcacheCache('localhost', $configMock);
+               return $this->cache;
+       }
+
+       public function tearDown()
+       {
+               $this->cache->clear(false);
+               parent::tearDown();
+       }
+}
diff --git a/tests/src/Core/Cache/MemcachedCacheDriverTest.php b/tests/src/Core/Cache/MemcachedCacheDriverTest.php
deleted file mode 100644 (file)
index 9f0ed8d..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-
-
-namespace Friendica\Test\src\Core\Cache;
-
-use Friendica\Factory\CacheDriverFactory;
-
-/**
- * @requires extension memcached
- */
-class MemcachedCacheDriverTest extends MemoryCacheTest
-{
-       protected function getInstance()
-       {
-               $this->configMock
-                       ->shouldReceive('get')
-                       ->with('system', 'memcached_hosts')
-                       ->andReturn([0 => 'localhost, 11211']);
-
-               $this->cache = CacheDriverFactory::create('memcached');
-               return $this->cache;
-       }
-
-       public function tearDown()
-       {
-               $this->cache->clear(false);
-               parent::tearDown();
-       }
-}
diff --git a/tests/src/Core/Cache/MemcachedCacheTest.php b/tests/src/Core/Cache/MemcachedCacheTest.php
new file mode 100644 (file)
index 0000000..d887250
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+
+
+namespace Friendica\Test\src\Core\Cache;
+
+use Friendica\Core\Cache\MemcachedCache;
+use Friendica\Core\Config\Configuration;
+use Psr\Log\NullLogger;
+
+/**
+ * @requires extension memcached
+ */
+class MemcachedCacheTest extends MemoryCacheTest
+{
+       protected function getInstance()
+       {
+               $configMock = \Mockery::mock(Configuration::class);
+
+               $configMock
+                       ->shouldReceive('get')
+                       ->with('system', 'memcached_hosts')
+                       ->andReturn([0 => 'localhost, 11211']);
+
+               $logger = new NullLogger();
+
+               $this->cache = new MemcachedCache('localhost', $configMock, $logger);
+               return $this->cache;
+       }
+
+       public function tearDown()
+       {
+               $this->cache->clear(false);
+               parent::tearDown();
+       }
+}
index 3bf2966a1331e304dad7188f50815079a0b719f4..19c102396bab3187aecb71f4b6808061921e8c52 100644 (file)
@@ -2,19 +2,20 @@
 
 namespace Friendica\Test\src\Core\Cache;
 
-use Friendica\Core\Cache\IMemoryCacheDriver;
+use Friendica\Core\Cache\IMemoryCache;
 
 abstract class MemoryCacheTest extends CacheTest
 {
        /**
-        * @var \Friendica\Core\Cache\IMemoryCacheDriver
+        * @var \Friendica\Core\Cache\IMemoryCache
         */
        protected $instance;
 
        protected function setUp()
        {
                parent::setUp();
-               if (!($this->instance instanceof IMemoryCacheDriver)) {
+
+               if (!($this->instance instanceof IMemoryCache)) {
                        throw new \Exception('MemoryCacheTest unsupported');
                }
        }
@@ -23,7 +24,8 @@ abstract class MemoryCacheTest extends CacheTest
         * @small
         * @dataProvider dataSimple
         */
-       function testCompareSet($value1, $value2) {
+       function testCompareSet($value1, $value2)
+       {
                $this->assertNull($this->instance->get('value1'));
 
                $this->instance->add('value1', $value1);
@@ -39,7 +41,8 @@ abstract class MemoryCacheTest extends CacheTest
         * @small
         * @dataProvider dataSimple
         */
-       function testNegativeCompareSet($value1, $value2) {
+       function testNegativeCompareSet($value1, $value2)
+       {
                $this->assertNull($this->instance->get('value1'));
 
                $this->instance->add('value1', $value1);
@@ -56,7 +59,8 @@ abstract class MemoryCacheTest extends CacheTest
         * @small
         * @dataProvider dataSimple
         */
-       function testCompareDelete($data) {
+       function testCompareDelete($data)
+       {
                $this->assertNull($this->instance->get('value1'));
 
                $this->instance->add('value1', $data);
@@ -70,7 +74,8 @@ abstract class MemoryCacheTest extends CacheTest
         * @small
         * @dataProvider dataSimple
         */
-       function testNegativeCompareDelete($data) {
+       function testNegativeCompareDelete($data)
+       {
                $this->assertNull($this->instance->get('value1'));
 
                $this->instance->add('value1', $data);
@@ -87,7 +92,8 @@ abstract class MemoryCacheTest extends CacheTest
         * @small
         * @dataProvider dataSimple
         */
-       function testAdd($value1, $value2) {
+       function testAdd($value1, $value2)
+       {
                $this->assertNull($this->instance->get('value1'));
 
                $this->instance->add('value1', $value1);
@@ -103,4 +109,4 @@ abstract class MemoryCacheTest extends CacheTest
                $this->assertEquals($value2, $received, 'Value was not overwritten by add');
                $this->assertNotEquals($value1, $received, 'Value was not overwritten by any other value');
        }
-}
\ No newline at end of file
+}
diff --git a/tests/src/Core/Cache/RedisCacheDriverTest.php b/tests/src/Core/Cache/RedisCacheDriverTest.php
deleted file mode 100644 (file)
index 6e11c3b..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-
-
-namespace Friendica\Test\src\Core\Cache;
-
-use Friendica\Factory\CacheDriverFactory;
-
-/**
- * @requires extension redis
- */
-class RedisCacheDriverTest extends MemoryCacheTest
-{
-       protected function getInstance()
-       {
-               $this->configMock
-                       ->shouldReceive('get')
-                       ->with('system', 'redis_host')
-                       ->andReturn('localhost');
-
-               $this->configMock
-                       ->shouldReceive('get')
-                       ->with('system', 'redis_port')
-                       ->andReturn(null);
-
-               $this->configMock
-                       ->shouldReceive('get')
-                       ->with('system', 'redis_db')
-                       ->andReturn(3);
-
-               $this->configMock
-                       ->shouldReceive('get')
-                       ->with('system', 'redis_password')
-                       ->andReturn(null);
-
-               $this->cache = CacheDriverFactory::create('redis');
-               return $this->cache;
-       }
-
-       public function tearDown()
-       {
-               $this->cache->clear(false);
-               parent::tearDown();
-       }
-}
diff --git a/tests/src/Core/Cache/RedisCacheTest.php b/tests/src/Core/Cache/RedisCacheTest.php
new file mode 100644 (file)
index 0000000..df35325
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+
+
+namespace Friendica\Test\src\Core\Cache;
+
+use Friendica\Core\Cache\RedisCache;
+use Friendica\Core\Config\Configuration;
+
+/**
+ * @requires extension redis
+ */
+class RedisCacheTest extends MemoryCacheTest
+{
+       protected function getInstance()
+       {
+               $configMock = \Mockery::mock(Configuration::class);
+
+               $configMock
+                       ->shouldReceive('get')
+                       ->with('system', 'redis_host')
+                       ->andReturn('localhost');
+               $configMock
+                       ->shouldReceive('get')
+                       ->with('system', 'redis_port')
+                       ->andReturn(null);
+
+               $configMock
+                       ->shouldReceive('get')
+                       ->with('system', 'redis_db', 0)
+                       ->andReturn(3);
+               $configMock
+                       ->shouldReceive('get')
+                       ->with('system', 'redis_password')
+                       ->andReturn(null);
+
+               $this->cache = new RedisCache('localhost', $configMock);
+               return $this->cache;
+       }
+
+       public function tearDown()
+       {
+               $this->cache->clear(false);
+               parent::tearDown();
+       }
+}
index f8f81f9ee721c8193bfbe656d3ad9279efb2bdbf..d8ac3eaea4d8cbe2aa63c5d22ae3eb57d5d635a7 100644 (file)
@@ -4,6 +4,7 @@ namespace Friendica\Test\src\Core\Config\Cache;
 
 use Friendica\Core\Config\Cache\ConfigCache;
 use Friendica\Test\MockedTest;
+use ParagonIE\HiddenString\HiddenString;
 
 class ConfigCacheTest extends MockedTest
 {
@@ -28,15 +29,11 @@ class ConfigCacheTest extends MockedTest
                ];
        }
 
-       private function assertConfigValues($data, ConfigCache $configCache, $uid = null)
+       private function assertConfigValues($data, ConfigCache $configCache)
        {
                foreach ($data as $cat => $values) {
                        foreach ($values as $key => $value) {
-                               if (isset($uid)) {
-                                       $this->assertEquals($data[$cat][$key], $configCache->getP($uid, $cat, $key));
-                               } else {
-                                       $this->assertEquals($data[$cat][$key], $configCache->get($cat, $key));
-                               }
+                               $this->assertEquals($data[$cat][$key], $configCache->get($cat, $key));
                        }
                }
        }
@@ -160,86 +157,25 @@ class ConfigCacheTest extends MockedTest
                        'key1' => 'value1',
                        'key2' => 'value2',
                ], $configCache->get('system'));
-       }
-
-       /**
-        * Test the delete() method
-        * @dataProvider dataTests
-        */
-       public function testDelete($data)
-       {
-               $configCache = new ConfigCache($data);
-
-               foreach ($data as $cat => $values) {
-                       foreach ($values as $key => $value) {
-                               $configCache->delete($cat, $key);
-                       }
-               }
-
-               $this->assertEmpty($configCache->getAll());
-       }
-
-       /**
-        * Test the setP() and getP() methods
-        * @dataProvider dataTests
-        */
-       public function testSetGetP($data)
-       {
-               $configCache = new ConfigCache();
-               $uid = 345;
-
-               foreach ($data as $cat => $values) {
-                       foreach ($values as $key => $value) {
-                               $configCache->setP($uid, $cat, $key, $value);
-                       }
-               }
-
-               $this->assertConfigValues($data, $configCache, $uid);
-       }
-
-
-       /**
-        * Test the getP() method with a category
-        */
-       public function testGetPCat()
-       {
-               $configCache = new ConfigCache();
-               $uid = 345;
-
-               $configCache->loadP($uid, [
-                       'system' => [
-                               'key1' => 'value1',
-                               'key2' => 'value2',
-                       ],
-                       'config' => [
-                               'key3' => 'value3',
-                       ],
-               ]);
 
+               // explicit null as key
                $this->assertEquals([
                        'key1' => 'value1',
                        'key2' => 'value2',
-               ], $configCache->get($uid, 'system'));
+               ], $configCache->get('system', null));
        }
 
        /**
-        * Test the deleteP() method
+        * Test the delete() method
         * @dataProvider dataTests
         */
-       public function testDeleteP($data)
+       public function testDelete($data)
        {
-               $configCache = new ConfigCache();
-               $uid = 345;
-
-               foreach ($data as $cat => $values) {
-                       foreach ($values as $key => $value) {
-                               $configCache->setP($uid, $cat, $key, $value);
-                       }
-               }
+               $configCache = new ConfigCache($data);
 
                foreach ($data as $cat => $values) {
                        foreach ($values as $key => $value) {
-                               $configCache->deleteP($uid, $cat, $key);
+                               $configCache->delete($cat, $key);
                        }
                }
 
@@ -322,7 +258,8 @@ class ConfigCacheTest extends MockedTest
                        ]
                ]);
 
-               $this->assertEmpty($configCache->get('database', 'password'));
+               $this->assertNotEmpty($configCache->get('database', 'password'));
+               $this->assertInstanceOf(HiddenString::class, $configCache->get('database', 'password'));
                $this->assertEmpty($configCache->get('database', 'username'));
        }
 
diff --git a/tests/src/Core/Config/Cache/PConfigCacheTest.php b/tests/src/Core/Config/Cache/PConfigCacheTest.php
new file mode 100644 (file)
index 0000000..283a5bc
--- /dev/null
@@ -0,0 +1,275 @@
+<?php
+
+namespace Friendica\Test\src\Core\Config\Cache;
+
+use Friendica\Core\Config\Cache\PConfigCache;
+use Friendica\Test\MockedTest;
+
+class PConfigCacheTest extends MockedTest
+{
+       public function dataTests()
+       {
+               return [
+                       'normal' => [
+                               'data' => [
+                                       'system' => [
+                                               'test'      => 'it',
+                                               'boolTrue'  => true,
+                                               'boolFalse' => false,
+                                               'int'       => 235,
+                                               'dec'       => 2.456,
+                                               'array'     => ['1', 2, '3', true, false],
+                                       ],
+                                       'config' => [
+                                               'a' => 'value',
+                                       ],
+                               ]
+                       ]
+               ];
+       }
+
+       private function assertConfigValues($data, PConfigCache $configCache, $uid)
+       {
+               foreach ($data as $cat => $values) {
+                       foreach ($values as $key => $value) {
+                               $this->assertEquals($data[$cat][$key], $configCache->get($uid, $cat, $key));
+                       }
+               }
+       }
+
+       /**
+        * Test the setP() and getP() methods
+        *
+        * @dataProvider dataTests
+        */
+       public function testSetGet($data)
+       {
+               $configCache = new PConfigCache();
+               $uid         = 345;
+
+               foreach ($data as $cat => $values) {
+                       foreach ($values as $key => $value) {
+                               $configCache->set($uid, $cat, $key, $value);
+                       }
+               }
+
+               $this->assertConfigValues($data, $configCache, $uid);
+       }
+
+
+       /**
+        * Test the getP() method with a category
+        */
+       public function testGetCat()
+       {
+               $configCache = new PConfigCache();
+               $uid         = 345;
+
+               $configCache->load($uid, [
+                       'system' => [
+                               'key1' => 'value1',
+                               'key2' => 'value2',
+                       ],
+                       'config' => [
+                               'key3' => 'value3',
+                       ],
+               ]);
+
+               $this->assertEquals([
+                       'key1' => 'value1',
+                       'key2' => 'value2',
+               ], $configCache->get($uid, 'system'));
+
+               // test explicit cat with null as key
+               $this->assertEquals([
+                       'key1' => 'value1',
+                       'key2' => 'value2',
+               ], $configCache->get($uid, 'system', null));
+       }
+
+       /**
+        * Test the deleteP() method
+        *
+        * @dataProvider dataTests
+        */
+       public function testDelete($data)
+       {
+               $configCache = new PConfigCache();
+               $uid         = 345;
+
+               foreach ($data as $cat => $values) {
+                       foreach ($values as $key => $value) {
+                               $configCache->set($uid, $cat, $key, $value);
+                       }
+               }
+
+               foreach ($data as $cat => $values) {
+                       foreach ($values as $key => $value) {
+                               $configCache->delete($uid, $cat, $key);
+                       }
+               }
+
+               $this->assertEmpty($configCache->getAll());
+       }
+
+       /**
+        * Test the keyDiff() method with result
+        *
+        * @dataProvider dataTests
+        */
+       public function testKeyDiffWithResult($data)
+       {
+               $configCache = new PConfigCache();
+
+               $diffConfig = [
+                       'fakeCat' => [
+                               'fakeKey' => 'value',
+                       ]
+               ];
+
+               $this->assertEquals($diffConfig, $configCache->keyDiff($diffConfig));
+       }
+
+       /**
+        * Test the keyDiff() method without result
+        *
+        * @dataProvider dataTests
+        */
+       public function testKeyDiffWithoutResult($data)
+       {
+               $configCache = new PConfigCache();
+
+               $configCache->load(1, $data);
+
+               $diffConfig = $configCache->getAll();
+
+               $this->assertEmpty($configCache->keyDiff($diffConfig));
+       }
+
+       /**
+        * Test the default hiding of passwords inside the cache
+        */
+       public function testPasswordHide()
+       {
+               $configCache = new PConfigCache();
+
+               $configCache->load(1, [
+                       'database' => [
+                               'password' => 'supersecure',
+                               'username' => 'notsecured',
+                       ]
+               ]);
+
+               $this->assertEquals('supersecure', $configCache->get(1, 'database', 'password'));
+               $this->assertNotEquals('supersecure', print_r($configCache->get(1, 'database', 'password'), true));
+               $this->assertEquals('notsecured', print_r($configCache->get(1, 'database', 'username'), true));
+       }
+
+       /**
+        * Test disabling the hiding of passwords inside the cache
+        */
+       public function testPasswordShow()
+       {
+               $configCache = new PConfigCache(false);
+
+               $configCache->load(1, [
+                       'database' => [
+                               'password' => 'supersecure',
+                               'username' => 'notsecured',
+                       ]
+               ]);
+
+               $this->assertEquals('supersecure', $configCache->get(1, 'database', 'password'));
+               $this->assertEquals('supersecure', print_r($configCache->get(1, 'database', 'password'), true));
+               $this->assertEquals('notsecured', print_r($configCache->get(1, 'database', 'username'), true));
+       }
+
+       /**
+        * Test a empty password
+        */
+       public function testEmptyPassword()
+       {
+               $configCache = new PConfigCache();
+
+               $configCache->load(1, [
+                       'database' => [
+                               'password' => '',
+                               'username' => '',
+                       ]
+               ]);
+
+               $this->assertEmpty($configCache->get(1, 'database', 'password'));
+               $this->assertEmpty($configCache->get(1, 'database', 'username'));
+       }
+
+       public function testWrongTypePassword()
+       {
+               $configCache = new PConfigCache();
+
+               $configCache->load(1, [
+                       'database' => [
+                               'password' => new \stdClass(),
+                               'username' => '',
+                       ]
+               ]);
+
+               $this->assertNotEmpty($configCache->get(1, 'database', 'password'));
+               $this->assertEmpty($configCache->get(1, 'database', 'username'));
+
+               $configCache = new PConfigCache();
+
+               $configCache->load(1, [
+                       'database' => [
+                               'password' => 23,
+                               'username' => '',
+                       ],
+               ]);
+
+               $this->assertEquals(23, $configCache->get(1, 'database', 'password'));
+               $this->assertEmpty($configCache->get(1, 'database', 'username'));
+       }
+
+       /**
+        * Test two different UID configs and make sure that there is no overlapping possible
+        */
+       public function testTwoUid()
+       {
+               $configCache = new PConfigCache();
+
+               $configCache->load(1, [
+                       'cat1' => [
+                               'key1' => 'value1',
+                       ],
+               ]);
+
+
+               $configCache->load(2, [
+                       'cat2' => [
+                               'key2' => 'value2',
+                       ],
+               ]);
+
+               $this->assertEquals('value1', $configCache->get(1, 'cat1', 'key1'));
+               $this->assertEquals('value2', $configCache->get(2, 'cat2', 'key2'));
+
+               $this->assertNull($configCache->get(1, 'cat2', 'key2'));
+               $this->assertNull($configCache->get(2, 'cat1', 'key1'));
+       }
+
+       /**
+        * Test when using an invalid UID
+        * @todo check it the clean way before using the config class
+        */
+       public function testInvalidUid()
+       {
+               // bad UID!
+               $uid = null;
+
+               $configCache = new PConfigCache();
+
+               $this->assertNull($configCache->get($uid, 'cat1', 'cat2'));
+
+               $this->assertFalse($configCache->set($uid, 'cat1', 'key1', 'doesn\'t matter!'));
+               $this->assertFalse($configCache->delete($uid, 'cat1', 'key1'));
+       }
+}
index b07f9e6302bd0fa1f5ff8c19a5fb3f86a0de8bcd..2191d86f1cbe9b0ca663286f5ac87a78d2df7288 100644 (file)
@@ -2,14 +2,55 @@
 
 namespace Friendica\Test\src\Core\Config;
 
-use Friendica\Core\Config\Adapter\IConfigAdapter;
 use Friendica\Core\Config\Cache\ConfigCache;
-use Friendica\Core\Config\Cache\IConfigCache;
 use Friendica\Core\Config\Configuration;
+use Friendica\Core\Config\JitConfiguration;
+use Friendica\Model\Config\Config as ConfigModel;
 use Friendica\Test\MockedTest;
+use Mockery\MockInterface;
+use Mockery;
 
-class ConfigurationTest extends MockedTest
+abstract class ConfigurationTest extends MockedTest
 {
+       /** @var ConfigModel|MockInterface */
+       protected $configModel;
+
+       /** @var ConfigCache */
+       protected $configCache;
+
+       /** @var Configuration */
+       protected $testedConfig;
+
+       /**
+        * Assert a config tree
+        *
+        * @param string $cat  The category to assert
+        * @param array  $data The result data array
+        */
+       protected function assertConfig(string $cat, array $data)
+       {
+               $result = $this->testedConfig->getCache()->getAll();
+
+               $this->assertNotEmpty($result);
+               $this->assertArrayHasKey($cat, $result);
+               $this->assertArraySubset($data, $result[$cat]);
+       }
+
+
+       protected function setUp()
+       {
+               parent::setUp();
+
+               // Create the config model
+               $this->configModel = Mockery::mock(ConfigModel::class);
+               $this->configCache = new ConfigCache();
+       }
+
+       /**
+        * @return Configuration
+        */
+       public abstract function getInstance();
+
        public function dataTests()
        {
                return [
@@ -24,107 +65,243 @@ class ConfigurationTest extends MockedTest
                ];
        }
 
+       public function dataConfigLoad()
+       {
+               $data = [
+                       'system' => [
+                               'key1' => 'value1',
+                               'key2' => 'value2',
+                               'key3' => 'value3',
+                       ],
+                       'config' => [
+                               'key1' => 'value1a',
+                               'key4' => 'value4',
+                       ],
+                       'other'  => [
+                               'key5' => 'value5',
+                               'key6' => 'value6',
+                       ],
+               ];
+
+               return [
+                       'system' => [
+                               'data'         => $data,
+                               'possibleCats' => [
+                                       'system',
+                                       'config',
+                                       'other'
+                               ],
+                               'load'         => [
+                                       'system',
+                               ],
+                       ],
+                       'other'  => [
+                               'data'         => $data,
+                               'possibleCats' => [
+                                       'system',
+                                       'config',
+                                       'other'
+                               ],
+                               'load'         => [
+                                       'other',
+                               ],
+                       ],
+                       'config' => [
+                               'data'         => $data,
+                               'possibleCats' => [
+                                       'system',
+                                       'config',
+                                       'other'
+                               ],
+                               'load'         => [
+                                       'config',
+                               ],
+                       ],
+                       'all'    => [
+                               'data'         => $data,
+                               'possibleCats' => [
+                                       'system',
+                                       'config',
+                                       'other'
+                               ],
+                               'load'         => [
+                                       'system',
+                                       'config',
+                                       'other'
+                               ],
+                       ],
+               ];
+       }
+
        /**
         * Test the configuration initialization
         */
-       public function testSetUp()
+       public function testSetUp(array $data)
        {
-               $configCache = new ConfigCache();
-               $configAdapter = \Mockery::mock(IConfigAdapter::class);
-               $configAdapter->shouldReceive('isConnected')->andReturn(false)->once();
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(true)
+                                 ->once();
 
-               $configuration = new Configuration($configCache, $configAdapter);
+               $this->testedConfig = $this->getInstance();
+               $this->assertInstanceOf(ConfigCache::class, $this->testedConfig->getCache());
 
-               $this->assertInstanceOf(IConfigCache::class, $configuration->getCache());
+               // assert config is loaded everytime
+               $this->assertConfig('config', $data['config']);
        }
 
        /**
         * Test the configuration load() method
         */
-       public function testCacheLoad()
+       public function testLoad(array $data, array $possibleCats, array $load)
        {
-               $configCache = new ConfigCache();
-               $configAdapter = \Mockery::mock(IConfigAdapter::class);
-               $configAdapter->shouldReceive('isConnected')->andReturn(true)->times(3);
-               // constructor loading
-               $configAdapter->shouldReceive('load')->andReturn([])->once();
-               // expected loading
-               $configAdapter->shouldReceive('load')->andReturn(['testing' => ['test' => 'it']])->once();
-               $configAdapter->shouldReceive('isLoaded')->with('testing', 'test')->andReturn(true)->once();
-
-               $configuration = new Configuration($configCache, $configAdapter);
-               $configuration->load('testing');
-
-               $this->assertEquals('it', $configuration->get('testing', 'test'));
-               $this->assertEquals('it', $configuration->getCache()->get('testing', 'test'));
+               $this->testedConfig = $this->getInstance();
+               $this->assertInstanceOf(ConfigCache::class, $this->testedConfig->getCache());
+
+               foreach ($load as $loadedCats) {
+                       $this->testedConfig->load($loadedCats);
+               }
+
+               // Assert at least loaded cats are loaded
+               foreach ($load as $loadedCats) {
+                       $this->assertConfig($loadedCats, $data[$loadedCats]);
+               }
+       }
+
+       public function dataDoubleLoad()
+       {
+               return [
+                       'config' => [
+                               'data1'  => [
+                                       'config' => [
+                                               'key1' => 'value1',
+                                               'key2' => 'value2',
+                                       ],
+                               ],
+                               'data2'  => [
+                                       'config' => [
+                                               'key1' => 'overwritten!',
+                                               'key3' => 'value3',
+                                       ],
+                               ],
+                               'expect' => [
+                                       'config' => [
+                                               // load should overwrite values everytime!
+                                               'key1' => 'overwritten!',
+                                               'key2' => 'value2',
+                                               'key3' => 'value3',
+                                       ],
+                               ],
+                       ],
+                       'other'  => [
+                               'data1'  => [
+                                       'config' => [
+                                               'key12' => 'data4',
+                                               'key45' => 7,
+                                       ],
+                                       'other'  => [
+                                               'key1' => 'value1',
+                                               'key2' => 'value2',
+                                       ],
+                               ],
+                               'data2'  => [
+                                       'other'  => [
+                                               'key1' => 'overwritten!',
+                                               'key3' => 'value3',
+                                       ],
+                                       'config' => [
+                                               'key45' => 45,
+                                               'key52' => true,
+                                       ]
+                               ],
+                               'expect' => [
+                                       'other'  => [
+                                               // load should overwrite values everytime!
+                                               'key1' => 'overwritten!',
+                                               'key2' => 'value2',
+                                               'key3' => 'value3',
+                                       ],
+                                       'config' => [
+                                               'key12' => 'data4',
+                                               'key45' => 45,
+                                               'key52' => true,
+                                       ],
+                               ],
+                       ],
+               ];
        }
 
        /**
         * Test the configuration load() method with overwrite
         */
-       public function testCacheLoadDouble()
+       public function testCacheLoadDouble(array $data1, array $data2, array $expect)
        {
-               $configCache = new ConfigCache();
-               $configAdapter = \Mockery::mock(IConfigAdapter::class);
-               $configAdapter->shouldReceive('isConnected')->andReturn(true)->times(5);
-               // constructor loading
-               $configAdapter->shouldReceive('load')->andReturn([])->once();
-               // expected loading
-               $configAdapter->shouldReceive('load')->andReturn(['testing' => ['test' => 'it']])->once();
-               $configAdapter->shouldReceive('isLoaded')->with('testing', 'test')->andReturn(true)->twice();
-               // expected next loading
-               $configAdapter->shouldReceive('load')->andReturn(['testing' => ['test' => 'again']])->once();
-
-               $configuration = new Configuration($configCache, $configAdapter);
-               $configuration->load('testing');
-
-               $this->assertEquals('it', $configuration->get('testing', 'test'));
-               $this->assertEquals('it', $configuration->getCache()->get('testing', 'test'));
-
-               $configuration->load('testing');
-
-               $this->assertEquals('again', $configuration->get('testing', 'test'));
-               $this->assertEquals('again', $configuration->getCache()->get('testing', 'test'));
+               $this->testedConfig = $this->getInstance();
+               $this->assertInstanceOf(ConfigCache::class, $this->testedConfig->getCache());
+
+               foreach ($data1 as $cat => $data) {
+                       $this->testedConfig->load($cat);
+               }
+
+               // Assert at least loaded cats are loaded
+               foreach ($data1 as $cat => $data) {
+                       $this->assertConfig($cat, $data);
+               }
+
+               foreach ($data2 as $cat => $data) {
+                       $this->testedConfig->load($cat);
+               }
+       }
+
+       /**
+        * Test the configuration load without result
+        */
+       public function testLoadWrong()
+       {
+               $this->configModel->shouldReceive('isConnected')->andReturn(true)->once();
+               $this->configModel->shouldReceive('load')->withAnyArgs()->andReturn([])->once();
+
+               $this->testedConfig = $this->getInstance();
+               $this->assertInstanceOf(ConfigCache::class, $this->testedConfig->getCache());
+
+               $this->assertEmpty($this->testedConfig->getCache()->getAll());
        }
 
        /**
         * Test the configuration get() and set() methods without adapter
+        *
         * @dataProvider dataTests
         */
        public function testSetGetWithoutDB($data)
        {
-               $configCache = new ConfigCache();
-               $configAdapter = \Mockery::mock(IConfigAdapter::class);
-               $configAdapter->shouldReceive('isConnected')->andReturn(false)->times(3);
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(false)
+                                 ->times(3);
 
-               $configuration = new Configuration($configCache, $configAdapter);
+               $this->testedConfig = $this->getInstance();
+               $this->assertInstanceOf(ConfigCache::class, $this->testedConfig->getCache());
 
-               $this->assertTrue($configuration->set('test', 'it', $data));
+               $this->assertTrue($this->testedConfig->set('test', 'it', $data));
 
-               $this->assertEquals($data, $configuration->get('test', 'it'));
-               $this->assertEquals($data, $configuration->getCache()->get('test', 'it'));
+               $this->assertEquals($data, $this->testedConfig->get('test', 'it'));
+               $this->assertEquals($data, $this->testedConfig->getCache()->get('test', 'it'));
        }
 
        /**
-        * Test the configuration get() and set() methods with adapter
+        * Test the configuration get() and set() methods with a model/db
+        *
         * @dataProvider dataTests
         */
        public function testSetGetWithDB($data)
        {
-               $configCache = new ConfigCache();
-               $configAdapter = \Mockery::mock(IConfigAdapter::class);
-               $configAdapter->shouldReceive('isConnected')->andReturn(true)->times(3);
-               // constructor loading
-               $configAdapter->shouldReceive('load')->andReturn([])->once();
-               $configAdapter->shouldReceive('isLoaded')->with('test', 'it')->andReturn(true)->once();
-               $configAdapter->shouldReceive('set')->with('test', 'it', $data)->andReturn(true)->once();
+               $this->configModel->shouldReceive('set')->with('test', 'it', $data)->andReturn(true)->once();
 
-               $configuration = new Configuration($configCache, $configAdapter);
+               $this->testedConfig = $this->getInstance();
+               $this->assertInstanceOf(ConfigCache::class, $this->testedConfig->getCache());
 
-               $this->assertTrue($configuration->set('test', 'it', $data));
+               $this->assertTrue($this->testedConfig->set('test', 'it', $data));
 
-               $this->assertEquals($data, $configuration->get('test', 'it'));
-               $this->assertEquals($data, $configuration->getCache()->get('test', 'it'));
+               $this->assertEquals($data, $this->testedConfig->get('test', 'it'));
+               $this->assertEquals($data, $this->testedConfig->getCache()->get('test', 'it'));
        }
 
        /**
@@ -132,145 +309,111 @@ class ConfigurationTest extends MockedTest
         */
        public function testGetWrongWithoutDB()
        {
-               $configCache = new ConfigCache();
-               $configAdapter = \Mockery::mock(IConfigAdapter::class);
-               $configAdapter->shouldReceive('isConnected')->andReturn(false)->times(4);
-
-               $configuration = new Configuration($configCache, $configAdapter);
+               $this->testedConfig = $this->getInstance();
+               $this->assertInstanceOf(ConfigCache::class, $this->testedConfig->getCache());
 
                // without refresh
-               $this->assertNull($configuration->get('test', 'it'));
+               $this->assertNull($this->testedConfig->get('test', 'it'));
 
                /// beware that the cache returns '!<unset>!' and not null for a non existing value
-               $this->assertNull($configuration->getCache()->get('test', 'it'));
+               $this->assertNull($this->testedConfig->getCache()->get('test', 'it'));
 
                // with default value
-               $this->assertEquals('default', $configuration->get('test', 'it', 'default'));
+               $this->assertEquals('default', $this->testedConfig->get('test', 'it', 'default'));
 
                // with default value and refresh
-               $this->assertEquals('default', $configuration->get('test', 'it', 'default', true));
+               $this->assertEquals('default', $this->testedConfig->get('test', 'it', 'default', true));
        }
 
        /**
         * Test the configuration get() method with refresh
+        *
         * @dataProvider dataTests
         */
        public function testGetWithRefresh($data)
        {
-               $configCache = new ConfigCache(['test' => ['it' => 'now']]);
-               $configAdapter = \Mockery::mock(IConfigAdapter::class);
-               $configAdapter->shouldReceive('isConnected')->andReturn(true)->times(4);
-               // constructor loading
-               $configAdapter->shouldReceive('load')->andReturn([])->once();
-               $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(null)->once();
-
-               $configuration = new Configuration($configCache, $configAdapter);
+               $this->configCache->load(['test' => ['it' => 'now']]);
+
+               $this->testedConfig = $this->getInstance();
+               $this->assertInstanceOf(ConfigCache::class, $this->testedConfig->getCache());
 
                // without refresh
-               $this->assertEquals('now', $configuration->get('test', 'it'));
-               $this->assertEquals('now', $configuration->getCache()->get('test', 'it'));
+               $this->assertEquals('now', $this->testedConfig->get('test', 'it'));
+               $this->assertEquals('now', $this->testedConfig->getCache()->get('test', 'it'));
 
                // with refresh
-               $this->assertEquals($data, $configuration->get('test', 'it', null, true));
-               $this->assertEquals($data, $configuration->getCache()->get('test', 'it'));
+               $this->assertEquals($data, $this->testedConfig->get('test', 'it', null, true));
+               $this->assertEquals($data, $this->testedConfig->getCache()->get('test', 'it'));
 
                // without refresh and wrong value and default
-               $this->assertEquals('default', $configuration->get('test', 'not', 'default'));
-               $this->assertNull($configuration->getCache()->get('test', 'not'));
-       }
-
-       /**
-        * Test the configuration get() method with different isLoaded settings
-        * @dataProvider dataTests
-        */
-       public function testGetWithoutLoaded($data)
-       {
-               $configCache = new ConfigCache(['test' => ['it' => 'now']]);
-               $configAdapter = \Mockery::mock(IConfigAdapter::class);
-               $configAdapter->shouldReceive('isConnected')->andReturn(true)->times(4);
-               // constructor loading
-               $configAdapter->shouldReceive('load')->andReturn([])->once();
-
-               $configAdapter->shouldReceive('isLoaded')->with('test', 'it')->andReturn(false)->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();
-
-               $configAdapter->shouldReceive('isLoaded')->with('test', 'it')->andReturn(true)->once();
-
-               $configuration = new Configuration($configCache, $configAdapter);
-
-               // first run is not loaded and no data is found in the DB
-               $this->assertEquals('now', $configuration->get('test', 'it'));
-               $this->assertEquals('now', $configuration->getCache()->get('test', 'it'));
-
-               // second run is not loaded, but now data is found in the db (overwrote cache)
-               $this->assertEquals($data, $configuration->get('test', 'it'));
-               $this->assertEquals($data, $configuration->getCache()->get('test', 'it'));
-
-               // third run is loaded and therefore cache is used
-               $this->assertEquals($data, $configuration->get('test', 'it'));
-               $this->assertEquals($data, $configuration->getCache()->get('test', 'it'));
+               $this->assertEquals('default', $this->testedConfig->get('test', 'not', 'default'));
+               $this->assertNull($this->testedConfig->getCache()->get('test', 'not'));
        }
 
        /**
-        * Test the configuration delete() method without adapter
+        * Test the configuration delete() method without a model/db
+        *
         * @dataProvider dataTests
         */
        public function testDeleteWithoutDB($data)
        {
-               $configCache = new ConfigCache(['test' => ['it' => $data]]);
-               $configAdapter = \Mockery::mock(IConfigAdapter::class);
-               $configAdapter->shouldReceive('isConnected')->andReturn(false)->times(4);
+               $this->configCache->load(['test' => ['it' => $data]]);
 
-               $configuration = new Configuration($configCache, $configAdapter);
+               $this->testedConfig = $this->getInstance();
+               $this->assertInstanceOf(ConfigCache::class, $this->testedConfig->getCache());
 
-               $this->assertEquals($data, $configuration->get('test', 'it'));
-               $this->assertEquals($data, $configuration->getCache()->get('test', 'it'));
+               $this->assertEquals($data, $this->testedConfig->get('test', 'it'));
+               $this->assertEquals($data, $this->testedConfig->getCache()->get('test', 'it'));
 
-               $this->assertTrue($configuration->delete('test', 'it'));
-               $this->assertNull($configuration->get('test', 'it'));
-               $this->assertNull($configuration->getCache()->get('test', 'it'));
+               $this->assertTrue($this->testedConfig->delete('test', 'it'));
+               $this->assertNull($this->testedConfig->get('test', 'it'));
+               $this->assertNull($this->testedConfig->getCache()->get('test', 'it'));
 
-               $this->assertEmpty($configuration->getCache()->getAll());
+               $this->assertEmpty($this->testedConfig->getCache()->getAll());
        }
 
        /**
-        * Test the configuration delete() method with adapter
+        * Test the configuration delete() method with a model/db
         */
        public function testDeleteWithDB()
        {
-               $configCache = new ConfigCache(['test' => ['it' => 'now', 'quarter' => 'true']]);
-               $configAdapter = \Mockery::mock(IConfigAdapter::class);
-               $configAdapter->shouldReceive('isConnected')->andReturn(true)->times(6);
-               // constructor loading
-               $configAdapter->shouldReceive('load')->andReturn([])->once();
-               $configAdapter->shouldReceive('isLoaded')->with('test', 'it')->andReturn(true)->once();
-
-               $configAdapter->shouldReceive('delete')->with('test', 'it')->andReturn(false)->once();
-
-               $configAdapter->shouldReceive('delete')->with('test', 'second')->andReturn(true)->once();
-               $configAdapter->shouldReceive('delete')->with('test', 'third')->andReturn(false)->once();
-               $configAdapter->shouldReceive('delete')->with('test', 'quarter')->andReturn(true)->once();
-
-               $configuration = new Configuration($configCache, $configAdapter);
-
-               $this->assertEquals('now', $configuration->get('test', 'it'));
-               $this->assertEquals('now', $configuration->getCache()->get('test', 'it'));
+               $this->configCache->load(['test' => ['it' => 'now', 'quarter' => 'true']]);
+
+               $this->configModel->shouldReceive('delete')
+                                 ->with('test', 'it')
+                                 ->andReturn(false)
+                                 ->once();
+               $this->configModel->shouldReceive('delete')
+                                 ->with('test', 'second')
+                                 ->andReturn(true)
+                                 ->once();
+               $this->configModel->shouldReceive('delete')
+                                 ->with('test', 'third')
+                                 ->andReturn(false)
+                                 ->once();
+               $this->configModel->shouldReceive('delete')
+                                 ->with('test', 'quarter')
+                                 ->andReturn(true)
+                                 ->once();
+
+               $this->testedConfig = $this->getInstance();
+               $this->assertInstanceOf(ConfigCache::class, $this->testedConfig->getCache());
+
+               // directly set the value to the cache
+               $this->testedConfig->getCache()->set('test', 'it', 'now');
+
+               $this->assertEquals('now', $this->testedConfig->get('test', 'it'));
+               $this->assertEquals('now', $this->testedConfig->getCache()->get('test', 'it'));
 
                // delete from cache only
-               $this->assertTrue($configuration->delete('test', 'it'));
+               $this->assertTrue($this->testedConfig->delete('test', 'it'));
                // delete from db only
-               $this->assertTrue($configuration->delete('test', 'second'));
+               $this->assertTrue($this->testedConfig->delete('test', 'second'));
                // no delete
-               $this->assertFalse($configuration->delete('test', 'third'));
+               $this->assertFalse($this->testedConfig->delete('test', 'third'));
                // delete both
-               $this->assertTrue($configuration->delete('test', 'quarter'));
+               $this->assertTrue($this->testedConfig->delete('test', 'quarter'));
 
-               $this->assertEmpty($configuration->getCache()->getAll());
+               $this->assertEmpty($this->testedConfig->getCache()->getAll());
        }
 }
diff --git a/tests/src/Core/Config/JitConfigurationTest.php b/tests/src/Core/Config/JitConfigurationTest.php
new file mode 100644 (file)
index 0000000..1a9723a
--- /dev/null
@@ -0,0 +1,179 @@
+<?php
+
+namespace Friendica\Test\src\Core\Config;
+
+use Friendica\Core\Config\JitConfiguration;
+
+class JitConfigurationTest extends ConfigurationTest
+{
+       public function getInstance()
+       {
+               return new JitConfiguration($this->configCache, $this->configModel);
+       }
+
+       /**
+        * @dataProvider dataConfigLoad
+        */
+       public function testSetUp(array $data)
+       {
+               $this->configModel->shouldReceive('load')
+                                 ->with('config')
+                                 ->andReturn(['config' => $data['config']])
+                                 ->once();
+
+               parent::testSetUp($data);
+       }
+
+       /**
+        * @dataProvider dataConfigLoad
+        */
+       public function testLoad(array $data, array $possibleCats, array $load)
+       {
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(true)
+                                 ->times(count($load) + 1);
+
+               $this->configModel->shouldReceive('load')
+                                 ->with('config')
+                                 ->andReturn(['config' => $data['config']])
+                                 ->once();
+
+               foreach ($load as $loadCat) {
+                       $this->configModel->shouldReceive('load')
+                                         ->with($loadCat)
+                                         ->andReturn([$loadCat => $data[$loadCat]])
+                                         ->once();
+               }
+
+               parent::testLoad($data, $possibleCats, $load);
+       }
+
+       /**
+        * @dataProvider dataDoubleLoad
+        */
+       public function testCacheLoadDouble(array $data1, array $data2, array $expect)
+       {
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(true)
+                                 ->times(count($data1) + count($data2) + 1);
+
+               $this->configModel->shouldReceive('load')
+                                 ->with('config')
+                                 ->andReturn(['config' => $data1['config']])
+                                 ->once();
+
+               foreach ($data1 as $cat => $data) {
+                       $this->configModel->shouldReceive('load')
+                                         ->with($cat)
+                                         ->andReturn([$cat => $data])
+                                         ->once();
+               }
+
+
+               foreach ($data2 as $cat => $data) {
+                       $this->configModel->shouldReceive('load')
+                                         ->with($cat)
+                                         ->andReturn([$cat => $data])
+                                         ->once();
+               }
+
+               parent::testCacheLoadDouble($data1, $data2, $expect);
+
+               // Assert the expected categories
+               foreach ($data2 as $cat => $data) {
+                       $this->assertConfig($cat, $expect[$cat]);
+               }
+       }
+
+       /**
+        * @dataProvider dataTests
+        */
+       public function testSetGetWithDB($data)
+       {
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(true)
+                                 ->times(3);
+
+               $this->configModel->shouldReceive('load')->with('config')->andReturn(['config' => []])->once();
+
+               parent::testSetGetWithDB($data);
+       }
+
+       /**
+        * @dataProvider dataTests
+        */
+       public function testGetWithRefresh($data)
+       {
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(true)
+                                 ->times(4);
+
+               // constructor loading
+               $this->configModel->shouldReceive('load')
+                                 ->with('config')
+                                 ->andReturn(['config' => []])
+                                 ->once();
+
+               // mocking one get without result
+               $this->configModel->shouldReceive('get')
+                                 ->with('test', 'it')
+                                 ->andReturn(null)
+                                 ->once();
+
+               // mocking the data get
+               $this->configModel->shouldReceive('get')
+                                 ->with('test', 'it')
+                                 ->andReturn($data)
+                                 ->once();
+
+               // mocking second get
+               $this->configModel->shouldReceive('get')
+                                 ->with('test', 'not')
+                                 ->andReturn(null)
+                                 ->once();
+
+               parent::testGetWithRefresh($data);
+       }
+
+       public function testGetWrongWithoutDB()
+       {
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(false)
+                                 ->times(4);
+
+               parent::testGetWrongWithoutDB();
+       }
+
+       /**
+        * @dataProvider dataTests
+        */
+       public function testDeleteWithoutDB($data)
+       {
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(false)
+                                 ->times(4);
+
+               parent::testDeleteWithoutDB($data);
+       }
+
+       public function testDeleteWithDB()
+       {
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(true)
+                                 ->times(6);
+
+               // constructor loading
+               $this->configModel->shouldReceive('load')
+                                 ->with('config')
+                                 ->andReturn(['config' => []])
+                                 ->once();
+
+               // mocking one get without result
+               $this->configModel->shouldReceive('get')
+                                 ->with('test', 'it')
+                                 ->andReturn(null)
+                                 ->once();
+
+               parent::testDeleteWithDB();
+       }
+}
diff --git a/tests/src/Core/Config/JitPConfigurationTest.php b/tests/src/Core/Config/JitPConfigurationTest.php
new file mode 100644 (file)
index 0000000..8ceea93
--- /dev/null
@@ -0,0 +1,145 @@
+<?php
+
+namespace Friendica\Test\src\Core\Config;
+
+use Friendica\Core\Config\JitPConfiguration;
+
+class JitPConfigurationTest extends PConfigurationTest
+{
+       public function getInstance()
+       {
+               return new JitPConfiguration($this->configCache, $this->configModel);
+       }
+
+       /**
+        * @dataProvider dataConfigLoad
+        */
+       public function testLoad(int $uid, array $data, array $possibleCats, array $load)
+       {
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(true)
+                                 ->times(count($load));
+
+               foreach ($load as $loadCat) {
+                       $this->configModel->shouldReceive('load')
+                                         ->with($uid, $loadCat)
+                                         ->andReturn([$loadCat => $data[$loadCat]])
+                                         ->once();
+               }
+
+               parent::testLoad($uid, $data, $possibleCats, $load);
+       }
+
+       /**
+        * @dataProvider dataDoubleLoad
+        */
+       public function testCacheLoadDouble(int $uid, array $data1, array $data2, array $expect)
+       {
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(true)
+                                 ->times(count($data1) + count($data2));
+
+               foreach ($data1 as $cat => $data) {
+                       $this->configModel->shouldReceive('load')
+                                         ->with($uid, $cat)
+                                         ->andReturn([$cat => $data])
+                                         ->once();
+               }
+
+
+               foreach ($data2 as $cat => $data) {
+                       $this->configModel->shouldReceive('load')
+                                         ->with($uid, $cat)
+                                         ->andReturn([$cat => $data])
+                                         ->once();
+               }
+
+               parent::testCacheLoadDouble($uid, $data1, $data2, $expect);
+
+               // Assert the expected categories
+               foreach ($data2 as $cat => $data) {
+                       $this->assertConfig($uid, $cat, $expect[$cat]);
+               }
+       }
+
+       /**
+        * @dataProvider dataTests
+        */
+       public function testSetGetWithoutDB(int $uid, $data)
+       {
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(false)
+                                 ->times(2);
+
+               parent::testSetGetWithoutDB($uid, $data);
+       }
+
+       /**
+        * @dataProvider dataTests
+        */
+       public function testSetGetWithDB(int $uid, $data)
+       {
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(true)
+                                 ->times(2);
+
+               parent::testSetGetWithDB($uid, $data);
+       }
+
+       /**
+        * @dataProvider dataTests
+        */
+       public function testGetWithRefresh(int $uid, $data)
+       {
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(true)
+                                 ->times(3);
+
+               // mocking one get without result
+               $this->configModel->shouldReceive('get')
+                                 ->with($uid, 'test', 'it')
+                                 ->andReturn(null)
+                                 ->once();
+
+               // mocking the data get
+               $this->configModel->shouldReceive('get')
+                                 ->with($uid, 'test', 'it')
+                                 ->andReturn($data)
+                                 ->once();
+
+               // mocking second get
+               $this->configModel->shouldReceive('get')
+                                 ->with($uid, 'test', 'not')
+                                 ->andReturn(null)
+                                 ->once();
+
+               parent::testGetWithRefresh($uid, $data);
+       }
+
+       /**
+        * @dataProvider dataTests
+        */
+       public function testDeleteWithoutDB(int $uid, $data)
+       {
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(false)
+                                 ->times(3);
+
+               parent::testDeleteWithoutDB($uid, $data);
+       }
+
+       public function testDeleteWithDB()
+       {
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(true)
+                                 ->times(5);
+
+               // mocking one get without result
+               $this->configModel->shouldReceive('get')
+                                 ->with(42, 'test', 'it')
+                                 ->andReturn(null)
+                                 ->once();
+
+               parent::testDeleteWithDB();
+       }
+}
index 294a73bba46a920f574651ba6c89e85d843264bb..40c6970a5cb9bc261e3b1ffff7a1bf089e853ade 100644 (file)
 
 namespace Friendica\Test\src\Core\Config;
 
-use Friendica\Core\Config\Adapter\IPConfigAdapter;
-use Friendica\Core\Config\Cache\ConfigCache;
+use Friendica\Core\Config\Cache\PConfigCache;
 use Friendica\Core\Config\PConfiguration;
+use Friendica\Model\Config\PConfig as PConfigModel;
 use Friendica\Test\MockedTest;
+use Mockery;
+use Mockery\MockInterface;
 
-class PConfigurationTest extends MockedTest
+abstract class PConfigurationTest extends MockedTest
 {
+       /** @var PConfigModel|MockInterface */
+       protected $configModel;
+
+       /** @var PConfigCache */
+       protected $configCache;
+
+       /** @var PConfiguration */
+       protected $testedConfig;
+
+       /**
+        * Assert a config tree
+        *
+        * @param int    $uid  The uid to assert
+        * @param string $cat  The category to assert
+        * @param array  $data The result data array
+        */
+       protected function assertConfig(int $uid, string $cat, array $data)
+       {
+               $result = $this->testedConfig->getCache()->getAll();
+
+               $this->assertNotEmpty($result);
+               $this->assertArrayHasKey($uid, $result);
+               $this->assertArrayHasKey($cat, $result[$uid]);
+               $this->assertArraySubset($data, $result[$uid][$cat]);
+       }
+
+
+       protected function setUp()
+       {
+               parent::setUp();
+
+               // Create the config model
+               $this->configModel = Mockery::mock(PConfigModel::class);
+               $this->configCache = new PConfigCache();
+       }
+
+       /**
+        * @return PConfiguration
+        */
+       public abstract function getInstance();
+
        public function dataTests()
        {
                return [
-                       'string'       => ['data' => 'it'],
-                       'boolTrue'     => ['data' => true],
-                       'boolFalse'    => ['data' => false],
-                       'integer'      => ['data' => 235],
-                       'decimal'      => ['data' => 2.456],
-                       'array'        => ['data' => ['1', 2, '3', true, false]],
-                       'boolIntTrue'  => ['data' => 1],
-                       'boolIntFalse' => ['Data' => 0],
+                       'string'       => ['uid' => 1, 'data' => 'it'],
+                       'boolTrue'     => ['uid' => 2, 'data' => true],
+                       'boolFalse'    => ['uid' => 3, 'data' => false],
+                       'integer'      => ['uid' => 4, 'data' => 235],
+                       'decimal'      => ['uid' => 5, 'data' => 2.456],
+                       'array'        => ['uid' => 6, 'data' => ['1', 2, '3', true, false]],
+                       'boolIntTrue'  => ['uid' => 7, 'data' => 1],
+                       'boolIntFalse' => ['uid' => 8, 'data' => 0],
+               ];
+       }
+
+       public function dataConfigLoad()
+       {
+               $data = [
+                       'system' => [
+                               'key1' => 'value1',
+                               'key2' => 'value2',
+                               'key3' => 'value3',
+                       ],
+                       'config' => [
+                               'key1' => 'value1a',
+                               'key4' => 'value4',
+                       ],
+                       'other'  => [
+                               'key5' => 'value5',
+                               'key6' => 'value6',
+                       ],
                ];
+
+               return [
+                       'system' => [
+                               'uid' => 1,
+                               'data'         => $data,
+                               'possibleCats' => [
+                                       'system',
+                                       'config',
+                                       'other'
+                               ],
+                               'load'         => [
+                                       'system',
+                               ],
+                       ],
+                       'other'  => [
+                               'uid' => 2,
+                               'data'         => $data,
+                               'possibleCats' => [
+                                       'system',
+                                       'config',
+                                       'other'
+                               ],
+                               'load'         => [
+                                       'other',
+                               ],
+                       ],
+                       'config' => [
+                               'uid' => 3,
+                               'data'         => $data,
+                               'possibleCats' => [
+                                       'system',
+                                       'config',
+                                       'other'
+                               ],
+                               'load'         => [
+                                       'config',
+                               ],
+                       ],
+                       'all'    => [
+                               'uid' => 4,
+                               'data'         => $data,
+                               'possibleCats' => [
+                                       'system',
+                                       'config',
+                                       'other'
+                               ],
+                               'load'         => [
+                                       'system',
+                                       'config',
+                                       'other'
+                               ],
+                       ],
+               ];
+       }
+
+       /**
+        * Test the configuration initialization
+        * @dataProvider dataConfigLoad
+        */
+       public function testSetUp(int $uid, array $data)
+       {
+               $this->testedConfig = $this->getInstance();
+               $this->assertInstanceOf(PConfigCache::class, $this->testedConfig->getCache());
+
+               $this->assertEmpty($this->testedConfig->getCache()->getAll());
        }
 
        /**
         * Test the configuration load() method
         */
-       public function testCacheLoad()
+       public function testLoad(int $uid, array $data, array $possibleCats, array $load)
        {
-               $uid = 234;
-               $configCache = new ConfigCache();
-               $configAdapter = \Mockery::mock(IPConfigAdapter::class);
-               $configAdapter->shouldReceive('isConnected')->andReturn(true)->twice();
-               // expected loading
-               $configAdapter->shouldReceive('load')
-                       ->with($uid, 'testing')
-                       ->andReturn(['testing' => ['test' => 'it']])
-                       ->once();
-               $configAdapter->shouldReceive('isLoaded')->with($uid, 'testing', 'test')->andReturn(true)->once();
+               $this->testedConfig = $this->getInstance();
+               $this->assertInstanceOf(PConfigCache::class, $this->testedConfig->getCache());
 
-               $configuration = new PConfiguration($configCache, $configAdapter);
-               $configuration->load($uid, 'testing');
+               foreach ($load as $loadedCats) {
+                       $this->testedConfig->load($uid, $loadedCats);
+               }
 
-               $this->assertEquals('it', $configuration->get($uid, 'testing', 'test'));
+               // Assert at least loaded cats are loaded
+               foreach ($load as $loadedCats) {
+                       $this->assertConfig($uid, $loadedCats, $data[$loadedCats]);
+               }
+       }
+
+       public function dataDoubleLoad()
+       {
+               return [
+                       'config' => [
+                               'uid' => 1,
+                               'data1'  => [
+                                       'config' => [
+                                               'key1' => 'value1',
+                                               'key2' => 'value2',
+                                       ],
+                               ],
+                               'data2'  => [
+                                       'config' => [
+                                               'key1' => 'overwritten!',
+                                               'key3' => 'value3',
+                                       ],
+                               ],
+                               'expect' => [
+                                       'config' => [
+                                               // load should overwrite values everytime!
+                                               'key1' => 'overwritten!',
+                                               'key2' => 'value2',
+                                               'key3' => 'value3',
+                                       ],
+                               ],
+                       ],
+                       'other'  => [
+                               'uid' => 1,
+                               'data1'  => [
+                                       'config' => [
+                                               'key12' => 'data4',
+                                               'key45' => 7,
+                                       ],
+                                       'other'  => [
+                                               'key1' => 'value1',
+                                               'key2' => 'value2',
+                                       ],
+                               ],
+                               'data2'  => [
+                                       'other'  => [
+                                               'key1' => 'overwritten!',
+                                               'key3' => 'value3',
+                                       ],
+                                       'config' => [
+                                               'key45' => 45,
+                                               'key52' => true,
+                                       ]
+                               ],
+                               'expect' => [
+                                       'other'  => [
+                                               // load should overwrite values everytime!
+                                               'key1' => 'overwritten!',
+                                               'key2' => 'value2',
+                                               'key3' => 'value3',
+                                       ],
+                                       'config' => [
+                                               'key12' => 'data4',
+                                               'key45' => 45,
+                                               'key52' => true,
+                                       ],
+                               ],
+                       ],
+               ];
        }
 
        /**
         * Test the configuration load() method with overwrite
         */
-       public function testCacheLoadDouble()
+       public function testCacheLoadDouble(int $uid, array $data1, array $data2, array $expect)
        {
-               $uid = 234;
-               $configCache = new ConfigCache();
-               $configAdapter = \Mockery::mock(IPConfigAdapter::class);
-               $configAdapter->shouldReceive('isConnected')->andReturn(true)->times(4);
-               // expected loading
-               $configAdapter->shouldReceive('load')->with($uid, 'testing')->andReturn(['testing' => ['test' => 'it']])->once();
-               $configAdapter->shouldReceive('isLoaded')->with($uid, 'testing', 'test')->andReturn(true)->twice();
-               // expected next loading
-               $configAdapter->shouldReceive('load')->andReturn(['testing' => ['test' => 'again']])->once();
-
-               $configuration = new PConfiguration($configCache, $configAdapter);
-               $configuration->load($uid, 'testing');
+               $this->testedConfig = $this->getInstance();
+               $this->assertInstanceOf(PConfigCache::class, $this->testedConfig->getCache());
 
-               $this->assertEquals('it', $configuration->get($uid, 'testing', 'test'));
+               foreach ($data1 as $cat => $data) {
+                       $this->testedConfig->load($uid, $cat);
+               }
 
-               $configuration->load($uid, 'testing');
+               // Assert at least loaded cats are loaded
+               foreach ($data1 as $cat => $data) {
+                       $this->assertConfig($uid, $cat, $data);
+               }
 
-               $this->assertEquals('again', $configuration->get($uid, 'testing', 'test'));
+               foreach ($data2 as $cat => $data) {
+                       $this->testedConfig->load($uid, $cat);
+               }
        }
 
        /**
         * Test the configuration get() and set() methods without adapter
+        *
         * @dataProvider dataTests
         */
-       public function testSetGetWithoutDB($data)
+       public function testSetGetWithoutDB(int $uid, $data)
        {
-               $uid = 234;
-               $configCache = new ConfigCache();
-               $configAdapter = \Mockery::mock(IPConfigAdapter::class);
-               $configAdapter->shouldReceive('isConnected')->andReturn(false)->times(2);
+               $this->testedConfig = $this->getInstance();
+               $this->assertInstanceOf(PConfigCache::class, $this->testedConfig->getCache());
 
-               $configuration = new PConfiguration($configCache, $configAdapter);
+               $this->assertTrue($this->testedConfig->set($uid, 'test', 'it', $data));
 
-               $this->assertTrue($configuration->set($uid, 'test', 'it', $data));
-
-               $this->assertEquals($data, $configuration->get($uid, 'test', 'it'));
+               $this->assertEquals($data, $this->testedConfig->get($uid, 'test', 'it'));
+               $this->assertEquals($data, $this->testedConfig->getCache()->get($uid, 'test', 'it'));
        }
 
        /**
-        * Test the configuration get() and set() methods with adapter
+        * Test the configuration get() and set() methods with a model/db
+        *
         * @dataProvider dataTests
         */
-       public function testSetGetWithDB($data)
+       public function testSetGetWithDB(int $uid, $data)
        {
-               $uid = 234;
-               $configCache = new ConfigCache();
-               $configAdapter = \Mockery::mock(IPConfigAdapter::class);
-               $configAdapter->shouldReceive('isConnected')->andReturn(true)->times(2);
-               $configAdapter->shouldReceive('isLoaded')->with($uid, 'test', 'it')->andReturn(true)->once();
-               $configAdapter->shouldReceive('set')->with($uid, 'test', 'it', $data)->andReturn(true)->once();
+               $this->configModel->shouldReceive('set')
+                                 ->with($uid, 'test', 'it', $data)
+                                 ->andReturn(true)
+                                 ->once();
 
-               $configuration = new PConfiguration($configCache, $configAdapter);
+               $this->testedConfig = $this->getInstance();
+               $this->assertInstanceOf(PConfigCache::class, $this->testedConfig->getCache());
 
-               $this->assertTrue($configuration->set($uid, 'test', 'it', $data));
+               $this->assertTrue($this->testedConfig->set($uid, 'test', 'it', $data));
 
-               $this->assertEquals($data, $configuration->get($uid, 'test', 'it'));
+               $this->assertEquals($data, $this->testedConfig->get($uid, 'test', 'it'));
+               $this->assertEquals($data, $this->testedConfig->getCache()->get($uid, 'test', 'it'));
        }
 
        /**
@@ -113,135 +297,179 @@ class PConfigurationTest extends MockedTest
         */
        public function testGetWrongWithoutDB()
        {
-               $uid = 234;
-               $configCache = new ConfigCache();
-               $configAdapter = \Mockery::mock(IPConfigAdapter::class);
-               $configAdapter->shouldReceive('isConnected')->andReturn(false)->times(3);
-
-               $configuration = new PConfiguration($configCache, $configAdapter);
+               $this->testedConfig = $this->getInstance();
+               $this->assertInstanceOf(PConfigCache::class, $this->testedConfig->getCache());
 
                // without refresh
-               $this->assertNull($configuration->get($uid, 'test', 'it'));
+               $this->assertNull($this->testedConfig->get(0, 'test', 'it'));
+
+               /// beware that the cache returns '!<unset>!' and not null for a non existing value
+               $this->assertNull($this->testedConfig->getCache()->get(0, 'test', 'it'));
 
                // with default value
-               $this->assertEquals('default', $configuration->get($uid, 'test', 'it', 'default'));
+               $this->assertEquals('default', $this->testedConfig->get(0, 'test', 'it', 'default'));
 
                // with default value and refresh
-               $this->assertEquals('default', $configuration->get($uid, 'test', 'it', 'default', true));
+               $this->assertEquals('default', $this->testedConfig->get(0, 'test', 'it', 'default', true));
        }
 
        /**
         * Test the configuration get() method with refresh
+        *
         * @dataProvider dataTests
         */
-       public function testGetWithRefresh($data)
+       public function testGetWithRefresh(int $uid, $data)
        {
-               $uid = 234;
-               $configCache = new ConfigCache();
-               $configAdapter = \Mockery::mock(IPConfigAdapter::class);
-               $configAdapter->shouldReceive('isConnected')->andReturn(true)->times(4);
-               $configAdapter->shouldReceive('isLoaded')->with($uid, 'test', 'it')->andReturn(false)->once();
-               $configAdapter->shouldReceive('get')->with($uid, 'test', 'it')->andReturn('now')->once();
-               $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(null)->once();
+               $this->configCache->load($uid, ['test' => ['it' => 'now']]);
 
-               $configuration = new PConfiguration($configCache, $configAdapter);
+               $this->testedConfig = $this->getInstance();
+               $this->assertInstanceOf(PConfigCache::class, $this->testedConfig->getCache());
 
                // without refresh
-               $this->assertEquals('now', $configuration->get($uid, 'test', 'it'));
-               // use the cache again
-               $this->assertEquals('now', $configuration->get($uid, 'test', 'it'));
+               $this->assertEquals('now', $this->testedConfig->get($uid, 'test', 'it'));
+               $this->assertEquals('now', $this->testedConfig->getCache()->get($uid, 'test', 'it'));
 
-               // with refresh (and load the second value out of the db)
-               $this->assertEquals($data, $configuration->get($uid, 'test', 'it', null, true));
+               // with refresh
+               $this->assertEquals($data, $this->testedConfig->get($uid, 'test', 'it', null, true));
+               $this->assertEquals($data, $this->testedConfig->getCache()->get($uid, 'test', 'it'));
 
                // without refresh and wrong value and default
-               $this->assertEquals('default', $configuration->get($uid, 'test', 'not', 'default'));
+               $this->assertEquals('default', $this->testedConfig->get($uid, 'test', 'not', 'default'));
+               $this->assertNull($this->testedConfig->getCache()->get($uid, 'test', 'not'));
        }
 
        /**
-        * Test the configuration get() method with different isLoaded settings
+        * Test the configuration delete() method without a model/db
+        *
         * @dataProvider dataTests
         */
-       public function testGetWithoutLoaded($data)
+       public function testDeleteWithoutDB(int $uid, $data)
        {
-               $uid = 234;
-               $configCache = new ConfigCache();
-               $configAdapter = \Mockery::mock(IPConfigAdapter::class);
-               $configAdapter->shouldReceive('isConnected')->andReturn(true)->times(3);
+               $this->configCache->load($uid, ['test' => ['it' => $data]]);
 
-               $configAdapter->shouldReceive('isLoaded')->with($uid, 'test', 'it')->andReturn(false)->once();
-               $configAdapter->shouldReceive('get')->with($uid, 'test', 'it')->andReturn(null)->once();
+               $this->testedConfig = $this->getInstance();
+               $this->assertInstanceOf(PConfigCache::class, $this->testedConfig->getCache());
 
-               $configAdapter->shouldReceive('isLoaded')->with($uid, 'test', 'it')->andReturn(false)->once();
-               $configAdapter->shouldReceive('get')->with($uid, 'test', 'it')->andReturn($data)->once();
+               $this->assertEquals($data, $this->testedConfig->get($uid, 'test', 'it'));
+               $this->assertEquals($data, $this->testedConfig->getCache()->get($uid, 'test', 'it'));
 
-               $configAdapter->shouldReceive('isLoaded')->with($uid, 'test', 'it')->andReturn(true)->once();
+               $this->assertTrue($this->testedConfig->delete($uid, 'test', 'it'));
+               $this->assertNull($this->testedConfig->get($uid, 'test', 'it'));
+               $this->assertNull($this->testedConfig->getCache()->get($uid, 'test', 'it'));
 
-               $configuration = new PConfiguration($configCache, $configAdapter);
+               $this->assertEmpty($this->testedConfig->getCache()->getAll());
+       }
 
-               // first run is not loaded and no data is found in the DB
-               $this->assertNull($configuration->get($uid, 'test', 'it'));
+       /**
+        * Test the configuration delete() method with a model/db
+        */
+       public function testDeleteWithDB()
+       {
+               $uid = 42;
+
+               $this->configCache->load($uid, ['test' => ['it' => 'now', 'quarter' => 'true']]);
+
+               $this->configModel->shouldReceive('delete')
+                                 ->with($uid, 'test', 'it')
+                                 ->andReturn(false)
+                                 ->once();
+               $this->configModel->shouldReceive('delete')
+                                 ->with($uid, 'test', 'second')
+                                 ->andReturn(true)
+                                 ->once();
+               $this->configModel->shouldReceive('delete')
+                                 ->with($uid, 'test', 'third')
+                                 ->andReturn(false)
+                                 ->once();
+               $this->configModel->shouldReceive('delete')
+                                 ->with($uid, 'test', 'quarter')
+                                 ->andReturn(true)
+                                 ->once();
+
+               $this->testedConfig = $this->getInstance();
+               $this->assertInstanceOf(PConfigCache::class, $this->testedConfig->getCache());
+
+               // directly set the value to the cache
+               $this->testedConfig->getCache()->set($uid, 'test', 'it', 'now');
+
+               $this->assertEquals('now', $this->testedConfig->get($uid, 'test', 'it'));
+               $this->assertEquals('now', $this->testedConfig->getCache()->get($uid, 'test', 'it'));
+
+               // delete from cache only
+               $this->assertTrue($this->testedConfig->delete($uid, 'test', 'it'));
+               // delete from db only
+               $this->assertTrue($this->testedConfig->delete($uid, 'test', 'second'));
+               // no delete
+               $this->assertFalse($this->testedConfig->delete($uid, 'test', 'third'));
+               // delete both
+               $this->assertTrue($this->testedConfig->delete($uid, 'test', 'quarter'));
 
-               // second run is not loaded, but now data is found in the db (overwrote cache)
-               $this->assertEquals($data, $configuration->get($uid,'test', 'it'));
+               $this->assertEmpty($this->testedConfig->getCache()->getAll());
+       }
 
-               // third run is loaded and therefore cache is used
-               $this->assertEquals($data, $configuration->get($uid,'test', 'it'));
+       public function dataMultiUid()
+       {
+               return [
+                       'normal' => [
+                               'data1' => [
+                                       'uid'  => 1,
+                                       'data' => [
+                                               'cat1' => [
+                                                       'key1' => 'value1',
+                                               ],
+                                               'cat2' => [
+                                                       'key2' => 'value2',
+                                               ]
+                                       ],
+                               ],
+                               'data2' => [
+                                       'uid' => 2,
+                                       'data' => [
+                                               'cat1' => [
+                                                       'key1' => 'value1a',
+                                               ],
+                                               'cat2' => [
+                                                       'key2' => 'value2',
+                                               ],
+                                       ],
+                               ],
+                       ],
+               ];
        }
 
        /**
-        * Test the configuration delete() method without adapter
-        * @dataProvider dataTests
+        * Test if multiple uids for caching are usable without errors
+        * @dataProvider dataMultiUid
         */
-       public function testDeleteWithoutDB($data)
+       public function testMultipleUidsWithCache(array $data1, array $data2)
        {
-               $uid = 234;
-               $configCache = new ConfigCache();
-               $configAdapter = \Mockery::mock(IPConfigAdapter::class);
-               $configAdapter->shouldReceive('isConnected')->andReturn(false)->times(4);
+               $this->configCache->load($data1['uid'], $data1['data']);
+               $this->configCache->load($data2['uid'], $data2['data']);
 
-               $configuration = new PConfiguration($configCache, $configAdapter);
+               $this->testedConfig = $this->getInstance();
+               $this->assertInstanceOf(PConfigCache::class, $this->testedConfig->getCache());
 
-               $this->assertTrue($configuration->set($uid, 'test', 'it', $data));
-               $this->assertEquals($data, $configuration->get($uid, 'test', 'it'));
-
-               $this->assertTrue($configuration->delete($uid, 'test', 'it'));
-               $this->assertNull($configuration->get($uid, 'test', 'it'));
+               $this->assertConfig($data1['uid'], 'cat1', $data1['data']['cat1']);
+               $this->assertConfig($data1['uid'], 'cat2', $data1['data']['cat2']);
+               $this->assertConfig($data2['uid'], 'cat1', $data2['data']['cat1']);
+               $this->assertConfig($data2['uid'], 'cat2', $data2['data']['cat2']);
        }
 
        /**
-        * Test the configuration delete() method with adapter
+        * Test when using an invalid UID
+        * @todo check it the clean way before using the config class
         */
-       public function testDeleteWithDB()
+       public function testInvalidUid()
        {
-               $uid = 234;
-               $configCache = new ConfigCache();
-               $configAdapter = \Mockery::mock(IPConfigAdapter::class);
-               $configAdapter->shouldReceive('isConnected')->andReturn(true)->times(6);
-               $configAdapter->shouldReceive('set')->with($uid, 'test', 'it', 'now')->andReturn(false)->once();
-               $configAdapter->shouldReceive('isLoaded')->with($uid, 'test', 'it')->andReturn(true)->once();
-
-               $configAdapter->shouldReceive('delete')->with($uid, 'test', 'it')->andReturn(false)->once();
-
-               $configAdapter->shouldReceive('delete')->with($uid, 'test', 'second')->andReturn(true)->once();
-               $configAdapter->shouldReceive('delete')->with($uid, 'test', 'third')->andReturn(false)->once();
-               $configAdapter->shouldReceive('delete')->with($uid, 'test', 'quarter')->andReturn(true)->once();
+               // bad UID!
+               $uid = 0;
 
-               $configuration = new PConfiguration($configCache, $configAdapter);
+               $this->testedConfig = $this->getInstance();
 
-               $this->assertFalse($configuration->set($uid, 'test', 'it', 'now'));
-               $this->assertEquals('now', $configuration->get($uid, 'test', 'it'));
+               $this->assertNull($this->testedConfig->get($uid, 'cat1', 'cat2'));
+               $this->assertEquals('fallback!', $this->testedConfig->get($uid, 'cat1', 'cat2', 'fallback!'));
 
-               // delete from set
-               $this->assertTrue($configuration->delete($uid, 'test', 'it'));
-               // delete from db only
-               $this->assertTrue($configuration->delete($uid, 'test', 'second'));
-               // no delete
-               $this->assertFalse($configuration->delete($uid, 'test', 'third'));
-               // delete both
-               $this->assertTrue($configuration->delete($uid, 'test', 'quarter'));
+               $this->assertFalse($this->testedConfig->set($uid, 'cat1', 'key1', 'doesn\'t matter!'));
+               $this->assertFalse($this->testedConfig->delete($uid, 'cat1', 'key1'));
        }
 }
diff --git a/tests/src/Core/Config/PreloadConfigurationTest.php b/tests/src/Core/Config/PreloadConfigurationTest.php
new file mode 100644 (file)
index 0000000..8804439
--- /dev/null
@@ -0,0 +1,140 @@
+<?php
+
+namespace Friendica\Test\src\Core\Config;
+
+use Friendica\Core\Config\PreloadConfiguration;
+
+class PreloadConfigurationTest extends ConfigurationTest
+{
+       public function getInstance()
+       {
+               return new PreloadConfiguration($this->configCache, $this->configModel);
+       }
+
+       /**
+        * @dataProvider dataConfigLoad
+        */
+       public function testSetUp(array $data)
+       {
+               $this->configModel->shouldReceive('load')
+                                 ->andReturn($data)
+                                 ->once();
+
+               parent::testSetUp($data);
+       }
+
+       /**
+        * @dataProvider dataConfigLoad
+        */
+       public function testLoad(array $data, array $possibleCats, array $load)
+       {
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(true)
+                                 ->once();
+
+               $this->configModel->shouldReceive('load')
+                                 ->andReturn($data)
+                                 ->once();
+
+               parent::testLoad($data, $possibleCats, $load);
+
+               // Assert that every category is loaded everytime
+               foreach ($data as $cat => $values) {
+                       $this->assertConfig($cat, $values);
+               }
+       }
+
+       /**
+        * @dataProvider dataDoubleLoad
+        */
+       public function testCacheLoadDouble(array $data1, array $data2, array $expect)
+       {
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(true)
+                                 ->once();
+
+               $this->configModel->shouldReceive('load')
+                                 ->andReturn($data1)
+                                 ->once();
+
+               parent::testCacheLoadDouble($data1, $data2, $expect);
+
+               // Assert that every category is loaded everytime and is NOT overwritten
+               foreach ($data1 as $cat => $values) {
+                       $this->assertConfig($cat, $values);
+               }
+       }
+
+       /**
+        * @dataProvider dataTests
+        */
+       public function testSetGetWithDB($data)
+       {
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(true)
+                                 ->times(2);
+
+               $this->configModel->shouldReceive('load')->andReturn(['config' => []])->once();
+
+               parent::testSetGetWithDB($data);
+       }
+
+       /**
+        * @dataProvider dataTests
+        */
+       public function testGetWithRefresh($data)
+       {
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(true)
+                                 ->times(2);
+
+               // constructor loading
+               $this->configModel->shouldReceive('load')
+                                 ->andReturn(['config' => []])
+                                 ->once();
+
+               // mocking one get
+               $this->configModel->shouldReceive('get')
+                                 ->with('test', 'it')
+                                 ->andReturn($data)
+                                 ->once();
+
+               parent::testGetWithRefresh($data);
+       }
+
+
+       public function testGetWrongWithoutDB()
+       {
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(false)
+                                 ->times(2);
+
+               parent::testGetWrongWithoutDB();
+       }
+
+       /**
+        * @dataProvider dataTests
+        */
+       public function testDeleteWithoutDB($data)
+       {
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(false)
+                                 ->times(2);
+
+               parent::testDeleteWithoutDB($data);
+       }
+
+       public function testDeleteWithDB()
+       {
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(true)
+                                 ->times(5);
+
+               // constructor loading
+               $this->configModel->shouldReceive('load')
+                                 ->andReturn(['config' => []])
+                                 ->once();
+
+               parent::testDeleteWithDB();
+       }
+}
diff --git a/tests/src/Core/Config/PreloadPConfigurationTest.php b/tests/src/Core/Config/PreloadPConfigurationTest.php
new file mode 100644 (file)
index 0000000..270a7a2
--- /dev/null
@@ -0,0 +1,137 @@
+<?php
+
+namespace Friendica\Test\src\Core\Config;
+
+use Friendica\Core\Config\PreloadPConfiguration;
+
+class PreloadPConfigurationTest extends PConfigurationTest
+{
+       public function getInstance()
+       {
+               return new PreloadPConfiguration($this->configCache, $this->configModel);
+       }
+
+       /**
+        * @dataProvider dataConfigLoad
+        */
+       public function testLoad(int $uid, array $data, array $possibleCats, array $load)
+       {
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(true)
+                                 ->once();
+
+               $this->configModel->shouldReceive('load')
+                                 ->with($uid)
+                                 ->andReturn($data)
+                                 ->once();
+
+               parent::testLoad($uid, $data, $possibleCats, $load);
+
+               // Assert that every category is loaded everytime
+               foreach ($data as $cat => $values) {
+                       $this->assertConfig($uid, $cat, $values);
+               }
+       }
+
+       /**
+        * @dataProvider dataDoubleLoad
+        */
+       public function testCacheLoadDouble(int $uid, array $data1, array $data2, array $expect)
+       {
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(true)
+                                 ->once();
+
+               $this->configModel->shouldReceive('load')
+                                 ->with($uid)
+                                 ->andReturn($data1)
+                                 ->once();
+
+               parent::testCacheLoadDouble($uid, $data1, $data2, $expect);
+
+               // Assert that every category is loaded everytime and is NOT overwritten
+               foreach ($data1 as $cat => $values) {
+                       $this->assertConfig($uid, $cat, $values);
+               }
+       }
+
+       /**
+        * @dataProvider dataTests
+        */
+       public function testSetGetWithoutDB(int $uid, $data)
+       {
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(false)
+                                 ->times(3);
+
+               parent::testSetGetWithoutDB($uid, $data);
+       }
+
+       /**
+        * @dataProvider dataTests
+        */
+       public function testSetGetWithDB(int $uid, $data)
+       {
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(true)
+                                 ->twice();
+
+               $this->configModel->shouldReceive('load')
+                                 ->with($uid)
+                                 ->andReturn(['config' => []])
+                                 ->once();
+
+               parent::testSetGetWithDB($uid, $data);
+       }
+
+       /**
+        * @dataProvider dataTests
+        */
+       public function testGetWithRefresh(int $uid, $data)
+       {
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(true)
+                                 ->times(2);
+
+               // constructor loading
+               $this->configModel->shouldReceive('load')
+                                 ->with($uid)
+                                 ->andReturn(['config' => []])
+                                 ->once();
+
+               // mocking one get
+               $this->configModel->shouldReceive('get')
+                                 ->with($uid, 'test', 'it')
+                                 ->andReturn($data)
+                                 ->once();
+
+               parent::testGetWithRefresh($uid, $data);
+       }
+
+       /**
+        * @dataProvider dataTests
+        */
+       public function testDeleteWithoutDB(int $uid, $data)
+       {
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(false)
+                                 ->times(4);
+
+               parent::testDeleteWithoutDB($uid, $data);
+       }
+
+       public function testDeleteWithDB()
+       {
+               $this->configModel->shouldReceive('isConnected')
+                                 ->andReturn(true)
+                                 ->times(5);
+
+               // constructor loading
+               $this->configModel->shouldReceive('load')
+                                 ->with(42)
+                                 ->andReturn(['config' => []])
+                                 ->once();
+
+               parent::testDeleteWithDB();
+       }
+}
index a238bf8e7d9389383ef0bc3738163c2a694d0978..a898dd2957bb85cc100c9c9281194811716e8251 100644 (file)
@@ -3,28 +3,47 @@
 // this is in the same namespace as Install for mocking 'function_exists'
 namespace Friendica\Core;
 
-use Friendica\Core\Config\Cache\IConfigCache;
+use Dice\Dice;
+use Friendica\BaseObject;
+use Friendica\Core\Config\Cache\ConfigCache;
 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;
+use Mockery\MockInterface;
 
-/**
- * @runTestsInSeparateProcesses
- * @preserveGlobalState disabled
- */
 class InstallerTest extends MockedTest
 {
        use VFSTrait;
-       use L10nMockTrait;
+
+       /**
+        * @var \Friendica\Core\L10n\L10n|MockInterface
+        */
+       private $l10nMock;
 
        public function setUp()
        {
                parent::setUp();
 
                $this->setUpVfsDir();
+
+               $this->l10nMock = \Mockery::mock(\Friendica\Core\L10n\L10n::class);
+
+               /** @var Dice|MockInterface $dice */
+               $dice = \Mockery::mock(Dice::class)->makePartial();
+               $dice = $dice->addRules(include __DIR__ . '/../../../static/dependencies.config.php');
+
+               $dice->shouldReceive('create')
+                          ->with(\Friendica\Core\L10n\L10n::class)
+                          ->andReturn($this->l10nMock);
+
+               BaseObject::setDependencyInjection($dice);
+       }
+
+       private function mockL10nT(string $text, $times = null)
+       {
+               $this->l10nMock->shouldReceive('t')->with($text)->andReturn($text)->times($times);
        }
 
        /**
@@ -105,7 +124,7 @@ class InstallerTest extends MockedTest
         */
        public function testCheckKeys()
        {
-               $this->mockL10nT();
+               $this->l10nMock->shouldReceive('t')->andReturnUsing(function ($args) { return $args; });
 
                $this->setFunctions(['openssl_pkey_new' => false]);
                $install = new Installer();
@@ -229,7 +248,7 @@ class InstallerTest extends MockedTest
         */
        public function testCheckLocalIni()
        {
-               $this->mockL10nT();
+               $this->l10nMock->shouldReceive('t')->andReturnUsing(function ($args) { return $args; });
 
                $this->assertTrue($this->root->hasChild('config/local.config.php'));
 
@@ -246,10 +265,12 @@ class InstallerTest extends MockedTest
 
        /**
         * @small
+        * @runInSeparateProcess
+        * @preserveGlobalState disabled
         */
        public function testCheckHtAccessFail()
        {
-               $this->mockL10nT();
+               $this->l10nMock->shouldReceive('t')->andReturnUsing(function ($args) { return $args; });
 
                // Mocking the CURL Response
                $curlResult = \Mockery::mock(CurlResult::class);
@@ -285,10 +306,12 @@ class InstallerTest extends MockedTest
 
        /**
         * @small
+        * @runInSeparateProcess
+        * @preserveGlobalState disabled
         */
        public function testCheckHtAccessWork()
        {
-               $this->mockL10nT();
+               $this->l10nMock->shouldReceive('t')->andReturnUsing(function ($args) { return $args; });
 
                // Mocking the failed CURL Response
                $curlResultF = \Mockery::mock(CurlResult::class);
@@ -326,10 +349,12 @@ class InstallerTest extends MockedTest
 
        /**
         * @small
+        * @runInSeparateProcess
+        * @preserveGlobalState disabled
         */
        public function testImagick()
        {
-               $this->mockL10nT();
+               $this->l10nMock->shouldReceive('t')->andReturnUsing(function ($args) { return $args; });
 
                $imageMock = \Mockery::mock('alias:'. Image::class);
                $imageMock
@@ -353,10 +378,12 @@ class InstallerTest extends MockedTest
 
        /**
         * @small
+        * @runInSeparateProcess
+        * @preserveGlobalState disabled
         */
        public function testImagickNotFound()
        {
-               $this->mockL10nT();
+               $this->l10nMock->shouldReceive('t')->andReturnUsing(function ($args) { return $args; });
 
                $imageMock = \Mockery::mock('alias:' . Image::class);
                $imageMock
@@ -399,10 +426,10 @@ class InstallerTest extends MockedTest
         */
        public function testSetUpCache()
        {
-               $this->mockL10nT();
+               $this->l10nMock->shouldReceive('t')->andReturnUsing(function ($args) { return $args; });
 
                $install = new Installer();
-               $configCache = \Mockery::mock(IConfigCache::class);
+               $configCache = \Mockery::mock(ConfigCache::class);
                $configCache->shouldReceive('set')->with('config', 'php_path', \Mockery::any())->once();
                $configCache->shouldReceive('set')->with('system', 'basepath', '/test/')->once();
 
diff --git a/tests/src/Core/Lock/APCuCacheLockDriverTest.php b/tests/src/Core/Lock/APCuCacheLockDriverTest.php
deleted file mode 100644 (file)
index 6e185d6..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-namespace Friendica\Test\src\Core\Lock;
-
-
-use Friendica\Core\Cache\APCuCache;
-use Friendica\Core\Lock\CacheLockDriver;
-
-class APCuCacheLockDriverTest extends LockTest
-{
-       protected function setUp()
-       {
-               if (!APCuCache::isAvailable()) {
-                       $this->markTestSkipped('APCu is not available');
-               }
-
-               parent::setUp();
-       }
-
-       protected function getInstance()
-       {
-               return new CacheLockDriver(new APCuCache());
-       }
-}
diff --git a/tests/src/Core/Lock/APCuCacheLockTest.php b/tests/src/Core/Lock/APCuCacheLockTest.php
new file mode 100644 (file)
index 0000000..3fbb360
--- /dev/null
@@ -0,0 +1,23 @@
+<?php
+
+namespace Friendica\Test\src\Core\Lock;
+
+use Friendica\Core\Cache\APCuCache;
+use Friendica\Core\Lock\CacheLock;
+
+class APCuCacheLockTest extends LockTest
+{
+       protected function setUp()
+       {
+               if (!APCuCache::isAvailable()) {
+                       $this->markTestSkipped('APCu is not available');
+               }
+
+               parent::setUp();
+       }
+
+       protected function getInstance()
+       {
+               return new CacheLock(new APCuCache('localhost'));
+       }
+}
diff --git a/tests/src/Core/Lock/ArrayCacheLockDriverTest.php b/tests/src/Core/Lock/ArrayCacheLockDriverTest.php
deleted file mode 100644 (file)
index 6713417..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-
-namespace Friendica\Test\src\Core\Lock;
-
-
-use Friendica\Core\Cache\ArrayCache;
-use Friendica\Core\Lock\CacheLockDriver;
-
-class ArrayCacheLockDriverTest extends LockTest
-{
-       protected function getInstance()
-       {
-               return new CacheLockDriver(new ArrayCache());
-       }
-
-       public function testLockTTL()
-       {
-               // ArrayCache doesn't support TTL
-               return true;
-       }
-}
diff --git a/tests/src/Core/Lock/ArrayCacheLockTest.php b/tests/src/Core/Lock/ArrayCacheLockTest.php
new file mode 100644 (file)
index 0000000..cc35d7f
--- /dev/null
@@ -0,0 +1,20 @@
+<?php
+
+namespace Friendica\Test\src\Core\Lock;
+
+use Friendica\Core\Cache\ArrayCache;
+use Friendica\Core\Lock\CacheLock;
+
+class ArrayCacheLockTest extends LockTest
+{
+       protected function getInstance()
+       {
+               return new CacheLock(new ArrayCache('localhost'));
+       }
+
+       public function testLockTTL()
+       {
+               // ArrayCache doesn't support TTL
+               return true;
+       }
+}
diff --git a/tests/src/Core/Lock/DatabaseLockDriverTest.php b/tests/src/Core/Lock/DatabaseLockDriverTest.php
deleted file mode 100644 (file)
index 297e76d..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-<?php
-
-namespace Friendica\Test\src\Core\Lock;
-
-use Friendica\Core\Cache;
-use Friendica\Core\Lock\DatabaseLockDriver;
-use Friendica\Test\Util\DbaLockMockTrait;
-
-/**
- * @runTestsInSeparateProcesses
- * @preserveGlobalState disabled
- */
-class DatabaseLockDriverTest extends LockTest
-{
-       use DbaLockMockTrait;
-
-       protected $pid = 123;
-
-       protected function setUp()
-       {
-               $this->mockConnected();
-               $this->mockConnect();
-
-               $this->mockReleaseAll($this->pid, 2);
-
-               parent::setUp();
-       }
-
-       protected function getInstance()
-       {
-               return new DatabaseLockDriver($this->pid);
-       }
-
-       public function testLock()
-       {
-               $this->mockIsLocked('foo', false, $this->startTime, 1);
-               $this->mockAcquireLock('foo', Cache::FIVE_MINUTES, false, $this->pid, false, $this->startTime, 1);
-               $this->mockIsLocked('foo', true, $this->startTime, 1);
-               $this->mockIsLocked('bar', false, $this->startTime, 1);
-
-               parent::testLock();
-       }
-
-       public function testDoubleLock()
-       {
-               $this->mockIsLocked('foo', false, $this->startTime, 1);
-               $this->mockAcquireLock('foo', Cache::FIVE_MINUTES, false, $this->pid, false, $this->startTime, 1);
-               $this->mockIsLocked('foo', true, $this->startTime, 1);
-               $this->mockAcquireLock('foo', Cache::FIVE_MINUTES, true, $this->pid, true, $this->startTime, 1);
-
-               parent::testDoubleLock();
-       }
-
-       public function testReleaseLock()
-       {
-               $this->mockIsLocked('foo', false, $this->startTime, 1);
-               $this->mockAcquireLock('foo', Cache::FIVE_MINUTES, false, $this->pid, false, $this->startTime, 1);
-               $this->mockIsLocked('foo', true, $this->startTime, 1);
-               $this->mockReleaseLock('foo', $this->pid, 1);
-               $this->mockIsLocked('foo', false, $this->startTime, 1);
-
-               parent::testReleaseLock();
-       }
-
-       public function testReleaseAll()
-       {
-               $this->mockAcquireLock('foo', Cache::FIVE_MINUTES, false, $this->pid, false, $this->startTime, 1);
-               $this->mockAcquireLock('bar', Cache::FIVE_MINUTES, false, $this->pid, false, $this->startTime, 1);
-               $this->mockAcquireLock('nice', Cache::FIVE_MINUTES, false, $this->pid, false, $this->startTime, 1);
-
-               $this->mockIsLocked('foo', true, $this->startTime, 1);
-               $this->mockIsLocked('bar', true, $this->startTime, 1);
-               $this->mockIsLocked('nice', true, $this->startTime, 1);
-
-               $this->mockReleaseAll($this->pid, 1);
-
-               $this->mockIsLocked('foo', false, $this->startTime, 1);
-               $this->mockIsLocked('bar', false, $this->startTime, 1);
-               $this->mockIsLocked('nice', false, $this->startTime, 1);
-
-               parent::testReleaseAll();
-       }
-
-       public function testReleaseAfterUnlock()
-       {
-               $this->mockIsLocked('foo', false, $this->startTime, 1);
-               $this->mockIsLocked('bar', false, $this->startTime, 1);
-               $this->mockIsLocked('nice', false, $this->startTime, 1);
-
-               $this->mockAcquireLock('foo', Cache::FIVE_MINUTES, false, $this->pid, false, $this->startTime, 1);
-               $this->mockAcquireLock('bar', Cache::FIVE_MINUTES, false, $this->pid, false, $this->startTime, 1);
-               $this->mockAcquireLock('nice', Cache::FIVE_MINUTES, false, $this->pid, false, $this->startTime, 1);
-
-               $this->mockReleaseLock('foo', $this->pid, 1);
-
-               $this->mockIsLocked('foo', false, $this->startTime, 1);
-               $this->mockIsLocked('bar', true, $this->startTime, 1);
-               $this->mockIsLocked('nice', true, $this->startTime, 1);
-
-               $this->mockReleaseAll($this->pid, 1);
-
-               $this->mockIsLocked('bar', false, $this->startTime, 1);
-               $this->mockIsLocked('nice', false, $this->startTime, 1);
-
-               parent::testReleaseAfterUnlock();
-       }
-
-       public function testReleaseWitTTL()
-       {
-               $this->mockIsLocked('test', false, $this->startTime, 1);
-               $this->mockAcquireLock('test', 10, false, $this->pid, false, $this->startTime, 1);
-               $this->mockIsLocked('test', true, $this->startTime, 1);
-               $this->mockReleaseLock('test', $this->pid, 1);
-               $this->mockIsLocked('test', false, $this->startTime, 1);
-
-               parent::testReleaseWitTTL();
-       }
-}
diff --git a/tests/src/Core/Lock/DatabaseLockTest.php b/tests/src/Core/Lock/DatabaseLockTest.php
new file mode 100644 (file)
index 0000000..2b20b2c
--- /dev/null
@@ -0,0 +1,43 @@
+<?php
+
+namespace Friendica\Test\src\Core\Lock;
+
+use Friendica\Core\Lock\DatabaseLock;
+use Friendica\Factory\ConfigFactory;
+use Friendica\Test\DatabaseTestTrait;
+use Friendica\Test\Util\Database\StaticDatabase;
+use Friendica\Test\Util\VFSTrait;
+use Friendica\Util\ConfigFileLoader;
+use Friendica\Util\Profiler;
+use Psr\Log\NullLogger;
+
+class DatabaseLockDriverTest extends LockTest
+{
+       use VFSTrait;
+       use DatabaseTestTrait;
+
+       protected $pid = 123;
+
+       protected function setUp()
+       {
+               $this->setUpVfsDir();
+
+               parent::setUp();
+       }
+
+       protected function getInstance()
+       {
+               $logger   = new NullLogger();
+               $profiler = \Mockery::mock(Profiler::class);
+               $profiler->shouldReceive('saveTimestamp')->withAnyArgs()->andReturn(true);
+
+               // load real config to avoid mocking every config-entry which is related to the Database class
+               $configFactory = new ConfigFactory();
+               $loader        = new ConfigFileLoader($this->root->url());
+               $configCache   = $configFactory->createCache($loader);
+
+               $dba = new StaticDatabase($configCache, $profiler, $logger);
+
+               return new DatabaseLock($dba, $this->pid);
+       }
+}
index 28f51733f428d9f7748dd0d52fa5a037a50bc047..24efeaab869823d7f6fa2c5b7cf179798d936502 100644 (file)
@@ -3,21 +3,16 @@
 namespace Friendica\Test\src\Core\Lock;
 
 use Friendica\Test\MockedTest;
-use Friendica\Test\Util\AppMockTrait;
-use Friendica\Test\Util\VFSTrait;
 
 abstract class LockTest extends MockedTest
 {
-       use VFSTrait;
-       use AppMockTrait;
-
        /**
         * @var int Start time of the mock (used for time operations)
         */
        protected $startTime = 1417011228;
 
        /**
-        * @var \Friendica\Core\Lock\ILockDriver
+        * @var \Friendica\Core\Lock\ILock
         */
        protected $instance;
 
@@ -25,28 +20,23 @@ abstract class LockTest extends MockedTest
 
        protected function setUp()
        {
-               // Reusable App object
-               $this->setUpVfsDir();
-               $this->mockApp($this->root);
-               $this->app
-                       ->shouldReceive('getHostname')
-                       ->andReturn('friendica.local');
-
                parent::setUp();
+
                $this->instance = $this->getInstance();
-               $this->instance->releaseAll();
+               $this->instance->releaseAll(true);
        }
 
        protected function tearDown()
        {
-               $this->instance->releaseAll();
+               $this->instance->releaseAll(true);
                parent::tearDown();
        }
 
        /**
         * @small
         */
-       public function testLock() {
+       public function testLock()
+       {
                $this->assertFalse($this->instance->isLocked('foo'));
                $this->assertTrue($this->instance->acquireLock('foo', 1));
                $this->assertTrue($this->instance->isLocked('foo'));
@@ -56,7 +46,8 @@ abstract class LockTest extends MockedTest
        /**
         * @small
         */
-       public function testDoubleLock() {
+       public function testDoubleLock()
+       {
                $this->assertFalse($this->instance->isLocked('foo'));
                $this->assertTrue($this->instance->acquireLock('foo', 1));
                $this->assertTrue($this->instance->isLocked('foo'));
@@ -67,7 +58,8 @@ abstract class LockTest extends MockedTest
        /**
         * @small
         */
-       public function testReleaseLock() {
+       public function testReleaseLock()
+       {
                $this->assertFalse($this->instance->isLocked('foo'));
                $this->assertTrue($this->instance->acquireLock('foo', 1));
                $this->assertTrue($this->instance->isLocked('foo'));
@@ -78,7 +70,8 @@ abstract class LockTest extends MockedTest
        /**
         * @small
         */
-       public function testReleaseAll() {
+       public function testReleaseAll()
+       {
                $this->assertTrue($this->instance->acquireLock('foo', 1));
                $this->assertTrue($this->instance->acquireLock('bar', 1));
                $this->assertTrue($this->instance->acquireLock('nice', 1));
@@ -97,7 +90,8 @@ abstract class LockTest extends MockedTest
        /**
         * @small
         */
-       public function testReleaseAfterUnlock() {
+       public function testReleaseAfterUnlock()
+       {
                $this->assertFalse($this->instance->isLocked('foo'));
                $this->assertFalse($this->instance->isLocked('bar'));
                $this->assertFalse($this->instance->isLocked('nice'));
@@ -129,10 +123,51 @@ abstract class LockTest extends MockedTest
                $this->assertFalse($this->instance->isLocked('test'));
        }
 
+       /**
+        * @small
+        */
+       public function testGetLocks()
+       {
+               $this->assertTrue($this->instance->acquireLock('foo', 1));
+               $this->assertTrue($this->instance->acquireLock('bar', 1));
+               $this->assertTrue($this->instance->acquireLock('nice', 1));
+
+               $this->assertTrue($this->instance->isLocked('foo'));
+               $this->assertTrue($this->instance->isLocked('bar'));
+               $this->assertTrue($this->instance->isLocked('nice'));
+
+               $locks = $this->instance->getLocks();
+
+               $this->assertContains('foo', $locks);
+               $this->assertContains('bar', $locks);
+               $this->assertContains('nice', $locks);
+       }
+
+       /**
+        * @small
+        */
+       public function testGetLocksWithPrefix()
+       {
+               $this->assertTrue($this->instance->acquireLock('foo', 1));
+               $this->assertTrue($this->instance->acquireLock('test1', 1));
+               $this->assertTrue($this->instance->acquireLock('test2', 1));
+
+               $this->assertTrue($this->instance->isLocked('foo'));
+               $this->assertTrue($this->instance->isLocked('test1'));
+               $this->assertTrue($this->instance->isLocked('test2'));
+
+               $locks = $this->instance->getLocks('test');
+
+               $this->assertContains('test1', $locks);
+               $this->assertContains('test2', $locks);
+               $this->assertNotContains('foo', $locks);
+       }
+
        /**
         * @medium
         */
-       function testLockTTL() {
+       function testLockTTL()
+       {
                $this->markTestSkipped('taking too much time without mocking');
 
                $this->assertFalse($this->instance->isLocked('foo'));
@@ -155,4 +190,13 @@ abstract class LockTest extends MockedTest
                $this->assertFalse($this->instance->isLocked('foo'));
                $this->assertFalse($this->instance->isLocked('bar'));
        }
+
+       /**
+        * Test if releasing a non-existing lock doesn't throw errors
+        */
+       public function testReleaseLockWithoutLock()
+       {
+               $this->assertFalse($this->instance->isLocked('wrongLock'));
+               $this->assertFalse($this->instance->releaseLock('wrongLock'));
+       }
 }
diff --git a/tests/src/Core/Lock/MemcacheCacheLockDriverTest.php b/tests/src/Core/Lock/MemcacheCacheLockDriverTest.php
deleted file mode 100644 (file)
index 8d32ad5..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-
-namespace Friendica\Test\src\Core\Lock;
-
-use Friendica\Factory\CacheDriverFactory;
-use Friendica\Core\Lock\CacheLockDriver;
-
-/**
- * @requires extension Memcache
- */
-class MemcacheCacheLockDriverTest extends LockTest
-{
-       protected function getInstance()
-       {
-               $this->configMock
-                       ->shouldReceive('get')
-                       ->with('system', 'memcache_host')
-                       ->andReturn('localhost');
-
-               $this->configMock
-                       ->shouldReceive('get')
-                       ->with('system', 'memcache_port')
-                       ->andReturn(11211);
-
-               return new CacheLockDriver(CacheDriverFactory::create('memcache'));
-       }
-}
diff --git a/tests/src/Core/Lock/MemcacheCacheLockTest.php b/tests/src/Core/Lock/MemcacheCacheLockTest.php
new file mode 100644 (file)
index 0000000..f550ac5
--- /dev/null
@@ -0,0 +1,30 @@
+<?php
+
+
+namespace Friendica\Test\src\Core\Lock;
+
+use Friendica\Core\Cache\MemcacheCache;
+use Friendica\Core\Config\Configuration;
+use Friendica\Core\Lock\CacheLock;
+
+/**
+ * @requires extension Memcache
+ */
+class MemcacheCacheLockTest extends LockTest
+{
+       protected function getInstance()
+       {
+               $configMock = \Mockery::mock(Configuration::class);
+
+               $configMock
+                       ->shouldReceive('get')
+                       ->with('system', 'memcache_host')
+                       ->andReturn('localhost');
+               $configMock
+                       ->shouldReceive('get')
+                       ->with('system', 'memcache_port')
+                       ->andReturn(11211);
+
+               return new CacheLock(new MemcacheCache('localhost', $configMock));
+       }
+}
diff --git a/tests/src/Core/Lock/MemcachedCacheLockDriverTest.php b/tests/src/Core/Lock/MemcachedCacheLockDriverTest.php
deleted file mode 100644 (file)
index f08ffa3..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-
-
-namespace Friendica\Test\src\Core\Lock;
-
-use Friendica\Factory\CacheDriverFactory;
-use Friendica\Core\Lock\CacheLockDriver;
-
-/**
- * @requires extension memcached
- */
-class MemcachedCacheLockDriverTest extends LockTest
-{
-       protected function getInstance()
-       {
-               $this->configMock
-                       ->shouldReceive('get')
-                       ->with('system', 'memcached_hosts')
-                       ->andReturn([0 => 'localhost, 11211']);
-
-               return new CacheLockDriver(CacheDriverFactory::create('memcached'));
-       }
-}
diff --git a/tests/src/Core/Lock/MemcachedCacheLockTest.php b/tests/src/Core/Lock/MemcachedCacheLockTest.php
new file mode 100644 (file)
index 0000000..8b59f91
--- /dev/null
@@ -0,0 +1,29 @@
+<?php
+
+
+namespace Friendica\Test\src\Core\Lock;
+
+use Friendica\Core\Cache\MemcachedCache;
+use Friendica\Core\Config\Configuration;
+use Friendica\Core\Lock\CacheLock;
+use Psr\Log\NullLogger;
+
+/**
+ * @requires extension memcached
+ */
+class MemcachedCacheLockTest extends LockTest
+{
+       protected function getInstance()
+       {
+               $configMock = \Mockery::mock(Configuration::class);
+
+               $configMock
+                       ->shouldReceive('get')
+                       ->with('system', 'memcached_hosts')
+                       ->andReturn([0 => 'localhost, 11211']);
+
+               $logger = new NullLogger();
+
+               return new CacheLock(new MemcachedCache('localhost', $configMock, $logger));
+       }
+}
diff --git a/tests/src/Core/Lock/RedisCacheLockDriverTest.php b/tests/src/Core/Lock/RedisCacheLockDriverTest.php
deleted file mode 100644 (file)
index 21bace5..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-
-namespace Friendica\Test\src\Core\Lock;
-
-use Friendica\Core\Lock\CacheLockDriver;
-use Friendica\Factory\CacheDriverFactory;
-
-/**
- * @requires extension redis
- */
-class RedisCacheLockDriverTest extends LockTest
-{
-       protected function getInstance()
-       {
-               $this->configMock
-                       ->shouldReceive('get')
-                       ->with('system', 'redis_host')
-                       ->andReturn('localhost');
-
-               $this->configMock
-                       ->shouldReceive('get')
-                       ->with('system', 'redis_port')
-                       ->andReturn(null);
-
-               $this->configMock
-                       ->shouldReceive('get')
-                       ->with('system', 'redis_db')
-                       ->andReturn(3);
-
-               $this->configMock
-                       ->shouldReceive('get')
-                       ->with('system', 'redis_password')
-                       ->andReturn(null);
-
-               return new CacheLockDriver(CacheDriverFactory::create('redis'));
-       }
-}
diff --git a/tests/src/Core/Lock/RedisCacheLockTest.php b/tests/src/Core/Lock/RedisCacheLockTest.php
new file mode 100644 (file)
index 0000000..0ebc021
--- /dev/null
@@ -0,0 +1,39 @@
+<?php
+
+
+namespace Friendica\Test\src\Core\Lock;
+
+use Friendica\Core\Cache\RedisCache;
+use Friendica\Core\Config\Configuration;
+use Friendica\Core\Lock\CacheLock;
+
+/**
+ * @requires extension redis
+ */
+class RedisCacheLockTest extends LockTest
+{
+       protected function getInstance()
+       {
+               $configMock = \Mockery::mock(Configuration::class);
+
+               $configMock
+                       ->shouldReceive('get')
+                       ->with('system', 'redis_host')
+                       ->andReturn('localhost');
+               $configMock
+                       ->shouldReceive('get')
+                       ->with('system', 'redis_port')
+                       ->andReturn(null);
+
+               $configMock
+                       ->shouldReceive('get')
+                       ->with('system', 'redis_db', 0)
+                       ->andReturn(3);
+               $configMock
+                       ->shouldReceive('get')
+                       ->with('system', 'redis_password')
+                       ->andReturn(null);
+
+               return new CacheLock(new RedisCache('localhost', $configMock));
+       }
+}
diff --git a/tests/src/Core/Lock/SemaphoreLockDriverTest.php b/tests/src/Core/Lock/SemaphoreLockDriverTest.php
deleted file mode 100644 (file)
index a37fbff..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-namespace Friendica\Test\src\Core\Lock;
-
-use Friendica\Core\Lock\SemaphoreLockDriver;
-
-class SemaphoreLockDriverTest extends LockTest
-{
-       public function setUp()
-       {
-               parent::setUp();
-
-               $this->app->shouldReceive('getHostname')->andReturn('friendica.local');
-
-               $this->configMock
-                       ->shouldReceive('get')
-                       ->with('system', 'temppath')
-                       ->andReturn('/tmp/');
-       }
-
-       protected function getInstance()
-       {
-               return new SemaphoreLockDriver();
-       }
-
-       function testLockTTL()
-       {
-               // Semaphore doesn't work with TTL
-               return true;
-       }
-}
diff --git a/tests/src/Core/Lock/SemaphoreLockTest.php b/tests/src/Core/Lock/SemaphoreLockTest.php
new file mode 100644 (file)
index 0000000..a2291b2
--- /dev/null
@@ -0,0 +1,89 @@
+<?php
+
+namespace Friendica\Test\src\Core\Lock;
+
+use Dice\Dice;
+use Friendica\App;
+use Friendica\BaseObject;
+use Friendica\Core\Config\Configuration;
+use Friendica\Core\Lock\SemaphoreLock;
+
+class SemaphoreLockTest extends LockTest
+{
+       public function setUp()
+       {
+               $dice = \Mockery::mock(Dice::class)->makePartial();
+
+               $app = \Mockery::mock(App::class);
+               $app->shouldReceive('getHostname')->andReturn('friendica.local');
+               $dice->shouldReceive('create')->with(App::class)->andReturn($app);
+
+               $configMock = \Mockery::mock(Configuration::class);
+               $configMock
+                       ->shouldReceive('get')
+                       ->with('system', 'temppath', NULL, false)
+                       ->andReturn('/tmp/');
+               $dice->shouldReceive('create')->with(Configuration::class)->andReturn($configMock);
+
+               // @todo Because "get_temppath()" is using static methods, we have to initialize the BaseObject
+               BaseObject::setDependencyInjection($dice);
+
+               parent::setUp();
+       }
+
+       protected function getInstance()
+       {
+               return new SemaphoreLock();
+       }
+
+       function testLockTTL()
+       {
+               // Semaphore doesn't work with TTL
+               return true;
+       }
+
+       /**
+        * Test if semaphore locking works even when trying to release locks, where the file exists
+        * but it shouldn't harm locking
+        */
+       public function testMissingFileNotOverriding()
+       {
+               $file = get_temppath() . '/test.sem';
+               touch($file);
+
+               $this->assertTrue(file_exists($file));
+               $this->assertFalse($this->instance->releaseLock('test', false));
+               $this->assertTrue(file_exists($file));
+       }
+
+       /**
+        * Test overriding semaphore release with already set semaphore
+        * This test proves that semaphore locks cannot get released by other instances except themselves
+        *
+        * Check for Bug https://github.com/friendica/friendica/issues/7298#issuecomment-521996540
+        * @see https://github.com/friendica/friendica/issues/7298#issuecomment-521996540
+        */
+       public function testMissingFileOverriding()
+       {
+               $file = get_temppath() . '/test.sem';
+               touch($file);
+
+               $this->assertTrue(file_exists($file));
+               $this->assertFalse($this->instance->releaseLock('test', true));
+               $this->assertTrue(file_exists($file));
+       }
+
+       /**
+        * Test acquire lock even the semaphore file exists, but isn't used
+        */
+       public function testOverrideSemFile()
+       {
+               $file = get_temppath() . '/test.sem';
+               touch($file);
+
+               $this->assertTrue(file_exists($file));
+               $this->assertTrue($this->instance->acquireLock('test'));
+               $this->assertTrue($this->instance->isLocked('test'));
+               $this->assertTrue($this->instance->releaseLock('test'));
+       }
+}
index 6b0781198a52ee828121771141c9f3cf4f4ac014..a385d1b35284feee92da2f55dd2b38d5ef05a54d 100644 (file)
@@ -9,7 +9,6 @@ class SystemTest extends TestCase
 {
        private function assertGuid($guid, $length, $prefix = '')
        {
-               print $guid;
                $length -= strlen($prefix);
                $this->assertRegExp("/^" . $prefix . "[a-z0-9]{" . $length . "}?$/", $guid);
        }
index 36bba1e65b9b6a531a77cfcc79bd75ba7f2d7919..9b2a2f122b608467f676145094445ac282ea8697 100644 (file)
@@ -1,34 +1,25 @@
 <?php
 namespace Friendica\Test\src\Database;
 
-use Friendica\App;
+use Dice\Dice;
+use Friendica\BaseObject;
 use Friendica\Core\Config;
+use Friendica\Database\Database;
 use Friendica\Database\DBA;
-use Friendica\Factory;
 use Friendica\Test\DatabaseTest;
-use Friendica\Util\BasePath;
-use Friendica\Util\BaseURL;
-use Friendica\Util\Config\ConfigFileLoader;
+use Friendica\Test\Util\Database\StaticDatabase;
 
 class DBATest extends DatabaseTest
 {
        public function setUp()
        {
-               $basePath = BasePath::create(dirname(__DIR__) . '/../../');
-               $mode = new App\Mode($basePath);
-               $router = new App\Router();
-               $configLoader = new ConfigFileLoader($basePath, $mode);
-               $configCache = Factory\ConfigFactory::createCache($configLoader);
-               $profiler = Factory\ProfilerFactory::create($configCache);
-               Factory\DBFactory::init($configCache, $profiler, $_SERVER);
-               $config = Factory\ConfigFactory::createConfig($configCache);
-               Factory\ConfigFactory::createPConfig($configCache);
-               $logger = Factory\LoggerFactory::create('test', $config, $profiler);
-               $baseUrl = new BaseURL($config, $_SERVER);
-               $this->app = new App($config, $mode, $router, $baseUrl, $logger, $profiler, false);
-
                parent::setUp();
 
+               $dice = (new Dice())
+                       ->addRules(include __DIR__ . '/../../../static/dependencies.config.php')
+                       ->addRule(Database::class, ['instanceOf' => StaticDatabase::class, 'shared' => true]);
+               BaseObject::setDependencyInjection($dice);
+
                // Default config
                Config::set('config', 'hostname', 'localhost');
                Config::set('system', 'throttle_limit_day', 100);
index 6050b7073ad8fd93d3cddc0d69984c9d70bb7d32..38c621d4c8794948b5a4a2c2a25abf573db79cbf 100644 (file)
@@ -2,32 +2,23 @@
 
 namespace Friendica\Test\src\Database;
 
-use Friendica\App;
+use Dice\Dice;
+use Friendica\BaseObject;
+use Friendica\Database\Database;
 use Friendica\Database\DBStructure;
-use Friendica\Factory;
 use Friendica\Test\DatabaseTest;
-use Friendica\Util\BasePath;
-use Friendica\Util\BaseURL;
-use Friendica\Util\Config\ConfigFileLoader;
+use Friendica\Test\Util\Database\StaticDatabase;
 
 class DBStructureTest extends DatabaseTest
 {
-       public function setUp()
+       protected function setUp()
        {
-               $basePath = BasePath::create(dirname(__DIR__) . '/../../');
-               $mode = new App\Mode($basePath);
-               $router = new App\Router();
-               $configLoader = new ConfigFileLoader($basePath, $mode);
-               $configCache = Factory\ConfigFactory::createCache($configLoader);
-               $profiler = Factory\ProfilerFactory::create($configCache);
-               Factory\DBFactory::init($configCache, $profiler, $_SERVER);
-               $config = Factory\ConfigFactory::createConfig($configCache);
-               Factory\ConfigFactory::createPConfig($configCache);
-               $logger = Factory\LoggerFactory::create('test', $config, $profiler);
-               $baseUrl = new BaseURL($config, $_SERVER);
-               $this->app = new App($config, $mode, $router, $baseUrl, $logger, $profiler, false);
-
                parent::setUp();
+
+               $dice = (new Dice())
+                       ->addRules(include __DIR__ . '/../../../static/dependencies.config.php')
+                       ->addRule(Database::class, ['instanceOf' => StaticDatabase::class, 'shared' => true]);
+               BaseObject::setDependencyInjection($dice);
        }
 
        /**
index b542371b3922432eda53ae84e2cb82e318de256c..72991c6d0f71695e6566b8c544ec5782b3afd993 100644 (file)
@@ -2,10 +2,13 @@
 
 namespace Friendica\Test\src\Network;
 
-use Friendica\Core\Logger;
+use Dice\Dice;
+use Friendica\BaseObject;
 use Friendica\Network\CurlResult;
-use Friendica\Util\Logger\VoidLogger;
+use Mockery\MockInterface;
 use PHPUnit\Framework\TestCase;
+use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
 
 class CurlResultTest extends TestCase
 {
@@ -13,7 +16,17 @@ class CurlResultTest extends TestCase
        {
                parent::setUp();
 
-               Logger::init(new VoidLogger());
+
+               /** @var Dice|MockInterface $dice */
+               $dice = \Mockery::mock(Dice::class)->makePartial();
+               $dice = $dice->addRules(include __DIR__ . '/../../../static/dependencies.config.php');
+
+               $logger = new NullLogger();
+               $dice->shouldReceive('create')
+                          ->with(LoggerInterface::class)
+                          ->andReturn($logger);
+
+               BaseObject::setDependencyInjection($dice);
        }
 
        /**
index 3c619255cfe959c419760eedb9d7d4c9d778e437..c9c7b079f9aa78cd933817c94c5efde7aa603835 100644 (file)
@@ -58,7 +58,8 @@ class BasePathTest extends MockedTest
         */
        public function testDetermineBasePath(array $server, $input, $output)
        {
-               $this->assertEquals($output, BasePath::create($input, $server));
+               $basepath = new BasePath($input, $server);
+               $this->assertEquals($output, $basepath->getPath());
        }
 
        /**
@@ -68,6 +69,7 @@ class BasePathTest extends MockedTest
         */
        public function testFailedBasePath()
        {
-               BasePath::create('/now23452sgfgas', []);
+               $basepath = new BasePath('/now23452sgfgas', []);
+               $basepath->getPath();
        }
 }
index 1e74af39fe3937d96811b7d1bd21736830619500..7f63027fcb7c10f8552f25157ab724a3305b7d8e 100644 (file)
@@ -1,9 +1,9 @@
 <?php
 namespace Friendica\Test\src\Util;
 
+use Friendica\App\BaseURL;
 use Friendica\Core\Config\Configuration;
 use Friendica\Test\MockedTest;
-use Friendica\Util\BaseURL;
 
 class BaseURLTest extends MockedTest
 {
index ad0fe8afca3fecacecb5a75d4351feb3069301f9..aa9a11cb080aeb02fcc86a2cf3277228c915782e 100644 (file)
@@ -2,31 +2,21 @@
 
 namespace Friendica\Test\src\Util\Config;
 
-use Friendica\App;
 use Friendica\Core\Config\Cache\ConfigCache;
 use Friendica\Test\MockedTest;
 use Friendica\Test\Util\VFSTrait;
-use Friendica\Util\Config\ConfigFileLoader;
-use Mockery\MockInterface;
+use Friendica\Util\ConfigFileLoader;
 use org\bovigo\vfs\vfsStream;
 
 class ConfigFileLoaderTest extends MockedTest
 {
        use VFSTrait;
 
-       /**
-        * @var App\Mode|MockInterface
-        */
-       private $mode;
-
        protected function setUp()
        {
                parent::setUp();
 
                $this->setUpVfsDir();
-
-               $this->mode = \Mockery::mock(App\Mode::class);
-               $this->mode->shouldReceive('isInstall')->andReturn(true);
        }
 
        /**
@@ -34,7 +24,9 @@ class ConfigFileLoaderTest extends MockedTest
         */
        public function testLoadConfigFiles()
        {
-               $configFileLoader = new ConfigFileLoader($this->root->url(), $this->mode);
+               $this->delConfigFile('local.config.php');
+
+               $configFileLoader = new ConfigFileLoader($this->root->url());
                $configCache = new ConfigCache();
 
                $configFileLoader->setupCache($configCache);
@@ -55,7 +47,7 @@ class ConfigFileLoaderTest extends MockedTest
                        ->at($this->root->getChild('config'))
                        ->setContent('<?php return true;');
 
-               $configFileLoader = new ConfigFileLoader($this->root->url(), $this->mode);
+               $configFileLoader = new ConfigFileLoader($this->root->url());
                $configCache = new ConfigCache();
 
                $configFileLoader->setupCache($configCache);
@@ -73,13 +65,13 @@ class ConfigFileLoaderTest extends MockedTest
                        '..' . DIRECTORY_SEPARATOR .
                        'datasets' . DIRECTORY_SEPARATOR .
                        'config' . DIRECTORY_SEPARATOR .
-                       'local.config.php';
+                       'A.config.php';
 
                vfsStream::newFile('local.config.php')
                        ->at($this->root->getChild('config'))
                        ->setContent(file_get_contents($file));
 
-               $configFileLoader = new ConfigFileLoader($this->root->url(), $this->mode);
+               $configFileLoader = new ConfigFileLoader($this->root->url());
                $configCache = new ConfigCache();
 
                $configFileLoader->setupCache($configCache);
@@ -105,13 +97,13 @@ class ConfigFileLoaderTest extends MockedTest
                        '..' . DIRECTORY_SEPARATOR .
                        'datasets' . DIRECTORY_SEPARATOR .
                        'config' . DIRECTORY_SEPARATOR .
-                       'local.ini.php';
+                       'A.ini.php';
 
                vfsStream::newFile('local.ini.php')
                        ->at($this->root->getChild('config'))
                        ->setContent(file_get_contents($file));
 
-               $configFileLoader = new ConfigFileLoader($this->root->url(), $this->mode);
+               $configFileLoader = new ConfigFileLoader($this->root->url());
                $configCache = new ConfigCache();
 
                $configFileLoader->setupCache($configCache);
@@ -142,7 +134,7 @@ class ConfigFileLoaderTest extends MockedTest
                        ->at($this->root)
                        ->setContent(file_get_contents($file));
 
-               $configFileLoader = new ConfigFileLoader($this->root->url(), $this->mode);
+               $configFileLoader = new ConfigFileLoader($this->root->url());
                $configCache = new ConfigCache();
 
                $configFileLoader->setupCache($configCache);
@@ -185,13 +177,13 @@ class ConfigFileLoaderTest extends MockedTest
                        '..' . DIRECTORY_SEPARATOR .
                        'datasets' . DIRECTORY_SEPARATOR .
                        'config' . DIRECTORY_SEPARATOR .
-                       'local.config.php';
+                       'A.config.php';
 
                vfsStream::newFile('test.config.php')
                        ->at($this->root->getChild('addon')->getChild('test')->getChild('config'))
                        ->setContent(file_get_contents($file));
 
-               $configFileLoader = new ConfigFileLoader($this->root->url(), $this->mode);
+               $configFileLoader = new ConfigFileLoader($this->root->url());
 
                $conf = $configFileLoader->loadAddonConfig('test');
 
@@ -202,4 +194,91 @@ class ConfigFileLoaderTest extends MockedTest
 
                $this->assertEquals('admin@test.it', $conf['config']['admin_email']);
        }
+
+       /**
+        * test loading multiple config files - the last config should work
+        */
+       public function testLoadMultipleConfigs()
+       {
+               $this->delConfigFile('local.config.php');
+
+               $fileDir = dirname(__DIR__) . DIRECTORY_SEPARATOR .
+                       '..' . DIRECTORY_SEPARATOR .
+                       '..' . DIRECTORY_SEPARATOR .
+                       'datasets' . DIRECTORY_SEPARATOR .
+                       'config' . DIRECTORY_SEPARATOR;
+
+               vfsStream::newFile('A.config.php')
+                        ->at($this->root->getChild('config'))
+                        ->setContent(file_get_contents($fileDir . 'A.config.php'));
+               vfsStream::newFile('B.config.php')
+                               ->at($this->root->getChild('config'))
+                        ->setContent(file_get_contents($fileDir . 'B.config.php'));
+
+               $configFileLoader = new ConfigFileLoader($this->root->url());
+               $configCache = new ConfigCache();
+
+               $configFileLoader->setupCache($configCache);
+
+               $this->assertEquals('admin@overwritten.local', $configCache->get('config', 'admin_email'));
+               $this->assertEquals('newValue', $configCache->get('system', 'newKey'));
+       }
+
+       /**
+        * test loading multiple config files - the last config should work (INI-version)
+        */
+       public function testLoadMultipleInis()
+       {
+               $this->delConfigFile('local.config.php');
+
+               $fileDir = dirname(__DIR__) . DIRECTORY_SEPARATOR .
+                          '..' . DIRECTORY_SEPARATOR .
+                          '..' . DIRECTORY_SEPARATOR .
+                          'datasets' . DIRECTORY_SEPARATOR .
+                          'config' . DIRECTORY_SEPARATOR;
+
+               vfsStream::newFile('A.ini.php')
+                        ->at($this->root->getChild('config'))
+                        ->setContent(file_get_contents($fileDir . 'A.ini.php'));
+               vfsStream::newFile('B.ini.php')
+                        ->at($this->root->getChild('config'))
+                        ->setContent(file_get_contents($fileDir . 'B.ini.php'));
+
+               $configFileLoader = new ConfigFileLoader($this->root->url());
+               $configCache = new ConfigCache();
+
+               $configFileLoader->setupCache($configCache);
+
+               $this->assertEquals('admin@overwritten.local', $configCache->get('config', 'admin_email'));
+               $this->assertEquals('newValue', $configCache->get('system', 'newKey'));
+       }
+
+       /**
+        * Test that sample-files (e.g. local-sample.config.php) is never loaded
+        */
+       public function testNotLoadingSamples()
+       {
+               $this->delConfigFile('local.config.php');
+
+               $fileDir = dirname(__DIR__) . DIRECTORY_SEPARATOR .
+                          '..' . DIRECTORY_SEPARATOR .
+                          '..' . DIRECTORY_SEPARATOR .
+                          'datasets' . DIRECTORY_SEPARATOR .
+                          'config' . DIRECTORY_SEPARATOR;
+
+               vfsStream::newFile('A.ini.php')
+                        ->at($this->root->getChild('config'))
+                        ->setContent(file_get_contents($fileDir . 'A.ini.php'));
+               vfsStream::newFile('B-sample.ini.php')
+                        ->at($this->root->getChild('config'))
+                        ->setContent(file_get_contents($fileDir . 'B.ini.php'));
+
+               $configFileLoader = new ConfigFileLoader($this->root->url());
+               $configCache = new ConfigCache();
+
+               $configFileLoader->setupCache($configCache);
+
+               $this->assertEquals('admin@test.it', $configCache->get('config', 'admin_email'));
+               $this->assertEmpty($configCache->get('system', 'NewKey'));
+       }
 }
index 1dbf36f38bb1f11e8bc5e6db99fc65f563db0004..0790bc30ac3aad45da8de12d45be1bdd68e4bf0e 100644 (file)
@@ -2,6 +2,8 @@
 
 namespace Friendica\Test\src\Util;
 
+use Friendica\Core\Config\Cache\ConfigCache;
+use Friendica\Core\Config\Configuration;
 use Friendica\Test\MockedTest;
 use Friendica\Util\Profiler;
 use Mockery\MockInterface;
@@ -26,7 +28,12 @@ class ProfilerTest extends MockedTest
         */
        public function testSetUp()
        {
-               $profiler = new Profiler(true, true);
+               $configCache = \Mockery::mock(ConfigCache::class);
+               $configCache->shouldReceive('get')
+                           ->withAnyArgs()
+                           ->andReturn(true)
+                           ->twice();
+               $profiler = new Profiler($configCache);
        }
 
        /**
@@ -96,7 +103,13 @@ class ProfilerTest extends MockedTest
         */
        public function testSaveTimestamp($timestamp, $name, array $functions)
        {
-               $profiler = new Profiler(true, true);
+               $configCache = \Mockery::mock(ConfigCache::class);
+               $configCache->shouldReceive('get')
+                           ->withAnyArgs()
+                           ->andReturn(true)
+                           ->twice();
+
+               $profiler = new Profiler($configCache);
 
                foreach ($functions as $function) {
                        $profiler->saveTimestamp($timestamp, $name, $function);
@@ -111,7 +124,13 @@ class ProfilerTest extends MockedTest
         */
        public function testReset($timestamp, $name, array $functions)
        {
-               $profiler = new Profiler(true, true);
+               $configCache = \Mockery::mock(ConfigCache::class);
+               $configCache->shouldReceive('get')
+                           ->withAnyArgs()
+                           ->andReturn(true)
+                           ->twice();
+
+               $profiler = new Profiler($configCache);
 
                $profiler->saveTimestamp($timestamp, $name);
                $profiler->reset();
@@ -168,7 +187,13 @@ class ProfilerTest extends MockedTest
                        ->shouldReceive('info')
                        ->once();
 
-               $profiler = new Profiler(true, true);
+               $configCache = \Mockery::mock(ConfigCache::class);
+               $configCache->shouldReceive('get')
+                           ->withAnyArgs()
+                           ->andReturn(true)
+                           ->twice();
+
+               $profiler = new Profiler($configCache);
 
                foreach ($data as $perf => $items) {
                        foreach ($items['functions'] as $function) {
@@ -193,19 +218,48 @@ class ProfilerTest extends MockedTest
         */
        public function testEnableDisable()
        {
-               $profiler = new Profiler(true, false);
+               $configCache = \Mockery::mock(ConfigCache::class);
+               $configCache->shouldReceive('get')
+                           ->with('system', 'profiler')
+                           ->andReturn(true)
+                           ->once();
+               $configCache->shouldReceive('get')
+                           ->with('rendertime', 'callstack')
+                           ->andReturn(false)
+                           ->once();
+
+               $profiler = new Profiler($configCache);
 
                $this->assertFalse($profiler->isRendertime());
                $this->assertEmpty($profiler->getRendertimeString());
 
                $profiler->saveTimestamp(time(), 'network', 'test1');
 
-               $profiler->update(false, false);
+               $config = \Mockery::mock(Configuration::class);
+               $config->shouldReceive('get')
+                           ->with('system', 'profiler')
+                           ->andReturn(false)
+                           ->once();
+               $config->shouldReceive('get')
+                           ->with('rendertime', 'callstack')
+                           ->andReturn(false)
+                           ->once();
+
+               $profiler->update($config);
 
                $this->assertFalse($profiler->isRendertime());
                $this->assertEmpty($profiler->getRendertimeString());
 
-               $profiler->update(true, true);
+               $config->shouldReceive('get')
+                      ->with('system', 'profiler')
+                      ->andReturn(true)
+                      ->once();
+               $config->shouldReceive('get')
+                      ->with('rendertime', 'callstack')
+                      ->andReturn(true)
+                      ->once();
+
+               $profiler->update($config);
 
                $profiler->saveTimestamp(time(), 'database', 'test2');
 
index 077a56e66e795252e8027ab6b1f73caa1ad338f3..18442f79588ecea0d6cd154f74c1f161ac4d8c4b 100644 (file)
@@ -22,7 +22,7 @@ use Friendica\Worker\Delivery;
  * This function is responsible for doing post update changes to the data
  * (not the structure) in the database.
  *
- * Database structure changes are done in config/dbstructure.config.php
+ * Database structure changes are done in static/dbstructure.config.php
  *
  * If there is a need for a post process to a structure change, update this file
  * by adding a new function at the end with the number of the new DB_UPDATE_VERSION.
@@ -33,8 +33,8 @@ use Friendica\Worker\Delivery;
  * You are currently on version 4711 and you are preparing changes that demand an update script.
  *
  * 1. Create a function "update_4712()" here in the update.php
- * 2. Apply the needed structural changes in config/dbStructure.php
- * 3. Set DB_UPDATE_VERSION in config/dbstructure.config.php to 4712.
+ * 2. Apply the needed structural changes in static/dbStructure.php
+ * 3. Set DB_UPDATE_VERSION in static/dbstructure.config.php to 4712.
  *
  * If you need to run a script before the database update, name the function "pre_update_4712()"
  */
@@ -369,3 +369,18 @@ function update_1309()
        }
        return Update::SUCCESS;
 }
+
+function update_1315()
+{
+       DBA::delete('item-delivery-data', ['postopts' => '', 'inform' => '', 'queue_count' => 0, 'queue_done' => 0]);
+       return Update::SUCCESS;
+}
+
+function update_1318()
+{
+       DBA::update('profile', ['marital' => "In a relation"], ['marital' => "Unavailable"]);
+       DBA::update('profile', ['marital' => "Single"], ['marital' => "Available"]);
+
+       Worker::add(PRIORITY_LOW, 'ProfileUpdate');
+       return Update::SUCCESS;
+}
index fc852dcd7564f1f68ba49c47a19d749323bfcd9c..1faef4acc4f23a88d9185270404fc76f7ac9fa5f 100644 (file)
@@ -86,7 +86,7 @@ var FileBrowser = {
 
                        var embed = "";
                        if (FileBrowser.type == "image") {
-                               embed = "[url="+this.dataset.link+"][img]"+this.dataset.img+"[/img][/url]";
+                               embed = "[url="+this.dataset.link+"][img="+this.dataset.img+"][/img][/url]";
                        }
                        if (FileBrowser.type=="file") {
                                // attachment links are "baseurl/attach/id"; we need id
index be5cdd0a940bf4cbcfa4cad6aaf2b7199bf7babc..7644af7fee4f37b41ee25eada88458284020ade5 100644 (file)
@@ -52,7 +52,7 @@
                        <div class="clear"></div>\
                        <hr class="previewseparator">';
                var text;
-               var urlRegex = /(https?\:\/\/|\s)[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})(\/+[a-z0-9_.\:\;-]*)*(\?[\&\%\|\+a-z0-9_=,\.\:\;-]*)?([\&\%\|\+&a-z0-9_=,\:\;\.-]*)([\!\#\/\&\%\|\+a-z0-9_=,\:\;\.-]*)}*/i;
+               var urlRegex = /(?<!=)(https?\:\/\/|\s)[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})(\/+[a-z0-9_.\:\;-]*)*(\?[\&\%\|\+a-z0-9_=,\.\:\;-]*)?([\&\%\|\+&a-z0-9_=,\:\;\.-]*)([\!\#\/\&\%\|\+a-z0-9_=,\:\;\.-]*)}*/i;
                var binurl;
                var block = false;
                var blockTitle = false;
index a2e2698a821730dd81653f97781294bd21143dd2..8b1303e7d3f534e3937f6cc459d441b0385018d7 100644 (file)
@@ -632,7 +632,6 @@ function post_comment(id) {
        unpause();
        commentBusy = true;
        $('body').css('cursor', 'wait');
-       $("#comment-preview-inp-" + id).val("0");
        $.post(
                "item",
                $("#comment-edit-form-" + id).serialize(),
@@ -661,11 +660,10 @@ function post_comment(id) {
 }
 
 function preview_comment(id) {
-       $("#comment-preview-inp-" + id).val("1");
        $("#comment-edit-preview-" + id).show();
        $.post(
                "item",
-               $("#comment-edit-form-" + id).serialize(),
+               $("#comment-edit-form-" + id).serialize() + '&preview=1',
                function(data) {
                        if (data.preview) {
                                $("#comment-edit-preview-" + id).html(data.preview);
index 5f07444c86f02904b0154714199ecf9e11f6c7b2..9266cb9ced04471fa05dd98b61d0d9b083f64b8a 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-31 00:33-0400\n"
+"POT-Creation-Date: 2019-08-06 16:52+0200\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,816 +18,830 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 
 
-#: include/api.php:1116
-#, 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/enotify.php:57
+msgid "Friendica Notification"
+msgstr ""
 
-#: include/api.php:1130
-#, 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/enotify.php:60
+msgid "Thank You,"
+msgstr ""
 
-#: include/api.php:1144
+#: include/enotify.php:63
 #, php-format
-msgid "Monthly posting limit of %d post reached. The post was rejected."
+msgid "%1$s, %2$s Administrator"
 msgstr ""
 
-#: include/api.php:4511 mod/photos.php:91 mod/photos.php:196 mod/photos.php:640
-#: mod/photos.php:1090 mod/photos.php:1107 mod/photos.php:1609
-#: 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:763 src/Model/User.php:771
-#: src/Model/User.php:779
-msgid "Profile Photos"
+#: include/enotify.php:65
+#, php-format
+msgid "%s Administrator"
 msgstr ""
 
-#: include/conversation.php:160 include/conversation.php:297
-#: src/Model/Item.php:3254
-msgid "event"
+#: include/enotify.php:134
+#, php-format
+msgid "[Friendica:Notify] New mail received at %s"
 msgstr ""
 
-#: include/conversation.php:163 include/conversation.php:173
-#: include/conversation.php:300 include/conversation.php:309
-#: mod/subthread.php:88 mod/tagger.php:68
-msgid "status"
+#: include/enotify.php:136
+#, php-format
+msgid "%1$s sent you a new private message at %2$s."
 msgstr ""
 
-#: include/conversation.php:168 include/conversation.php:305
-#: mod/subthread.php:88 mod/tagger.php:68 src/Model/Item.php:3256
-msgid "photo"
+#: include/enotify.php:137
+msgid "a private message"
 msgstr ""
 
-#: include/conversation.php:181
+#: include/enotify.php:137
 #, php-format
-msgid "%1$s likes %2$s's %3$s"
+msgid "%1$s sent you %2$s."
 msgstr ""
 
-#: include/conversation.php:183
+#: include/enotify.php:139
 #, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
+msgid "Please visit %s to view and/or reply to your private messages."
 msgstr ""
 
-#: include/conversation.php:185
+#: include/enotify.php:172
 #, php-format
-msgid "%1$s attends %2$s's %3$s"
+msgid "%1$s tagged you on [url=%2$s]a %3$s[/url]"
 msgstr ""
 
-#: include/conversation.php:187
+#: include/enotify.php:178
 #, php-format
-msgid "%1$s doesn't attend %2$s's %3$s"
+msgid "%1$s commented on [url=%2$s]a %3$s[/url]"
 msgstr ""
 
-#: include/conversation.php:189
+#: include/enotify.php:188
 #, php-format
-msgid "%1$s attends maybe %2$s's %3$s"
+msgid "%1$s tagged you on [url=%2$s]%3$s's %4$s[/url]"
 msgstr ""
 
-#: include/conversation.php:224
+#: include/enotify.php:195
 #, php-format
-msgid "%1$s is now friends with %2$s"
+msgid "%1$s commented on [url=%2$s]%3$s's %4$s[/url]"
 msgstr ""
 
-#: include/conversation.php:265
+#: include/enotify.php:207
 #, php-format
-msgid "%1$s poked %2$s"
+msgid "%1$s tagged you on [url=%2$s]your %3$s[/url]"
 msgstr ""
 
-#: include/conversation.php:319 mod/tagger.php:101
+#: include/enotify.php:213
 #, php-format
-msgid "%1$s tagged %2$s's %3$s with %4$s"
+msgid "%1$s commented on [url=%2$s]your %3$s[/url]"
 msgstr ""
 
-#: include/conversation.php:341
-msgid "post/item"
+#: include/enotify.php:224
+#, php-format
+msgid "%1$s tagged you on [url=%2$s]their %3$s[/url]"
 msgstr ""
 
-#: include/conversation.php:342
+#: include/enotify.php:230
 #, php-format
-msgid "%1$s marked %2$s's %3$s as favorite"
+msgid "%1$s commented on [url=%2$s]their %3$s[/url]"
 msgstr ""
 
-#: include/conversation.php:568 mod/photos.php:1441 mod/profiles.php:352
-msgid "Likes"
+#: include/enotify.php:243
+#, php-format
+msgid "[Friendica:Notify] %s tagged you"
 msgstr ""
 
-#: include/conversation.php:569 mod/photos.php:1441 mod/profiles.php:355
-msgid "Dislikes"
+#: include/enotify.php:245
+#, php-format
+msgid "%1$s tagged you at %2$s"
 msgstr ""
 
-#: include/conversation.php:570 include/conversation.php:1564
-#: mod/photos.php:1442
-msgid "Attending"
-msgid_plural "Attending"
-msgstr[0] ""
-msgstr[1] ""
-
-#: include/conversation.php:571 mod/photos.php:1442
-msgid "Not attending"
+#: include/enotify.php:247
+#, php-format
+msgid "[Friendica:Notify] Comment to conversation #%1$d by %2$s"
 msgstr ""
 
-#: include/conversation.php:572 mod/photos.php:1442
-msgid "Might attend"
+#: include/enotify.php:249
+#, php-format
+msgid "%s commented on an item/conversation you have been following."
 msgstr ""
 
-#: include/conversation.php:573
-msgid "Reshares"
+#: include/enotify.php:254 include/enotify.php:269 include/enotify.php:284
+#: include/enotify.php:303 include/enotify.php:319
+#, php-format
+msgid "Please visit %s to view and/or reply to the conversation."
 msgstr ""
 
-#: include/conversation.php:653 mod/photos.php:1498 src/Object/Post.php:208
-msgid "Select"
+#: include/enotify.php:261
+#, php-format
+msgid "[Friendica:Notify] %s posted to your profile wall"
 msgstr ""
 
-#: include/conversation.php:654 mod/photos.php:1499 mod/settings.php:735
-#: src/Module/Admin/Users.php:288 src/Module/Contact.php:824
-#: src/Module/Contact.php:1099
-msgid "Delete"
+#: include/enotify.php:263
+#, php-format
+msgid "%1$s posted to your profile wall at %2$s"
 msgstr ""
 
-#: include/conversation.php:679 src/Object/Post.php:382 src/Object/Post.php:383
+#: include/enotify.php:264
 #, php-format
-msgid "View %s's profile @ %s"
+msgid "%1$s posted to [url=%2$s]your wall[/url]"
 msgstr ""
 
-#: include/conversation.php:692 src/Object/Post.php:370
-msgid "Categories:"
+#: include/enotify.php:276
+#, php-format
+msgid "[Friendica:Notify] %s shared a new post"
 msgstr ""
 
-#: include/conversation.php:693 src/Object/Post.php:371
-msgid "Filed under:"
+#: include/enotify.php:278
+#, php-format
+msgid "%1$s shared a new post at %2$s"
 msgstr ""
 
-#: include/conversation.php:700 src/Object/Post.php:396
+#: include/enotify.php:279
 #, php-format
-msgid "%s from %s"
+msgid "%1$s [url=%2$s]shared a post[/url]."
 msgstr ""
 
-#: include/conversation.php:715
-msgid "View in context"
+#: include/enotify.php:291
+#, php-format
+msgid "[Friendica:Notify] %1$s poked you"
 msgstr ""
 
-#: include/conversation.php:717 include/conversation.php:1230
-#: mod/editpost.php:86 mod/message.php:260 mod/message.php:442
-#: mod/photos.php:1414 mod/wallmessage.php:141 src/Object/Post.php:423
-msgid "Please wait"
+#: include/enotify.php:293
+#, php-format
+msgid "%1$s poked you at %2$s"
 msgstr ""
 
-#: include/conversation.php:781
-msgid "remove"
+#: include/enotify.php:294
+#, php-format
+msgid "%1$s [url=%2$s]poked you[/url]."
 msgstr ""
 
-#: include/conversation.php:785
-msgid "Delete Selected Items"
+#: include/enotify.php:311
+#, php-format
+msgid "[Friendica:Notify] %s tagged your post"
 msgstr ""
 
-#: include/conversation.php:940 view/theme/frio/theme.php:358
-msgid "Follow Thread"
+#: include/enotify.php:313
+#, php-format
+msgid "%1$s tagged your post at %2$s"
 msgstr ""
 
-#: include/conversation.php:941 src/Model/Contact.php:1111
-msgid "View Status"
+#: include/enotify.php:314
+#, php-format
+msgid "%1$s tagged [url=%2$s]your post[/url]"
 msgstr ""
 
-#: include/conversation.php:942 include/conversation.php:960 mod/match.php:87
-#: mod/suggest.php:87 src/Model/Contact.php:1051 src/Model/Contact.php:1104
-#: src/Model/Contact.php:1112 src/Module/AllFriends.php:74
-#: src/Module/BaseSearchModule.php:130 src/Module/Directory.php:155
-msgid "View Profile"
+#: include/enotify.php:326
+msgid "[Friendica:Notify] Introduction received"
 msgstr ""
 
-#: include/conversation.php:943 src/Model/Contact.php:1113
-msgid "View Photos"
+#: include/enotify.php:328
+#, php-format
+msgid "You've received an introduction from '%1$s' at %2$s"
 msgstr ""
 
-#: include/conversation.php:944 src/Model/Contact.php:1105
-#: src/Model/Contact.php:1114
-msgid "Network Posts"
+#: include/enotify.php:329
+#, php-format
+msgid "You've received [url=%1$s]an introduction[/url] from %2$s."
 msgstr ""
 
-#: include/conversation.php:945 src/Model/Contact.php:1106
-#: src/Model/Contact.php:1115
-msgid "View Contact"
+#: include/enotify.php:334 include/enotify.php:380
+#, php-format
+msgid "You may visit their profile at %s"
 msgstr ""
 
-#: include/conversation.php:946 src/Model/Contact.php:1117
-msgid "Send PM"
+#: include/enotify.php:336
+#, php-format
+msgid "Please visit %s to approve or reject the introduction."
 msgstr ""
 
-#: include/conversation.php:947 src/Module/Admin/Blocklist/Contact.php:67
-#: src/Module/Admin/Users.php:289 src/Module/Contact.php:617
-#: src/Module/Contact.php:821 src/Module/Contact.php:1074
-msgid "Block"
+#: include/enotify.php:343
+msgid "[Friendica:Notify] A new person is sharing with you"
 msgstr ""
 
-#: include/conversation.php:948 mod/notifications.php:60
-#: mod/notifications.php:189 mod/notifications.php:282
-#: src/Module/Contact.php:618 src/Module/Contact.php:822
-#: src/Module/Contact.php:1082
-msgid "Ignore"
+#: include/enotify.php:345 include/enotify.php:346
+#, php-format
+msgid "%1$s is sharing with you at %2$s"
 msgstr ""
 
-#: include/conversation.php:952 src/Model/Contact.php:1118
-msgid "Poke"
+#: include/enotify.php:353
+msgid "[Friendica:Notify] You have a new follower"
 msgstr ""
 
-#: include/conversation.php:957 mod/follow.php:158 mod/match.php:88
-#: mod/suggest.php:88 src/Content/Widget.php:66 src/Model/Contact.php:1107
-#: src/Module/AllFriends.php:75 src/Module/BaseSearchModule.php:131
-#: src/Module/Contact.php:570 view/theme/vier/theme.php:201
-msgid "Connect/Follow"
+#: include/enotify.php:355 include/enotify.php:356
+#, php-format
+msgid "You have a new follower at %2$s : %1$s"
 msgstr ""
 
-#: include/conversation.php:1082
-#, php-format
-msgid "%s likes this."
+#: include/enotify.php:369
+msgid "[Friendica:Notify] Friend suggestion received"
 msgstr ""
 
-#: include/conversation.php:1085
+#: include/enotify.php:371
 #, php-format
-msgid "%s doesn't like this."
+msgid "You've received a friend suggestion from '%1$s' at %2$s"
 msgstr ""
 
-#: include/conversation.php:1088
+#: include/enotify.php:372
 #, php-format
-msgid "%s attends."
+msgid "You've received [url=%1$s]a friend suggestion[/url] for %2$s from %3$s."
 msgstr ""
 
-#: include/conversation.php:1091
-#, php-format
-msgid "%s doesn't attend."
+#: include/enotify.php:378
+msgid "Name:"
 msgstr ""
 
-#: include/conversation.php:1094
-#, php-format
-msgid "%s attends maybe."
+#: include/enotify.php:379
+msgid "Photo:"
 msgstr ""
 
-#: include/conversation.php:1097 include/conversation.php:1140
+#: include/enotify.php:382
 #, php-format
-msgid "%s reshared this."
+msgid "Please visit %s to approve or reject the suggestion."
 msgstr ""
 
-#: include/conversation.php:1105
-msgid "and"
+#: include/enotify.php:390 include/enotify.php:405
+msgid "[Friendica:Notify] Connection accepted"
 msgstr ""
 
-#: include/conversation.php:1111
+#: include/enotify.php:392 include/enotify.php:407
 #, php-format
-msgid "and %d other people"
+msgid "'%1$s' has accepted your connection request at %2$s"
 msgstr ""
 
-#: include/conversation.php:1119
+#: include/enotify.php:393 include/enotify.php:408
 #, php-format
-msgid "<span  %1$s>%2$d people</span> like this"
+msgid "%2$s has accepted your [url=%1$s]connection request[/url]."
 msgstr ""
 
-#: include/conversation.php:1120
-#, php-format
-msgid "%s like this."
+#: include/enotify.php:398
+msgid ""
+"You are now mutual friends and may exchange status updates, photos, and "
+"email without restriction."
 msgstr ""
 
-#: include/conversation.php:1123
+#: include/enotify.php:400
 #, php-format
-msgid "<span  %1$s>%2$d people</span> don't like this"
+msgid "Please visit %s if you wish to make any changes to this relationship."
 msgstr ""
 
-#: include/conversation.php:1124
+#: include/enotify.php:413
 #, php-format
-msgid "%s don't like this."
+msgid ""
+"'%1$s' has chosen to accept you a fan, which restricts some forms of "
+"communication - such as private messaging and some profile interactions. If "
+"this is a celebrity or community page, these settings were applied "
+"automatically."
 msgstr ""
 
-#: include/conversation.php:1127
+#: include/enotify.php:415
 #, php-format
-msgid "<span  %1$s>%2$d people</span> attend"
+msgid ""
+"'%1$s' may choose to extend this into a two-way or more permissive "
+"relationship in the future."
 msgstr ""
 
-#: include/conversation.php:1128
+#: include/enotify.php:417
 #, php-format
-msgid "%s attend."
+msgid "Please visit %s  if you wish to make any changes to this relationship."
 msgstr ""
 
-#: include/conversation.php:1131
-#, php-format
-msgid "<span  %1$s>%2$d people</span> don't attend"
+#: include/enotify.php:427 mod/removeme.php:46
+msgid "[Friendica System Notify]"
 msgstr ""
 
-#: include/conversation.php:1132
+#: include/enotify.php:427
+msgid "registration request"
+msgstr ""
+
+#: include/enotify.php:429
 #, php-format
-msgid "%s don't attend."
+msgid "You've received a registration request from '%1$s' at %2$s"
 msgstr ""
 
-#: include/conversation.php:1135
+#: include/enotify.php:430
 #, php-format
-msgid "<span  %1$s>%2$d people</span> attend maybe"
+msgid "You've received a [url=%1$s]registration request[/url] from %2$s."
 msgstr ""
 
-#: include/conversation.php:1136
+#: include/enotify.php:435
 #, php-format
-msgid "%s attend maybe."
+msgid ""
+"Full Name:\t%s\n"
+"Site Location:\t%s\n"
+"Login Name:\t%s (%s)"
 msgstr ""
 
-#: include/conversation.php:1139
+#: include/enotify.php:441
 #, php-format
-msgid "<span  %1$s>%2$d people</span> reshared this"
+msgid "Please visit %s to approve or reject the request."
 msgstr ""
 
-#: include/conversation.php:1169
-msgid "Visible to <strong>everybody</strong>"
-msgstr ""
+#: include/api.php:1119
+#, 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/conversation.php:1170 src/Object/Post.php:886
-msgid "Please enter a image/video/audio/webpage URL:"
-msgstr ""
+#: include/api.php:1133
+#, 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/conversation.php:1171
-msgid "Tag term:"
+#: include/api.php:1147
+#, php-format
+msgid "Monthly posting limit of %d post reached. The post was rejected."
 msgstr ""
 
-#: include/conversation.php:1172 src/Module/Filer/SaveTag.php:48
-msgid "Save to Folder:"
+#: include/api.php:4587 mod/photos.php:91 mod/photos.php:196 mod/photos.php:640
+#: mod/photos.php:1090 mod/photos.php:1107 mod/photos.php:1610
+#: mod/profile_photo.php:85 mod/profile_photo.php:94 mod/profile_photo.php:103
+#: mod/profile_photo.php:210 mod/profile_photo.php:298
+#: mod/profile_photo.php:308 src/Model/User.php:796 src/Model/User.php:804
+#: src/Model/User.php:812
+msgid "Profile Photos"
 msgstr ""
 
-#: include/conversation.php:1173
-msgid "Where are you right now?"
+#: include/conversation.php:161 include/conversation.php:298
+#: src/Model/Item.php:3300
+msgid "event"
 msgstr ""
 
-#: include/conversation.php:1174
-msgid "Delete item(s)?"
+#: include/conversation.php:164 include/conversation.php:174
+#: include/conversation.php:301 include/conversation.php:310
+#: mod/subthread.php:88 mod/tagger.php:69
+msgid "status"
 msgstr ""
 
-#: include/conversation.php:1206
-msgid "New Post"
+#: include/conversation.php:169 include/conversation.php:306
+#: mod/subthread.php:88 mod/tagger.php:69 src/Model/Item.php:3302
+msgid "photo"
 msgstr ""
 
-#: include/conversation.php:1209
-msgid "Share"
+#: include/conversation.php:182
+#, php-format
+msgid "%1$s likes %2$s's %3$s"
 msgstr ""
 
-#: include/conversation.php:1210 mod/editpost.php:72 mod/message.php:258
-#: mod/message.php:439 mod/wallmessage.php:139
-msgid "Upload photo"
+#: include/conversation.php:184
+#, php-format
+msgid "%1$s doesn't like %2$s's %3$s"
 msgstr ""
 
-#: include/conversation.php:1211 mod/editpost.php:73
-msgid "upload photo"
+#: include/conversation.php:186
+#, php-format
+msgid "%1$s attends %2$s's %3$s"
 msgstr ""
 
-#: include/conversation.php:1212 mod/editpost.php:74
-msgid "Attach file"
+#: include/conversation.php:188
+#, php-format
+msgid "%1$s doesn't attend %2$s's %3$s"
 msgstr ""
 
-#: include/conversation.php:1213 mod/editpost.php:75
-msgid "attach file"
+#: include/conversation.php:190
+#, php-format
+msgid "%1$s attends maybe %2$s's %3$s"
 msgstr ""
 
-#: include/conversation.php:1214 src/Object/Post.php:878
-msgid "Bold"
+#: include/conversation.php:225
+#, php-format
+msgid "%1$s is now friends with %2$s"
 msgstr ""
 
-#: include/conversation.php:1215 src/Object/Post.php:879
-msgid "Italic"
+#: include/conversation.php:266
+#, php-format
+msgid "%1$s poked %2$s"
 msgstr ""
 
-#: include/conversation.php:1216 src/Object/Post.php:880
-msgid "Underline"
+#: include/conversation.php:320 mod/tagger.php:102
+#, php-format
+msgid "%1$s tagged %2$s's %3$s with %4$s"
 msgstr ""
 
-#: include/conversation.php:1217 src/Object/Post.php:881
-msgid "Quote"
+#: include/conversation.php:342
+msgid "post/item"
 msgstr ""
 
-#: include/conversation.php:1218 src/Object/Post.php:882
-msgid "Code"
+#: include/conversation.php:343
+#, php-format
+msgid "%1$s marked %2$s's %3$s as favorite"
 msgstr ""
 
-#: include/conversation.php:1219 src/Object/Post.php:883
-msgid "Image"
+#: include/conversation.php:569 mod/profiles.php:352 mod/photos.php:1442
+msgid "Likes"
 msgstr ""
 
-#: include/conversation.php:1220 src/Object/Post.php:884
-msgid "Link"
+#: include/conversation.php:570 mod/profiles.php:355 mod/photos.php:1442
+msgid "Dislikes"
 msgstr ""
 
-#: include/conversation.php:1221 src/Object/Post.php:885
-msgid "Link or Media"
-msgstr ""
+#: include/conversation.php:571 include/conversation.php:1565
+#: mod/photos.php:1443
+msgid "Attending"
+msgid_plural "Attending"
+msgstr[0] ""
+msgstr[1] ""
 
-#: include/conversation.php:1222 mod/editpost.php:82
-msgid "Set your location"
+#: include/conversation.php:572 mod/photos.php:1443
+msgid "Not attending"
 msgstr ""
 
-#: include/conversation.php:1223 mod/editpost.php:83
-msgid "set location"
+#: include/conversation.php:573 mod/photos.php:1443
+msgid "Might attend"
 msgstr ""
 
-#: include/conversation.php:1224 mod/editpost.php:84
-msgid "Clear browser location"
+#: include/conversation.php:574
+msgid "Reshares"
 msgstr ""
 
-#: include/conversation.php:1225 mod/editpost.php:85
-msgid "clear location"
+#: include/conversation.php:654 mod/photos.php:1499 src/Object/Post.php:209
+msgid "Select"
 msgstr ""
 
-#: include/conversation.php:1227 mod/editpost.php:99
-msgid "Set title"
+#: include/conversation.php:655 mod/photos.php:1500 mod/settings.php:738
+#: src/Module/Admin/Users.php:288 src/Module/Contact.php:830
+#: src/Module/Contact.php:1101
+msgid "Delete"
 msgstr ""
 
-#: include/conversation.php:1229 mod/editpost.php:101
-msgid "Categories (comma-separated list)"
+#: include/conversation.php:680 src/Object/Post.php:383 src/Object/Post.php:384
+#, php-format
+msgid "View %s's profile @ %s"
 msgstr ""
 
-#: include/conversation.php:1231 mod/editpost.php:87
-msgid "Permission settings"
+#: include/conversation.php:693 src/Object/Post.php:371
+msgid "Categories:"
 msgstr ""
 
-#: include/conversation.php:1232 mod/editpost.php:116
-msgid "permissions"
+#: include/conversation.php:694 src/Object/Post.php:372
+msgid "Filed under:"
 msgstr ""
 
-#: include/conversation.php:1241 mod/editpost.php:96
-msgid "Public post"
+#: include/conversation.php:701 src/Object/Post.php:397
+#, php-format
+msgid "%s from %s"
 msgstr ""
 
-#: include/conversation.php:1245 mod/editpost.php:107 mod/events.php:549
-#: mod/photos.php:1432 mod/photos.php:1471 mod/photos.php:1531
-#: src/Object/Post.php:887
-msgid "Preview"
+#: include/conversation.php:716
+msgid "View in context"
 msgstr ""
 
-#: include/conversation.php:1249 include/items.php:397 mod/dfrn_request.php:650
-#: mod/editpost.php:110 mod/fbrowser.php:110 mod/fbrowser.php:139
-#: mod/follow.php:172 mod/message.php:153 mod/photos.php:1084
-#: mod/photos.php:1191 mod/settings.php:675 mod/settings.php:701
-#: mod/suggest.php:76 mod/tagrm.php:20 mod/tagrm.php:115 mod/unfollow.php:132
-#: src/Module/Contact.php:443
-msgid "Cancel"
+#: include/conversation.php:718 include/conversation.php:1231
+#: mod/wallmessage.php:141 mod/editpost.php:86 mod/message.php:260
+#: mod/message.php:442 mod/photos.php:1415 src/Module/Item/Compose.php:193
+#: src/Object/Post.php:424
+msgid "Please wait"
 msgstr ""
 
-#: include/conversation.php:1254
-msgid "Post to Groups"
+#: include/conversation.php:782
+msgid "remove"
 msgstr ""
 
-#: include/conversation.php:1255
-msgid "Post to Contacts"
+#: include/conversation.php:786
+msgid "Delete Selected Items"
 msgstr ""
 
-#: include/conversation.php:1256
-msgid "Private post"
+#: include/conversation.php:941 view/theme/frio/theme.php:363
+msgid "Follow Thread"
 msgstr ""
 
-#: include/conversation.php:1261 mod/editpost.php:114 src/Model/Profile.php:366
-msgid "Message"
+#: include/conversation.php:942 src/Model/Contact.php:1198
+msgid "View Status"
 msgstr ""
 
-#: include/conversation.php:1262 mod/editpost.php:115
-msgid "Browser"
+#: include/conversation.php:943 include/conversation.php:961 mod/match.php:87
+#: mod/suggest.php:87 src/Model/Contact.php:1138 src/Model/Contact.php:1191
+#: src/Model/Contact.php:1199 src/Module/AllFriends.php:74
+#: src/Module/BaseSearchModule.php:133 src/Module/Directory.php:150
+msgid "View Profile"
 msgstr ""
 
-#: include/conversation.php:1534
-msgid "View all"
+#: include/conversation.php:944 src/Model/Contact.php:1200
+msgid "View Photos"
 msgstr ""
 
-#: include/conversation.php:1558
-msgid "Like"
-msgid_plural "Likes"
-msgstr[0] ""
-msgstr[1] ""
+#: include/conversation.php:945 src/Model/Contact.php:1192
+#: src/Model/Contact.php:1201
+msgid "Network Posts"
+msgstr ""
 
-#: include/conversation.php:1561
-msgid "Dislike"
-msgid_plural "Dislikes"
-msgstr[0] ""
-msgstr[1] ""
+#: include/conversation.php:946 src/Model/Contact.php:1193
+#: src/Model/Contact.php:1202
+msgid "View Contact"
+msgstr ""
 
-#: include/conversation.php:1567
-msgid "Not Attending"
-msgid_plural "Not Attending"
-msgstr[0] ""
-msgstr[1] ""
+#: include/conversation.php:947 src/Model/Contact.php:1204
+msgid "Send PM"
+msgstr ""
 
-#: include/conversation.php:1570 src/Content/ContactSelector.php:167
-msgid "Undecided"
-msgid_plural "Undecided"
-msgstr[0] ""
-msgstr[1] ""
+#: include/conversation.php:948 src/Module/Admin/Blocklist/Contact.php:67
+#: src/Module/Admin/Users.php:289 src/Module/Contact.php:623
+#: src/Module/Contact.php:827 src/Module/Contact.php:1076
+msgid "Block"
+msgstr ""
 
-#: include/enotify.php:57
-msgid "Friendica Notification"
+#: include/conversation.php:949 mod/notifications.php:60
+#: mod/notifications.php:189 mod/notifications.php:282
+#: src/Module/Contact.php:624 src/Module/Contact.php:828
+#: src/Module/Contact.php:1084
+msgid "Ignore"
 msgstr ""
 
-#: include/enotify.php:60
-msgid "Thank You,"
+#: include/conversation.php:953 src/Model/Contact.php:1205
+msgid "Poke"
 msgstr ""
 
-#: include/enotify.php:63
-#, php-format
-msgid "%1$s, %2$s Administrator"
+#: include/conversation.php:958 mod/match.php:88 mod/follow.php:160
+#: mod/suggest.php:88 view/theme/vier/theme.php:201 src/Content/Widget.php:66
+#: src/Model/Contact.php:1194 src/Module/AllFriends.php:75
+#: src/Module/BaseSearchModule.php:134
+msgid "Connect/Follow"
 msgstr ""
 
-#: include/enotify.php:65
+#: include/conversation.php:1083
 #, php-format
-msgid "%s Administrator"
+msgid "%s likes this."
 msgstr ""
 
-#: include/enotify.php:134
+#: include/conversation.php:1086
 #, php-format
-msgid "[Friendica:Notify] New mail received at %s"
+msgid "%s doesn't like this."
 msgstr ""
 
-#: include/enotify.php:136
+#: include/conversation.php:1089
 #, php-format
-msgid "%1$s sent you a new private message at %2$s."
+msgid "%s attends."
 msgstr ""
 
-#: include/enotify.php:137
-msgid "a private message"
+#: include/conversation.php:1092
+#, php-format
+msgid "%s doesn't attend."
 msgstr ""
 
-#: include/enotify.php:137
+#: include/conversation.php:1095
 #, php-format
-msgid "%1$s sent you %2$s."
+msgid "%s attends maybe."
 msgstr ""
 
-#: include/enotify.php:139
+#: include/conversation.php:1098 include/conversation.php:1141
 #, php-format
-msgid "Please visit %s to view and/or reply to your private messages."
+msgid "%s reshared this."
 msgstr ""
 
-#: include/enotify.php:172
-#, php-format
-msgid "%1$s tagged you on [url=%2$s]a %3$s[/url]"
+#: include/conversation.php:1106
+msgid "and"
 msgstr ""
 
-#: include/enotify.php:178
+#: include/conversation.php:1112
 #, php-format
-msgid "%1$s commented on [url=%2$s]a %3$s[/url]"
+msgid "and %d other people"
 msgstr ""
 
-#: include/enotify.php:188
+#: include/conversation.php:1120
 #, php-format
-msgid "%1$s tagged you on [url=%2$s]%3$s's %4$s[/url]"
+msgid "<span  %1$s>%2$d people</span> like this"
 msgstr ""
 
-#: include/enotify.php:195
+#: include/conversation.php:1121
 #, php-format
-msgid "%1$s commented on [url=%2$s]%3$s's %4$s[/url]"
+msgid "%s like this."
 msgstr ""
 
-#: include/enotify.php:207
+#: include/conversation.php:1124
 #, php-format
-msgid "%1$s tagged you on [url=%2$s]your %3$s[/url]"
+msgid "<span  %1$s>%2$d people</span> don't like this"
 msgstr ""
 
-#: include/enotify.php:213
+#: include/conversation.php:1125
 #, php-format
-msgid "%1$s commented on [url=%2$s]your %3$s[/url]"
+msgid "%s don't like this."
 msgstr ""
 
-#: include/enotify.php:224
+#: include/conversation.php:1128
 #, php-format
-msgid "%1$s tagged you on [url=%2$s]their %3$s[/url]"
+msgid "<span  %1$s>%2$d people</span> attend"
 msgstr ""
 
-#: include/enotify.php:230
+#: include/conversation.php:1129
 #, php-format
-msgid "%1$s commented on [url=%2$s]their %3$s[/url]"
+msgid "%s attend."
 msgstr ""
 
-#: include/enotify.php:243
+#: include/conversation.php:1132
 #, php-format
-msgid "[Friendica:Notify] %s tagged you"
+msgid "<span  %1$s>%2$d people</span> don't attend"
 msgstr ""
 
-#: include/enotify.php:245
+#: include/conversation.php:1133
 #, php-format
-msgid "%1$s tagged you at %2$s"
+msgid "%s don't attend."
 msgstr ""
 
-#: include/enotify.php:247
+#: include/conversation.php:1136
 #, php-format
-msgid "[Friendica:Notify] Comment to conversation #%1$d by %2$s"
+msgid "<span  %1$s>%2$d people</span> attend maybe"
 msgstr ""
 
-#: include/enotify.php:249
+#: include/conversation.php:1137
 #, php-format
-msgid "%s commented on an item/conversation you have been following."
+msgid "%s attend maybe."
 msgstr ""
 
-#: include/enotify.php:254 include/enotify.php:269 include/enotify.php:284
-#: include/enotify.php:303 include/enotify.php:319
+#: include/conversation.php:1140
 #, php-format
-msgid "Please visit %s to view and/or reply to the conversation."
+msgid "<span  %1$s>%2$d people</span> reshared this"
 msgstr ""
 
-#: include/enotify.php:261
-#, php-format
-msgid "[Friendica:Notify] %s posted to your profile wall"
+#: include/conversation.php:1170
+msgid "Visible to <strong>everybody</strong>"
 msgstr ""
 
-#: include/enotify.php:263
-#, php-format
-msgid "%1$s posted to your profile wall at %2$s"
+#: include/conversation.php:1171 src/Module/Item/Compose.php:187
+#: src/Object/Post.php:887
+msgid "Please enter a image/video/audio/webpage URL:"
 msgstr ""
 
-#: include/enotify.php:264
-#, php-format
-msgid "%1$s posted to [url=%2$s]your wall[/url]"
+#: include/conversation.php:1172
+msgid "Tag term:"
 msgstr ""
 
-#: include/enotify.php:276
-#, php-format
-msgid "[Friendica:Notify] %s shared a new post"
+#: include/conversation.php:1173 src/Module/Filer/SaveTag.php:48
+msgid "Save to Folder:"
 msgstr ""
 
-#: include/enotify.php:278
-#, php-format
-msgid "%1$s shared a new post at %2$s"
+#: include/conversation.php:1174
+msgid "Where are you right now?"
 msgstr ""
 
-#: include/enotify.php:279
-#, php-format
-msgid "%1$s [url=%2$s]shared a post[/url]."
+#: include/conversation.php:1175
+msgid "Delete item(s)?"
 msgstr ""
 
-#: include/enotify.php:291
-#, php-format
-msgid "[Friendica:Notify] %1$s poked you"
+#: include/conversation.php:1207
+msgid "New Post"
 msgstr ""
 
-#: include/enotify.php:293
-#, php-format
-msgid "%1$s poked you at %2$s"
+#: include/conversation.php:1210
+msgid "Share"
 msgstr ""
 
-#: include/enotify.php:294
-#, php-format
-msgid "%1$s [url=%2$s]poked you[/url]."
+#: include/conversation.php:1211 mod/wallmessage.php:139 mod/editpost.php:72
+#: mod/message.php:258 mod/message.php:439
+msgid "Upload photo"
 msgstr ""
 
-#: include/enotify.php:311
-#, php-format
-msgid "[Friendica:Notify] %s tagged your post"
+#: include/conversation.php:1212 mod/editpost.php:73
+msgid "upload photo"
 msgstr ""
 
-#: include/enotify.php:313
-#, php-format
-msgid "%1$s tagged your post at %2$s"
+#: include/conversation.php:1213 mod/editpost.php:74
+msgid "Attach file"
 msgstr ""
 
-#: include/enotify.php:314
-#, php-format
-msgid "%1$s tagged [url=%2$s]your post[/url]"
+#: include/conversation.php:1214 mod/editpost.php:75
+msgid "attach file"
 msgstr ""
 
-#: include/enotify.php:326
-msgid "[Friendica:Notify] Introduction received"
+#: include/conversation.php:1215 src/Module/Item/Compose.php:179
+#: src/Object/Post.php:879
+msgid "Bold"
 msgstr ""
 
-#: include/enotify.php:328
-#, php-format
-msgid "You've received an introduction from '%1$s' at %2$s"
+#: include/conversation.php:1216 src/Module/Item/Compose.php:180
+#: src/Object/Post.php:880
+msgid "Italic"
 msgstr ""
 
-#: include/enotify.php:329
-#, php-format
-msgid "You've received [url=%1$s]an introduction[/url] from %2$s."
+#: include/conversation.php:1217 src/Module/Item/Compose.php:181
+#: src/Object/Post.php:881
+msgid "Underline"
 msgstr ""
 
-#: include/enotify.php:334 include/enotify.php:380
-#, php-format
-msgid "You may visit their profile at %s"
+#: include/conversation.php:1218 src/Module/Item/Compose.php:182
+#: src/Object/Post.php:882
+msgid "Quote"
 msgstr ""
 
-#: include/enotify.php:336
-#, php-format
-msgid "Please visit %s to approve or reject the introduction."
+#: include/conversation.php:1219 src/Module/Item/Compose.php:183
+#: src/Object/Post.php:883
+msgid "Code"
 msgstr ""
 
-#: include/enotify.php:343
-msgid "[Friendica:Notify] A new person is sharing with you"
+#: include/conversation.php:1220 src/Module/Item/Compose.php:184
+#: src/Object/Post.php:884
+msgid "Image"
 msgstr ""
 
-#: include/enotify.php:345 include/enotify.php:346
-#, php-format
-msgid "%1$s is sharing with you at %2$s"
+#: include/conversation.php:1221 src/Module/Item/Compose.php:185
+#: src/Object/Post.php:885
+msgid "Link"
 msgstr ""
 
-#: include/enotify.php:353
-msgid "[Friendica:Notify] You have a new follower"
+#: include/conversation.php:1222 src/Module/Item/Compose.php:186
+#: src/Object/Post.php:886
+msgid "Link or Media"
 msgstr ""
 
-#: include/enotify.php:355 include/enotify.php:356
-#, php-format
-msgid "You have a new follower at %2$s : %1$s"
+#: include/conversation.php:1223 mod/editpost.php:82
+#: src/Module/Item/Compose.php:189
+msgid "Set your location"
 msgstr ""
 
-#: include/enotify.php:369
-msgid "[Friendica:Notify] Friend suggestion received"
+#: include/conversation.php:1224 mod/editpost.php:83
+msgid "set location"
 msgstr ""
 
-#: include/enotify.php:371
-#, php-format
-msgid "You've received a friend suggestion from '%1$s' at %2$s"
+#: include/conversation.php:1225 mod/editpost.php:84
+msgid "Clear browser location"
 msgstr ""
 
-#: include/enotify.php:372
-#, php-format
-msgid "You've received [url=%1$s]a friend suggestion[/url] for %2$s from %3$s."
+#: include/conversation.php:1226 mod/editpost.php:85
+msgid "clear location"
 msgstr ""
 
-#: include/enotify.php:378
-msgid "Name:"
+#: include/conversation.php:1228 mod/editpost.php:99
+#: src/Module/Item/Compose.php:194
+msgid "Set title"
 msgstr ""
 
-#: include/enotify.php:379
-msgid "Photo:"
+#: include/conversation.php:1230 mod/editpost.php:101
+#: src/Module/Item/Compose.php:195
+msgid "Categories (comma-separated list)"
 msgstr ""
 
-#: include/enotify.php:382
-#, php-format
-msgid "Please visit %s to approve or reject the suggestion."
+#: include/conversation.php:1232 mod/editpost.php:87
+msgid "Permission settings"
 msgstr ""
 
-#: include/enotify.php:390 include/enotify.php:405
-msgid "[Friendica:Notify] Connection accepted"
+#: include/conversation.php:1233 mod/editpost.php:116
+msgid "permissions"
 msgstr ""
 
-#: include/enotify.php:392 include/enotify.php:407
-#, php-format
-msgid "'%1$s' has accepted your connection request at %2$s"
+#: include/conversation.php:1242 mod/editpost.php:96
+msgid "Public post"
 msgstr ""
 
-#: include/enotify.php:393 include/enotify.php:408
-#, php-format
-msgid "%2$s has accepted your [url=%1$s]connection request[/url]."
+#: include/conversation.php:1246 mod/editpost.php:107 mod/events.php:550
+#: mod/photos.php:1433 mod/photos.php:1472 mod/photos.php:1532
+#: src/Module/Item/Compose.php:188 src/Object/Post.php:888
+msgid "Preview"
 msgstr ""
 
-#: include/enotify.php:398
-msgid ""
-"You are now mutual friends and may exchange status updates, photos, and "
-"email without restriction."
+#: include/conversation.php:1250 include/items.php:397 mod/tagrm.php:20
+#: mod/tagrm.php:115 mod/unfollow.php:132 mod/dfrn_request.php:650
+#: mod/editpost.php:110 mod/fbrowser.php:110 mod/fbrowser.php:139
+#: mod/follow.php:174 mod/message.php:153 mod/photos.php:1084
+#: mod/photos.php:1191 mod/settings.php:678 mod/settings.php:704
+#: mod/suggest.php:76 src/Module/Contact.php:464
+msgid "Cancel"
 msgstr ""
 
-#: include/enotify.php:400
-#, php-format
-msgid "Please visit %s if you wish to make any changes to this relationship."
+#: include/conversation.php:1255
+msgid "Post to Groups"
 msgstr ""
 
-#: include/enotify.php:413
-#, php-format
-msgid ""
-"'%1$s' has chosen to accept you a fan, which restricts some forms of "
-"communication - such as private messaging and some profile interactions. If "
-"this is a celebrity or community page, these settings were applied "
-"automatically."
+#: include/conversation.php:1256
+msgid "Post to Contacts"
 msgstr ""
 
-#: include/enotify.php:415
-#, php-format
-msgid ""
-"'%1$s' may choose to extend this into a two-way or more permissive "
-"relationship in the future."
+#: include/conversation.php:1257
+msgid "Private post"
 msgstr ""
 
-#: include/enotify.php:417
-#, php-format
-msgid "Please visit %s  if you wish to make any changes to this relationship."
+#: include/conversation.php:1262 mod/editpost.php:114 src/Model/Profile.php:542
+#: src/Module/Contact.php:339
+msgid "Message"
 msgstr ""
 
-#: include/enotify.php:427 mod/removeme.php:46
-msgid "[Friendica System Notify]"
+#: include/conversation.php:1263 mod/editpost.php:115
+msgid "Browser"
 msgstr ""
 
-#: include/enotify.php:427
-msgid "registration request"
+#: include/conversation.php:1535
+msgid "View all"
 msgstr ""
 
-#: include/enotify.php:429
-#, php-format
-msgid "You've received a registration request from '%1$s' at %2$s"
-msgstr ""
+#: include/conversation.php:1559
+msgid "Like"
+msgid_plural "Likes"
+msgstr[0] ""
+msgstr[1] ""
 
-#: include/enotify.php:430
-#, php-format
-msgid "You've received a [url=%1$s]registration request[/url] from %2$s."
-msgstr ""
+#: include/conversation.php:1562
+msgid "Dislike"
+msgid_plural "Dislikes"
+msgstr[0] ""
+msgstr[1] ""
 
-#: include/enotify.php:435
-#, php-format
-msgid ""
-"Full Name:\t%s\n"
-"Site Location:\t%s\n"
-"Login Name:\t%s (%s)"
-msgstr ""
+#: include/conversation.php:1568
+msgid "Not Attending"
+msgid_plural "Not Attending"
+msgstr[0] ""
+msgstr[1] ""
 
-#: include/enotify.php:441
-#, php-format
-msgid "Please visit %s to approve or reject the request."
-msgstr ""
+#: include/conversation.php:1571 src/Content/ContactSelector.php:167
+msgid "Undecided"
+msgid_plural "Undecided"
+msgstr[0] ""
+msgstr[1] ""
 
 #: include/items.php:354 src/Module/Admin/Themes/Details.php:53
 #: src/Module/Admin/Themes/Index.php:41 src/Module/Debug/ItemBody.php:27
@@ -839,33 +853,33 @@ msgstr ""
 msgid "Do you really want to delete this item?"
 msgstr ""
 
-#: include/items.php:394 mod/api.php:109 mod/dfrn_request.php:640
-#: mod/follow.php:161 mod/message.php:150 mod/profiles.php:526
-#: mod/profiles.php:529 mod/profiles.php:551 mod/settings.php:1084
-#: mod/settings.php:1090 mod/settings.php:1097 mod/settings.php:1101
-#: mod/settings.php:1105 mod/settings.php:1109 mod/settings.php:1113
-#: mod/settings.php:1117 mod/settings.php:1137 mod/settings.php:1138
-#: mod/settings.php:1139 mod/settings.php:1140 mod/settings.php:1141
-#: mod/suggest.php:73 src/Module/Contact.php:440 src/Module/Register.php:97
+#: include/items.php:394 mod/api.php:109 mod/profiles.php:526
+#: mod/profiles.php:529 mod/profiles.php:551 mod/dfrn_request.php:640
+#: mod/follow.php:163 mod/message.php:150 mod/settings.php:1089
+#: mod/settings.php:1095 mod/settings.php:1102 mod/settings.php:1106
+#: mod/settings.php:1110 mod/settings.php:1114 mod/settings.php:1118
+#: mod/settings.php:1122 mod/settings.php:1142 mod/settings.php:1143
+#: mod/settings.php:1144 mod/settings.php:1145 mod/settings.php:1146
+#: mod/suggest.php:73 src/Module/Contact.php:461 src/Module/Register.php:97
 msgid "Yes"
 msgstr ""
 
-#: include/items.php:444 mod/api.php:34 mod/api.php:39 mod/cal.php:301
-#: mod/common.php:27 mod/crepair.php:90 mod/delegate.php:30 mod/delegate.php:48
-#: mod/delegate.php:59 mod/dfrn_confirm.php:64 mod/editpost.php:21
-#: mod/events.php:207 mod/follow.php:57 mod/follow.php:132 mod/fsuggest.php:62
-#: mod/item.php:169 mod/manage.php:130 mod/message.php:56 mod/message.php:101
-#: mod/network.php:36 mod/notes.php:27 mod/notifications.php:70
-#: mod/ostatus_subscribe.php:18 mod/photos.php:178 mod/photos.php:962
-#: 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:50
-#: mod/settings.php:163 mod/settings.php:664 mod/suggest.php:39
-#: mod/uimport.php:17 mod/unfollow.php:22 mod/unfollow.php:77
-#: mod/unfollow.php:109 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/Module/Attach.php:42 src/Module/Contact.php:357
+#: include/items.php:444 mod/api.php:34 mod/api.php:39 mod/delegate.php:30
+#: mod/delegate.php:48 mod/delegate.php:59 mod/ostatus_subscribe.php:18
+#: mod/regmod.php:89 mod/repair_ostatus.php:16 mod/uimport.php:17
+#: mod/unfollow.php:22 mod/unfollow.php:77 mod/unfollow.php:109
+#: 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 mod/profiles.php:182
+#: mod/profiles.php:499 mod/cal.php:301 mod/common.php:27 mod/crepair.php:90
+#: mod/dfrn_confirm.php:64 mod/editpost.php:21 mod/events.php:208
+#: mod/follow.php:57 mod/follow.php:134 mod/fsuggest.php:63 mod/item.php:170
+#: mod/manage.php:130 mod/message.php:56 mod/message.php:101 mod/network.php:37
+#: mod/notes.php:27 mod/notifications.php:70 mod/photos.php:178
+#: mod/photos.php:962 mod/poke.php:141 mod/profile_photo.php:32
+#: mod/profile_photo.php:177 mod/profile_photo.php:197 mod/settings.php:52
+#: mod/settings.php:165 mod/settings.php:667 mod/suggest.php:39
+#: src/Module/Attach.php:42 src/Module/Contact.php:378
 #: src/Module/FollowConfirm.php:27 src/Module/Group.php:31
 #: src/Module/Group.php:77 src/Module/Invite.php:22 src/Module/Invite.php:110
 #: src/Module/Notifications/Notify.php:19 src/Module/Profile/Contacts.php:50
@@ -891,2003 +905,2222 @@ msgid ""
 "and/or create new posts for you?"
 msgstr ""
 
-#: mod/api.php:110 mod/dfrn_request.php:640 mod/follow.php:161
-#: mod/profiles.php:526 mod/profiles.php:530 mod/profiles.php:551
-#: mod/settings.php:1084 mod/settings.php:1090 mod/settings.php:1097
-#: mod/settings.php:1101 mod/settings.php:1105 mod/settings.php:1109
-#: mod/settings.php:1113 mod/settings.php:1117 mod/settings.php:1137
-#: mod/settings.php:1138 mod/settings.php:1139 mod/settings.php:1140
-#: mod/settings.php:1141 src/Module/Register.php:98
+#: mod/api.php:110 mod/profiles.php:526 mod/profiles.php:530
+#: mod/profiles.php:551 mod/dfrn_request.php:640 mod/follow.php:163
+#: mod/settings.php:1089 mod/settings.php:1095 mod/settings.php:1102
+#: mod/settings.php:1106 mod/settings.php:1110 mod/settings.php:1114
+#: mod/settings.php:1118 mod/settings.php:1122 mod/settings.php:1142
+#: mod/settings.php:1143 mod/settings.php:1144 mod/settings.php:1145
+#: mod/settings.php:1146 src/Module/Register.php:98
 msgid "No"
 msgstr ""
 
-#: mod/cal.php:34 mod/cal.php:38 mod/community.php:39 mod/follow.php:20
-#: src/Module/Debug/ItemBody.php:18
-msgid "Access denied."
+#: mod/delegate.php:42
+msgid "Parent user not found."
 msgstr ""
 
-#: mod/cal.php:140 mod/display.php:306 src/Module/Profile.php:176
-msgid "Access to this profile has been restricted."
+#: mod/delegate.php:149
+msgid "No parent user"
 msgstr ""
 
-#: mod/cal.php:271 mod/events.php:382 src/Content/Nav.php:159
-#: src/Content/Nav.php:225 src/Model/Profile.php:934 src/Model/Profile.php:945
-#: view/theme/frio/theme.php:266 view/theme/frio/theme.php:270
-msgid "Events"
+#: mod/delegate.php:164
+msgid "Parent Password:"
 msgstr ""
 
-#: mod/cal.php:272 mod/events.php:383
-msgid "View"
+#: mod/delegate.php:164
+msgid ""
+"Please enter the password of the parent account to legitimize your request."
 msgstr ""
 
-#: mod/cal.php:273 mod/events.php:385
-msgid "Previous"
+#: mod/delegate.php:171
+msgid "Parent User"
 msgstr ""
 
-#: mod/cal.php:274 mod/events.php:386 src/Module/Install.php:173
-msgid "Next"
+#: 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 ""
 
-#: mod/cal.php:277 mod/events.php:391 src/Model/Event.php:428
-msgid "today"
+#: mod/delegate.php:175 mod/settings.php:677 mod/settings.php:784
+#: mod/settings.php:874 mod/settings.php:953 mod/settings.php:1178
+#: src/Module/Admin/Addons/Index.php:52 src/Module/Admin/Features.php:69
+#: src/Module/Admin/Logs/Settings.php:65 src/Module/Admin/Site.php:569
+#: src/Module/Admin/Themes/Index.php:95 src/Module/Admin/Tos.php:50
+msgid "Save Settings"
 msgstr ""
 
-#: mod/cal.php:278 mod/events.php:392 src/Model/Event.php:429
-#: src/Util/Temporal.php:314
-msgid "month"
+#: mod/delegate.php:176 src/Content/Nav.php:263
+msgid "Delegate Page Management"
 msgstr ""
 
-#: mod/cal.php:279 mod/events.php:393 src/Model/Event.php:430
-#: src/Util/Temporal.php:315
-msgid "week"
+#: mod/delegate.php:177
+msgid "Delegates"
 msgstr ""
 
-#: mod/cal.php:280 mod/events.php:394 src/Model/Event.php:431
-#: src/Util/Temporal.php:316
-msgid "day"
+#: mod/delegate.php:179
+msgid ""
+"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."
 msgstr ""
 
-#: mod/cal.php:281 mod/events.php:395
-msgid "list"
+#: mod/delegate.php:180
+msgid "Existing Page Delegates"
 msgstr ""
 
-#: mod/cal.php:294 src/Console/NewPassword.php:67 src/Model/User.php:351
-msgid "User not found"
+#: mod/delegate.php:182
+msgid "Potential Delegates"
 msgstr ""
 
-#: mod/cal.php:310
-msgid "This calendar format is not supported"
+#: mod/delegate.php:184 mod/tagrm.php:114
+msgid "Remove"
 msgstr ""
 
-#: mod/cal.php:312
-msgid "No exportable data found"
+#: mod/delegate.php:185
+msgid "Add"
 msgstr ""
 
-#: mod/cal.php:329
-msgid "calendar"
+#: mod/delegate.php:186
+msgid "No entries."
 msgstr ""
 
-#: mod/common.php:90
-msgid "No contacts in common."
+#: mod/oexchange.php:32
+msgid "Post successful."
 msgstr ""
 
-#: mod/common.php:141 src/Module/Contact.php:889
-msgid "Common Friends"
+#: mod/ostatus_subscribe.php:23
+msgid "Subscribing to OStatus contacts"
 msgstr ""
 
-#: mod/community.php:32 mod/dfrn_request.php:597 mod/display.php:204
-#: mod/photos.php:850 mod/search.php:94 mod/search.php:100 mod/videos.php:118
-#: src/Module/Debug/Probe.php:20 src/Module/Debug/WebFinger.php:19
-#: src/Module/Directory.php:43
-msgid "Public access denied."
+#: mod/ostatus_subscribe.php:35
+msgid "No contact provided."
 msgstr ""
 
-#: mod/community.php:75
-msgid "Community option not available."
+#: mod/ostatus_subscribe.php:42
+msgid "Couldn't fetch information for contact."
 msgstr ""
 
-#: mod/community.php:92
-msgid "Not available."
+#: mod/ostatus_subscribe.php:52
+msgid "Couldn't fetch friends for contact."
 msgstr ""
 
-#: mod/community.php:102
-msgid "Local Community"
+#: mod/ostatus_subscribe.php:70 mod/repair_ostatus.php:52
+msgid "Done"
 msgstr ""
 
-#: mod/community.php:105
-msgid "Posts from local users on this server"
+#: mod/ostatus_subscribe.php:84
+msgid "success"
 msgstr ""
 
-#: mod/community.php:113
-msgid "Global Community"
+#: mod/ostatus_subscribe.php:86
+msgid "failed"
 msgstr ""
 
-#: mod/community.php:116
-msgid "Posts from users of the whole federated network"
+#: mod/ostatus_subscribe.php:89 src/Object/Post.php:285
+msgid "ignored"
 msgstr ""
 
-#: mod/community.php:162 mod/search.php:219
-msgid "No results."
+#: mod/ostatus_subscribe.php:94 mod/repair_ostatus.php:58
+msgid "Keep this window open until done."
 msgstr ""
 
-#: mod/community.php:206
-msgid ""
-"This community stream shows all public posts received by this node. They may "
-"not reflect the opinions of this node’s users."
+#: mod/profperm.php:30
+msgid "Permission denied"
 msgstr ""
 
-#: mod/crepair.php:79
-msgid "Contact settings applied."
+#: mod/profperm.php:36 mod/profperm.php:69
+msgid "Invalid profile identifier."
 msgstr ""
 
-#: mod/crepair.php:81
-msgid "Contact update failed."
+#: mod/profperm.php:115
+msgid "Profile Visibility Editor"
 msgstr ""
 
-#: mod/crepair.php:102 mod/dfrn_confirm.php:125 mod/fsuggest.php:31
-#: mod/fsuggest.php:74 mod/redir.php:32 mod/redir.php:140
-#: src/Module/FollowConfirm.php:46 src/Module/Group.php:92
-msgid "Contact not found."
+#: mod/profperm.php:117 view/theme/frio/theme.php:268 src/Content/Nav.php:161
+#: src/Model/Profile.php:881 src/Model/Profile.php:917
+#: src/Module/Contact.php:656 src/Module/Contact.php:872
+#: src/Module/Welcome.php:38
+msgid "Profile"
 msgstr ""
 
-#: 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."
+#: mod/profperm.php:119 src/Module/Group.php:321
+msgid "Click on a contact to add or remove."
 msgstr ""
 
-#: 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 ""
-
-#: mod/crepair.php:130 mod/crepair.php:132
-msgid "No mirroring"
+#: mod/profperm.php:128
+msgid "Visible To"
 msgstr ""
 
-#: mod/crepair.php:130
-msgid "Mirror as forwarded posting"
+#: mod/profperm.php:144
+msgid "All Contacts (with secure profile access)"
 msgstr ""
 
-#: mod/crepair.php:130 mod/crepair.php:132
-msgid "Mirror as my own posting"
+#: mod/regmod.php:53
+msgid "Account approved."
 msgstr ""
 
-#: mod/crepair.php:145
-msgid "Return to contact editor"
+#: mod/regmod.php:77
+#, php-format
+msgid "Registration revoked for %s"
 msgstr ""
 
-#: mod/crepair.php:147
-msgid "Refetch contact data"
+#: mod/regmod.php:84
+msgid "Please login."
 msgstr ""
 
-#: mod/crepair.php:149 mod/events.php:551 mod/fsuggest.php:91
-#: mod/manage.php:183 mod/message.php:261 mod/message.php:441
-#: mod/photos.php:991 mod/photos.php:1101 mod/photos.php:1386
-#: mod/photos.php:1431 mod/photos.php:1470 mod/photos.php:1530 mod/poke.php:184
-#: mod/profiles.php:562 src/Module/Contact.php:590
-#: src/Module/Debug/Localtime.php:45 src/Module/Install.php:211
-#: src/Module/Install.php:251 src/Module/Install.php:287
-#: src/Module/Invite.php:157 src/Object/Post.php:877
-#: view/theme/duepuntozero/config.php:72 view/theme/frio/config.php:121
-#: view/theme/quattro/config.php:74 view/theme/vier/config.php:120
-msgid "Submit"
+#: mod/removeme.php:46
+msgid "User deleted their account"
 msgstr ""
 
-#: mod/crepair.php:150
-msgid "Remote Self"
+#: mod/removeme.php:47
+msgid ""
+"On your Friendica node an user deleted their account. Please ensure that "
+"their data is removed from the backups."
 msgstr ""
 
-#: mod/crepair.php:153
-msgid "Mirror postings from this contact"
+#: mod/removeme.php:48
+#, php-format
+msgid "The user id is %d"
 msgstr ""
 
-#: mod/crepair.php:155
-msgid ""
-"Mark this contact as remote_self, this will cause friendica to repost new "
-"entries from this contact."
+#: mod/removeme.php:84 mod/removeme.php:87
+msgid "Remove My Account"
 msgstr ""
 
-#: mod/crepair.php:159 mod/settings.php:676 mod/settings.php:702
-#: src/Module/Admin/Blocklist/Contact.php:73 src/Module/Admin/Users.php:272
-#: src/Module/Admin/Users.php:283 src/Module/Admin/Users.php:297
-#: src/Module/Admin/Users.php:313
-msgid "Name"
+#: mod/removeme.php:85
+msgid ""
+"This will completely remove your account. Once this has been done it is not "
+"recoverable."
 msgstr ""
 
-#: mod/crepair.php:160
-msgid "Account Nickname"
+#: mod/removeme.php:86
+msgid "Please enter your password for verification:"
 msgstr ""
 
-#: mod/crepair.php:161
-msgid "@Tagname - overrides Name/Nickname"
+#: mod/repair_ostatus.php:21
+msgid "Resubscribing to OStatus contacts"
 msgstr ""
 
-#: mod/crepair.php:162
-msgid "Account URL"
-msgstr ""
+#: mod/repair_ostatus.php:37 src/Module/TwoFactor/Verify.php:64
+msgid "Error"
+msgid_plural "Errors"
+msgstr[0] ""
+msgstr[1] ""
 
-#: mod/crepair.php:163
-msgid "Account URL Alias"
+#: mod/tagrm.php:31
+msgid "Tag(s) removed"
 msgstr ""
 
-#: mod/crepair.php:164
-msgid "Friend Request URL"
+#: mod/tagrm.php:101
+msgid "Remove Item Tag"
 msgstr ""
 
-#: mod/crepair.php:165
-msgid "Friend Confirm URL"
+#: mod/tagrm.php:103
+msgid "Select a tag to remove: "
 msgstr ""
 
-#: mod/crepair.php:166
-msgid "Notification Endpoint URL"
+#: mod/uimport.php:30
+msgid "User imports on closed servers can only be done by an administrator."
 msgstr ""
 
-#: mod/crepair.php:167
-msgid "Poll/Feed URL"
+#: mod/uimport.php:39 src/Module/Register.php:59
+msgid ""
+"This site has exceeded the number of allowed daily account registrations. "
+"Please try again tomorrow."
 msgstr ""
 
-#: mod/crepair.php:168
-msgid "New photo from this URL"
+#: mod/uimport.php:54 src/Module/Register.php:141
+msgid "Import"
 msgstr ""
 
-#: mod/delegate.php:42
-msgid "Parent user not found."
+#: mod/uimport.php:56
+msgid "Move account"
 msgstr ""
 
-#: mod/delegate.php:149
-msgid "No parent user"
+#: mod/uimport.php:57
+msgid "You can import an account from another Friendica server."
 msgstr ""
 
-#: mod/delegate.php:164
-msgid "Parent Password:"
+#: mod/uimport.php:58
+msgid ""
+"You need to export your account from the old server and upload it here. We "
+"will recreate your old account here with all your contacts. We will try also "
+"to inform your friends that you moved here."
 msgstr ""
 
-#: mod/delegate.php:164
+#: mod/uimport.php:59
 msgid ""
-"Please enter the password of the parent account to legitimize your request."
+"This feature is experimental. We can't import contacts from the OStatus "
+"network (GNU Social/Statusnet) or from Diaspora"
 msgstr ""
 
-#: mod/delegate.php:171
-msgid "Parent User"
+#: mod/uimport.php:60
+msgid "Account file"
 msgstr ""
 
-#: mod/delegate.php:174
+#: mod/uimport.php:60
 msgid ""
-"Parent users have total control about this account, including the account "
-"settings. Please double check whom you give this access."
+"To export your account, go to \"Settings->Export your personal data\" and "
+"select \"Export account\""
 msgstr ""
 
-#: mod/delegate.php:175 mod/settings.php:674 mod/settings.php:781
-#: mod/settings.php:869 mod/settings.php:948 mod/settings.php:1173
-#: src/Module/Admin/Addons/Index.php:52 src/Module/Admin/Features.php:69
-#: src/Module/Admin/Logs/Settings.php:65 src/Module/Admin/Site.php:570
-#: src/Module/Admin/Themes/Index.php:95 src/Module/Admin/Tos.php:50
-msgid "Save Settings"
+#: mod/unfollow.php:36 mod/unfollow.php:92
+msgid "You aren't following this contact."
 msgstr ""
 
-#: mod/delegate.php:176 src/Content/Nav.php:260
-msgid "Delegate Page Management"
+#: mod/unfollow.php:46 mod/unfollow.php:98
+msgid "Unfollowing is currently not supported by your network."
 msgstr ""
 
-#: mod/delegate.php:177
-msgid "Delegates"
+#: mod/unfollow.php:67
+msgid "Contact unfollowed"
 msgstr ""
 
-#: mod/delegate.php:179
-msgid ""
-"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."
+#: mod/unfollow.php:118
+msgid "Disconnect/Unfollow"
 msgstr ""
 
-#: mod/delegate.php:180
-msgid "Existing Page Delegates"
+#: mod/unfollow.php:128 mod/dfrn_request.php:647 mod/follow.php:170
+msgid "Your Identity Address:"
 msgstr ""
 
-#: mod/delegate.php:182
-msgid "Potential Delegates"
+#: mod/unfollow.php:131 mod/dfrn_request.php:649 mod/follow.php:76
+msgid "Submit Request"
 msgstr ""
 
-#: mod/delegate.php:184 mod/tagrm.php:114
-msgid "Remove"
+#: mod/unfollow.php:137 mod/follow.php:179 mod/notifications.php:182
+#: mod/notifications.php:274 src/Module/Admin/Blocklist/Contact.php:83
+#: src/Module/Contact.php:641
+msgid "Profile URL"
 msgstr ""
 
-#: mod/delegate.php:185
-msgid "Add"
+#: mod/unfollow.php:147 mod/follow.php:195 src/Model/Profile.php:912
+#: src/Module/Contact.php:867
+msgid "Status Messages and Posts"
 msgstr ""
 
-#: mod/delegate.php:186
-msgid "No entries."
+#: mod/update_community.php:23 mod/update_contact.php:23
+#: mod/update_display.php:24 mod/update_network.php:33 mod/update_notes.php:36
+#: mod/update_profile.php:34
+msgid "[Embedded content - reload page to view]"
 msgstr ""
 
-#: mod/dfrn_confirm.php:70 mod/profiles.php:43 mod/profiles.php:152
-#: mod/profiles.php:196 mod/profiles.php:511
-msgid "Profile not found."
+#: 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
+msgid "Invalid request."
 msgstr ""
 
-#: mod/dfrn_confirm.php:126
-msgid ""
-"This may occasionally happen if contact was requested by both persons and it "
-"has already been approved."
+#: mod/wall_attach.php:103
+msgid "Sorry, maybe your upload is bigger than the PHP configuration allows"
 msgstr ""
 
-#: mod/dfrn_confirm.php:227
-msgid "Response from remote site was not understood."
+#: mod/wall_attach.php:103
+msgid "Or - did you try to upload an empty file?"
 msgstr ""
 
-#: mod/dfrn_confirm.php:234 mod/dfrn_confirm.php:240
-msgid "Unexpected response from remote site: "
+#: mod/wall_attach.php:114
+#, php-format
+msgid "File exceeds size limit of %s"
 msgstr ""
 
-#: mod/dfrn_confirm.php:249
-msgid "Confirmation completed successfully."
+#: mod/wall_attach.php:129
+msgid "File upload failed."
 msgstr ""
 
-#: mod/dfrn_confirm.php:261
-msgid "Temporary failure. Please wait and try again."
+#: mod/wall_upload.php:198 mod/photos.php:683 mod/photos.php:686
+#: mod/photos.php:715 mod/profile_photo.php:152
+#, php-format
+msgid "Image exceeds size limit of %s"
 msgstr ""
 
-#: mod/dfrn_confirm.php:264
-msgid "Introduction failed or was revoked."
+#: mod/wall_upload.php:212 mod/photos.php:738 mod/profile_photo.php:161
+msgid "Unable to process image."
 msgstr ""
 
-#: mod/dfrn_confirm.php:269
-msgid "Remote site reported: "
+#: mod/wall_upload.php:243
+msgid "Wall Photos"
 msgstr ""
 
-#: mod/dfrn_confirm.php:374
+#: mod/wall_upload.php:251 mod/photos.php:767 mod/profile_photo.php:303
+msgid "Image upload failed."
+msgstr ""
+
+#: mod/wallmessage.php:52 mod/wallmessage.php:115
 #, php-format
-msgid "No user record found for '%s' "
+msgid "Number of daily wall messages for %s exceeded. Message failed."
 msgstr ""
 
-#: mod/dfrn_confirm.php:384
-msgid "Our site encryption key is apparently messed up."
+#: mod/wallmessage.php:60 mod/message.php:70
+msgid "No recipient selected."
 msgstr ""
 
-#: mod/dfrn_confirm.php:395
-msgid "Empty site URL was provided or URL could not be decrypted by us."
+#: mod/wallmessage.php:63
+msgid "Unable to check your home location."
 msgstr ""
 
-#: mod/dfrn_confirm.php:411
-msgid "Contact record was not found for you on our site."
+#: mod/wallmessage.php:66 mod/message.php:77
+msgid "Message could not be sent."
 msgstr ""
 
-#: mod/dfrn_confirm.php:425
-#, php-format
-msgid "Site public key not available in contact record for URL %s."
+#: mod/wallmessage.php:69 mod/message.php:80
+msgid "Message collection failure."
 msgstr ""
 
-#: mod/dfrn_confirm.php:441
-msgid ""
-"The ID provided by your system is a duplicate on our system. It should work "
-"if you try again."
+#: mod/wallmessage.php:72 mod/message.php:83
+msgid "Message sent."
 msgstr ""
 
-#: mod/dfrn_confirm.php:452
-msgid "Unable to set your contact credentials on our system."
+#: mod/wallmessage.php:89 mod/wallmessage.php:98
+msgid "No recipient."
 msgstr ""
 
-#: mod/dfrn_confirm.php:508
-msgid "Unable to update your contact profile details on our system"
+#: mod/wallmessage.php:123 mod/message.php:204 mod/message.php:360
+msgid "Please enter a link URL:"
 msgstr ""
 
-#: mod/dfrn_confirm.php:538 mod/dfrn_request.php:560 src/Model/Contact.php:2234
-msgid "[Name Withheld]"
+#: mod/wallmessage.php:128 mod/message.php:246
+msgid "Send Private Message"
 msgstr ""
 
-#: mod/dfrn_poll.php:125 mod/dfrn_poll.php:530
+#: mod/wallmessage.php:129
 #, php-format
-msgid "%1$s welcomes %2$s"
+msgid ""
+"If you wish for %s to respond, please check that the privacy settings on "
+"your site allow private mail from unknown senders."
 msgstr ""
 
-#: mod/dfrn_request.php:98
-msgid "This introduction has already been accepted."
+#: mod/wallmessage.php:130 mod/message.php:247 mod/message.php:430
+msgid "To:"
 msgstr ""
 
-#: mod/dfrn_request.php:116 mod/dfrn_request.php:354
-msgid "Profile location is not valid or does not contain profile information."
+#: mod/wallmessage.php:131 mod/message.php:251 mod/message.php:432
+msgid "Subject:"
 msgstr ""
 
-#: mod/dfrn_request.php:120 mod/dfrn_request.php:358
-msgid "Warning: profile location has no identifiable owner name."
+#: mod/wallmessage.php:137 mod/message.php:255 mod/message.php:435
+#: src/Module/Invite.php:150
+msgid "Your message:"
 msgstr ""
 
-#: mod/dfrn_request.php:123 mod/dfrn_request.php:361
-msgid "Warning: profile location has no profile photo."
+#: mod/wallmessage.php:140 mod/editpost.php:76 mod/message.php:259
+#: mod/message.php:440
+msgid "Insert web link"
 msgstr ""
 
-#: mod/dfrn_request.php:127 mod/dfrn_request.php:365
-#, php-format
-msgid "%d required parameter was not found at the given location"
-msgid_plural "%d required parameters were not found at the given location"
-msgstr[0] ""
-msgstr[1] ""
-
-#: mod/dfrn_request.php:165
-msgid "Introduction complete."
+#: mod/match.php:49
+msgid "No keywords to match. Please add keywords to your default profile."
 msgstr ""
 
-#: mod/dfrn_request.php:201
-msgid "Unrecoverable protocol error."
-msgstr ""
-
-#: mod/dfrn_request.php:228
-msgid "Profile unavailable."
+#: mod/match.php:102 mod/suggest.php:106 src/Content/Widget.php:42
+#: src/Module/AllFriends.php:91 src/Module/BaseSearchModule.php:131
+msgid "Connect"
 msgstr ""
 
-#: mod/dfrn_request.php:249
-#, php-format
-msgid "%s has received too many connection requests today."
+#: mod/match.php:115 src/Content/Pager.php:198
+msgid "first"
 msgstr ""
 
-#: mod/dfrn_request.php:250
-msgid "Spam protection measures have been invoked."
+#: mod/match.php:120 src/Content/Pager.php:258
+msgid "next"
 msgstr ""
 
-#: mod/dfrn_request.php:251
-msgid "Friends are advised to please try again in 24 hours."
+#: mod/match.php:130 src/Module/BaseSearchModule.php:92
+msgid "No matches"
 msgstr ""
 
-#: mod/dfrn_request.php:275
-msgid "Invalid locator"
+#: mod/match.php:135
+msgid "Profile Match"
 msgstr ""
 
-#: mod/dfrn_request.php:311
-msgid "You have already introduced yourself here."
+#: mod/profiles.php:43 mod/profiles.php:152 mod/profiles.php:196
+#: mod/profiles.php:511 mod/dfrn_confirm.php:70
+msgid "Profile not found."
 msgstr ""
 
-#: mod/dfrn_request.php:314
-#, php-format
-msgid "Apparently you are already friends with %s."
+#: mod/profiles.php:62
+msgid "Profile deleted."
 msgstr ""
 
-#: mod/dfrn_request.php:334
-msgid "Invalid profile URL."
+#: mod/profiles.php:78 mod/profiles.php:114
+msgid "Profile-"
 msgstr ""
 
-#: mod/dfrn_request.php:340 src/Model/Contact.php:1878
-msgid "Disallowed profile URL."
+#: mod/profiles.php:97 mod/profiles.php:135
+msgid "New profile created."
 msgstr ""
 
-#: mod/dfrn_request.php:346 src/Model/Contact.php:1883
-#: src/Module/Admin/Blocklist/Server.php:64
-#: src/Module/Admin/Blocklist/Server.php:83 src/Module/Friendica.php:59
-msgid "Blocked domain"
+#: mod/profiles.php:120
+msgid "Profile unavailable to clone."
 msgstr ""
 
-#: mod/dfrn_request.php:413 src/Module/Contact.php:143
-msgid "Failed to update contact record."
+#: mod/profiles.php:206
+msgid "Profile Name is required."
 msgstr ""
 
-#: mod/dfrn_request.php:433
-msgid "Your introduction has been sent."
+#: mod/profiles.php:346
+msgid "Marital Status"
 msgstr ""
 
-#: mod/dfrn_request.php:471
-msgid ""
-"Remote subscription can't be done for your network. Please subscribe "
-"directly on your system."
+#: mod/profiles.php:349
+msgid "Romantic Partner"
 msgstr ""
 
-#: mod/dfrn_request.php:487
-msgid "Please login to confirm introduction."
+#: mod/profiles.php:358
+msgid "Work/Employment"
 msgstr ""
 
-#: mod/dfrn_request.php:495
-msgid ""
-"Incorrect identity currently logged in. Please login to <strong>this</"
-"strong> profile."
+#: mod/profiles.php:361
+msgid "Religion"
 msgstr ""
 
-#: mod/dfrn_request.php:509 mod/dfrn_request.php:524
-msgid "Confirm"
+#: mod/profiles.php:364
+msgid "Political Views"
 msgstr ""
 
-#: mod/dfrn_request.php:520
-msgid "Hide this contact"
+#: mod/profiles.php:367
+msgid "Gender"
 msgstr ""
 
-#: mod/dfrn_request.php:522
-#, php-format
-msgid "Welcome home %s."
+#: mod/profiles.php:370
+msgid "Sexual Preference"
 msgstr ""
 
-#: mod/dfrn_request.php:523
-#, php-format
-msgid "Please confirm your introduction/connection request to %s."
+#: mod/profiles.php:373
+msgid "XMPP"
 msgstr ""
 
-#: mod/dfrn_request.php:632
-msgid ""
-"Please enter your 'Identity Address' from one of the following supported "
-"communications networks:"
+#: mod/profiles.php:376
+msgid "Homepage"
 msgstr ""
 
-#: mod/dfrn_request.php:634
-#, php-format
-msgid ""
-"If you are not yet a member of the free social web, <a href=\"%s\">follow "
-"this link to find a public Friendica site and join us today</a>."
+#: mod/profiles.php:379 mod/profiles.php:578
+msgid "Interests"
 msgstr ""
 
-#: mod/dfrn_request.php:637
-msgid "Friend/Connection Request"
+#: mod/profiles.php:382
+msgid "Address"
 msgstr ""
 
-#: mod/dfrn_request.php:638
-msgid ""
-"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
-"testuser@gnusocial.de"
+#: mod/profiles.php:389 mod/profiles.php:574
+msgid "Location"
 msgstr ""
 
-#: mod/dfrn_request.php:639 mod/follow.php:160
-msgid "Please answer the following:"
+#: mod/profiles.php:469
+msgid "Profile updated."
 msgstr ""
 
-#: mod/dfrn_request.php:640 mod/follow.php:161
-#, php-format
-msgid "Does %s know you?"
+#: mod/profiles.php:523
+msgid "Hide contacts and friends:"
 msgstr ""
 
-#: mod/dfrn_request.php:641 mod/follow.php:162
-msgid "Add a personal note:"
+#: mod/profiles.php:528
+msgid "Hide your contact/friend list from viewers of this profile?"
 msgstr ""
 
-#: mod/dfrn_request.php:643
-msgid "Friendica"
+#: mod/profiles.php:548
+msgid "Show more profile fields:"
 msgstr ""
 
-#: mod/dfrn_request.php:644
-msgid "GNU Social (Pleroma, Mastodon)"
+#: mod/profiles.php:560
+msgid "Profile Actions"
 msgstr ""
 
-#: mod/dfrn_request.php:645
-msgid "Diaspora (Socialhome, Hubzilla)"
+#: mod/profiles.php:561
+msgid "Edit Profile Details"
 msgstr ""
 
-#: mod/dfrn_request.php:646
-#, php-format
-msgid ""
-" - please do not use this form.  Instead, enter %s into your Diaspora search "
-"bar."
+#: mod/profiles.php:562 mod/crepair.php:149 mod/events.php:552
+#: mod/fsuggest.php:92 mod/manage.php:183 mod/message.php:261
+#: mod/message.php:441 mod/photos.php:991 mod/photos.php:1101
+#: mod/photos.php:1387 mod/photos.php:1432 mod/photos.php:1471
+#: mod/photos.php:1531 mod/poke.php:184 view/theme/duepuntozero/config.php:72
+#: view/theme/frio/config.php:127 view/theme/quattro/config.php:74
+#: view/theme/vier/config.php:120 src/Module/Contact.php:598
+#: src/Module/Debug/Localtime.php:45 src/Module/Install.php:213
+#: src/Module/Install.php:253 src/Module/Install.php:289
+#: src/Module/Invite.php:157 src/Module/Item/Compose.php:178
+#: src/Object/Post.php:878
+msgid "Submit"
 msgstr ""
 
-#: mod/dfrn_request.php:647 mod/follow.php:168 mod/unfollow.php:128
-msgid "Your Identity Address:"
+#: mod/profiles.php:563
+msgid "Change Profile Photo"
 msgstr ""
 
-#: mod/dfrn_request.php:649 mod/follow.php:74 mod/unfollow.php:131
-msgid "Submit Request"
+#: mod/profiles.php:565
+msgid "View this profile"
 msgstr ""
 
-#: mod/display.php:257 mod/display.php:342
-msgid "The requested item doesn't exist or has been deleted."
+#: mod/profiles.php:566
+msgid "View all profiles"
 msgstr ""
 
-#: mod/display.php:417
-msgid "The feed for this item is unavailable."
+#: mod/profiles.php:567 mod/profiles.php:662 src/Model/Profile.php:423
+msgid "Edit visibility"
 msgstr ""
 
-#: mod/editpost.php:28 mod/editpost.php:38
-msgid "Item not found"
+#: mod/profiles.php:568
+msgid "Create a new profile using these settings"
 msgstr ""
 
-#: mod/editpost.php:45
-msgid "Edit post"
+#: mod/profiles.php:569
+msgid "Clone this profile"
 msgstr ""
 
-#: mod/editpost.php:71 mod/notes.php:46 src/Content/Text/HTML.php:894
-#: src/Module/Filer/SaveTag.php:49
-msgid "Save"
+#: mod/profiles.php:570
+msgid "Delete this profile"
 msgstr ""
 
-#: mod/editpost.php:76 mod/message.php:259 mod/message.php:440
-#: mod/wallmessage.php:140
-msgid "Insert web link"
+#: mod/profiles.php:572
+msgid "Basic information"
 msgstr ""
 
-#: mod/editpost.php:77
-msgid "web link"
+#: mod/profiles.php:573
+msgid "Profile picture"
 msgstr ""
 
-#: mod/editpost.php:78
-msgid "Insert video link"
+#: mod/profiles.php:575
+msgid "Preferences"
 msgstr ""
 
-#: mod/editpost.php:79
-msgid "video link"
+#: mod/profiles.php:576
+msgid "Status information"
 msgstr ""
 
-#: mod/editpost.php:80
-msgid "Insert audio link"
+#: mod/profiles.php:577
+msgid "Additional information"
 msgstr ""
 
-#: mod/editpost.php:81
-msgid "audio link"
+#: mod/profiles.php:579 mod/network.php:992
+#: src/Core/NotificationsManager.php:158
+msgid "Personal"
 msgstr ""
 
-#: mod/editpost.php:95 src/Core/ACL.php:308
-msgid "CC: email addresses"
+#: mod/profiles.php:580
+msgid "Relation"
 msgstr ""
 
-#: mod/editpost.php:102 src/Core/ACL.php:309
-msgid "Example: bob@example.com, mary@example.com"
+#: mod/profiles.php:581 src/Util/Temporal.php:79 src/Util/Temporal.php:81
+msgid "Miscellaneous"
 msgstr ""
 
-#: mod/events.php:117 mod/events.php:119
-msgid "Event can not end before it has started."
+#: mod/profiles.php:583 mod/profile_photo.php:246 src/Module/Welcome.php:39
+msgid "Upload Profile Photo"
 msgstr ""
 
-#: mod/events.php:126 mod/events.php:128
-msgid "Event title and start time are required."
+#: mod/profiles.php:584
+msgid "Your Gender:"
 msgstr ""
 
-#: mod/events.php:384
-msgid "Create New Event"
+#: mod/profiles.php:585
+msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
 msgstr ""
 
-#: mod/events.php:507
-msgid "Event details"
+#: mod/profiles.php:586 src/Model/Profile.php:800
+msgid "Sexual Preference:"
 msgstr ""
 
-#: mod/events.php:508
-msgid "Starting date and Title are required."
+#: mod/profiles.php:587
+msgid "Example: fishing photography software"
 msgstr ""
 
-#: mod/events.php:509 mod/events.php:514
-msgid "Event Starts:"
+#: mod/profiles.php:592
+msgid "Profile Name:"
 msgstr ""
 
-#: mod/events.php:509 mod/events.php:541 mod/profiles.php:592
+#: mod/profiles.php:592 mod/events.php:510 mod/events.php:542
 msgid "Required"
 msgstr ""
 
-#: mod/events.php:522 mod/events.php:547
-msgid "Finish date/time is not known or not relevant"
+#: mod/profiles.php:594
+msgid ""
+"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
+"be visible to anybody using the internet."
 msgstr ""
 
-#: mod/events.php:524 mod/events.php:529
-msgid "Event Finishes:"
+#: mod/profiles.php:595
+msgid "Your Full Name:"
 msgstr ""
 
-#: mod/events.php:535 mod/events.php:548
-msgid "Adjust for viewer timezone"
+#: mod/profiles.php:596
+msgid "Title/Description:"
 msgstr ""
 
-#: mod/events.php:537
-msgid "Description:"
+#: mod/profiles.php:599
+msgid "Street Address:"
 msgstr ""
 
-#: mod/events.php:539 mod/notifications.php:264 src/Model/Event.php:68
-#: src/Model/Event.php:95 src/Model/Event.php:437 src/Model/Event.php:933
-#: src/Model/Profile.php:439 src/Module/Contact.php:639
-#: src/Module/Directory.php:142
-msgid "Location:"
+#: mod/profiles.php:600
+msgid "Locality/City:"
 msgstr ""
 
-#: mod/events.php:541 mod/events.php:543
-msgid "Title:"
+#: mod/profiles.php:601
+msgid "Region/State:"
 msgstr ""
 
-#: mod/events.php:544 mod/events.php:545
-msgid "Share this event"
+#: mod/profiles.php:602
+msgid "Postal/Zip Code:"
 msgstr ""
 
-#: mod/events.php:552 src/Model/Profile.php:871
-msgid "Basic"
+#: mod/profiles.php:603
+msgid "Country:"
 msgstr ""
 
-#: mod/events.php:553 src/Model/Profile.php:872 src/Module/Admin/Site.php:575
-#: src/Module/Contact.php:899
-msgid "Advanced"
+#: mod/profiles.php:604 src/Util/Temporal.php:149
+msgid "Age: "
 msgstr ""
 
-#: mod/events.php:554 mod/photos.php:1009 mod/photos.php:1382
-#: src/Core/ACL.php:314
-msgid "Permissions"
+#: mod/profiles.php:607
+msgid "Who: (if applicable)"
 msgstr ""
 
-#: mod/events.php:570
-msgid "Failed to remove event"
+#: mod/profiles.php:607
+msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
 msgstr ""
 
-#: mod/events.php:572
-msgid "Event removed"
+#: mod/profiles.php:608
+msgid "Since [date]:"
 msgstr ""
 
-#: mod/fbrowser.php:43 src/Content/Nav.php:157 src/Model/Profile.php:914
-#: view/theme/frio/theme.php:264
-msgid "Photos"
+#: mod/profiles.php:610
+msgid "Tell us about yourself..."
 msgstr ""
 
-#: mod/fbrowser.php:52 mod/fbrowser.php:76 mod/photos.php:196
-#: mod/photos.php:973 mod/photos.php:1090 mod/photos.php:1107
-#: mod/photos.php:1583 mod/photos.php:1598 src/Model/Photo.php:552
-#: src/Model/Photo.php:561
-msgid "Contact Photos"
+#: mod/profiles.php:611
+msgid "XMPP (Jabber) address:"
 msgstr ""
 
-#: mod/fbrowser.php:112 mod/fbrowser.php:141 mod/profile_photo.php:254
-msgid "Upload"
-msgstr ""
+#: mod/profiles.php:611
+msgid ""
+"The XMPP address will be propagated to your contacts so that they can follow "
+"you."
+msgstr ""
 
-#: mod/fbrowser.php:136
-msgid "Files"
+#: mod/profiles.php:612
+msgid "Homepage URL:"
 msgstr ""
 
-#: mod/follow.php:46
-msgid "The contact could not be added."
+#: mod/profiles.php:613 src/Model/Profile.php:808
+msgid "Hometown:"
 msgstr ""
 
-#: mod/follow.php:85
-msgid "You already added this contact."
+#: mod/profiles.php:614 src/Model/Profile.php:816
+msgid "Political Views:"
 msgstr ""
 
-#: mod/follow.php:97
-msgid "Diaspora support isn't enabled. Contact can't be added."
+#: mod/profiles.php:615
+msgid "Religious Views:"
 msgstr ""
 
-#: mod/follow.php:104
-msgid "OStatus support is disabled. Contact can't be added."
+#: mod/profiles.php:616
+msgid "Public Keywords:"
 msgstr ""
 
-#: mod/follow.php:111
-msgid "The network type couldn't be detected. Contact can't be added."
+#: mod/profiles.php:616
+msgid "(Used for suggesting potential friends, can be seen by others)"
 msgstr ""
 
-#: mod/follow.php:177 mod/notifications.php:182 mod/notifications.php:274
-#: mod/unfollow.php:137 src/Module/Admin/Blocklist/Contact.php:83
-#: src/Module/Contact.php:635
-msgid "Profile URL"
+#: mod/profiles.php:617
+msgid "Private Keywords:"
 msgstr ""
 
-#: mod/follow.php:181 mod/notifications.php:268 src/Model/Profile.php:801
-#: src/Module/Contact.php:645
-msgid "Tags:"
+#: mod/profiles.php:617
+msgid "(Used for searching profiles, never shown to others)"
 msgstr ""
 
-#: mod/follow.php:193 mod/unfollow.php:147 src/Model/Profile.php:901
-#: src/Module/Contact.php:861
-msgid "Status Messages and Posts"
+#: mod/profiles.php:618 src/Model/Profile.php:832
+msgid "Likes:"
 msgstr ""
 
-#: mod/fsuggest.php:43
-msgid "Suggested contact not found."
+#: mod/profiles.php:619 src/Model/Profile.php:836
+msgid "Dislikes:"
 msgstr ""
 
-#: mod/fsuggest.php:56
-msgid "Friend suggestion sent."
+#: mod/profiles.php:620
+msgid "Musical interests"
 msgstr ""
 
-#: mod/fsuggest.php:78
-msgid "Suggest Friends"
+#: mod/profiles.php:621
+msgid "Books, literature"
 msgstr ""
 
-#: mod/fsuggest.php:80
-#, php-format
-msgid "Suggest a friend for %s"
+#: mod/profiles.php:622
+msgid "Television"
 msgstr ""
 
-#: mod/hcard.php:20
-msgid "No profile"
+#: mod/profiles.php:623
+msgid "Film/dance/culture/entertainment"
 msgstr ""
 
-#: mod/item.php:122
-msgid "Unable to locate original post."
+#: mod/profiles.php:624
+msgid "Hobbies/Interests"
 msgstr ""
 
-#: mod/item.php:322
-msgid "Empty post discarded."
+#: mod/profiles.php:625
+msgid "Love/romance"
 msgstr ""
 
-#: mod/item.php:837
-#, php-format
-msgid ""
-"This message was sent to you by %s, a member of the Friendica social network."
+#: mod/profiles.php:626
+msgid "Work/employment"
 msgstr ""
 
-#: mod/item.php:839
-#, php-format
-msgid "You may visit them online at %s"
+#: mod/profiles.php:627
+msgid "School/education"
 msgstr ""
 
-#: mod/item.php:840
-msgid ""
-"Please contact the sender by replying to this post if you do not wish to "
-"receive these messages."
+#: mod/profiles.php:628
+msgid "Contact information and Social Networks"
 msgstr ""
 
-#: mod/item.php:844
-#, php-format
-msgid "%s posted an update."
+#: mod/profiles.php:659 src/Model/Profile.php:419
+msgid "Profile Image"
 msgstr ""
 
-#: mod/lockview.php:46 mod/lockview.php:57
-msgid "Remote privacy information not available."
+#: mod/profiles.php:661 src/Model/Profile.php:422
+msgid "visible to everybody"
 msgstr ""
 
-#: mod/lockview.php:66
-msgid "Visible to:"
+#: mod/profiles.php:668
+msgid "Edit/Manage Profiles"
 msgstr ""
 
-#: mod/lostpass.php:26
-msgid "No valid account found."
+#: mod/profiles.php:669 src/Model/Profile.php:409 src/Model/Profile.php:430
+msgid "Change profile photo"
 msgstr ""
 
-#: mod/lostpass.php:38
-msgid "Password reset request issued. Check your email."
+#: mod/profiles.php:670 src/Model/Profile.php:410
+msgid "Create New Profile"
 msgstr ""
 
-#: mod/lostpass.php:44
-#, php-format
-msgid ""
-"\n"
-"\t\tDear %1$s,\n"
-"\t\t\tA request was recently received at \"%2$s\" to reset your account\n"
-"\t\tpassword. In order to confirm this request, please select the "
-"verification link\n"
-"\t\tbelow or paste it into your web browser address bar.\n"
-"\n"
-"\t\tIf you did NOT request this change, please DO NOT follow the link\n"
-"\t\tprovided and ignore and/or delete this email, the request will expire "
-"shortly.\n"
-"\n"
-"\t\tYour password will not be changed unless we can verify that you\n"
-"\t\tissued this request."
+#: mod/cal.php:34 mod/cal.php:38 mod/community.php:40 mod/follow.php:20
+#: src/Module/Debug/ItemBody.php:18
+msgid "Access denied."
 msgstr ""
 
-#: mod/lostpass.php:55
-#, php-format
-msgid ""
-"\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"
+#: mod/cal.php:140 mod/display.php:301 src/Module/Profile.php:177
+msgid "Access to this profile has been restricted."
 msgstr ""
 
-#: mod/lostpass.php:74
-#, php-format
-msgid "Password reset requested at %s"
+#: mod/cal.php:271 mod/events.php:383 view/theme/frio/theme.php:271
+#: view/theme/frio/theme.php:275 src/Content/Nav.php:164
+#: src/Content/Nav.php:228 src/Model/Profile.php:945 src/Model/Profile.php:956
+msgid "Events"
 msgstr ""
 
-#: mod/lostpass.php:89
-msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
+#: mod/cal.php:272 mod/events.php:384
+msgid "View"
 msgstr ""
 
-#: mod/lostpass.php:102
-msgid "Request has expired, please make a new one."
+#: mod/cal.php:273 mod/events.php:386
+msgid "Previous"
 msgstr ""
 
-#: mod/lostpass.php:117
-msgid "Forgot your Password?"
+#: mod/cal.php:274 mod/events.php:387 src/Module/Install.php:175
+msgid "Next"
 msgstr ""
 
-#: mod/lostpass.php:118
-msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
+#: mod/cal.php:277 mod/events.php:392 src/Model/Event.php:428
+msgid "today"
 msgstr ""
 
-#: mod/lostpass.php:119 src/Module/Login.php:327
-msgid "Nickname or Email: "
+#: mod/cal.php:278 mod/events.php:393 src/Util/Temporal.php:314
+#: src/Model/Event.php:429
+msgid "month"
 msgstr ""
 
-#: mod/lostpass.php:120
-msgid "Reset"
+#: mod/cal.php:279 mod/events.php:394 src/Util/Temporal.php:315
+#: src/Model/Event.php:430
+msgid "week"
 msgstr ""
 
-#: mod/lostpass.php:135 src/Module/Login.php:339
-msgid "Password Reset"
+#: mod/cal.php:280 mod/events.php:395 src/Util/Temporal.php:316
+#: src/Model/Event.php:431
+msgid "day"
 msgstr ""
 
-#: mod/lostpass.php:136
-msgid "Your password has been reset as requested."
+#: mod/cal.php:281 mod/events.php:396
+msgid "list"
 msgstr ""
 
-#: mod/lostpass.php:137
-msgid "Your new password is"
+#: mod/cal.php:294 src/Model/User.php:384 src/Console/NewPassword.php:88
+msgid "User not found"
 msgstr ""
 
-#: mod/lostpass.php:138
-msgid "Save or copy your new password - and then"
+#: mod/cal.php:310
+msgid "This calendar format is not supported"
 msgstr ""
 
-#: mod/lostpass.php:139
-msgid "click here to login"
+#: mod/cal.php:312
+msgid "No exportable data found"
 msgstr ""
 
-#: mod/lostpass.php:140
-msgid ""
-"Your password may be changed from the <em>Settings</em> page after "
-"successful login."
+#: mod/cal.php:329
+msgid "calendar"
 msgstr ""
 
-#: mod/lostpass.php:147
-#, php-format
-msgid ""
-"\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"
+#: mod/common.php:90
+msgid "No contacts in common."
 msgstr ""
 
-#: mod/lostpass.php:153
-#, php-format
-msgid ""
-"\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"
+#: mod/common.php:141 src/Module/Contact.php:895
+msgid "Common Friends"
 msgstr ""
 
-#: mod/lostpass.php:169
-#, php-format
-msgid "Your password has been changed at %s"
+#: mod/community.php:33 mod/dfrn_request.php:597 mod/display.php:199
+#: mod/photos.php:850 mod/search.php:87 mod/search.php:93 mod/videos.php:118
+#: src/Module/Debug/Probe.php:20 src/Module/Debug/WebFinger.php:19
+#: src/Module/Directory.php:30
+msgid "Public access denied."
 msgstr ""
 
-#: mod/manage.php:179
-msgid "Manage Identities and/or Pages"
+#: mod/community.php:76
+msgid "Community option not available."
 msgstr ""
 
-#: mod/manage.php:180
-msgid ""
-"Toggle between different identities or community/group pages which share "
-"your account details or which you have been granted \"manage\" permissions"
+#: mod/community.php:93
+msgid "Not available."
 msgstr ""
 
-#: mod/manage.php:181
-msgid "Select an identity to manage: "
+#: mod/community.php:103
+msgid "Local Community"
 msgstr ""
 
-#: mod/match.php:49
-msgid "No keywords to match. Please add keywords to your default profile."
+#: mod/community.php:106
+msgid "Posts from local users on this server"
 msgstr ""
 
-#: mod/match.php:102 mod/suggest.php:106 src/Content/Widget.php:42
-#: src/Model/Profile.php:309 src/Module/AllFriends.php:91
-#: src/Module/BaseSearchModule.php:128
-msgid "Connect"
+#: mod/community.php:114
+msgid "Global Community"
 msgstr ""
 
-#: mod/match.php:115 src/Content/Pager.php:198
-msgid "first"
+#: mod/community.php:117
+msgid "Posts from users of the whole federated network"
 msgstr ""
 
-#: mod/match.php:120 src/Content/Pager.php:258
-msgid "next"
+#: mod/community.php:163 mod/search.php:222
+msgid "No results."
 msgstr ""
 
-#: mod/match.php:130 src/Module/BaseSearchModule.php:89
-msgid "No matches"
+#: mod/community.php:215
+msgid ""
+"This community stream shows all public posts received by this node. They may "
+"not reflect the opinions of this node’s users."
 msgstr ""
 
-#: mod/match.php:135
-msgid "Profile Match"
+#: mod/crepair.php:79
+msgid "Contact settings applied."
 msgstr ""
 
-#: mod/message.php:33 mod/message.php:116 src/Content/Nav.php:254
-msgid "New Message"
+#: mod/crepair.php:81
+msgid "Contact update failed."
 msgstr ""
 
-#: mod/message.php:70 mod/wallmessage.php:60
-msgid "No recipient selected."
+#: mod/crepair.php:102 mod/dfrn_confirm.php:125 mod/fsuggest.php:32
+#: mod/fsuggest.php:75 mod/redir.php:32 mod/redir.php:140
+#: src/Module/FollowConfirm.php:46 src/Module/Group.php:92
+msgid "Contact not found."
 msgstr ""
 
-#: mod/message.php:74
-msgid "Unable to locate contact information."
+#: 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 ""
 
-#: mod/message.php:77 mod/wallmessage.php:66
-msgid "Message could not be sent."
+#: 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 ""
 
-#: mod/message.php:80 mod/wallmessage.php:69
-msgid "Message collection failure."
+#: mod/crepair.php:130 mod/crepair.php:132
+msgid "No mirroring"
 msgstr ""
 
-#: mod/message.php:83 mod/wallmessage.php:72
-msgid "Message sent."
+#: mod/crepair.php:130
+msgid "Mirror as forwarded posting"
 msgstr ""
 
-#: mod/message.php:110 mod/notifications.php:47 mod/notifications.php:190
-#: mod/notifications.php:246
-msgid "Discard"
+#: mod/crepair.php:130 mod/crepair.php:132
+msgid "Mirror as my own posting"
 msgstr ""
 
-#: mod/message.php:123 src/Content/Nav.php:251 view/theme/frio/theme.php:271
-msgid "Messages"
+#: mod/crepair.php:145
+msgid "Return to contact editor"
 msgstr ""
 
-#: mod/message.php:148
-msgid "Do you really want to delete this message?"
+#: mod/crepair.php:147
+msgid "Refetch contact data"
 msgstr ""
 
-#: mod/message.php:166
-msgid "Conversation not found."
+#: mod/crepair.php:150
+msgid "Remote Self"
 msgstr ""
 
-#: mod/message.php:171
-msgid "Message deleted."
+#: mod/crepair.php:153
+msgid "Mirror postings from this contact"
 msgstr ""
 
-#: mod/message.php:176 mod/message.php:190
-msgid "Conversation removed."
+#: mod/crepair.php:155
+msgid ""
+"Mark this contact as remote_self, this will cause friendica to repost new "
+"entries from this contact."
 msgstr ""
 
-#: mod/message.php:204 mod/message.php:360 mod/wallmessage.php:123
-msgid "Please enter a link URL:"
+#: mod/crepair.php:159 mod/settings.php:679 mod/settings.php:705
+#: src/Module/Admin/Blocklist/Contact.php:73 src/Module/Admin/Users.php:272
+#: src/Module/Admin/Users.php:283 src/Module/Admin/Users.php:297
+#: src/Module/Admin/Users.php:313
+msgid "Name"
 msgstr ""
 
-#: mod/message.php:246 mod/wallmessage.php:128
-msgid "Send Private Message"
+#: mod/crepair.php:160
+msgid "Account Nickname"
 msgstr ""
 
-#: mod/message.php:247 mod/message.php:430 mod/wallmessage.php:130
-msgid "To:"
+#: mod/crepair.php:161
+msgid "@Tagname - overrides Name/Nickname"
 msgstr ""
 
-#: mod/message.php:251 mod/message.php:432 mod/wallmessage.php:131
-msgid "Subject:"
+#: mod/crepair.php:162
+msgid "Account URL"
 msgstr ""
 
-#: mod/message.php:255 mod/message.php:435 mod/wallmessage.php:137
-#: src/Module/Invite.php:150
-msgid "Your message:"
+#: mod/crepair.php:163
+msgid "Account URL Alias"
 msgstr ""
 
-#: mod/message.php:289
-msgid "No messages."
+#: mod/crepair.php:164
+msgid "Friend Request URL"
 msgstr ""
 
-#: mod/message.php:352
-msgid "Message not available."
+#: mod/crepair.php:165
+msgid "Friend Confirm URL"
 msgstr ""
 
-#: mod/message.php:406
-msgid "Delete message"
+#: mod/crepair.php:166
+msgid "Notification Endpoint URL"
 msgstr ""
 
-#: mod/message.php:408 mod/message.php:540
-msgid "D, d M Y - g:i A"
+#: mod/crepair.php:167
+msgid "Poll/Feed URL"
 msgstr ""
 
-#: mod/message.php:423 mod/message.php:537
-msgid "Delete conversation"
+#: mod/crepair.php:168
+msgid "New photo from this URL"
 msgstr ""
 
-#: mod/message.php:425
+#: mod/dfrn_confirm.php:126
 msgid ""
-"No secure communications available. You <strong>may</strong> be able to "
-"respond from the sender's profile page."
-msgstr ""
-
-#: mod/message.php:429
-msgid "Send Reply"
+"This may occasionally happen if contact was requested by both persons and it "
+"has already been approved."
 msgstr ""
 
-#: mod/message.php:512
-#, php-format
-msgid "Unknown sender - %s"
+#: mod/dfrn_confirm.php:227
+msgid "Response from remote site was not understood."
 msgstr ""
 
-#: mod/message.php:514
-#, php-format
-msgid "You and %s"
+#: mod/dfrn_confirm.php:234 mod/dfrn_confirm.php:240
+msgid "Unexpected response from remote site: "
 msgstr ""
 
-#: mod/message.php:516
-#, php-format
-msgid "%s and You"
+#: mod/dfrn_confirm.php:249
+msgid "Confirmation completed successfully."
 msgstr ""
 
-#: mod/message.php:543
-#, php-format
-msgid "%d message"
-msgid_plural "%d messages"
-msgstr[0] ""
-msgstr[1] ""
-
-#: mod/network.php:182 mod/search.php:36
-msgid "Remove term"
+#: mod/dfrn_confirm.php:261
+msgid "Temporary failure. Please wait and try again."
 msgstr ""
 
-#: mod/network.php:189 mod/search.php:45
-msgid "Saved Searches"
+#: mod/dfrn_confirm.php:264
+msgid "Introduction failed or was revoked."
 msgstr ""
 
-#: mod/network.php:190 src/Model/Group.php:434
-msgid "add"
+#: mod/dfrn_confirm.php:269
+msgid "Remote site reported: "
 msgstr ""
 
-#: mod/network.php:570
+#: mod/dfrn_confirm.php:374
 #, php-format
-msgid ""
-"Warning: This group contains %s member from a network that doesn't allow non "
-"public messages."
-msgid_plural ""
-"Warning: This group contains %s members from a network that doesn't allow "
-"non public messages."
-msgstr[0] ""
-msgstr[1] ""
-
-#: mod/network.php:573
-msgid "Messages in this group won't be send to these receivers."
+msgid "No user record found for '%s' "
 msgstr ""
 
-#: mod/network.php:640
-msgid "No such group"
+#: mod/dfrn_confirm.php:384
+msgid "Our site encryption key is apparently messed up."
 msgstr ""
 
-#: mod/network.php:661 src/Module/Group.php:288
-msgid "Group is empty"
+#: mod/dfrn_confirm.php:395
+msgid "Empty site URL was provided or URL could not be decrypted by us."
 msgstr ""
 
-#: mod/network.php:665
-#, php-format
-msgid "Group: %s"
+#: mod/dfrn_confirm.php:411
+msgid "Contact record was not found for you on our site."
 msgstr ""
 
-#: mod/network.php:691
-msgid "Private messages to this person are at risk of public disclosure."
+#: mod/dfrn_confirm.php:425
+#, php-format
+msgid "Site public key not available in contact record for URL %s."
 msgstr ""
 
-#: mod/network.php:694 src/Module/AllFriends.php:35
-#: src/Module/AllFriends.php:43
-msgid "Invalid contact."
+#: mod/dfrn_confirm.php:441
+msgid ""
+"The ID provided by your system is a duplicate on our system. It should work "
+"if you try again."
 msgstr ""
 
-#: mod/network.php:973
-msgid "Commented Order"
+#: mod/dfrn_confirm.php:452
+msgid "Unable to set your contact credentials on our system."
 msgstr ""
 
-#: mod/network.php:976
-msgid "Sort by Comment Date"
+#: mod/dfrn_confirm.php:508
+msgid "Unable to update your contact profile details on our system"
 msgstr ""
 
-#: mod/network.php:981
-msgid "Posted Order"
+#: mod/dfrn_confirm.php:538 mod/dfrn_request.php:560 src/Model/Contact.php:2457
+msgid "[Name Withheld]"
 msgstr ""
 
-#: mod/network.php:984
-msgid "Sort by Post Date"
+#: mod/dfrn_poll.php:125 mod/dfrn_poll.php:530
+#, php-format
+msgid "%1$s welcomes %2$s"
 msgstr ""
 
-#: mod/network.php:991 mod/profiles.php:579
-#: src/Core/NotificationsManager.php:158
-msgid "Personal"
+#: mod/dfrn_request.php:98
+msgid "This introduction has already been accepted."
 msgstr ""
 
-#: mod/network.php:994
-msgid "Posts that mention or involve you"
+#: mod/dfrn_request.php:116 mod/dfrn_request.php:354
+msgid "Profile location is not valid or does not contain profile information."
 msgstr ""
 
-#: mod/network.php:1001
-msgid "New"
+#: mod/dfrn_request.php:120 mod/dfrn_request.php:358
+msgid "Warning: profile location has no identifiable owner name."
 msgstr ""
 
-#: mod/network.php:1004
-msgid "Activity Stream - by date"
+#: mod/dfrn_request.php:123 mod/dfrn_request.php:361
+msgid "Warning: profile location has no profile photo."
 msgstr ""
 
-#: mod/network.php:1012
-msgid "Shared Links"
-msgstr ""
+#: mod/dfrn_request.php:127 mod/dfrn_request.php:365
+#, php-format
+msgid "%d required parameter was not found at the given location"
+msgid_plural "%d required parameters were not found at the given location"
+msgstr[0] ""
+msgstr[1] ""
 
-#: mod/network.php:1015
-msgid "Interesting Links"
+#: mod/dfrn_request.php:165
+msgid "Introduction complete."
 msgstr ""
 
-#: mod/network.php:1022
-msgid "Starred"
+#: mod/dfrn_request.php:201
+msgid "Unrecoverable protocol error."
 msgstr ""
 
-#: mod/network.php:1025
-msgid "Favourite Posts"
+#: mod/dfrn_request.php:228
+msgid "Profile unavailable."
 msgstr ""
 
-#: mod/notes.php:34 src/Model/Profile.php:956
-msgid "Personal Notes"
+#: mod/dfrn_request.php:249
+#, php-format
+msgid "%s has received too many connection requests today."
 msgstr ""
 
-#: mod/notifications.php:38
-msgid "Invalid request identifier."
+#: mod/dfrn_request.php:250
+msgid "Spam protection measures have been invoked."
 msgstr ""
 
-#: mod/notifications.php:93 src/Content/Nav.php:246
-msgid "Notifications"
+#: mod/dfrn_request.php:251
+msgid "Friends are advised to please try again in 24 hours."
 msgstr ""
 
-#: mod/notifications.php:107
-msgid "Network Notifications"
+#: mod/dfrn_request.php:275
+msgid "Invalid locator"
 msgstr ""
 
-#: mod/notifications.php:112
-msgid "System Notifications"
+#: mod/dfrn_request.php:311
+msgid "You have already introduced yourself here."
 msgstr ""
 
-#: mod/notifications.php:117
-msgid "Personal Notifications"
+#: mod/dfrn_request.php:314
+#, php-format
+msgid "Apparently you are already friends with %s."
 msgstr ""
 
-#: mod/notifications.php:122
-msgid "Home Notifications"
+#: mod/dfrn_request.php:334
+msgid "Invalid profile URL."
 msgstr ""
 
-#: mod/notifications.php:145
-msgid "Show unread"
+#: mod/dfrn_request.php:340 src/Model/Contact.php:2099
+msgid "Disallowed profile URL."
 msgstr ""
 
-#: mod/notifications.php:145
-msgid "Show all"
+#: mod/dfrn_request.php:346 src/Model/Contact.php:2104
+#: src/Module/Friendica.php:59
+msgid "Blocked domain"
 msgstr ""
 
-#: mod/notifications.php:156
-msgid "Show Ignored Requests"
+#: mod/dfrn_request.php:413 src/Module/Contact.php:143
+msgid "Failed to update contact record."
 msgstr ""
 
-#: mod/notifications.php:156
-msgid "Hide Ignored Requests"
+#: mod/dfrn_request.php:433
+msgid "Your introduction has been sent."
 msgstr ""
 
-#: mod/notifications.php:169 mod/notifications.php:254
-msgid "Notification type:"
+#: mod/dfrn_request.php:471
+msgid ""
+"Remote subscription can't be done for your network. Please subscribe "
+"directly on your system."
 msgstr ""
 
-#: mod/notifications.php:172
-msgid "Suggested by:"
+#: mod/dfrn_request.php:487
+msgid "Please login to confirm introduction."
 msgstr ""
 
-#: mod/notifications.php:184 mod/notifications.php:271
-#: src/Module/Contact.php:626
-msgid "Hide this contact from others"
+#: mod/dfrn_request.php:495
+msgid ""
+"Incorrect identity currently logged in. Please login to <strong>this</"
+"strong> profile."
 msgstr ""
 
-#: mod/notifications.php:186 mod/notifications.php:280
-#: src/Module/Admin/Users.php:286
-msgid "Approve"
+#: mod/dfrn_request.php:509 mod/dfrn_request.php:524
+msgid "Confirm"
 msgstr ""
 
-#: mod/notifications.php:206
-msgid "Claims to be known to you: "
+#: mod/dfrn_request.php:520
+msgid "Hide this contact"
 msgstr ""
 
-#: mod/notifications.php:207
-msgid "yes"
+#: mod/dfrn_request.php:522
+#, php-format
+msgid "Welcome home %s."
 msgstr ""
 
-#: mod/notifications.php:207
-msgid "no"
+#: mod/dfrn_request.php:523
+#, php-format
+msgid "Please confirm your introduction/connection request to %s."
 msgstr ""
 
-#: mod/notifications.php:208 mod/notifications.php:212
-msgid "Shall your connection be bidirectional or not?"
+#: mod/dfrn_request.php:632
+msgid ""
+"Please enter your 'Identity Address' from one of the following supported "
+"communications networks:"
 msgstr ""
 
-#: mod/notifications.php:209 mod/notifications.php:213
+#: mod/dfrn_request.php:634
 #, php-format
 msgid ""
-"Accepting %s as a friend allows %s to subscribe to your posts, and you will "
-"also receive updates from them in your news feed."
+"If you are not yet a member of the free social web, <a href=\"%s\">follow "
+"this link to find a public Friendica site and join us today</a>."
 msgstr ""
 
-#: mod/notifications.php:210
-#, php-format
+#: mod/dfrn_request.php:637
+msgid "Friend/Connection Request"
+msgstr ""
+
+#: mod/dfrn_request.php:638
 msgid ""
-"Accepting %s as a subscriber allows them to subscribe to your posts, but you "
-"will not receive updates from them in your news feed."
+"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
+"testuser@gnusocial.de"
 msgstr ""
 
-#: mod/notifications.php:214
+#: mod/dfrn_request.php:639 mod/follow.php:162
+msgid "Please answer the following:"
+msgstr ""
+
+#: mod/dfrn_request.php:640 mod/follow.php:163
+#, php-format
+msgid "Does %s know you?"
+msgstr ""
+
+#: mod/dfrn_request.php:641 mod/follow.php:164
+msgid "Add a personal note:"
+msgstr ""
+
+#: mod/dfrn_request.php:643
+msgid "Friendica"
+msgstr ""
+
+#: mod/dfrn_request.php:644
+msgid "GNU Social (Pleroma, Mastodon)"
+msgstr ""
+
+#: mod/dfrn_request.php:645
+msgid "Diaspora (Socialhome, Hubzilla)"
+msgstr ""
+
+#: mod/dfrn_request.php:646
 #, php-format
 msgid ""
-"Accepting %s as a sharer allows them to subscribe to your posts, but you "
-"will not receive updates from them in your news feed."
+" - please do not use this form.  Instead, enter %s into your Diaspora search "
+"bar."
 msgstr ""
 
-#: mod/notifications.php:225
-msgid "Friend"
+#: mod/display.php:252 mod/display.php:337
+msgid "The requested item doesn't exist or has been deleted."
 msgstr ""
 
-#: mod/notifications.php:226
-msgid "Sharer"
+#: mod/display.php:412
+msgid "The feed for this item is unavailable."
 msgstr ""
 
-#: mod/notifications.php:226
-msgid "Subscriber"
+#: mod/editpost.php:28 mod/editpost.php:38
+msgid "Item not found"
 msgstr ""
 
-#: mod/notifications.php:266 src/Model/Profile.php:445
-#: src/Model/Profile.php:813 src/Module/Contact.php:643
-#: src/Module/Directory.php:150
-msgid "About:"
+#: mod/editpost.php:45
+msgid "Edit post"
 msgstr ""
 
-#: mod/notifications.php:270 src/Model/Profile.php:442
-#: src/Model/Profile.php:752 src/Module/Directory.php:147
-msgid "Gender:"
+#: mod/editpost.php:71 mod/notes.php:46 src/Content/Text/HTML.php:883
+#: src/Module/Filer/SaveTag.php:49
+msgid "Save"
 msgstr ""
 
-#: mod/notifications.php:277 src/Model/Profile.php:539
-#: src/Module/Contact.php:318
-msgid "Network:"
+#: mod/editpost.php:77
+msgid "web link"
 msgstr ""
 
-#: mod/notifications.php:291
-msgid "No introductions."
+#: mod/editpost.php:78
+msgid "Insert video link"
 msgstr ""
 
-#: mod/notifications.php:325
+#: mod/editpost.php:79
+msgid "video link"
+msgstr ""
+
+#: mod/editpost.php:80
+msgid "Insert audio link"
+msgstr ""
+
+#: mod/editpost.php:81
+msgid "audio link"
+msgstr ""
+
+#: mod/editpost.php:95 src/Core/ACL.php:308 src/Module/Item/Compose.php:200
+msgid "CC: email addresses"
+msgstr ""
+
+#: mod/editpost.php:102 src/Core/ACL.php:309
+msgid "Example: bob@example.com, mary@example.com"
+msgstr ""
+
+#: mod/events.php:118 mod/events.php:120
+msgid "Event can not end before it has started."
+msgstr ""
+
+#: mod/events.php:127 mod/events.php:129
+msgid "Event title and start time are required."
+msgstr ""
+
+#: mod/events.php:385
+msgid "Create New Event"
+msgstr ""
+
+#: mod/events.php:508
+msgid "Event details"
+msgstr ""
+
+#: mod/events.php:509
+msgid "Starting date and Title are required."
+msgstr ""
+
+#: mod/events.php:510 mod/events.php:515
+msgid "Event Starts:"
+msgstr ""
+
+#: mod/events.php:523 mod/events.php:548
+msgid "Finish date/time is not known or not relevant"
+msgstr ""
+
+#: mod/events.php:525 mod/events.php:530
+msgid "Event Finishes:"
+msgstr ""
+
+#: mod/events.php:536 mod/events.php:549
+msgid "Adjust for viewer timezone"
+msgstr ""
+
+#: mod/events.php:538
+msgid "Description:"
+msgstr ""
+
+#: mod/events.php:540 mod/notifications.php:264 src/Model/Event.php:68
+#: src/Model/Event.php:95 src/Model/Event.php:437 src/Model/Event.php:933
+#: src/Model/Profile.php:447 src/Module/Contact.php:645
+#: src/Module/Directory.php:137
+msgid "Location:"
+msgstr ""
+
+#: mod/events.php:542 mod/events.php:544
+msgid "Title:"
+msgstr ""
+
+#: mod/events.php:545 mod/events.php:546
+msgid "Share this event"
+msgstr ""
+
+#: mod/events.php:553 src/Model/Profile.php:882
+msgid "Basic"
+msgstr ""
+
+#: mod/events.php:554 src/Model/Profile.php:883 src/Module/Admin/Site.php:574
+#: src/Module/Contact.php:905
+msgid "Advanced"
+msgstr ""
+
+#: mod/events.php:555 mod/photos.php:1009 mod/photos.php:1383
+#: src/Core/ACL.php:314
+msgid "Permissions"
+msgstr ""
+
+#: mod/events.php:571
+msgid "Failed to remove event"
+msgstr ""
+
+#: mod/events.php:573
+msgid "Event removed"
+msgstr ""
+
+#: mod/fbrowser.php:43 view/theme/frio/theme.php:269 src/Content/Nav.php:162
+#: src/Model/Profile.php:925
+msgid "Photos"
+msgstr ""
+
+#: mod/fbrowser.php:52 mod/fbrowser.php:76 mod/photos.php:196
+#: mod/photos.php:973 mod/photos.php:1090 mod/photos.php:1107
+#: mod/photos.php:1584 mod/photos.php:1599 src/Model/Photo.php:574
+#: src/Model/Photo.php:583
+msgid "Contact Photos"
+msgstr ""
+
+#: mod/fbrowser.php:112 mod/fbrowser.php:141 mod/profile_photo.php:247
+msgid "Upload"
+msgstr ""
+
+#: mod/fbrowser.php:136
+msgid "Files"
+msgstr ""
+
+#: mod/follow.php:46
+msgid "The contact could not be added."
+msgstr ""
+
+#: mod/follow.php:87
+msgid "You already added this contact."
+msgstr ""
+
+#: mod/follow.php:99
+msgid "Diaspora support isn't enabled. Contact can't be added."
+msgstr ""
+
+#: mod/follow.php:106
+msgid "OStatus support is disabled. Contact can't be added."
+msgstr ""
+
+#: mod/follow.php:113
+msgid "The network type couldn't be detected. Contact can't be added."
+msgstr ""
+
+#: mod/follow.php:183 mod/notifications.php:268 src/Model/Profile.php:812
+#: src/Module/Contact.php:651
+msgid "Tags:"
+msgstr ""
+
+#: mod/fsuggest.php:44
+msgid "Suggested contact not found."
+msgstr ""
+
+#: mod/fsuggest.php:57
+msgid "Friend suggestion sent."
+msgstr ""
+
+#: mod/fsuggest.php:79
+msgid "Suggest Friends"
+msgstr ""
+
+#: mod/fsuggest.php:81
 #, php-format
-msgid "No more %s notifications."
+msgid "Suggest a friend for %s"
 msgstr ""
 
-#: mod/oexchange.php:32
-msgid "Post successful."
+#: mod/hcard.php:20
+msgid "No profile"
 msgstr ""
 
-#: mod/openid.php:31
-msgid "OpenID protocol error. No ID returned."
+#: mod/item.php:123
+msgid "Unable to locate original post."
 msgstr ""
 
-#: mod/openid.php:67
+#: mod/item.php:323
+msgid "Empty post discarded."
+msgstr ""
+
+#: mod/item.php:803
+#, php-format
 msgid ""
-"Account not found and OpenID registration is not permitted on this site."
+"This message was sent to you by %s, a member of the Friendica social network."
 msgstr ""
 
-#: mod/openid.php:117 src/Module/Login.php:93 src/Module/Login.php:144
-msgid "Login failed."
+#: mod/item.php:805
+#, php-format
+msgid "You may visit them online at %s"
 msgstr ""
 
-#: mod/ostatus_subscribe.php:23
-msgid "Subscribing to OStatus contacts"
+#: mod/item.php:806
+msgid ""
+"Please contact the sender by replying to this post if you do not wish to "
+"receive these messages."
 msgstr ""
 
-#: mod/ostatus_subscribe.php:35
-msgid "No contact provided."
+#: mod/item.php:810
+#, php-format
+msgid "%s posted an update."
 msgstr ""
 
-#: mod/ostatus_subscribe.php:42
-msgid "Couldn't fetch information for contact."
+#: mod/lockview.php:47 mod/lockview.php:58
+msgid "Remote privacy information not available."
 msgstr ""
 
-#: mod/ostatus_subscribe.php:52
-msgid "Couldn't fetch friends for contact."
+#: mod/lockview.php:67
+msgid "Visible to:"
 msgstr ""
 
-#: mod/ostatus_subscribe.php:70 mod/repair_ostatus.php:52
-msgid "Done"
+#: mod/lockview.php:73 mod/lockview.php:108 src/Content/Widget.php:192
+#: src/Module/Contact.php:797 src/Module/Item/Compose.php:97
+#: src/Module/Profile/Contacts.php:126
+msgid "Followers"
 msgstr ""
 
-#: mod/ostatus_subscribe.php:84
-msgid "success"
+#: mod/lockview.php:79 mod/lockview.php:114 src/Module/Item/Compose.php:104
+msgid "Mutuals"
 msgstr ""
 
-#: mod/ostatus_subscribe.php:86
-msgid "failed"
+#: mod/lostpass.php:26
+msgid "No valid account found."
 msgstr ""
 
-#: mod/ostatus_subscribe.php:89 src/Object/Post.php:284
-msgid "ignored"
+#: mod/lostpass.php:38
+msgid "Password reset request issued. Check your email."
 msgstr ""
 
-#: mod/ostatus_subscribe.php:94 mod/repair_ostatus.php:58
-msgid "Keep this window open until done."
+#: mod/lostpass.php:44
+#, php-format
+msgid ""
+"\n"
+"\t\tDear %1$s,\n"
+"\t\t\tA request was recently received at \"%2$s\" to reset your account\n"
+"\t\tpassword. In order to confirm this request, please select the "
+"verification link\n"
+"\t\tbelow or paste it into your web browser address bar.\n"
+"\n"
+"\t\tIf you did NOT request this change, please DO NOT follow the link\n"
+"\t\tprovided and ignore and/or delete this email, the request will expire "
+"shortly.\n"
+"\n"
+"\t\tYour password will not be changed unless we can verify that you\n"
+"\t\tissued this request."
 msgstr ""
 
-#: mod/photos.php:113 src/Model/Profile.php:917
-msgid "Photo Albums"
+#: mod/lostpass.php:55
+#, php-format
+msgid ""
+"\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"
 msgstr ""
 
-#: mod/photos.php:114 mod/photos.php:1638
-msgid "Recent Photos"
+#: mod/lostpass.php:74
+#, php-format
+msgid "Password reset requested at %s"
 msgstr ""
 
-#: mod/photos.php:116 mod/photos.php:1152 mod/photos.php:1640
-msgid "Upload New Photos"
+#: mod/lostpass.php:89
+msgid ""
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
 msgstr ""
 
-#: mod/photos.php:134 mod/settings.php:58 src/Module/BaseSettingsModule.php:18
-msgid "everybody"
+#: mod/lostpass.php:102
+msgid "Request has expired, please make a new one."
 msgstr ""
 
-#: mod/photos.php:185
-msgid "Contact information unavailable"
+#: mod/lostpass.php:117
+msgid "Forgot your Password?"
 msgstr ""
 
-#: mod/photos.php:207
-msgid "Album not found."
+#: mod/lostpass.php:118
+msgid ""
+"Enter your email address and submit to have your password reset. Then check "
+"your email for further instructions."
 msgstr ""
 
-#: mod/photos.php:265
-msgid "Album successfully deleted"
+#: mod/lostpass.php:119 src/Module/Login.php:318
+msgid "Nickname or Email: "
 msgstr ""
 
-#: mod/photos.php:267
-msgid "Album was empty."
+#: mod/lostpass.php:120
+msgid "Reset"
 msgstr ""
 
-#: mod/photos.php:590
-msgid "a photo"
+#: mod/lostpass.php:135 src/Module/Login.php:330
+msgid "Password Reset"
 msgstr ""
 
-#: mod/photos.php:590
+#: mod/lostpass.php:136
+msgid "Your password has been reset as requested."
+msgstr ""
+
+#: mod/lostpass.php:137
+msgid "Your new password is"
+msgstr ""
+
+#: mod/lostpass.php:138
+msgid "Save or copy your new password - and then"
+msgstr ""
+
+#: mod/lostpass.php:139
+msgid "click here to login"
+msgstr ""
+
+#: mod/lostpass.php:140
+msgid ""
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
+msgstr ""
+
+#: mod/lostpass.php:147
 #, php-format
-msgid "%1$s was tagged in %2$s by %3$s"
+msgid ""
+"\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"
 msgstr ""
 
-#: mod/photos.php:683 mod/photos.php:686 mod/photos.php:715
-#: mod/profile_photo.php:152 mod/wall_upload.php:198
+#: mod/lostpass.php:153
 #, php-format
-msgid "Image exceeds size limit of %s"
+msgid ""
+"\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"
 msgstr ""
 
-#: mod/photos.php:689
-msgid "Image upload didn't complete, please try again"
+#: mod/lostpass.php:169
+#, php-format
+msgid "Your password has been changed at %s"
 msgstr ""
 
-#: mod/photos.php:692
-msgid "Image file is missing"
+#: mod/manage.php:179
+msgid "Manage Identities and/or Pages"
 msgstr ""
 
-#: mod/photos.php:697
+#: mod/manage.php:180
 msgid ""
-"Server can't accept new file upload at this time, please contact your "
-"administrator"
+"Toggle between different identities or community/group pages which share "
+"your account details or which you have been granted \"manage\" permissions"
 msgstr ""
 
-#: mod/photos.php:723
-msgid "Image file is empty."
+#: mod/manage.php:181
+msgid "Select an identity to manage: "
 msgstr ""
 
-#: mod/photos.php:738 mod/profile_photo.php:161 mod/wall_upload.php:212
-msgid "Unable to process image."
+#: mod/message.php:33 mod/message.php:116 src/Content/Nav.php:257
+msgid "New Message"
 msgstr ""
 
-#: mod/photos.php:767 mod/profile_photo.php:310 mod/wall_upload.php:251
-msgid "Image upload failed."
+#: mod/message.php:74
+msgid "Unable to locate contact information."
 msgstr ""
 
-#: mod/photos.php:855
-msgid "No photos selected"
+#: mod/message.php:110 mod/notifications.php:47 mod/notifications.php:190
+#: mod/notifications.php:246
+msgid "Discard"
 msgstr ""
 
-#: mod/photos.php:947 mod/videos.php:210
-msgid "Access to this item is restricted."
+#: mod/message.php:123 view/theme/frio/theme.php:276 src/Content/Nav.php:254
+msgid "Messages"
 msgstr ""
 
-#: mod/photos.php:1001
-msgid "Upload Photos"
+#: mod/message.php:148
+msgid "Do you really want to delete this message?"
 msgstr ""
 
-#: mod/photos.php:1005 mod/photos.php:1097
-msgid "New album name: "
+#: mod/message.php:166
+msgid "Conversation not found."
 msgstr ""
 
-#: mod/photos.php:1006
-msgid "or select existing album:"
+#: mod/message.php:171
+msgid "Message deleted."
 msgstr ""
 
-#: mod/photos.php:1007
-msgid "Do not show a status post for this upload"
+#: mod/message.php:176 mod/message.php:190
+msgid "Conversation removed."
 msgstr ""
 
-#: mod/photos.php:1023 mod/photos.php:1390 mod/settings.php:1208
-msgid "Show to Groups"
+#: mod/message.php:289
+msgid "No messages."
 msgstr ""
 
-#: mod/photos.php:1024 mod/photos.php:1391 mod/settings.php:1209
-msgid "Show to Contacts"
+#: mod/message.php:352
+msgid "Message not available."
 msgstr ""
 
-#: mod/photos.php:1079
-msgid "Do you really want to delete this photo album and all its photos?"
+#: mod/message.php:406
+msgid "Delete message"
 msgstr ""
 
-#: mod/photos.php:1081 mod/photos.php:1102
-msgid "Delete Album"
+#: mod/message.php:408 mod/message.php:540
+msgid "D, d M Y - g:i A"
 msgstr ""
 
-#: mod/photos.php:1108
-msgid "Edit Album"
+#: mod/message.php:423 mod/message.php:537
+msgid "Delete conversation"
 msgstr ""
 
-#: mod/photos.php:1109
-msgid "Drop Album"
+#: mod/message.php:425
+msgid ""
+"No secure communications available. You <strong>may</strong> be able to "
+"respond from the sender's profile page."
 msgstr ""
 
-#: mod/photos.php:1114
-msgid "Show Newest First"
+#: mod/message.php:429
+msgid "Send Reply"
 msgstr ""
 
-#: mod/photos.php:1116
-msgid "Show Oldest First"
+#: mod/message.php:512
+#, php-format
+msgid "Unknown sender - %s"
 msgstr ""
 
-#: mod/photos.php:1137 mod/photos.php:1623
-msgid "View Photo"
+#: mod/message.php:514
+#, php-format
+msgid "You and %s"
 msgstr ""
 
-#: mod/photos.php:1174
-msgid "Permission denied. Access to this item may be restricted."
+#: mod/message.php:516
+#, php-format
+msgid "%s and You"
 msgstr ""
 
-#: mod/photos.php:1176
-msgid "Photo not available"
+#: mod/message.php:543
+#, php-format
+msgid "%d message"
+msgid_plural "%d messages"
+msgstr[0] ""
+msgstr[1] ""
+
+#: mod/network.php:183 mod/search.php:35
+msgid "Remove term"
 msgstr ""
 
-#: mod/photos.php:1186
-msgid "Do you really want to delete this photo?"
+#: mod/network.php:190 mod/search.php:44
+msgid "Saved Searches"
 msgstr ""
 
-#: mod/photos.php:1188 mod/photos.php:1387
-msgid "Delete Photo"
+#: mod/network.php:191 src/Model/Group.php:483
+msgid "add"
+msgstr ""
+
+#: mod/network.php:571
+#, php-format
+msgid ""
+"Warning: This group contains %s member from a network that doesn't allow non "
+"public messages."
+msgid_plural ""
+"Warning: This group contains %s members from a network that doesn't allow "
+"non public messages."
+msgstr[0] ""
+msgstr[1] ""
+
+#: mod/network.php:574
+msgid "Messages in this group won't be send to these receivers."
 msgstr ""
 
-#: mod/photos.php:1279
-msgid "View photo"
+#: mod/network.php:641
+msgid "No such group"
 msgstr ""
 
-#: mod/photos.php:1281
-msgid "Edit photo"
+#: mod/network.php:662 src/Module/Group.php:288
+msgid "Group is empty"
 msgstr ""
 
-#: mod/photos.php:1282
-msgid "Delete photo"
+#: mod/network.php:666
+#, php-format
+msgid "Group: %s"
 msgstr ""
 
-#: mod/photos.php:1283
-msgid "Use as profile photo"
+#: mod/network.php:692
+msgid "Private messages to this person are at risk of public disclosure."
 msgstr ""
 
-#: mod/photos.php:1290
-msgid "Private Photo"
+#: mod/network.php:695 src/Module/AllFriends.php:35
+#: src/Module/AllFriends.php:43
+msgid "Invalid contact."
 msgstr ""
 
-#: mod/photos.php:1296
-msgid "View Full Size"
+#: mod/network.php:974
+msgid "Commented Order"
 msgstr ""
 
-#: mod/photos.php:1355
-msgid "Tags: "
+#: mod/network.php:977
+msgid "Sort by Comment Date"
 msgstr ""
 
-#: mod/photos.php:1358
-msgid "[Select tags to remove]"
+#: mod/network.php:982
+msgid "Posted Order"
 msgstr ""
 
-#: mod/photos.php:1373
-msgid "New album name"
+#: mod/network.php:985
+msgid "Sort by Post Date"
 msgstr ""
 
-#: mod/photos.php:1374
-msgid "Caption"
+#: mod/network.php:995
+msgid "Posts that mention or involve you"
 msgstr ""
 
-#: mod/photos.php:1375
-msgid "Add a Tag"
+#: mod/network.php:1002
+msgid "New"
 msgstr ""
 
-#: mod/photos.php:1375
-msgid "Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+#: mod/network.php:1005
+msgid "Activity Stream - by date"
 msgstr ""
 
-#: mod/photos.php:1376
-msgid "Do not rotate"
+#: mod/network.php:1013
+msgid "Shared Links"
 msgstr ""
 
-#: mod/photos.php:1377
-msgid "Rotate CW (right)"
+#: mod/network.php:1016
+msgid "Interesting Links"
 msgstr ""
 
-#: mod/photos.php:1378
-msgid "Rotate CCW (left)"
+#: mod/network.php:1023
+msgid "Starred"
 msgstr ""
 
-#: mod/photos.php:1412 src/Object/Post.php:312
-msgid "I like this (toggle)"
+#: mod/network.php:1026
+msgid "Favourite Posts"
 msgstr ""
 
-#: mod/photos.php:1413 src/Object/Post.php:313
-msgid "I don't like this (toggle)"
+#: mod/notes.php:34 src/Model/Profile.php:967
+msgid "Personal Notes"
 msgstr ""
 
-#: mod/photos.php:1428 mod/photos.php:1467 mod/photos.php:1527
-#: src/Module/Contact.php:1015 src/Object/Post.php:874
-msgid "This is you"
+#: mod/notifications.php:38
+msgid "Invalid request identifier."
 msgstr ""
 
-#: mod/photos.php:1430 mod/photos.php:1469 mod/photos.php:1529
-#: src/Object/Post.php:419 src/Object/Post.php:876
-msgid "Comment"
+#: mod/notifications.php:93 src/Content/Nav.php:249
+msgid "Notifications"
 msgstr ""
 
-#: mod/photos.php:1558
-msgid "Map"
+#: mod/notifications.php:107
+msgid "Network Notifications"
 msgstr ""
 
-#: mod/photos.php:1629 mod/videos.php:287
-msgid "View Album"
+#: mod/notifications.php:112
+msgid "System Notifications"
 msgstr ""
 
-#: mod/ping.php:272
-msgid "{0} wants to be your friend"
+#: mod/notifications.php:117
+msgid "Personal Notifications"
 msgstr ""
 
-#: mod/ping.php:288
-msgid "{0} requested registration"
+#: mod/notifications.php:122
+msgid "Home Notifications"
 msgstr ""
 
-#: mod/poke.php:177
-msgid "Poke/Prod"
+#: mod/notifications.php:145
+msgid "Show unread"
 msgstr ""
 
-#: mod/poke.php:178
-msgid "poke, prod or do other things to somebody"
+#: mod/notifications.php:145
+msgid "Show all"
 msgstr ""
 
-#: mod/poke.php:179
-msgid "Recipient"
+#: mod/notifications.php:156
+msgid "Show Ignored Requests"
 msgstr ""
 
-#: mod/poke.php:180
-msgid "Choose what you wish to do to recipient"
+#: mod/notifications.php:156
+msgid "Hide Ignored Requests"
 msgstr ""
 
-#: mod/poke.php:183
-msgid "Make this post private"
+#: mod/notifications.php:169 mod/notifications.php:254
+msgid "Notification type:"
 msgstr ""
 
-#: mod/profiles.php:62
-msgid "Profile deleted."
+#: mod/notifications.php:172
+msgid "Suggested by:"
 msgstr ""
 
-#: mod/profiles.php:78 mod/profiles.php:114
-msgid "Profile-"
+#: mod/notifications.php:184 mod/notifications.php:271
+#: src/Module/Contact.php:632
+msgid "Hide this contact from others"
 msgstr ""
 
-#: mod/profiles.php:97 mod/profiles.php:135
-msgid "New profile created."
+#: mod/notifications.php:186 mod/notifications.php:280
+#: src/Module/Admin/Users.php:286
+msgid "Approve"
 msgstr ""
 
-#: mod/profiles.php:120
-msgid "Profile unavailable to clone."
+#: mod/notifications.php:206
+msgid "Claims to be known to you: "
 msgstr ""
 
-#: mod/profiles.php:206
-msgid "Profile Name is required."
+#: mod/notifications.php:207
+msgid "yes"
 msgstr ""
 
-#: mod/profiles.php:346
-msgid "Marital Status"
+#: mod/notifications.php:207
+msgid "no"
 msgstr ""
 
-#: mod/profiles.php:349
-msgid "Romantic Partner"
+#: mod/notifications.php:208 mod/notifications.php:212
+msgid "Shall your connection be bidirectional or not?"
 msgstr ""
 
-#: mod/profiles.php:358
-msgid "Work/Employment"
+#: mod/notifications.php:209 mod/notifications.php:213
+#, php-format
+msgid ""
+"Accepting %s as a friend allows %s to subscribe to your posts, and you will "
+"also receive updates from them in your news feed."
 msgstr ""
 
-#: mod/profiles.php:361
-msgid "Religion"
+#: mod/notifications.php:210
+#, php-format
+msgid ""
+"Accepting %s as a subscriber allows them to subscribe to your posts, but you "
+"will not receive updates from them in your news feed."
 msgstr ""
 
-#: mod/profiles.php:364
-msgid "Political Views"
+#: mod/notifications.php:214
+#, php-format
+msgid ""
+"Accepting %s as a sharer allows them to subscribe to your posts, but you "
+"will not receive updates from them in your news feed."
 msgstr ""
 
-#: mod/profiles.php:367
-msgid "Gender"
+#: mod/notifications.php:225
+msgid "Friend"
 msgstr ""
 
-#: mod/profiles.php:370
-msgid "Sexual Preference"
+#: mod/notifications.php:226
+msgid "Sharer"
 msgstr ""
 
-#: mod/profiles.php:373
-msgid "XMPP"
+#: mod/notifications.php:226
+msgid "Subscriber"
 msgstr ""
 
-#: mod/profiles.php:376
-msgid "Homepage"
+#: mod/notifications.php:266 src/Model/Profile.php:453
+#: src/Model/Profile.php:824 src/Module/Contact.php:649
+#: src/Module/Directory.php:145
+msgid "About:"
 msgstr ""
 
-#: mod/profiles.php:379 mod/profiles.php:578
-msgid "Interests"
+#: mod/notifications.php:270 src/Model/Profile.php:450
+#: src/Model/Profile.php:763 src/Module/Directory.php:142
+msgid "Gender:"
 msgstr ""
 
-#: mod/profiles.php:382
-msgid "Address"
+#: mod/notifications.php:277 src/Model/Profile.php:550
+#: src/Module/Contact.php:333
+msgid "Network:"
 msgstr ""
 
-#: mod/profiles.php:389 mod/profiles.php:574
-msgid "Location"
+#: mod/notifications.php:291
+msgid "No introductions."
 msgstr ""
 
-#: mod/profiles.php:469
-msgid "Profile updated."
+#: mod/notifications.php:325
+#, php-format
+msgid "No more %s notifications."
 msgstr ""
 
-#: mod/profiles.php:523
-msgid "Hide contacts and friends:"
+#: mod/openid.php:31
+msgid "OpenID protocol error. No ID returned."
 msgstr ""
 
-#: mod/profiles.php:528
-msgid "Hide your contact/friend list from viewers of this profile?"
+#: mod/openid.php:67
+msgid ""
+"Account not found and OpenID registration is not permitted on this site."
 msgstr ""
 
-#: mod/profiles.php:548
-msgid "Show more profile fields:"
+#: mod/openid.php:117 src/Module/Login.php:88 src/Module/Login.php:139
+msgid "Login failed."
 msgstr ""
 
-#: mod/profiles.php:560
-msgid "Profile Actions"
+#: mod/photos.php:113 src/Model/Profile.php:928
+msgid "Photo Albums"
 msgstr ""
 
-#: mod/profiles.php:561
-msgid "Edit Profile Details"
+#: mod/photos.php:114 mod/photos.php:1639
+msgid "Recent Photos"
 msgstr ""
 
-#: mod/profiles.php:563
-msgid "Change Profile Photo"
+#: mod/photos.php:116 mod/photos.php:1152 mod/photos.php:1641
+msgid "Upload New Photos"
 msgstr ""
 
-#: mod/profiles.php:565
-msgid "View this profile"
+#: mod/photos.php:134 mod/settings.php:60 src/Module/BaseSettingsModule.php:18
+msgid "everybody"
 msgstr ""
 
-#: mod/profiles.php:566
-msgid "View all profiles"
+#: mod/photos.php:185
+msgid "Contact information unavailable"
 msgstr ""
 
-#: mod/profiles.php:567 mod/profiles.php:662 src/Model/Profile.php:415
-msgid "Edit visibility"
+#: mod/photos.php:207
+msgid "Album not found."
 msgstr ""
 
-#: mod/profiles.php:568
-msgid "Create a new profile using these settings"
+#: mod/photos.php:265
+msgid "Album successfully deleted"
 msgstr ""
 
-#: mod/profiles.php:569
-msgid "Clone this profile"
+#: mod/photos.php:267
+msgid "Album was empty."
 msgstr ""
 
-#: mod/profiles.php:570
-msgid "Delete this profile"
+#: mod/photos.php:590
+msgid "a photo"
 msgstr ""
 
-#: mod/profiles.php:572
-msgid "Basic information"
+#: mod/photos.php:590
+#, php-format
+msgid "%1$s was tagged in %2$s by %3$s"
 msgstr ""
 
-#: mod/profiles.php:573
-msgid "Profile picture"
+#: mod/photos.php:689
+msgid "Image upload didn't complete, please try again"
 msgstr ""
 
-#: mod/profiles.php:575
-msgid "Preferences"
+#: mod/photos.php:692
+msgid "Image file is missing"
 msgstr ""
 
-#: mod/profiles.php:576
-msgid "Status information"
+#: mod/photos.php:697
+msgid ""
+"Server can't accept new file upload at this time, please contact your "
+"administrator"
 msgstr ""
 
-#: mod/profiles.php:577
-msgid "Additional information"
+#: mod/photos.php:723
+msgid "Image file is empty."
 msgstr ""
 
-#: mod/profiles.php:580
-msgid "Relation"
+#: mod/photos.php:855
+msgid "No photos selected"
 msgstr ""
 
-#: mod/profiles.php:581 src/Util/Temporal.php:79 src/Util/Temporal.php:81
-msgid "Miscellaneous"
+#: mod/photos.php:947 mod/videos.php:210
+msgid "Access to this item is restricted."
 msgstr ""
 
-#: mod/profiles.php:583 mod/profile_photo.php:253 src/Module/Welcome.php:39
-msgid "Upload Profile Photo"
+#: mod/photos.php:1001
+msgid "Upload Photos"
 msgstr ""
 
-#: mod/profiles.php:584
-msgid "Your Gender:"
+#: mod/photos.php:1005 mod/photos.php:1097
+msgid "New album name: "
 msgstr ""
 
-#: mod/profiles.php:585
-msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
+#: mod/photos.php:1006
+msgid "or select existing album:"
 msgstr ""
 
-#: mod/profiles.php:586 src/Model/Profile.php:789
-msgid "Sexual Preference:"
+#: mod/photos.php:1007
+msgid "Do not show a status post for this upload"
 msgstr ""
 
-#: mod/profiles.php:587
-msgid "Example: fishing photography software"
+#: mod/photos.php:1023 mod/photos.php:1391 mod/settings.php:1213
+msgid "Show to Groups"
 msgstr ""
 
-#: mod/profiles.php:592
-msgid "Profile Name:"
+#: mod/photos.php:1024 mod/photos.php:1392 mod/settings.php:1214
+msgid "Show to Contacts"
 msgstr ""
 
-#: mod/profiles.php:594
-msgid ""
-"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
-"be visible to anybody using the internet."
+#: mod/photos.php:1079
+msgid "Do you really want to delete this photo album and all its photos?"
 msgstr ""
 
-#: mod/profiles.php:595
-msgid "Your Full Name:"
+#: mod/photos.php:1081 mod/photos.php:1102
+msgid "Delete Album"
 msgstr ""
 
-#: mod/profiles.php:596
-msgid "Title/Description:"
+#: mod/photos.php:1108
+msgid "Edit Album"
 msgstr ""
 
-#: mod/profiles.php:599
-msgid "Street Address:"
+#: mod/photos.php:1109
+msgid "Drop Album"
 msgstr ""
 
-#: mod/profiles.php:600
-msgid "Locality/City:"
+#: mod/photos.php:1114
+msgid "Show Newest First"
 msgstr ""
 
-#: mod/profiles.php:601
-msgid "Region/State:"
+#: mod/photos.php:1116
+msgid "Show Oldest First"
 msgstr ""
 
-#: mod/profiles.php:602
-msgid "Postal/Zip Code:"
+#: mod/photos.php:1137 mod/photos.php:1624
+msgid "View Photo"
 msgstr ""
 
-#: mod/profiles.php:603
-msgid "Country:"
+#: mod/photos.php:1174
+msgid "Permission denied. Access to this item may be restricted."
 msgstr ""
 
-#: mod/profiles.php:604 src/Util/Temporal.php:149
-msgid "Age: "
+#: mod/photos.php:1176
+msgid "Photo not available"
 msgstr ""
 
-#: mod/profiles.php:607
-msgid "Who: (if applicable)"
+#: mod/photos.php:1186
+msgid "Do you really want to delete this photo?"
 msgstr ""
 
-#: mod/profiles.php:607
-msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
+#: mod/photos.php:1188 mod/photos.php:1388
+msgid "Delete Photo"
 msgstr ""
 
-#: mod/profiles.php:608
-msgid "Since [date]:"
+#: mod/photos.php:1279
+msgid "View photo"
 msgstr ""
 
-#: mod/profiles.php:610
-msgid "Tell us about yourself..."
+#: mod/photos.php:1281
+msgid "Edit photo"
 msgstr ""
 
-#: mod/profiles.php:611
-msgid "XMPP (Jabber) address:"
+#: mod/photos.php:1282
+msgid "Delete photo"
 msgstr ""
 
-#: mod/profiles.php:611
-msgid ""
-"The XMPP address will be propagated to your contacts so that they can follow "
-"you."
+#: mod/photos.php:1283
+msgid "Use as profile photo"
 msgstr ""
 
-#: mod/profiles.php:612
-msgid "Homepage URL:"
+#: mod/photos.php:1290
+msgid "Private Photo"
 msgstr ""
 
-#: mod/profiles.php:613 src/Model/Profile.php:797
-msgid "Hometown:"
+#: mod/photos.php:1296
+msgid "View Full Size"
 msgstr ""
 
-#: mod/profiles.php:614 src/Model/Profile.php:805
-msgid "Political Views:"
+#: mod/photos.php:1356
+msgid "Tags: "
 msgstr ""
 
-#: mod/profiles.php:615
-msgid "Religious Views:"
+#: mod/photos.php:1359
+msgid "[Select tags to remove]"
 msgstr ""
 
-#: mod/profiles.php:616
-msgid "Public Keywords:"
+#: mod/photos.php:1374
+msgid "New album name"
 msgstr ""
 
-#: mod/profiles.php:616
-msgid "(Used for suggesting potential friends, can be seen by others)"
+#: mod/photos.php:1375
+msgid "Caption"
 msgstr ""
 
-#: mod/profiles.php:617
-msgid "Private Keywords:"
+#: mod/photos.php:1376
+msgid "Add a Tag"
 msgstr ""
 
-#: mod/profiles.php:617
-msgid "(Used for searching profiles, never shown to others)"
+#: mod/photos.php:1376
+msgid "Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
 msgstr ""
 
-#: mod/profiles.php:618 src/Model/Profile.php:821
-msgid "Likes:"
+#: mod/photos.php:1377
+msgid "Do not rotate"
 msgstr ""
 
-#: mod/profiles.php:619 src/Model/Profile.php:825
-msgid "Dislikes:"
+#: mod/photos.php:1378
+msgid "Rotate CW (right)"
 msgstr ""
 
-#: mod/profiles.php:620
-msgid "Musical interests"
+#: mod/photos.php:1379
+msgid "Rotate CCW (left)"
 msgstr ""
 
-#: mod/profiles.php:621
-msgid "Books, literature"
+#: mod/photos.php:1413 src/Object/Post.php:313
+msgid "I like this (toggle)"
 msgstr ""
 
-#: mod/profiles.php:622
-msgid "Television"
+#: mod/photos.php:1414 src/Object/Post.php:314
+msgid "I don't like this (toggle)"
 msgstr ""
 
-#: mod/profiles.php:623
-msgid "Film/dance/culture/entertainment"
+#: mod/photos.php:1429 mod/photos.php:1468 mod/photos.php:1528
+#: src/Module/Contact.php:1017 src/Module/Item/Compose.php:176
+#: src/Object/Post.php:875
+msgid "This is you"
 msgstr ""
 
-#: mod/profiles.php:624
-msgid "Hobbies/Interests"
+#: mod/photos.php:1431 mod/photos.php:1470 mod/photos.php:1530
+#: src/Object/Post.php:420 src/Object/Post.php:877
+msgid "Comment"
 msgstr ""
 
-#: mod/profiles.php:625
-msgid "Love/romance"
+#: mod/photos.php:1559
+msgid "Map"
 msgstr ""
 
-#: mod/profiles.php:626
-msgid "Work/employment"
+#: mod/photos.php:1630 mod/videos.php:287
+msgid "View Album"
 msgstr ""
 
-#: mod/profiles.php:627
-msgid "School/education"
+#: mod/ping.php:272
+msgid "{0} wants to be your friend"
 msgstr ""
 
-#: mod/profiles.php:628
-msgid "Contact information and Social Networks"
+#: mod/ping.php:288
+msgid "{0} requested registration"
 msgstr ""
 
-#: mod/profiles.php:659 src/Model/Profile.php:411
-msgid "Profile Image"
+#: mod/poke.php:177
+msgid "Poke/Prod"
 msgstr ""
 
-#: mod/profiles.php:661 src/Model/Profile.php:414
-msgid "visible to everybody"
+#: mod/poke.php:178
+msgid "poke, prod or do other things to somebody"
 msgstr ""
 
-#: mod/profiles.php:668
-msgid "Edit/Manage Profiles"
+#: mod/poke.php:179
+msgid "Recipient"
 msgstr ""
 
-#: mod/profiles.php:669 src/Model/Profile.php:401 src/Model/Profile.php:423
-msgid "Change profile photo"
+#: mod/poke.php:180
+msgid "Choose what you wish to do to recipient"
 msgstr ""
 
-#: mod/profiles.php:670 src/Model/Profile.php:402
-msgid "Create New Profile"
+#: mod/poke.php:183
+msgid "Make this post private"
 msgstr ""
 
 #: mod/profile_photo.php:58
@@ -2895,7 +3128,7 @@ msgid "Image uploaded but image cropping failed."
 msgstr ""
 
 #: mod/profile_photo.php:88 mod/profile_photo.php:97 mod/profile_photo.php:106
-#: mod/profile_photo.php:318
+#: mod/profile_photo.php:311
 #, php-format
 msgid "Image size reduction [%s] failed."
 msgstr ""
@@ -2910,377 +3143,312 @@ msgstr ""
 msgid "Unable to process image"
 msgstr ""
 
-#: mod/profile_photo.php:251
+#: mod/profile_photo.php:244
 msgid "Upload File:"
 msgstr ""
 
-#: mod/profile_photo.php:252
+#: mod/profile_photo.php:245
 msgid "Select a profile:"
 msgstr ""
 
-#: mod/profile_photo.php:257
+#: mod/profile_photo.php:250
 msgid "or"
 msgstr ""
 
-#: mod/profile_photo.php:258
+#: mod/profile_photo.php:251
 msgid "skip this step"
 msgstr ""
 
-#: mod/profile_photo.php:258
+#: mod/profile_photo.php:251
 msgid "select a photo from your photo albums"
 msgstr ""
 
-#: mod/profile_photo.php:271
+#: mod/profile_photo.php:264
 msgid "Crop Image"
 msgstr ""
 
-#: mod/profile_photo.php:272
+#: mod/profile_photo.php:265
 msgid "Please adjust the image cropping for optimum viewing."
 msgstr ""
 
-#: mod/profile_photo.php:274
+#: mod/profile_photo.php:267
 msgid "Done Editing"
 msgstr ""
 
-#: mod/profile_photo.php:308
+#: mod/profile_photo.php:301
 msgid "Image uploaded successfully."
 msgstr ""
 
-#: mod/profperm.php:30
-msgid "Permission denied"
-msgstr ""
-
-#: mod/profperm.php:36 mod/profperm.php:69
-msgid "Invalid profile identifier."
-msgstr ""
-
-#: mod/profperm.php:115
-msgid "Profile Visibility Editor"
-msgstr ""
-
-#: mod/profperm.php:117 src/Content/Nav.php:156 src/Model/Profile.php:870
-#: src/Model/Profile.php:906 src/Module/Contact.php:650
-#: src/Module/Contact.php:866 src/Module/Welcome.php:38
-#: view/theme/frio/theme.php:263
-msgid "Profile"
-msgstr ""
-
-#: mod/profperm.php:119 src/Module/Group.php:321
-msgid "Click on a contact to add or remove."
-msgstr ""
-
-#: mod/profperm.php:128
-msgid "Visible To"
-msgstr ""
-
-#: mod/profperm.php:144
-msgid "All Contacts (with secure profile access)"
-msgstr ""
-
-#: mod/regmod.php:53
-msgid "Account approved."
-msgstr ""
-
-#: mod/regmod.php:77
-#, php-format
-msgid "Registration revoked for %s"
-msgstr ""
-
-#: mod/regmod.php:84
-msgid "Please login."
-msgstr ""
-
-#: mod/removeme.php:46
-msgid "User deleted their account"
-msgstr ""
-
-#: mod/removeme.php:47
-msgid ""
-"On your Friendica node an user deleted their account. Please ensure that "
-"their data is removed from the backups."
-msgstr ""
-
-#: mod/removeme.php:48
-#, php-format
-msgid "The user id is %d"
-msgstr ""
-
-#: mod/removeme.php:84 mod/removeme.php:87
-msgid "Remove My Account"
-msgstr ""
-
-#: mod/removeme.php:85
-msgid ""
-"This will completely remove your account. Once this has been done it is not "
-"recoverable."
-msgstr ""
-
-#: mod/removeme.php:86
-msgid "Please enter your password for verification:"
-msgstr ""
-
-#: mod/repair_ostatus.php:21
-msgid "Resubscribing to OStatus contacts"
-msgstr ""
-
-#: mod/repair_ostatus.php:37
-msgid "Error"
-msgstr ""
-
-#: mod/search.php:99
+#: mod/search.php:92
 msgid "Only logged in users are permitted to perform a search."
 msgstr ""
 
-#: mod/search.php:121
+#: mod/search.php:114
 msgid "Only one search per minute is permitted for not logged in users."
 msgstr ""
 
-#: mod/search.php:141 src/Content/Nav.php:197 src/Content/Text/HTML.php:900
+#: mod/search.php:134 src/Content/Text/HTML.php:889 src/Content/Nav.php:200
 msgid "Search"
 msgstr ""
 
-#: mod/search.php:225
+#: mod/search.php:228
 #, php-format
 msgid "Items tagged with: %s"
 msgstr ""
 
-#: mod/search.php:227 src/Module/Contact.php:813
+#: mod/search.php:230 src/Module/Contact.php:819
 #, php-format
 msgid "Results for: %s"
 msgstr ""
 
-#: mod/settings.php:63 src/Module/BaseSettingsModule.php:24
+#: mod/settings.php:65 src/Module/BaseSettingsModule.php:24
 msgid "Account"
 msgstr ""
 
-#: mod/settings.php:71 src/Module/BaseSettingsModule.php:31
-#: src/Module/Settings/TwoFactor/Index.php:83
-#: src/Module/TwoFactor/Verify.php:60
+#: mod/settings.php:73 src/Module/BaseSettingsModule.php:31
+#: src/Module/Settings/TwoFactor/Index.php:89
+#: src/Module/TwoFactor/Verify.php:62
 msgid "Two-factor authentication"
 msgstr ""
 
-#: mod/settings.php:78 src/Content/Nav.php:265 src/Model/Profile.php:394
+#: mod/settings.php:80 src/Content/Nav.php:268 src/Model/Profile.php:402
 #: src/Module/BaseSettingsModule.php:38
 msgid "Profiles"
 msgstr ""
 
-#: mod/settings.php:86 src/Module/BaseAdminModule.php:84
+#: mod/settings.php:88 src/Module/BaseAdminModule.php:84
 #: src/Module/BaseSettingsModule.php:46
 msgid "Additional features"
 msgstr ""
 
-#: mod/settings.php:94 src/Module/BaseSettingsModule.php:54
+#: mod/settings.php:96 src/Module/BaseSettingsModule.php:54
 msgid "Display"
 msgstr ""
 
-#: mod/settings.php:101 mod/settings.php:839
+#: mod/settings.php:103 mod/settings.php:843
 #: src/Module/BaseSettingsModule.php:61
 msgid "Social Networks"
 msgstr ""
 
-#: mod/settings.php:108 src/Module/Admin/Addons/Details.php:100
+#: mod/settings.php:110 src/Module/Admin/Addons/Details.php:100
 #: src/Module/Admin/Addons/Index.php:51 src/Module/BaseAdminModule.php:82
 #: src/Module/BaseSettingsModule.php:68
 msgid "Addons"
 msgstr ""
 
-#: mod/settings.php:115 src/Content/Nav.php:260
+#: mod/settings.php:117 src/Content/Nav.php:263
 #: src/Module/BaseSettingsModule.php:75
 msgid "Delegations"
 msgstr ""
 
-#: mod/settings.php:122 src/Module/BaseSettingsModule.php:82
+#: mod/settings.php:124 src/Module/BaseSettingsModule.php:82
 msgid "Connected apps"
 msgstr ""
 
-#: mod/settings.php:129 mod/uexport.php:59 src/Module/BaseSettingsModule.php:89
+#: mod/settings.php:131 mod/uexport.php:59 src/Module/BaseSettingsModule.php:89
 msgid "Export personal data"
 msgstr ""
 
-#: mod/settings.php:136 src/Module/BaseSettingsModule.php:96
+#: mod/settings.php:138 src/Module/BaseSettingsModule.php:96
 msgid "Remove account"
 msgstr ""
 
-#: mod/settings.php:145 src/Content/Nav.php:262
+#: mod/settings.php:147 view/theme/frio/theme.php:277 src/Content/Nav.php:265
 #: src/Module/Admin/Addons/Details.php:102
 #: src/Module/Admin/Themes/Details.php:107
 #: src/Module/BaseSettingsModule.php:105 src/Module/Welcome.php:33
-#: view/theme/frio/theme.php:272
 msgid "Settings"
 msgstr ""
 
-#: mod/settings.php:188
+#: mod/settings.php:190
 msgid "Missing some important data!"
 msgstr ""
 
-#: mod/settings.php:190 mod/settings.php:700 src/Module/Contact.php:820
+#: mod/settings.php:192 mod/settings.php:703 src/Module/Contact.php:826
 msgid "Update"
 msgstr ""
 
-#: mod/settings.php:299
+#: mod/settings.php:302
 msgid "Failed to connect with email account using the settings provided."
 msgstr ""
 
-#: mod/settings.php:304
+#: mod/settings.php:307
 msgid "Email settings updated."
 msgstr ""
 
-#: mod/settings.php:320
+#: mod/settings.php:323
 msgid "Features updated"
 msgstr ""
 
-#: mod/settings.php:393
+#: mod/settings.php:384
+msgid "The theme you chose isn't available."
+msgstr ""
+
+#: mod/settings.php:396
 msgid "Relocate message has been send to your contacts"
 msgstr ""
 
-#: mod/settings.php:405
+#: mod/settings.php:408
 msgid "Passwords do not match."
 msgstr ""
 
-#: mod/settings.php:413 src/Console/NewPassword.php:80
+#: mod/settings.php:416 src/Console/NewPassword.php:101
 msgid "Password update failed. Please try again."
 msgstr ""
 
-#: mod/settings.php:416 src/Console/NewPassword.php:83
+#: mod/settings.php:419 src/Console/NewPassword.php:104
 msgid "Password changed."
 msgstr ""
 
-#: mod/settings.php:419
+#: mod/settings.php:422
 msgid "Password unchanged."
 msgstr ""
 
-#: mod/settings.php:500
+#: mod/settings.php:503
 msgid " Please use a shorter name."
 msgstr ""
 
-#: mod/settings.php:503
+#: mod/settings.php:506
 msgid " Name too short."
 msgstr ""
 
-#: mod/settings.php:510 src/Module/Settings/TwoFactor/Index.php:66
+#: mod/settings.php:513 src/Module/Settings/TwoFactor/Index.php:72
 msgid "Wrong Password"
 msgstr ""
 
-#: mod/settings.php:515
+#: mod/settings.php:518
 msgid "Invalid email."
 msgstr ""
 
-#: mod/settings.php:521
+#: mod/settings.php:524
 msgid "Cannot change to that email."
 msgstr ""
 
-#: mod/settings.php:571
+#: mod/settings.php:574
 msgid "Private forum has no privacy permissions. Using default privacy group."
 msgstr ""
 
-#: mod/settings.php:574
+#: mod/settings.php:577
 msgid "Private forum has no privacy permissions and no default privacy group."
 msgstr ""
 
-#: mod/settings.php:614
+#: mod/settings.php:617
 msgid "Settings updated."
 msgstr ""
 
-#: mod/settings.php:673 mod/settings.php:699 mod/settings.php:733
+#: mod/settings.php:676 mod/settings.php:702 mod/settings.php:736
 msgid "Add application"
 msgstr ""
 
-#: mod/settings.php:677 mod/settings.php:703
+#: mod/settings.php:680 mod/settings.php:706
 msgid "Consumer Key"
 msgstr ""
 
-#: mod/settings.php:678 mod/settings.php:704
+#: mod/settings.php:681 mod/settings.php:707
 msgid "Consumer Secret"
 msgstr ""
 
-#: mod/settings.php:679 mod/settings.php:705
+#: mod/settings.php:682 mod/settings.php:708
 msgid "Redirect"
 msgstr ""
 
-#: mod/settings.php:680 mod/settings.php:706
+#: mod/settings.php:683 mod/settings.php:709
 msgid "Icon url"
 msgstr ""
 
-#: mod/settings.php:691
+#: mod/settings.php:694
 msgid "You can't edit this application."
 msgstr ""
 
-#: mod/settings.php:732
+#: mod/settings.php:735
 msgid "Connected Apps"
 msgstr ""
 
-#: mod/settings.php:734 src/Object/Post.php:167 src/Object/Post.php:169
+#: mod/settings.php:737 src/Object/Post.php:168 src/Object/Post.php:170
 msgid "Edit"
 msgstr ""
 
-#: mod/settings.php:736
+#: mod/settings.php:739
 msgid "Client key starts with"
 msgstr ""
 
-#: mod/settings.php:737
+#: mod/settings.php:740
 msgid "No name"
 msgstr ""
 
-#: mod/settings.php:738
+#: mod/settings.php:741
 msgid "Remove authorization"
 msgstr ""
 
-#: mod/settings.php:749
+#: mod/settings.php:752
 msgid "No Addon settings configured"
 msgstr ""
 
-#: mod/settings.php:758
+#: mod/settings.php:761
 msgid "Addon Settings"
 msgstr ""
 
-#: mod/settings.php:772 src/Module/Admin/Features.php:58
+#: mod/settings.php:775 src/Module/Admin/Features.php:58
 #: src/Module/Admin/Features.php:59
 msgid "Off"
 msgstr ""
 
-#: mod/settings.php:772 src/Module/Admin/Features.php:58
+#: mod/settings.php:775 src/Module/Admin/Features.php:58
 #: src/Module/Admin/Features.php:59
 msgid "On"
 msgstr ""
 
-#: mod/settings.php:779
+#: mod/settings.php:782
 msgid "Additional Features"
 msgstr ""
 
-#: mod/settings.php:802 src/Content/ContactSelector.php:87
+#: mod/settings.php:806 src/Content/ContactSelector.php:87
 msgid "Diaspora"
 msgstr ""
 
-#: mod/settings.php:802 mod/settings.php:803
+#: mod/settings.php:806 mod/settings.php:807
 msgid "enabled"
 msgstr ""
 
-#: mod/settings.php:802 mod/settings.php:803
+#: mod/settings.php:806 mod/settings.php:807
 msgid "disabled"
 msgstr ""
 
-#: mod/settings.php:802 mod/settings.php:803
+#: mod/settings.php:806 mod/settings.php:807
 #, php-format
 msgid "Built-in support for %s connectivity is %s"
 msgstr ""
 
-#: mod/settings.php:803
+#: mod/settings.php:807
 msgid "GNU Social (OStatus)"
 msgstr ""
 
-#: mod/settings.php:834
+#: mod/settings.php:838
 msgid "Email access is disabled on this site."
 msgstr ""
 
-#: mod/settings.php:844
+#: mod/settings.php:848
 msgid "General Social Media Settings"
 msgstr ""
 
-#: mod/settings.php:845
+#: mod/settings.php:849
+msgid "Accept only top level posts by contacts you follow"
+msgstr ""
+
+#: mod/settings.php:849
+msgid ""
+"The system does an auto completion of threads when a comment arrives. This "
+"has got the side effect that you can receive posts that had been started by "
+"a non-follower but had been commented by someone you follow. This setting "
+"deactivates this behaviour. When activated, you strictly only will receive "
+"posts from people you really do follow."
+msgstr ""
+
+#: mod/settings.php:850
 msgid "Disable Content Warning"
 msgstr ""
 
-#: mod/settings.php:845
+#: mod/settings.php:850
 msgid ""
 "Users on networks like Mastodon or Pleroma are able to set a content warning "
 "field which collapse their post by default. This disables the automatic "
@@ -3288,352 +3456,352 @@ msgid ""
 "any other content filtering you eventually set up."
 msgstr ""
 
-#: mod/settings.php:846
+#: mod/settings.php:851
 msgid "Disable intelligent shortening"
 msgstr ""
 
-#: mod/settings.php:846
+#: mod/settings.php:851
 msgid ""
 "Normally the system tries to find the best link to add to shortened posts. "
 "If this option is enabled then every shortened post will always point to the "
 "original friendica post."
 msgstr ""
 
-#: mod/settings.php:847
+#: mod/settings.php:852
 msgid "Automatically follow any GNU Social (OStatus) followers/mentioners"
 msgstr ""
 
-#: mod/settings.php:847
+#: mod/settings.php:852
 msgid ""
 "If you receive a message from an unknown OStatus user, this option decides "
 "what to do. If it is checked, a new contact will be created for every "
 "unknown user."
 msgstr ""
 
-#: mod/settings.php:848
+#: mod/settings.php:853
 msgid "Default group for OStatus contacts"
 msgstr ""
 
-#: mod/settings.php:849
+#: mod/settings.php:854
 msgid "Your legacy GNU Social account"
 msgstr ""
 
-#: mod/settings.php:849
+#: mod/settings.php:854
 msgid ""
 "If you enter your old GNU Social/Statusnet account name here (in the format "
 "user@domain.tld), your contacts will be added automatically. The field will "
 "be emptied when done."
 msgstr ""
 
-#: mod/settings.php:852
+#: mod/settings.php:857
 msgid "Repair OStatus subscriptions"
 msgstr ""
 
-#: mod/settings.php:856
+#: mod/settings.php:861
 msgid "Email/Mailbox Setup"
 msgstr ""
 
-#: mod/settings.php:857
+#: mod/settings.php:862
 msgid ""
 "If you wish to communicate with email contacts using this service "
 "(optional), please specify how to connect to your mailbox."
 msgstr ""
 
-#: mod/settings.php:858
+#: mod/settings.php:863
 msgid "Last successful email check:"
 msgstr ""
 
-#: mod/settings.php:860
+#: mod/settings.php:865
 msgid "IMAP server name:"
 msgstr ""
 
-#: mod/settings.php:861
+#: mod/settings.php:866
 msgid "IMAP port:"
 msgstr ""
 
-#: mod/settings.php:862
+#: mod/settings.php:867
 msgid "Security:"
 msgstr ""
 
-#: mod/settings.php:862 mod/settings.php:867
+#: mod/settings.php:867 mod/settings.php:872
 msgid "None"
 msgstr ""
 
-#: mod/settings.php:863
+#: mod/settings.php:868
 msgid "Email login name:"
 msgstr ""
 
-#: mod/settings.php:864
+#: mod/settings.php:869
 msgid "Email password:"
 msgstr ""
 
-#: mod/settings.php:865
+#: mod/settings.php:870
 msgid "Reply-to address:"
 msgstr ""
 
-#: mod/settings.php:866
+#: mod/settings.php:871
 msgid "Send public posts to all email contacts:"
 msgstr ""
 
-#: mod/settings.php:867
+#: mod/settings.php:872
 msgid "Action after import:"
 msgstr ""
 
-#: mod/settings.php:867 src/Content/Nav.php:248
+#: mod/settings.php:872 src/Content/Nav.php:251
 msgid "Mark as seen"
 msgstr ""
 
-#: mod/settings.php:867
+#: mod/settings.php:872
 msgid "Move to folder"
 msgstr ""
 
-#: mod/settings.php:868
+#: mod/settings.php:873
 msgid "Move to folder:"
 msgstr ""
 
-#: mod/settings.php:892 src/Module/Admin/Site.php:435
+#: mod/settings.php:897 src/Module/Admin/Site.php:434
 msgid "No special theme for mobile devices"
 msgstr ""
 
-#: mod/settings.php:900
+#: mod/settings.php:905
 #, php-format
 msgid "%s - (Unsupported)"
 msgstr ""
 
-#: mod/settings.php:902 src/Module/Admin/Site.php:452
+#: mod/settings.php:907 src/Module/Admin/Site.php:451
 #, php-format
 msgid "%s - (Experimental)"
 msgstr ""
 
-#: mod/settings.php:930 src/Core/L10n.php:371 src/Model/Event.php:395
+#: mod/settings.php:935 src/Core/L10n/L10n.php:370 src/Model/Event.php:395
 msgid "Sunday"
 msgstr ""
 
-#: mod/settings.php:930 src/Core/L10n.php:371 src/Model/Event.php:396
+#: mod/settings.php:935 src/Core/L10n/L10n.php:370 src/Model/Event.php:396
 msgid "Monday"
 msgstr ""
 
-#: mod/settings.php:946
+#: mod/settings.php:951
 msgid "Display Settings"
 msgstr ""
 
-#: mod/settings.php:952
+#: mod/settings.php:957
 msgid "Display Theme:"
 msgstr ""
 
-#: mod/settings.php:953
+#: mod/settings.php:958
 msgid "Mobile Theme:"
 msgstr ""
 
-#: mod/settings.php:954
+#: mod/settings.php:959
 msgid "Suppress warning of insecure networks"
 msgstr ""
 
-#: mod/settings.php:954
+#: mod/settings.php:959
 msgid ""
 "Should the system suppress the warning that the current group contains "
 "members of networks that can't receive non public postings."
 msgstr ""
 
-#: mod/settings.php:955
+#: mod/settings.php:960
 msgid "Update browser every xx seconds"
 msgstr ""
 
-#: mod/settings.php:955
+#: mod/settings.php:960
 msgid "Minimum of 10 seconds. Enter -1 to disable it."
 msgstr ""
 
-#: mod/settings.php:956
+#: mod/settings.php:961
 msgid "Number of items to display per page:"
 msgstr ""
 
-#: mod/settings.php:956 mod/settings.php:957
+#: mod/settings.php:961 mod/settings.php:962
 msgid "Maximum of 100 items"
 msgstr ""
 
-#: mod/settings.php:957
+#: mod/settings.php:962
 msgid "Number of items to display per page when viewed from mobile device:"
 msgstr ""
 
-#: mod/settings.php:958
+#: mod/settings.php:963
 msgid "Don't show emoticons"
 msgstr ""
 
-#: mod/settings.php:959
+#: mod/settings.php:964
 msgid "Calendar"
 msgstr ""
 
-#: mod/settings.php:960
+#: mod/settings.php:965
 msgid "Beginning of week:"
 msgstr ""
 
-#: mod/settings.php:961
+#: mod/settings.php:966
 msgid "Don't show notices"
 msgstr ""
 
-#: mod/settings.php:962
+#: mod/settings.php:967
 msgid "Infinite scroll"
 msgstr ""
 
-#: mod/settings.php:963
+#: mod/settings.php:968
 msgid "Automatic updates only at the top of the network page"
 msgstr ""
 
-#: mod/settings.php:963
+#: mod/settings.php:968
 msgid ""
 "When disabled, the network page is updated all the time, which could be "
 "confusing while reading."
 msgstr ""
 
-#: mod/settings.php:964
+#: mod/settings.php:969
 msgid "Bandwidth Saver Mode"
 msgstr ""
 
-#: mod/settings.php:964
+#: mod/settings.php:969
 msgid ""
 "When enabled, embedded content is not displayed on automatic updates, they "
 "only show on page reload."
 msgstr ""
 
-#: mod/settings.php:965
+#: mod/settings.php:970
 msgid "Smart Threading"
 msgstr ""
 
-#: mod/settings.php:965
+#: mod/settings.php:970
 msgid ""
 "When enabled, suppress extraneous thread indentation while keeping it where "
 "it matters. Only works if threading is available and enabled."
 msgstr ""
 
-#: mod/settings.php:967
+#: mod/settings.php:972
 msgid "General Theme Settings"
 msgstr ""
 
-#: mod/settings.php:968
+#: mod/settings.php:973
 msgid "Custom Theme Settings"
 msgstr ""
 
-#: mod/settings.php:969
+#: mod/settings.php:974
 msgid "Content Settings"
 msgstr ""
 
-#: mod/settings.php:970 view/theme/duepuntozero/config.php:73
-#: view/theme/frio/config.php:122 view/theme/quattro/config.php:75
+#: mod/settings.php:975 view/theme/duepuntozero/config.php:73
+#: view/theme/frio/config.php:128 view/theme/quattro/config.php:75
 #: view/theme/vier/config.php:121
 msgid "Theme settings"
 msgstr ""
 
-#: mod/settings.php:984
+#: mod/settings.php:989
 msgid "Unable to find your profile. Please contact your admin."
 msgstr ""
 
-#: mod/settings.php:1023
+#: mod/settings.php:1028
 msgid "Account Types"
 msgstr ""
 
-#: mod/settings.php:1024
+#: mod/settings.php:1029
 msgid "Personal Page Subtypes"
 msgstr ""
 
-#: mod/settings.php:1025
+#: mod/settings.php:1030
 msgid "Community Forum Subtypes"
 msgstr ""
 
-#: mod/settings.php:1032 src/Module/Admin/Users.php:229
+#: mod/settings.php:1037 src/Module/Admin/Users.php:229
 msgid "Personal Page"
 msgstr ""
 
-#: mod/settings.php:1033
+#: mod/settings.php:1038
 msgid "Account for a personal profile."
 msgstr ""
 
-#: mod/settings.php:1036 src/Module/Admin/Users.php:230
+#: mod/settings.php:1041 src/Module/Admin/Users.php:230
 msgid "Organisation Page"
 msgstr ""
 
-#: mod/settings.php:1037
+#: mod/settings.php:1042
 msgid ""
 "Account for an organisation that automatically approves contact requests as "
 "\"Followers\"."
 msgstr ""
 
-#: mod/settings.php:1040 src/Module/Admin/Users.php:231
+#: mod/settings.php:1045 src/Module/Admin/Users.php:231
 msgid "News Page"
 msgstr ""
 
-#: mod/settings.php:1041
+#: mod/settings.php:1046
 msgid ""
 "Account for a news reflector that automatically approves contact requests as "
 "\"Followers\"."
 msgstr ""
 
-#: mod/settings.php:1044 src/Module/Admin/Users.php:232
+#: mod/settings.php:1049 src/Module/Admin/Users.php:232
 msgid "Community Forum"
 msgstr ""
 
-#: mod/settings.php:1045
+#: mod/settings.php:1050
 msgid "Account for community discussions."
 msgstr ""
 
-#: mod/settings.php:1048 src/Module/Admin/Users.php:222
+#: mod/settings.php:1053 src/Module/Admin/Users.php:222
 msgid "Normal Account Page"
 msgstr ""
 
-#: mod/settings.php:1049
+#: mod/settings.php:1054
 msgid ""
 "Account for a regular personal profile that requires manual approval of "
 "\"Friends\" and \"Followers\"."
 msgstr ""
 
-#: mod/settings.php:1052 src/Module/Admin/Users.php:223
+#: mod/settings.php:1057 src/Module/Admin/Users.php:223
 msgid "Soapbox Page"
 msgstr ""
 
-#: mod/settings.php:1053
+#: mod/settings.php:1058
 msgid ""
 "Account for a public profile that automatically approves contact requests as "
 "\"Followers\"."
 msgstr ""
 
-#: mod/settings.php:1056 src/Module/Admin/Users.php:224
+#: mod/settings.php:1061 src/Module/Admin/Users.php:224
 msgid "Public Forum"
 msgstr ""
 
-#: mod/settings.php:1057
+#: mod/settings.php:1062
 msgid "Automatically approves all contact requests."
 msgstr ""
 
-#: mod/settings.php:1060 src/Module/Admin/Users.php:225
+#: mod/settings.php:1065 src/Module/Admin/Users.php:225
 msgid "Automatic Friend Page"
 msgstr ""
 
-#: mod/settings.php:1061
+#: mod/settings.php:1066
 msgid ""
 "Account for a popular profile that automatically approves contact requests "
 "as \"Friends\"."
 msgstr ""
 
-#: mod/settings.php:1064
+#: mod/settings.php:1069
 msgid "Private Forum [Experimental]"
 msgstr ""
 
-#: mod/settings.php:1065
+#: mod/settings.php:1070
 msgid "Requires manual approval of contact requests."
 msgstr ""
 
-#: mod/settings.php:1076
+#: mod/settings.php:1081
 msgid "OpenID:"
 msgstr ""
 
-#: mod/settings.php:1076
+#: mod/settings.php:1081
 msgid "(Optional) Allow this OpenID to login to this account."
 msgstr ""
 
-#: mod/settings.php:1084
+#: mod/settings.php:1089
 msgid "Publish your default profile in your local site directory?"
 msgstr ""
 
-#: mod/settings.php:1084
+#: mod/settings.php:1089
 #, php-format
 msgid ""
 "Your profile will be published in this node's <a href=\"%s\">local "
@@ -3641,313 +3809,313 @@ msgid ""
 "system settings."
 msgstr ""
 
-#: mod/settings.php:1090
+#: mod/settings.php:1095
 msgid "Publish your default profile in the global social directory?"
 msgstr ""
 
-#: mod/settings.php:1090
+#: mod/settings.php:1095
 #, php-format
 msgid ""
 "Your profile will be published in the global friendica directories (e.g. <a "
 "href=\"%s\">%s</a>). Your profile will be visible in public."
 msgstr ""
 
-#: mod/settings.php:1097
+#: mod/settings.php:1102
 msgid "Hide your contact/friend list from viewers of your default profile?"
 msgstr ""
 
-#: mod/settings.php:1097
+#: mod/settings.php:1102
 msgid ""
 "Your contact list won't be shown in your default profile page. You can "
 "decide to show your contact list separately for each additional profile you "
 "create"
 msgstr ""
 
-#: mod/settings.php:1101
+#: mod/settings.php:1106
 msgid "Hide your profile details from anonymous viewers?"
 msgstr ""
 
-#: mod/settings.php:1101
+#: mod/settings.php:1106
 msgid ""
 "Anonymous visitors will only see your profile picture, your display name and "
 "the nickname you are using on your profile page. Your public posts and "
 "replies will still be accessible by other means."
 msgstr ""
 
-#: mod/settings.php:1105
+#: mod/settings.php:1110
 msgid "Allow friends to post to your profile page?"
 msgstr ""
 
-#: mod/settings.php:1105
+#: mod/settings.php:1110
 msgid ""
 "Your contacts may write posts on your profile wall. These posts will be "
 "distributed to your contacts"
 msgstr ""
 
-#: mod/settings.php:1109
+#: mod/settings.php:1114
 msgid "Allow friends to tag your posts?"
 msgstr ""
 
-#: mod/settings.php:1109
+#: mod/settings.php:1114
 msgid "Your contacts can add additional tags to your posts."
 msgstr ""
 
-#: mod/settings.php:1113
+#: mod/settings.php:1118
 msgid "Allow us to suggest you as a potential friend to new members?"
 msgstr ""
 
-#: mod/settings.php:1113
+#: mod/settings.php:1118
 msgid "If you like, Friendica may suggest new members to add you as a contact."
 msgstr ""
 
-#: mod/settings.php:1117
+#: mod/settings.php:1122
 msgid "Permit unknown people to send you private mail?"
 msgstr ""
 
-#: mod/settings.php:1117
+#: mod/settings.php:1122
 msgid ""
 "Friendica network users may send you private messages even if they are not "
 "in your contact list."
 msgstr ""
 
-#: mod/settings.php:1121
+#: mod/settings.php:1126
 msgid "Profile is <strong>not published</strong>."
 msgstr ""
 
-#: mod/settings.php:1127
+#: mod/settings.php:1132
 #, php-format
 msgid "Your Identity Address is <strong>'%s'</strong> or '%s'."
 msgstr ""
 
-#: mod/settings.php:1134
+#: mod/settings.php:1139
 msgid "Automatically expire posts after this many days:"
 msgstr ""
 
-#: mod/settings.php:1134
+#: mod/settings.php:1139
 msgid "If empty, posts will not expire. Expired posts will be deleted"
 msgstr ""
 
-#: mod/settings.php:1135
+#: mod/settings.php:1140
 msgid "Advanced expiration settings"
 msgstr ""
 
-#: mod/settings.php:1136
+#: mod/settings.php:1141
 msgid "Advanced Expiration"
 msgstr ""
 
-#: mod/settings.php:1137
+#: mod/settings.php:1142
 msgid "Expire posts:"
 msgstr ""
 
-#: mod/settings.php:1138
+#: mod/settings.php:1143
 msgid "Expire personal notes:"
 msgstr ""
 
-#: mod/settings.php:1139
+#: mod/settings.php:1144
 msgid "Expire starred posts:"
 msgstr ""
 
-#: mod/settings.php:1140
+#: mod/settings.php:1145
 msgid "Expire photos:"
 msgstr ""
 
-#: mod/settings.php:1141
+#: mod/settings.php:1146
 msgid "Only expire posts by others:"
 msgstr ""
 
-#: mod/settings.php:1171
+#: mod/settings.php:1176
 msgid "Account Settings"
 msgstr ""
 
-#: mod/settings.php:1179
+#: mod/settings.php:1184
 msgid "Password Settings"
 msgstr ""
 
-#: mod/settings.php:1180 src/Module/Register.php:130
+#: mod/settings.php:1185 src/Module/Register.php:130
 msgid "New Password:"
 msgstr ""
 
-#: mod/settings.php:1180
+#: mod/settings.php:1185
 msgid ""
 "Allowed characters are a-z, A-Z, 0-9 and special characters except white "
 "spaces, accentuated letters and colon (:)."
 msgstr ""
 
-#: mod/settings.php:1181 src/Module/Register.php:131
+#: mod/settings.php:1186 src/Module/Register.php:131
 msgid "Confirm:"
 msgstr ""
 
-#: mod/settings.php:1181
+#: mod/settings.php:1186
 msgid "Leave password fields blank unless changing"
 msgstr ""
 
-#: mod/settings.php:1182
+#: mod/settings.php:1187
 msgid "Current Password:"
 msgstr ""
 
-#: mod/settings.php:1182 mod/settings.php:1183
+#: mod/settings.php:1187 mod/settings.php:1188
 msgid "Your current password to confirm the changes"
 msgstr ""
 
-#: mod/settings.php:1183
+#: mod/settings.php:1188
 msgid "Password:"
 msgstr ""
 
-#: mod/settings.php:1187
+#: mod/settings.php:1192
 msgid "Basic Settings"
 msgstr ""
 
-#: mod/settings.php:1188 src/Model/Profile.php:745
+#: mod/settings.php:1193 src/Model/Profile.php:756
 msgid "Full Name:"
 msgstr ""
 
-#: mod/settings.php:1189
+#: mod/settings.php:1194
 msgid "Email Address:"
 msgstr ""
 
-#: mod/settings.php:1190
+#: mod/settings.php:1195
 msgid "Your Timezone:"
 msgstr ""
 
-#: mod/settings.php:1191
+#: mod/settings.php:1196
 msgid "Your Language:"
 msgstr ""
 
-#: mod/settings.php:1191
+#: mod/settings.php:1196
 msgid ""
 "Set the language we use to show you friendica interface and to send you "
 "emails"
 msgstr ""
 
-#: mod/settings.php:1192
+#: mod/settings.php:1197
 msgid "Default Post Location:"
 msgstr ""
 
-#: mod/settings.php:1193
+#: mod/settings.php:1198
 msgid "Use Browser Location:"
 msgstr ""
 
-#: mod/settings.php:1196
+#: mod/settings.php:1201
 msgid "Security and Privacy Settings"
 msgstr ""
 
-#: mod/settings.php:1198
+#: mod/settings.php:1203
 msgid "Maximum Friend Requests/Day:"
 msgstr ""
 
-#: mod/settings.php:1198 mod/settings.php:1227
+#: mod/settings.php:1203 mod/settings.php:1232
 msgid "(to prevent spam abuse)"
 msgstr ""
 
-#: mod/settings.php:1199
+#: mod/settings.php:1204
 msgid "Default Post Permissions"
 msgstr ""
 
-#: mod/settings.php:1200
+#: mod/settings.php:1205
 msgid "(click to open/close)"
 msgstr ""
 
-#: mod/settings.php:1210
+#: mod/settings.php:1215
 msgid "Default Private Post"
 msgstr ""
 
-#: mod/settings.php:1211
+#: mod/settings.php:1216
 msgid "Default Public Post"
 msgstr ""
 
-#: mod/settings.php:1215
+#: mod/settings.php:1220
 msgid "Default Permissions for New Posts"
 msgstr ""
 
-#: mod/settings.php:1227
+#: mod/settings.php:1232
 msgid "Maximum private messages per day from unknown people:"
 msgstr ""
 
-#: mod/settings.php:1230
+#: mod/settings.php:1235
 msgid "Notification Settings"
 msgstr ""
 
-#: mod/settings.php:1231
+#: mod/settings.php:1236
 msgid "Send a notification email when:"
 msgstr ""
 
-#: mod/settings.php:1232
+#: mod/settings.php:1237
 msgid "You receive an introduction"
 msgstr ""
 
-#: mod/settings.php:1233
+#: mod/settings.php:1238
 msgid "Your introductions are confirmed"
 msgstr ""
 
-#: mod/settings.php:1234
+#: mod/settings.php:1239
 msgid "Someone writes on your profile wall"
 msgstr ""
 
-#: mod/settings.php:1235
+#: mod/settings.php:1240
 msgid "Someone writes a followup comment"
 msgstr ""
 
-#: mod/settings.php:1236
+#: mod/settings.php:1241
 msgid "You receive a private message"
 msgstr ""
 
-#: mod/settings.php:1237
+#: mod/settings.php:1242
 msgid "You receive a friend suggestion"
 msgstr ""
 
-#: mod/settings.php:1238
+#: mod/settings.php:1243
 msgid "You are tagged in a post"
 msgstr ""
 
-#: mod/settings.php:1239
+#: mod/settings.php:1244
 msgid "You are poked/prodded/etc. in a post"
 msgstr ""
 
-#: mod/settings.php:1241
+#: mod/settings.php:1246
 msgid "Activate desktop notifications"
 msgstr ""
 
-#: mod/settings.php:1241
+#: mod/settings.php:1246
 msgid "Show desktop popup on new notifications"
 msgstr ""
 
-#: mod/settings.php:1243
+#: mod/settings.php:1248
 msgid "Text-only notification emails"
 msgstr ""
 
-#: mod/settings.php:1245
+#: mod/settings.php:1250
 msgid "Send text only notification emails, without the html part"
 msgstr ""
 
-#: mod/settings.php:1247
+#: mod/settings.php:1252
 msgid "Show detailled notifications"
 msgstr ""
 
-#: mod/settings.php:1249
+#: mod/settings.php:1254
 msgid ""
 "Per default, notifications are condensed to a single notification per item. "
 "When enabled every notification is displayed."
 msgstr ""
 
-#: mod/settings.php:1251
+#: mod/settings.php:1256
 msgid "Advanced Account/Page Type Settings"
 msgstr ""
 
-#: mod/settings.php:1252
+#: mod/settings.php:1257
 msgid "Change the behaviour of this account for special situations"
 msgstr ""
 
-#: mod/settings.php:1255
+#: mod/settings.php:1260
 msgid "Relocate"
 msgstr ""
 
-#: mod/settings.php:1256
+#: mod/settings.php:1261
 msgid ""
 "If you have moved this profile from another server, and some of your "
 "contacts don't receive your updates, try pushing this button."
 msgstr ""
 
-#: mod/settings.php:1257
+#: mod/settings.php:1262
 msgid "Resend relocate message to contacts"
 msgstr ""
 
@@ -3974,22 +4142,10 @@ msgstr ""
 msgid "Ignore/Hide"
 msgstr ""
 
-#: mod/suggest.php:119 src/Content/Widget.php:69 view/theme/vier/theme.php:204
+#: mod/suggest.php:119 view/theme/vier/theme.php:204 src/Content/Widget.php:69
 msgid "Friend Suggestions"
 msgstr ""
 
-#: mod/tagrm.php:31
-msgid "Tag(s) removed"
-msgstr ""
-
-#: mod/tagrm.php:101
-msgid "Remove Item Tag"
-msgstr ""
-
-#: mod/tagrm.php:103
-msgid "Select a tag to remove: "
-msgstr ""
-
 #: mod/uexport.php:52
 msgid "Export account"
 msgstr ""
@@ -4011,983 +4167,1127 @@ msgid ""
 "of your account (photos are not exported)"
 msgstr ""
 
-#: mod/uimport.php:30
-msgid "User imports on closed servers can only be done by an administrator."
+#: mod/videos.php:123
+msgid "No videos selected"
 msgstr ""
 
-#: mod/uimport.php:39 src/Module/Register.php:59
-msgid ""
-"This site has exceeded the number of allowed daily account registrations. "
-"Please try again tomorrow."
+#: mod/videos.php:280 src/Model/Item.php:3468
+msgid "View Video"
 msgstr ""
 
-#: mod/uimport.php:54 src/Module/Register.php:141
-msgid "Import"
+#: mod/videos.php:295
+msgid "Recent Videos"
 msgstr ""
 
-#: mod/uimport.php:56
-msgid "Move account"
+#: mod/videos.php:297
+msgid "Upload New Videos"
 msgstr ""
 
-#: mod/uimport.php:57
-msgid "You can import an account from another Friendica server."
+#: view/theme/duepuntozero/config.php:55 src/Model/User.php:745
+msgid "default"
 msgstr ""
 
-#: mod/uimport.php:58
+#: view/theme/duepuntozero/config.php:56
+msgid "greenzero"
+msgstr ""
+
+#: view/theme/duepuntozero/config.php:57
+msgid "purplezero"
+msgstr ""
+
+#: view/theme/duepuntozero/config.php:58
+msgid "easterbunny"
+msgstr ""
+
+#: view/theme/duepuntozero/config.php:59
+msgid "darkzero"
+msgstr ""
+
+#: view/theme/duepuntozero/config.php:60
+msgid "comix"
+msgstr ""
+
+#: view/theme/duepuntozero/config.php:61
+msgid "slackr"
+msgstr ""
+
+#: view/theme/duepuntozero/config.php:74
+msgid "Variations"
+msgstr ""
+
+#: view/theme/frio/php/Image.php:24
+msgid "Top Banner"
+msgstr ""
+
+#: view/theme/frio/php/Image.php:24
 msgid ""
-"You need to export your account from the old server and upload it here. We "
-"will recreate your old account here with all your contacts. We will try also "
-"to inform your friends that you moved here."
+"Resize image to the width of the screen and show background color below on "
+"long pages."
 msgstr ""
 
-#: mod/uimport.php:59
+#: view/theme/frio/php/Image.php:25
+msgid "Full screen"
+msgstr ""
+
+#: view/theme/frio/php/Image.php:25
 msgid ""
-"This feature is experimental. We can't import contacts from the OStatus "
-"network (GNU Social/Statusnet) or from Diaspora"
+"Resize image to fill entire screen, clipping either the right or the bottom."
 msgstr ""
 
-#: mod/uimport.php:60
-msgid "Account file"
+#: view/theme/frio/php/Image.php:26
+msgid "Single row mosaic"
 msgstr ""
 
-#: mod/uimport.php:60
+#: view/theme/frio/php/Image.php:26
 msgid ""
-"To export your account, go to \"Settings->Export your personal data\" and "
-"select \"Export account\""
+"Resize image to repeat it on a single row, either vertical or horizontal."
 msgstr ""
 
-#: mod/unfollow.php:36 mod/unfollow.php:92
-msgid "You aren't following this contact."
+#: view/theme/frio/php/Image.php:27
+msgid "Mosaic"
 msgstr ""
 
-#: mod/unfollow.php:46 mod/unfollow.php:98
-msgid "Unfollowing is currently not supported by your network."
+#: view/theme/frio/php/Image.php:27
+msgid "Repeat image to fill the screen."
 msgstr ""
 
-#: mod/unfollow.php:67
-msgid "Contact unfollowed"
+#: view/theme/frio/config.php:111
+msgid "Custom"
 msgstr ""
 
-#: mod/unfollow.php:118 src/Module/Contact.php:566
-msgid "Disconnect/Unfollow"
+#: view/theme/frio/config.php:123
+msgid "Note"
 msgstr ""
 
-#: mod/update_community.php:23 mod/update_contact.php:23
-#: mod/update_display.php:24 mod/update_network.php:33 mod/update_notes.php:36
-#: mod/update_profile.php:34
-msgid "[Embedded content - reload page to view]"
+#: view/theme/frio/config.php:123
+msgid "Check image permissions if all users are allowed to see the image"
 msgstr ""
 
-#: mod/videos.php:123
-msgid "No videos selected"
+#: view/theme/frio/config.php:129
+msgid "Select color scheme"
 msgstr ""
 
-#: mod/videos.php:280 src/Model/Item.php:3422
-msgid "View Video"
+#: view/theme/frio/config.php:130
+msgid "Copy or paste schemestring"
 msgstr ""
 
-#: mod/videos.php:295
-msgid "Recent Videos"
+#: view/theme/frio/config.php:130
+msgid ""
+"You can copy this string to share your theme with others. Pasting here "
+"applies the schemestring"
 msgstr ""
 
-#: mod/videos.php:297
-msgid "Upload New Videos"
+#: view/theme/frio/config.php:131
+msgid "Navigation bar background color"
 msgstr ""
 
-#: mod/wallmessage.php:52 mod/wallmessage.php:115
-#, php-format
-msgid "Number of daily wall messages for %s exceeded. Message failed."
+#: view/theme/frio/config.php:132
+msgid "Navigation bar icon color "
 msgstr ""
 
-#: mod/wallmessage.php:63
-msgid "Unable to check your home location."
+#: view/theme/frio/config.php:133
+msgid "Link color"
 msgstr ""
 
-#: mod/wallmessage.php:89 mod/wallmessage.php:98
-msgid "No recipient."
+#: view/theme/frio/config.php:134
+msgid "Set the background color"
+msgstr ""
+
+#: view/theme/frio/config.php:135
+msgid "Content background opacity"
+msgstr ""
+
+#: view/theme/frio/config.php:136
+msgid "Set the background image"
+msgstr ""
+
+#: view/theme/frio/config.php:137
+msgid "Background image style"
+msgstr ""
+
+#: view/theme/frio/config.php:139
+msgid "Enable Compose page"
+msgstr ""
+
+#: view/theme/frio/config.php:139
+msgid ""
+"This replaces the jot modal window for writing new posts with a link to <a "
+"href=\"compose\">the new Compose page</a>."
+msgstr ""
+
+#: view/theme/frio/config.php:143
+msgid "Login page background image"
+msgstr ""
+
+#: view/theme/frio/config.php:147
+msgid "Login page background color"
+msgstr ""
+
+#: view/theme/frio/config.php:147
+msgid "Leave background image and color empty for theme defaults"
+msgstr ""
+
+#: view/theme/frio/theme.php:246
+msgid "Guest"
+msgstr ""
+
+#: view/theme/frio/theme.php:251
+msgid "Visitor"
+msgstr ""
+
+#: view/theme/frio/theme.php:267 src/Content/Nav.php:160
+#: src/Model/Profile.php:909 src/Module/Contact.php:654
+#: src/Module/Contact.php:856 src/Module/Settings/TwoFactor/Index.php:91
+msgid "Status"
+msgstr ""
+
+#: view/theme/frio/theme.php:267 src/Content/Nav.php:160
+#: src/Content/Nav.php:244
+msgid "Your posts and conversations"
 msgstr ""
 
-#: 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."
+#: view/theme/frio/theme.php:268 src/Content/Nav.php:161
+msgid "Your profile page"
 msgstr ""
 
-#: 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
-msgid "Invalid request."
+#: view/theme/frio/theme.php:269 src/Content/Nav.php:162
+msgid "Your photos"
 msgstr ""
 
-#: mod/wall_attach.php:103
-msgid "Sorry, maybe your upload is bigger than the PHP configuration allows"
+#: view/theme/frio/theme.php:270 src/Content/Nav.php:163
+#: src/Model/Profile.php:933 src/Model/Profile.php:936
+msgid "Videos"
 msgstr ""
 
-#: mod/wall_attach.php:103
-msgid "Or - did you try to upload an empty file?"
+#: view/theme/frio/theme.php:270 src/Content/Nav.php:163
+msgid "Your videos"
 msgstr ""
 
-#: mod/wall_attach.php:114
-#, php-format
-msgid "File exceeds size limit of %s"
+#: view/theme/frio/theme.php:271 src/Content/Nav.php:164
+msgid "Your events"
 msgstr ""
 
-#: mod/wall_attach.php:129
-msgid "File upload failed."
+#: view/theme/frio/theme.php:274 src/Core/NotificationsManager.php:151
+#: src/Content/Nav.php:241
+msgid "Network"
 msgstr ""
 
-#: mod/wall_upload.php:243
-msgid "Wall Photos"
+#: view/theme/frio/theme.php:274 src/Content/Nav.php:241
+msgid "Conversations from your friends"
 msgstr ""
 
-#: src/App.php:505
-msgid "Delete this item?"
+#: view/theme/frio/theme.php:275 src/Content/Nav.php:228
+#: src/Model/Profile.php:948 src/Model/Profile.php:959
+msgid "Events and Calendar"
 msgstr ""
 
-#: src/App.php:547
-msgid "toggle mobile"
+#: view/theme/frio/theme.php:276 src/Content/Nav.php:254
+msgid "Private mail"
 msgstr ""
 
-#: src/App.php:863
-msgid "No system theme config value set."
+#: view/theme/frio/theme.php:277 src/Content/Nav.php:265
+msgid "Account settings"
 msgstr ""
 
-#: src/App.php:1163
-msgid "You must be logged in to use addons. "
+#: view/theme/frio/theme.php:278 src/Content/Text/HTML.php:900
+#: src/Content/Nav.php:205 src/Content/Nav.php:271 src/Model/Profile.php:988
+#: src/Model/Profile.php:991 src/Module/Contact.php:800
+#: src/Module/Contact.php:884
+msgid "Contacts"
 msgstr ""
 
-#: src/BaseModule.php:135
-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."
+#: view/theme/frio/theme.php:278 src/Content/Nav.php:271
+msgid "Manage/edit friends and contacts"
 msgstr ""
 
-#: src/Console/ArchiveContact.php:65
-#, php-format
-msgid "Could not find any unarchived contact entry for this URL (%s)"
+#: view/theme/quattro/config.php:76
+msgid "Alignment"
 msgstr ""
 
-#: src/Console/ArchiveContact.php:68
-msgid "The contact entries have been archived"
+#: view/theme/quattro/config.php:76
+msgid "Left"
 msgstr ""
 
-#: src/Console/GlobalCommunityBlock.php:66
-#: src/Module/Admin/Blocklist/Contact.php:30
-#, php-format
-msgid "Could not find any contact entry for this URL (%s)"
+#: view/theme/quattro/config.php:76
+msgid "Center"
 msgstr ""
 
-#: src/Console/GlobalCommunityBlock.php:71
-#: src/Module/Admin/Blocklist/Contact.php:28
-msgid "The contact has been blocked from the node"
+#: view/theme/quattro/config.php:77
+msgid "Color scheme"
 msgstr ""
 
-#: src/Console/NewPassword.php:72
-msgid "Enter new password: "
+#: view/theme/quattro/config.php:78
+msgid "Posts font size"
 msgstr ""
 
-#: src/Console/PostUpdate.php:50
-#, php-format
-msgid "Post update version number has been set to %s."
+#: view/theme/quattro/config.php:79
+msgid "Textareas font size"
 msgstr ""
 
-#: src/Console/PostUpdate.php:58
-msgid "Check for pending update actions."
+#: view/theme/vier/config.php:76
+msgid "Comma separated list of helper forums"
 msgstr ""
 
-#: src/Console/PostUpdate.php:60
-msgid "Done."
+#: view/theme/vier/config.php:116 src/Core/ACL.php:302
+msgid "don't show"
 msgstr ""
 
-#: src/Console/PostUpdate.php:62
-msgid "Execute pending post updates."
+#: view/theme/vier/config.php:116 src/Core/ACL.php:301
+msgid "show"
 msgstr ""
 
-#: src/Console/PostUpdate.php:68
-msgid "All pending post updates are done."
+#: view/theme/vier/config.php:122
+msgid "Set style"
 msgstr ""
 
-#: src/Content/ContactSelector.php:58
-msgid "Frequently"
+#: view/theme/vier/config.php:123
+msgid "Community Pages"
 msgstr ""
 
-#: src/Content/ContactSelector.php:59
-msgid "Hourly"
+#: view/theme/vier/config.php:124 view/theme/vier/theme.php:151
+msgid "Community Profiles"
 msgstr ""
 
-#: src/Content/ContactSelector.php:60
-msgid "Twice daily"
+#: view/theme/vier/config.php:125
+msgid "Help or @NewHere ?"
 msgstr ""
 
-#: src/Content/ContactSelector.php:61
-msgid "Daily"
+#: view/theme/vier/config.php:126 view/theme/vier/theme.php:373
+msgid "Connect Services"
 msgstr ""
 
-#: src/Content/ContactSelector.php:62
-msgid "Weekly"
+#: view/theme/vier/config.php:127
+msgid "Find Friends"
 msgstr ""
 
-#: src/Content/ContactSelector.php:63
-msgid "Monthly"
+#: view/theme/vier/config.php:128 view/theme/vier/theme.php:181
+msgid "Last users"
 msgstr ""
 
-#: src/Content/ContactSelector.php:83
-msgid "DFRN"
+#: view/theme/vier/theme.php:199 src/Content/Widget.php:64
+msgid "Find People"
 msgstr ""
 
-#: src/Content/ContactSelector.php:84
-msgid "OStatus"
+#: view/theme/vier/theme.php:200 src/Content/Widget.php:65
+msgid "Enter name or interest"
 msgstr ""
 
-#: src/Content/ContactSelector.php:85
-msgid "RSS/Atom"
+#: view/theme/vier/theme.php:202 src/Content/Widget.php:67
+msgid "Examples: Robert Morgenstein, Fishing"
 msgstr ""
 
-#: src/Content/ContactSelector.php:86 src/Module/Admin/Users.php:272
-#: src/Module/Admin/Users.php:283 src/Module/Admin/Users.php:297
-#: src/Module/Admin/Users.php:315
-msgid "Email"
+#: view/theme/vier/theme.php:203 src/Content/Widget.php:68
+#: src/Module/Contact.php:820 src/Module/Directory.php:86
+msgid "Find"
 msgstr ""
 
-#: src/Content/ContactSelector.php:88
-msgid "Zot!"
+#: view/theme/vier/theme.php:205 src/Content/Widget.php:70
+msgid "Similar Interests"
 msgstr ""
 
-#: src/Content/ContactSelector.php:89
-msgid "LinkedIn"
+#: view/theme/vier/theme.php:206 src/Content/Widget.php:71
+msgid "Random Profile"
 msgstr ""
 
-#: src/Content/ContactSelector.php:90
-msgid "XMPP/IM"
+#: view/theme/vier/theme.php:207 src/Content/Widget.php:72
+msgid "Invite Friends"
 msgstr ""
 
-#: src/Content/ContactSelector.php:91
-msgid "MySpace"
+#: view/theme/vier/theme.php:208 src/Content/Widget.php:73
+#: src/Module/Directory.php:78
+msgid "Global Directory"
 msgstr ""
 
-#: src/Content/ContactSelector.php:92
-msgid "Google+"
+#: view/theme/vier/theme.php:210 src/Content/Widget.php:75
+msgid "Local Directory"
 msgstr ""
 
-#: src/Content/ContactSelector.php:93
-msgid "pump.io"
+#: view/theme/vier/theme.php:250 src/Content/Text/HTML.php:903
+#: src/Content/ForumManager.php:130 src/Content/Nav.php:209
+msgid "Forums"
 msgstr ""
 
-#: src/Content/ContactSelector.php:94
-msgid "Twitter"
+#: view/theme/vier/theme.php:252 src/Content/ForumManager.php:132
+msgid "External link to forum"
 msgstr ""
 
-#: src/Content/ContactSelector.php:95
-msgid "Diaspora Connector"
+#: view/theme/vier/theme.php:255 src/Content/ForumManager.php:135
+#: src/Content/Widget.php:407 src/Content/Widget.php:507
+msgid "show more"
 msgstr ""
 
-#: src/Content/ContactSelector.php:96
-msgid "GNU Social Connector"
+#: view/theme/vier/theme.php:288
+msgid "Quick Start"
 msgstr ""
 
-#: src/Content/ContactSelector.php:97
-msgid "ActivityPub"
+#: view/theme/vier/theme.php:294 src/Content/Nav.php:192 src/Module/Help.php:50
+#: src/Module/Settings/TwoFactor/AppSpecific.php:99
+#: src/Module/Settings/TwoFactor/Index.php:90
+#: src/Module/Settings/TwoFactor/Recovery.php:77
+#: src/Module/Settings/TwoFactor/Verify.php:117
+msgid "Help"
 msgstr ""
 
-#: src/Content/ContactSelector.php:98
-msgid "pnut"
+#: src/Core/ACL.php:288 src/Module/Item/Compose.php:139
+msgid "Post to Email"
 msgstr ""
 
-#: src/Content/ContactSelector.php:153 src/Content/ContactSelector.php:193
-#: src/Content/ContactSelector.php:231
-msgid "No answer"
+#: src/Core/ACL.php:300
+msgid "Visible to everybody"
 msgstr ""
 
-#: src/Content/ContactSelector.php:154
-msgid "Male"
+#: src/Core/ACL.php:311
+msgid "Connectors"
 msgstr ""
 
-#: src/Content/ContactSelector.php:155
-msgid "Female"
+#: src/Core/ACL.php:313
+msgid "Hide your profile details from unknown viewers?"
 msgstr ""
 
-#: src/Content/ContactSelector.php:156
-msgid "Currently Male"
+#: src/Core/ACL.php:313
+#, php-format
+msgid "Connectors disabled, since \"%s\" is enabled."
 msgstr ""
 
-#: src/Content/ContactSelector.php:157
-msgid "Currently Female"
+#: src/Core/ACL.php:315
+msgid "Close"
 msgstr ""
 
-#: src/Content/ContactSelector.php:158
-msgid "Mostly Male"
+#: 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 ""
 
-#: src/Content/ContactSelector.php:159
-msgid "Mostly Female"
+#: src/Core/Installer.php:182
+msgid ""
+"You may need to import the file \"database.sql\" manually using phpmyadmin "
+"or mysql."
 msgstr ""
 
-#: src/Content/ContactSelector.php:160
-msgid "Transgender"
+#: src/Core/Installer.php:183 src/Module/Install.php:174
+#: src/Module/Install.php:330
+msgid "Please see the file \"INSTALL.txt\"."
 msgstr ""
 
-#: src/Content/ContactSelector.php:161
-msgid "Intersex"
+#: src/Core/Installer.php:244
+msgid "Could not find a command line version of PHP in the web server PATH."
 msgstr ""
 
-#: src/Content/ContactSelector.php:162
-msgid "Transsexual"
+#: 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 href='https://"
+"github.com/friendica/friendica/blob/master/doc/Install.md#set-up-the-"
+"worker'>'Setup the worker'</a>"
 msgstr ""
 
-#: src/Content/ContactSelector.php:163
-msgid "Hermaphrodite"
+#: src/Core/Installer.php:250
+msgid "PHP executable path"
 msgstr ""
 
-#: src/Content/ContactSelector.php:164
-msgid "Neuter"
+#: src/Core/Installer.php:250
+msgid ""
+"Enter full path to php executable. You can leave this blank to continue the "
+"installation."
 msgstr ""
 
-#: src/Content/ContactSelector.php:165
-msgid "Non-specific"
+#: src/Core/Installer.php:255
+msgid "Command line PHP"
 msgstr ""
 
-#: src/Content/ContactSelector.php:166
-msgid "Other"
+#: src/Core/Installer.php:264
+msgid "PHP executable is not the php cli binary (could be cgi-fgci version)"
 msgstr ""
 
-#: src/Content/ContactSelector.php:194
-msgid "Males"
+#: src/Core/Installer.php:265
+msgid "Found PHP version: "
 msgstr ""
 
-#: src/Content/ContactSelector.php:195
-msgid "Females"
+#: src/Core/Installer.php:267
+msgid "PHP cli binary"
 msgstr ""
 
-#: src/Content/ContactSelector.php:196
-msgid "Gay"
+#: src/Core/Installer.php:280
+msgid ""
+"The command line version of PHP on your system does not have "
+"\"register_argc_argv\" enabled."
 msgstr ""
 
-#: src/Content/ContactSelector.php:197
-msgid "Lesbian"
+#: src/Core/Installer.php:281
+msgid "This is required for message delivery to work."
 msgstr ""
 
-#: src/Content/ContactSelector.php:198
-msgid "No Preference"
+#: src/Core/Installer.php:286
+msgid "PHP register_argc_argv"
 msgstr ""
 
-#: src/Content/ContactSelector.php:199
-msgid "Bisexual"
+#: src/Core/Installer.php:318
+msgid ""
+"Error: the \"openssl_pkey_new\" function on this system is not able to "
+"generate encryption keys"
 msgstr ""
 
-#: src/Content/ContactSelector.php:200
-msgid "Autosexual"
+#: src/Core/Installer.php:319
+msgid ""
+"If running under Windows, please see \"http://www.php.net/manual/en/openssl."
+"installation.php\"."
 msgstr ""
 
-#: src/Content/ContactSelector.php:201
-msgid "Abstinent"
+#: src/Core/Installer.php:322
+msgid "Generate encryption keys"
 msgstr ""
 
-#: src/Content/ContactSelector.php:202
-msgid "Virgin"
+#: src/Core/Installer.php:374
+msgid ""
+"Error: Apache webserver mod-rewrite module is required but not installed."
 msgstr ""
 
-#: src/Content/ContactSelector.php:203
-msgid "Deviant"
+#: src/Core/Installer.php:379
+msgid "Apache mod_rewrite module"
 msgstr ""
 
-#: src/Content/ContactSelector.php:204
-msgid "Fetish"
+#: src/Core/Installer.php:385
+msgid "Error: PDO or MySQLi PHP module required but not installed."
 msgstr ""
 
-#: src/Content/ContactSelector.php:205
-msgid "Oodles"
+#: src/Core/Installer.php:390
+msgid "Error: The MySQL driver for PDO is not installed."
 msgstr ""
 
-#: src/Content/ContactSelector.php:206
-msgid "Nonsexual"
+#: src/Core/Installer.php:394
+msgid "PDO or MySQLi PHP module"
 msgstr ""
 
-#: src/Content/ContactSelector.php:232
-msgid "Single"
+#: src/Core/Installer.php:402
+msgid "Error, XML PHP module required but not installed."
 msgstr ""
 
-#: src/Content/ContactSelector.php:233
-msgid "Lonely"
+#: src/Core/Installer.php:406
+msgid "XML PHP module"
 msgstr ""
 
-#: src/Content/ContactSelector.php:234
-msgid "Available"
+#: src/Core/Installer.php:409
+msgid "libCurl PHP module"
 msgstr ""
 
-#: src/Content/ContactSelector.php:235
-msgid "Unavailable"
+#: src/Core/Installer.php:410
+msgid "Error: libCURL PHP module required but not installed."
 msgstr ""
 
-#: src/Content/ContactSelector.php:236
-msgid "Has crush"
+#: src/Core/Installer.php:416
+msgid "GD graphics PHP module"
 msgstr ""
 
-#: src/Content/ContactSelector.php:237
-msgid "Infatuated"
+#: src/Core/Installer.php:417
+msgid ""
+"Error: GD graphics PHP module with JPEG support required but not installed."
 msgstr ""
 
-#: src/Content/ContactSelector.php:238
-msgid "Dating"
+#: src/Core/Installer.php:423
+msgid "OpenSSL PHP module"
 msgstr ""
 
-#: src/Content/ContactSelector.php:239
-msgid "Unfaithful"
+#: src/Core/Installer.php:424
+msgid "Error: openssl PHP module required but not installed."
 msgstr ""
 
-#: src/Content/ContactSelector.php:240
-msgid "Sex Addict"
+#: src/Core/Installer.php:430
+msgid "mb_string PHP module"
 msgstr ""
 
-#: src/Content/ContactSelector.php:241 src/Model/User.php:729
-msgid "Friends"
+#: src/Core/Installer.php:431
+msgid "Error: mb_string PHP module required but not installed."
 msgstr ""
 
-#: src/Content/ContactSelector.php:242
-msgid "Friends/Benefits"
+#: src/Core/Installer.php:437
+msgid "iconv PHP module"
 msgstr ""
 
-#: src/Content/ContactSelector.php:243
-msgid "Casual"
+#: src/Core/Installer.php:438
+msgid "Error: iconv PHP module required but not installed."
 msgstr ""
 
-#: src/Content/ContactSelector.php:244
-msgid "Engaged"
+#: src/Core/Installer.php:444
+msgid "POSIX PHP module"
 msgstr ""
 
-#: src/Content/ContactSelector.php:245
-msgid "Married"
+#: src/Core/Installer.php:445
+msgid "Error: POSIX PHP module required but not installed."
 msgstr ""
 
-#: src/Content/ContactSelector.php:246
-msgid "Imaginarily married"
+#: src/Core/Installer.php:451
+msgid "JSON PHP module"
 msgstr ""
 
-#: src/Content/ContactSelector.php:247
-msgid "Partners"
+#: src/Core/Installer.php:452
+msgid "Error: JSON PHP module required but not installed."
 msgstr ""
 
-#: src/Content/ContactSelector.php:248
-msgid "Cohabiting"
+#: src/Core/Installer.php:458
+msgid "File Information PHP module"
 msgstr ""
 
-#: src/Content/ContactSelector.php:249
-msgid "Common law"
+#: src/Core/Installer.php:459
+msgid "Error: File Information PHP module required but not installed."
 msgstr ""
 
-#: src/Content/ContactSelector.php:250
-msgid "Happy"
+#: 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/Content/ContactSelector.php:251
-msgid "Not looking"
+#: 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/Content/ContactSelector.php:252
-msgid "Swinger"
+#: 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/Content/ContactSelector.php:253
-msgid "Betrayed"
+#: 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/Content/ContactSelector.php:254
-msgid "Separated"
+#: src/Core/Installer.php:488
+msgid "config/local.config.php is writable"
 msgstr ""
 
-#: src/Content/ContactSelector.php:255
-msgid "Unstable"
+#: 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/Content/ContactSelector.php:256
-msgid "Divorced"
+#: 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/Content/ContactSelector.php:257
-msgid "Imaginarily divorced"
+#: 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/Content/ContactSelector.php:258
-msgid "Widowed"
+#: 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/Content/ContactSelector.php:259
-msgid "Uncertain"
+#: src/Core/Installer.php:514
+msgid "view/smarty3 is writable"
 msgstr ""
 
-#: src/Content/ContactSelector.php:260
-msgid "It's complicated"
+#: src/Core/Installer.php:543
+msgid ""
+"Url rewrite in .htaccess is not working. Make sure you copied .htaccess-dist "
+"to .htaccess."
 msgstr ""
 
-#: src/Content/ContactSelector.php:261
-msgid "Don't care"
+#: src/Core/Installer.php:545
+msgid "Error message from Curl when fetching"
 msgstr ""
 
-#: src/Content/ContactSelector.php:262
-msgid "Ask me"
+#: src/Core/Installer.php:550
+msgid "Url rewrite is working"
 msgstr ""
 
-#: src/Content/Feature.php:82
-msgid "General Features"
+#: src/Core/Installer.php:579
+msgid "ImageMagick PHP extension is not installed"
 msgstr ""
 
-#: src/Content/Feature.php:84
-msgid "Multiple Profiles"
+#: src/Core/Installer.php:581
+msgid "ImageMagick PHP extension is installed"
 msgstr ""
 
-#: src/Content/Feature.php:84
-msgid "Ability to create multiple profiles"
+#: src/Core/Installer.php:583 tests/src/Core/InstallerTest.php:372
+#: tests/src/Core/InstallerTest.php:400
+msgid "ImageMagick supports GIF"
 msgstr ""
 
-#: src/Content/Feature.php:85
-msgid "Photo Location"
+#: src/Core/Installer.php:606
+msgid "Database already in use."
 msgstr ""
 
-#: 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."
+#: src/Core/Installer.php:611
+msgid "Could not connect to database."
 msgstr ""
 
-#: src/Content/Feature.php:86
-msgid "Export Public Calendar"
+#: src/Core/L10n/L10n.php:370 src/Model/Event.php:397
+msgid "Tuesday"
 msgstr ""
 
-#: src/Content/Feature.php:86
-msgid "Ability for visitors to download the public calendar"
+#: src/Core/L10n/L10n.php:370 src/Model/Event.php:398
+msgid "Wednesday"
 msgstr ""
 
-#: src/Content/Feature.php:91
-msgid "Post Composition Features"
+#: src/Core/L10n/L10n.php:370 src/Model/Event.php:399
+msgid "Thursday"
 msgstr ""
 
-#: src/Content/Feature.php:92
-msgid "Auto-mention Forums"
+#: src/Core/L10n/L10n.php:370 src/Model/Event.php:400
+msgid "Friday"
 msgstr ""
 
-#: src/Content/Feature.php:92
-msgid ""
-"Add/remove mention when a forum page is selected/deselected in ACL window."
+#: src/Core/L10n/L10n.php:370 src/Model/Event.php:401
+msgid "Saturday"
 msgstr ""
 
-#: src/Content/Feature.php:93
-msgid "Explicit Mentions"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:416
+msgid "January"
 msgstr ""
 
-#: src/Content/Feature.php:93
-msgid ""
-"Add explicit mentions to comment box for manual control over who gets "
-"mentioned in replies."
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:417
+msgid "February"
 msgstr ""
 
-#: src/Content/Feature.php:98
-msgid "Network Sidebar"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:418
+msgid "March"
 msgstr ""
 
-#: src/Content/Feature.php:99 src/Content/Widget.php:497
-msgid "Archives"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:419
+msgid "April"
 msgstr ""
 
-#: src/Content/Feature.php:99
-msgid "Ability to select posts by date ranges"
+#: src/Core/L10n/L10n.php:374 src/Core/L10n/L10n.php:394
+#: src/Model/Event.php:407
+msgid "May"
 msgstr ""
 
-#: src/Content/Feature.php:100
-msgid "Protocol Filter"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:420
+msgid "June"
 msgstr ""
 
-#: src/Content/Feature.php:100
-msgid "Enable widget to display Network posts only from selected protocols"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:421
+msgid "July"
 msgstr ""
 
-#: src/Content/Feature.php:105
-msgid "Network Tabs"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:422
+msgid "August"
 msgstr ""
 
-#: src/Content/Feature.php:106
-msgid "Network New Tab"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:423
+msgid "September"
 msgstr ""
 
-#: src/Content/Feature.php:106
-msgid "Enable tab to display only new Network posts (from the last 12 hours)"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:424
+msgid "October"
 msgstr ""
 
-#: src/Content/Feature.php:107
-msgid "Network Shared Links Tab"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:425
+msgid "November"
 msgstr ""
 
-#: src/Content/Feature.php:107
-msgid "Enable tab to display only Network posts with links in them"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:426
+msgid "December"
 msgstr ""
 
-#: src/Content/Feature.php:112
-msgid "Post/Comment Tools"
+#: src/Core/L10n/L10n.php:390 src/Model/Event.php:388
+msgid "Mon"
 msgstr ""
 
-#: src/Content/Feature.php:113
-msgid "Post Categories"
+#: src/Core/L10n/L10n.php:390 src/Model/Event.php:389
+msgid "Tue"
 msgstr ""
 
-#: src/Content/Feature.php:113
-msgid "Add categories to your posts"
+#: src/Core/L10n/L10n.php:390 src/Model/Event.php:390
+msgid "Wed"
 msgstr ""
 
-#: src/Content/Feature.php:118
-msgid "Advanced Profile Settings"
+#: src/Core/L10n/L10n.php:390 src/Model/Event.php:391
+msgid "Thu"
 msgstr ""
 
-#: src/Content/Feature.php:119
-msgid "List Forums"
+#: src/Core/L10n/L10n.php:390 src/Model/Event.php:392
+msgid "Fri"
 msgstr ""
 
-#: src/Content/Feature.php:119
-msgid "Show visitors public community forums at the Advanced Profile Page"
+#: src/Core/L10n/L10n.php:390 src/Model/Event.php:393
+msgid "Sat"
 msgstr ""
 
-#: src/Content/Feature.php:120
-msgid "Tag Cloud"
+#: src/Core/L10n/L10n.php:390 src/Model/Event.php:387
+msgid "Sun"
 msgstr ""
 
-#: src/Content/Feature.php:120
-msgid "Provide a personal tag cloud on your profile page"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:403
+msgid "Jan"
 msgstr ""
 
-#: src/Content/Feature.php:121
-msgid "Display Membership Date"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:404
+msgid "Feb"
 msgstr ""
 
-#: src/Content/Feature.php:121
-msgid "Display membership date in profile"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:405
+msgid "Mar"
 msgstr ""
 
-#: src/Content/ForumManager.php:130 src/Content/Nav.php:206
-#: src/Content/Text/HTML.php:914 view/theme/vier/theme.php:250
-msgid "Forums"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:406
+msgid "Apr"
 msgstr ""
 
-#: src/Content/ForumManager.php:132 view/theme/vier/theme.php:252
-msgid "External link to forum"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:408
+msgid "Jun"
 msgstr ""
 
-#: src/Content/ForumManager.php:135 src/Content/Widget.php:405
-#: src/Content/Widget.php:503 view/theme/vier/theme.php:255
-msgid "show more"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:409
+msgid "Jul"
 msgstr ""
 
-#: src/Content/Nav.php:73
-msgid "Nothing new here"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:410
+msgid "Aug"
 msgstr ""
 
-#: src/Content/Nav.php:77
-msgid "Clear notifications"
+#: src/Core/L10n/L10n.php:394
+msgid "Sep"
 msgstr ""
 
-#: src/Content/Nav.php:78 src/Content/Text/HTML.php:903
-msgid "@name, !forum, #tags, content"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:412
+msgid "Oct"
 msgstr ""
 
-#: src/Content/Nav.php:152 src/Module/Login.php:324
-#: view/theme/frio/theme.php:259
-msgid "Logout"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:413
+msgid "Nov"
 msgstr ""
 
-#: src/Content/Nav.php:152 view/theme/frio/theme.php:259
-msgid "End this session"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:414
+msgid "Dec"
 msgstr ""
 
-#: src/Content/Nav.php:155 src/Model/Profile.php:898 src/Module/Contact.php:648
-#: src/Module/Contact.php:850 src/Module/Settings/TwoFactor/Index.php:85
-#: view/theme/frio/theme.php:262
-msgid "Status"
+#: src/Core/L10n/L10n.php:413
+msgid "poke"
 msgstr ""
 
-#: src/Content/Nav.php:155 src/Content/Nav.php:241
-#: view/theme/frio/theme.php:262
-msgid "Your posts and conversations"
+#: src/Core/L10n/L10n.php:413
+msgid "poked"
 msgstr ""
 
-#: src/Content/Nav.php:156 view/theme/frio/theme.php:263
-msgid "Your profile page"
+#: src/Core/L10n/L10n.php:414
+msgid "ping"
 msgstr ""
 
-#: src/Content/Nav.php:157 view/theme/frio/theme.php:264
-msgid "Your photos"
+#: src/Core/L10n/L10n.php:414
+msgid "pinged"
 msgstr ""
 
-#: src/Content/Nav.php:158 src/Model/Profile.php:922 src/Model/Profile.php:925
-#: view/theme/frio/theme.php:265
-msgid "Videos"
+#: src/Core/L10n/L10n.php:415
+msgid "prod"
 msgstr ""
 
-#: src/Content/Nav.php:158 view/theme/frio/theme.php:265
-msgid "Your videos"
+#: src/Core/L10n/L10n.php:415
+msgid "prodded"
 msgstr ""
 
-#: src/Content/Nav.php:159 view/theme/frio/theme.php:266
-msgid "Your events"
+#: src/Core/L10n/L10n.php:416
+msgid "slap"
 msgstr ""
 
-#: src/Content/Nav.php:160
-msgid "Personal notes"
+#: src/Core/L10n/L10n.php:416
+msgid "slapped"
 msgstr ""
 
-#: src/Content/Nav.php:160
-msgid "Your personal notes"
+#: src/Core/L10n/L10n.php:417
+msgid "finger"
 msgstr ""
 
-#: src/Content/Nav.php:169 src/Module/Bookmarklet.php:25
-#: src/Module/Login.php:325
-msgid "Login"
+#: src/Core/L10n/L10n.php:417
+msgid "fingered"
 msgstr ""
 
-#: src/Content/Nav.php:169
-msgid "Sign in"
+#: src/Core/L10n/L10n.php:418
+msgid "rebuff"
 msgstr ""
 
-#: src/Content/Nav.php:179 src/Content/Nav.php:241
-#: src/Core/NotificationsManager.php:165
-msgid "Home"
+#: src/Core/L10n/L10n.php:418
+msgid "rebuffed"
 msgstr ""
 
-#: src/Content/Nav.php:179
-msgid "Home Page"
+#: src/Core/NotificationsManager.php:144
+msgid "System"
 msgstr ""
 
-#: src/Content/Nav.php:183 src/Module/Login.php:296 src/Module/Register.php:136
-msgid "Register"
+#: src/Core/NotificationsManager.php:165 src/Content/Nav.php:182
+#: src/Content/Nav.php:244
+msgid "Home"
 msgstr ""
 
-#: src/Content/Nav.php:183
-msgid "Create an account"
+#: src/Core/NotificationsManager.php:172 src/Content/Nav.php:248
+msgid "Introductions"
 msgstr ""
 
-#: src/Content/Nav.php:189 src/Module/Help.php:50
-#: src/Module/Settings/TwoFactor/Index.php:84
-#: src/Module/Settings/TwoFactor/Recovery.php:77
-#: src/Module/Settings/TwoFactor/Verify.php:117 view/theme/vier/theme.php:294
-msgid "Help"
+#: src/Core/NotificationsManager.php:234 src/Core/NotificationsManager.php:246
+#, php-format
+msgid "%s commented on %s's post"
 msgstr ""
 
-#: src/Content/Nav.php:189
-msgid "Help and documentation"
+#: src/Core/NotificationsManager.php:245
+#, php-format
+msgid "%s created a new post"
 msgstr ""
 
-#: src/Content/Nav.php:193
-msgid "Apps"
+#: src/Core/NotificationsManager.php:259
+#, php-format
+msgid "%s liked %s's post"
 msgstr ""
 
-#: src/Content/Nav.php:193
-msgid "Addon applications, utilities, games"
+#: src/Core/NotificationsManager.php:272
+#, php-format
+msgid "%s disliked %s's post"
 msgstr ""
 
-#: src/Content/Nav.php:197
-msgid "Search site content"
+#: src/Core/NotificationsManager.php:285
+#, php-format
+msgid "%s is attending %s's event"
 msgstr ""
 
-#: src/Content/Nav.php:200 src/Content/Text/HTML.php:909
-msgid "Full Text"
+#: src/Core/NotificationsManager.php:298
+#, php-format
+msgid "%s is not attending %s's event"
 msgstr ""
 
-#: src/Content/Nav.php:201 src/Content/Text/HTML.php:910
-#: src/Content/Widget/TagCloud.php:54
-msgid "Tags"
+#: src/Core/NotificationsManager.php:311
+#, php-format
+msgid "%s may attend %s's event"
 msgstr ""
 
-#: src/Content/Nav.php:202 src/Content/Nav.php:268
-#: src/Content/Text/HTML.php:911 src/Model/Profile.php:977
-#: src/Model/Profile.php:980 src/Module/Contact.php:794
-#: src/Module/Contact.php:878 view/theme/frio/theme.php:273
-msgid "Contacts"
+#: src/Core/NotificationsManager.php:344
+#, php-format
+msgid "%s is now friends with %s"
 msgstr ""
 
-#: src/Content/Nav.php:221
-msgid "Community"
+#: src/Core/NotificationsManager.php:622
+msgid "Friend Suggestion"
 msgstr ""
 
-#: src/Content/Nav.php:221
-msgid "Conversations on this and other servers"
+#: src/Core/NotificationsManager.php:656
+msgid "Friend/Connect Request"
 msgstr ""
 
-#: src/Content/Nav.php:225 src/Model/Profile.php:937 src/Model/Profile.php:948
-#: view/theme/frio/theme.php:270
-msgid "Events and Calendar"
+#: src/Core/NotificationsManager.php:656
+msgid "New Follower"
 msgstr ""
 
-#: src/Content/Nav.php:228
-msgid "Directory"
+#: src/Core/Session.php:188
+#, php-format
+msgid "Welcome %s"
 msgstr ""
 
-#: src/Content/Nav.php:228
-msgid "People directory"
+#: src/Core/Session.php:189
+msgid "Please upload a profile photo."
 msgstr ""
 
-#: src/Content/Nav.php:230 src/Module/BaseAdminModule.php:75
-msgid "Information"
+#: src/Core/Session.php:192
+#, php-format
+msgid "Welcome back %s"
 msgstr ""
 
-#: src/Content/Nav.php:230
-msgid "Information about this friendica instance"
+#: src/Core/Update.php:193
+#, php-format
+msgid "Update %s failed. See error logs."
 msgstr ""
 
-#: src/Content/Nav.php:233 src/Module/Admin/Tos.php:43
-#: src/Module/BaseAdminModule.php:85 src/Module/Register.php:144
-#: src/Module/Tos.php:73
-msgid "Terms of Service"
+#: src/Core/Update.php:257
+#, 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/Nav.php:233
-msgid "Terms of Service of this Friendica instance"
+#: src/Core/Update.php:263
+#, php-format
+msgid ""
+"The error message is\n"
+"[pre]%s[/pre]"
 msgstr ""
 
-#: src/Content/Nav.php:238 src/Core/NotificationsManager.php:151
-#: view/theme/frio/theme.php:269
-msgid "Network"
+#: src/Core/Update.php:269 src/Core/Update.php:308
+msgid "[Friendica Notify] Database update"
 msgstr ""
 
-#: src/Content/Nav.php:238 view/theme/frio/theme.php:269
-msgid "Conversations from your friends"
+#: src/Core/Update.php:300
+#, php-format
+msgid ""
+"\n"
+"\t\t\t\t\tThe friendica database was successfully updated from %s to %s."
 msgstr ""
 
-#: src/Content/Nav.php:239
-msgid "Network Reset"
+#: src/Core/UserImport.php:107
+msgid "Error decoding account file"
 msgstr ""
 
-#: src/Content/Nav.php:239
-msgid "Load Network page with no filters"
+#: src/Core/UserImport.php:113
+msgid "Error! No version data in file! This is not a Friendica account file?"
 msgstr ""
 
-#: src/Content/Nav.php:245 src/Core/NotificationsManager.php:172
-msgid "Introductions"
+#: src/Core/UserImport.php:121
+#, php-format
+msgid "User '%s' already exists on this server!"
 msgstr ""
 
-#: src/Content/Nav.php:245
-msgid "Friend Requests"
+#: src/Core/UserImport.php:157
+msgid "User creation error"
 msgstr ""
 
-#: src/Content/Nav.php:247
-msgid "See all notifications"
+#: src/Core/UserImport.php:175
+msgid "User profile creation error"
 msgstr ""
 
-#: src/Content/Nav.php:248
-msgid "Mark all system notifications seen"
-msgstr ""
+#: src/Core/UserImport.php:219
+#, php-format
+msgid "%d contact not imported"
+msgid_plural "%d contacts not imported"
+msgstr[0] ""
+msgstr[1] ""
 
-#: src/Content/Nav.php:251 view/theme/frio/theme.php:271
-msgid "Private mail"
+#: src/Core/UserImport.php:284
+msgid "Done. You can now login with your username and password"
 msgstr ""
 
-#: src/Content/Nav.php:252
-msgid "Inbox"
+#: src/Util/Temporal.php:147 src/Model/Profile.php:776
+msgid "Birthday:"
 msgstr ""
 
-#: src/Content/Nav.php:253
-msgid "Outbox"
+#: src/Util/Temporal.php:151
+msgid "YYYY-MM-DD or MM-DD"
 msgstr ""
 
-#: src/Content/Nav.php:257
-msgid "Manage"
+#: src/Util/Temporal.php:298
+msgid "never"
 msgstr ""
 
-#: src/Content/Nav.php:257
-msgid "Manage other pages"
+#: src/Util/Temporal.php:305
+msgid "less than a second ago"
 msgstr ""
 
-#: src/Content/Nav.php:262 view/theme/frio/theme.php:272
-msgid "Account settings"
+#: src/Util/Temporal.php:313
+msgid "year"
 msgstr ""
 
-#: src/Content/Nav.php:265
-msgid "Manage/Edit Profiles"
+#: src/Util/Temporal.php:313
+msgid "years"
 msgstr ""
 
-#: src/Content/Nav.php:268 view/theme/frio/theme.php:273
-msgid "Manage/edit friends and contacts"
+#: src/Util/Temporal.php:314
+msgid "months"
 msgstr ""
 
-#: src/Content/Nav.php:273 src/Module/BaseAdminModule.php:114
-msgid "Admin"
+#: src/Util/Temporal.php:315
+msgid "weeks"
 msgstr ""
 
-#: src/Content/Nav.php:273
-msgid "Site setup and configuration"
+#: src/Util/Temporal.php:316
+msgid "days"
 msgstr ""
 
-#: src/Content/Nav.php:276
-msgid "Navigation"
+#: src/Util/Temporal.php:317
+msgid "hour"
 msgstr ""
 
-#: src/Content/Nav.php:276
-msgid "Site map"
+#: src/Util/Temporal.php:317
+msgid "hours"
 msgstr ""
 
-#: src/Content/OEmbed.php:255
-msgid "Embedding disabled"
+#: src/Util/Temporal.php:318
+msgid "minute"
 msgstr ""
 
-#: src/Content/OEmbed.php:378
-msgid "Embedded content"
+#: src/Util/Temporal.php:318
+msgid "minutes"
 msgstr ""
 
-#: src/Content/Pager.php:153
-msgid "newer"
+#: src/Util/Temporal.php:319
+msgid "second"
 msgstr ""
 
-#: src/Content/Pager.php:158
-msgid "older"
+#: src/Util/Temporal.php:319
+msgid "seconds"
 msgstr ""
 
-#: src/Content/Pager.php:203
-msgid "prev"
+#: src/Util/Temporal.php:329
+#, php-format
+msgid "in %1$d %2$s"
 msgstr ""
 
-#: src/Content/Pager.php:263
-msgid "last"
+#: src/Util/Temporal.php:332
+#, php-format
+msgid "%1$d %2$s ago"
 msgstr ""
 
-#: src/Content/Text/BBCode.php:430
+#: src/Content/Text/BBCode.php:457
 msgid "view full size"
 msgstr ""
 
-#: src/Content/Text/BBCode.php:864 src/Content/Text/BBCode.php:1591
-#: src/Content/Text/BBCode.php:1592
+#: src/Content/Text/BBCode.php:891 src/Content/Text/BBCode.php:1533
+#: src/Content/Text/BBCode.php:1534
 msgid "Image/photo"
 msgstr ""
 
-#: src/Content/Text/BBCode.php:972
+#: src/Content/Text/BBCode.php:1009
 #, php-format
 msgid "<a href=\"%1$s\" target=\"_blank\">%2$s</a> %3$s"
 msgstr ""
 
-#: src/Content/Text/BBCode.php:1518 src/Content/Text/BBCode.php:1540
+#: src/Content/Text/BBCode.php:1460 src/Content/Text/BBCode.php:1482
 msgid "$1 wrote:"
 msgstr ""
 
-#: src/Content/Text/BBCode.php:1602 src/Content/Text/BBCode.php:1603
+#: src/Content/Text/BBCode.php:1536 src/Content/Text/BBCode.php:1537
 msgid "Encrypted content"
 msgstr ""
 
-#: src/Content/Text/BBCode.php:1710
+#: src/Content/Text/BBCode.php:1758
 msgid "Invalid source protocol"
 msgstr ""
 
-#: src/Content/Text/BBCode.php:1721
+#: src/Content/Text/BBCode.php:1769
 msgid "Invalid link protocol"
 msgstr ""
 
-#: src/Content/Text/HTML.php:800
+#: src/Content/Text/HTML.php:789
 msgid "Loading more entries..."
 msgstr ""
 
-#: src/Content/Text/HTML.php:801
+#: src/Content/Text/HTML.php:790
 msgid "The end"
 msgstr ""
 
-#: src/Content/Text/HTML.php:894
+#: src/Content/Text/HTML.php:883 src/Model/Profile.php:536
+#: src/Module/Contact.php:335
 msgid "Follow"
 msgstr ""
 
-#: src/Content/Text/HTML.php:951 src/Model/Item.php:3472
-#: src/Model/Item.php:3483
+#: src/Content/Text/HTML.php:892 src/Content/Nav.php:79
+msgid "@name, !forum, #tags, content"
+msgstr ""
+
+#: src/Content/Text/HTML.php:898 src/Content/Nav.php:203
+msgid "Full Text"
+msgstr ""
+
+#: src/Content/Text/HTML.php:899 src/Content/Widget/TagCloud.php:54
+#: src/Content/Nav.php:204
+msgid "Tags"
+msgstr ""
+
+#: src/Content/Text/HTML.php:940 src/Model/Item.php:3518
+#: src/Model/Item.php:3529
 msgid "Click to open/close"
 msgstr ""
 
@@ -5018,745 +5318,719 @@ msgstr[1] ""
 msgid "View Contacts"
 msgstr ""
 
-#: src/Content/Widget.php:38
-msgid "Add New Contact"
+#: src/Content/Widget/TrendingTags.php:34
+#, php-format
+msgid "Trending Tags (last %d hour)"
+msgid_plural "Trending Tags (last %d hours)"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Content/Widget/TrendingTags.php:35
+msgid "More Trending Tags"
 msgstr ""
 
-#: src/Content/Widget.php:39
-msgid "Enter address or web location"
+#: src/Content/Pager.php:153
+msgid "newer"
 msgstr ""
 
-#: src/Content/Widget.php:40
-msgid "Example: bob@example.com, http://example.com/barbara"
+#: src/Content/Pager.php:158
+msgid "older"
 msgstr ""
 
-#: src/Content/Widget.php:58
-#, php-format
-msgid "%d invitation available"
-msgid_plural "%d invitations available"
-msgstr[0] ""
-msgstr[1] ""
+#: src/Content/Pager.php:203
+msgid "prev"
+msgstr ""
 
-#: src/Content/Widget.php:64 view/theme/vier/theme.php:199
-msgid "Find People"
+#: src/Content/Pager.php:263
+msgid "last"
 msgstr ""
 
-#: src/Content/Widget.php:65 view/theme/vier/theme.php:200
-msgid "Enter name or interest"
+#: src/Content/ContactSelector.php:58
+msgid "Frequently"
 msgstr ""
 
-#: src/Content/Widget.php:67 view/theme/vier/theme.php:202
-msgid "Examples: Robert Morgenstein, Fishing"
+#: src/Content/ContactSelector.php:59
+msgid "Hourly"
 msgstr ""
 
-#: src/Content/Widget.php:68 src/Module/Contact.php:814
-#: src/Module/Directory.php:91 view/theme/vier/theme.php:203
-msgid "Find"
+#: src/Content/ContactSelector.php:60
+msgid "Twice daily"
 msgstr ""
 
-#: src/Content/Widget.php:70 view/theme/vier/theme.php:205
-msgid "Similar Interests"
+#: src/Content/ContactSelector.php:61
+msgid "Daily"
 msgstr ""
 
-#: src/Content/Widget.php:71 view/theme/vier/theme.php:206
-msgid "Random Profile"
+#: src/Content/ContactSelector.php:62
+msgid "Weekly"
+msgstr ""
+
+#: src/Content/ContactSelector.php:63
+msgid "Monthly"
+msgstr ""
+
+#: src/Content/ContactSelector.php:83
+msgid "DFRN"
+msgstr ""
+
+#: src/Content/ContactSelector.php:84
+msgid "OStatus"
+msgstr ""
+
+#: src/Content/ContactSelector.php:85
+msgid "RSS/Atom"
+msgstr ""
+
+#: src/Content/ContactSelector.php:86 src/Module/Admin/Users.php:272
+#: src/Module/Admin/Users.php:283 src/Module/Admin/Users.php:297
+#: src/Module/Admin/Users.php:315
+msgid "Email"
+msgstr ""
+
+#: src/Content/ContactSelector.php:88
+msgid "Zot!"
+msgstr ""
+
+#: src/Content/ContactSelector.php:89
+msgid "LinkedIn"
 msgstr ""
 
-#: src/Content/Widget.php:72 view/theme/vier/theme.php:207
-msgid "Invite Friends"
+#: src/Content/ContactSelector.php:90
+msgid "XMPP/IM"
 msgstr ""
 
-#: src/Content/Widget.php:73 src/Module/Directory.php:83
-#: view/theme/vier/theme.php:208
-msgid "Global Directory"
+#: src/Content/ContactSelector.php:91
+msgid "MySpace"
 msgstr ""
 
-#: src/Content/Widget.php:75 view/theme/vier/theme.php:210
-msgid "Local Directory"
+#: src/Content/ContactSelector.php:92
+msgid "Google+"
 msgstr ""
 
-#: src/Content/Widget.php:192 src/Module/Contact.php:791
-#: src/Module/Profile/Contacts.php:126
-msgid "Followers"
+#: src/Content/ContactSelector.php:93
+msgid "pump.io"
 msgstr ""
 
-#: src/Content/Widget.php:193 src/Module/Contact.php:792
-#: src/Module/Profile/Contacts.php:127
-msgid "Following"
+#: src/Content/ContactSelector.php:94
+msgid "Twitter"
 msgstr ""
 
-#: src/Content/Widget.php:194 src/Module/Contact.php:793
-#: src/Module/Profile/Contacts.php:128
-msgid "Mutual friends"
+#: src/Content/ContactSelector.php:95
+msgid "Diaspora Connector"
 msgstr ""
 
-#: src/Content/Widget.php:199
-msgid "Relationships"
+#: src/Content/ContactSelector.php:96
+msgid "GNU Social Connector"
 msgstr ""
 
-#: src/Content/Widget.php:201 src/Module/Contact.php:688
-#: src/Module/Group.php:287
-msgid "All Contacts"
+#: src/Content/ContactSelector.php:97
+msgid "ActivityPub"
 msgstr ""
 
-#: src/Content/Widget.php:244
-msgid "Protocols"
+#: src/Content/ContactSelector.php:98
+msgid "pnut"
 msgstr ""
 
-#: src/Content/Widget.php:246
-msgid "All Protocols"
+#: src/Content/ContactSelector.php:153 src/Content/ContactSelector.php:193
+#: src/Content/ContactSelector.php:231
+msgid "No answer"
 msgstr ""
 
-#: src/Content/Widget.php:279
-msgid "Saved Folders"
+#: src/Content/ContactSelector.php:154
+msgid "Male"
 msgstr ""
 
-#: src/Content/Widget.php:281 src/Content/Widget.php:318
-msgid "Everything"
+#: src/Content/ContactSelector.php:155
+msgid "Female"
 msgstr ""
 
-#: src/Content/Widget.php:316
-msgid "Categories"
+#: src/Content/ContactSelector.php:156
+msgid "Currently Male"
 msgstr ""
 
-#: src/Content/Widget.php:400
-#, php-format
-msgid "%d contact in common"
-msgid_plural "%d contacts in common"
-msgstr[0] ""
-msgstr[1] ""
+#: src/Content/ContactSelector.php:157
+msgid "Currently Female"
+msgstr ""
 
-#: src/Core/ACL.php:288
-msgid "Post to Email"
+#: src/Content/ContactSelector.php:158
+msgid "Mostly Male"
 msgstr ""
 
-#: src/Core/ACL.php:300
-msgid "Visible to everybody"
+#: src/Content/ContactSelector.php:159
+msgid "Mostly Female"
 msgstr ""
 
-#: src/Core/ACL.php:301 view/theme/vier/config.php:116
-msgid "show"
+#: src/Content/ContactSelector.php:160
+msgid "Transgender"
 msgstr ""
 
-#: src/Core/ACL.php:302 view/theme/vier/config.php:116
-msgid "don't show"
+#: src/Content/ContactSelector.php:161
+msgid "Intersex"
 msgstr ""
 
-#: src/Core/ACL.php:311
-msgid "Connectors"
+#: src/Content/ContactSelector.php:162
+msgid "Transsexual"
 msgstr ""
 
-#: src/Core/ACL.php:313
-msgid "Hide your profile details from unknown viewers?"
+#: src/Content/ContactSelector.php:163
+msgid "Hermaphrodite"
 msgstr ""
 
-#: src/Core/ACL.php:313
-#, php-format
-msgid "Connectors disabled, since \"%s\" is enabled."
+#: src/Content/ContactSelector.php:164
+msgid "Neuter"
 msgstr ""
 
-#: src/Core/ACL.php:315
-msgid "Close"
+#: src/Content/ContactSelector.php:165
+msgid "Non-specific"
 msgstr ""
 
-#: 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."
+#: src/Content/ContactSelector.php:166
+msgid "Other"
 msgstr ""
 
-#: src/Core/Installer.php:183
-msgid ""
-"You may need to import the file \"database.sql\" manually using phpmyadmin "
-"or mysql."
+#: src/Content/ContactSelector.php:194
+msgid "Males"
 msgstr ""
 
-#: src/Core/Installer.php:184 src/Module/Install.php:172
-#: src/Module/Install.php:328
-msgid "Please see the file \"INSTALL.txt\"."
+#: src/Content/ContactSelector.php:195
+msgid "Females"
 msgstr ""
 
-#: src/Core/Installer.php:245
-msgid "Could not find a command line version of PHP in the web server PATH."
+#: src/Content/ContactSelector.php:196
+msgid "Gay"
 msgstr ""
 
-#: 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://"
-"github.com/friendica/friendica/blob/master/doc/Install.md#set-up-the-"
-"worker'>'Setup the worker'</a>"
+#: src/Content/ContactSelector.php:197
+msgid "Lesbian"
 msgstr ""
 
-#: src/Core/Installer.php:251
-msgid "PHP executable path"
+#: src/Content/ContactSelector.php:198
+msgid "No Preference"
 msgstr ""
 
-#: src/Core/Installer.php:251
-msgid ""
-"Enter full path to php executable. You can leave this blank to continue the "
-"installation."
+#: src/Content/ContactSelector.php:199
+msgid "Bisexual"
 msgstr ""
 
-#: src/Core/Installer.php:256
-msgid "Command line PHP"
+#: src/Content/ContactSelector.php:200
+msgid "Autosexual"
 msgstr ""
 
-#: src/Core/Installer.php:265
-msgid "PHP executable is not the php cli binary (could be cgi-fgci version)"
+#: src/Content/ContactSelector.php:201
+msgid "Abstinent"
 msgstr ""
 
-#: src/Core/Installer.php:266
-msgid "Found PHP version: "
+#: src/Content/ContactSelector.php:202
+msgid "Virgin"
 msgstr ""
 
-#: src/Core/Installer.php:268
-msgid "PHP cli binary"
+#: src/Content/ContactSelector.php:203
+msgid "Deviant"
 msgstr ""
 
-#: src/Core/Installer.php:281
-msgid ""
-"The command line version of PHP on your system does not have "
-"\"register_argc_argv\" enabled."
+#: src/Content/ContactSelector.php:204
+msgid "Fetish"
 msgstr ""
 
-#: src/Core/Installer.php:282
-msgid "This is required for message delivery to work."
+#: src/Content/ContactSelector.php:205
+msgid "Oodles"
 msgstr ""
 
-#: src/Core/Installer.php:287
-msgid "PHP register_argc_argv"
+#: src/Content/ContactSelector.php:206
+msgid "Nonsexual"
 msgstr ""
 
-#: src/Core/Installer.php:319
-msgid ""
-"Error: the \"openssl_pkey_new\" function on this system is not able to "
-"generate encryption keys"
+#: src/Content/ContactSelector.php:232
+msgid "Single"
 msgstr ""
 
-#: src/Core/Installer.php:320
-msgid ""
-"If running under Windows, please see \"http://www.php.net/manual/en/openssl."
-"installation.php\"."
+#: src/Content/ContactSelector.php:233
+msgid "Lonely"
 msgstr ""
 
-#: src/Core/Installer.php:323
-msgid "Generate encryption keys"
+#: src/Content/ContactSelector.php:234
+msgid "In a relation"
 msgstr ""
 
-#: src/Core/Installer.php:375
-msgid ""
-"Error: Apache webserver mod-rewrite module is required but not installed."
+#: src/Content/ContactSelector.php:235
+msgid "Has crush"
 msgstr ""
 
-#: src/Core/Installer.php:380
-msgid "Apache mod_rewrite module"
+#: src/Content/ContactSelector.php:236
+msgid "Infatuated"
 msgstr ""
 
-#: src/Core/Installer.php:386
-msgid "Error: PDO or MySQLi PHP module required but not installed."
+#: src/Content/ContactSelector.php:237
+msgid "Dating"
 msgstr ""
 
-#: src/Core/Installer.php:391
-msgid "Error: The MySQL driver for PDO is not installed."
+#: src/Content/ContactSelector.php:238
+msgid "Unfaithful"
 msgstr ""
 
-#: src/Core/Installer.php:395
-msgid "PDO or MySQLi PHP module"
+#: src/Content/ContactSelector.php:239
+msgid "Sex Addict"
 msgstr ""
 
-#: src/Core/Installer.php:403
-msgid "Error, XML PHP module required but not installed."
+#: src/Content/ContactSelector.php:240 src/Model/User.php:762
+msgid "Friends"
 msgstr ""
 
-#: src/Core/Installer.php:407
-msgid "XML PHP module"
+#: src/Content/ContactSelector.php:241
+msgid "Friends/Benefits"
 msgstr ""
 
-#: src/Core/Installer.php:410
-msgid "libCurl PHP module"
+#: src/Content/ContactSelector.php:242
+msgid "Casual"
 msgstr ""
 
-#: src/Core/Installer.php:411
-msgid "Error: libCURL PHP module required but not installed."
+#: src/Content/ContactSelector.php:243
+msgid "Engaged"
 msgstr ""
 
-#: src/Core/Installer.php:417
-msgid "GD graphics PHP module"
+#: src/Content/ContactSelector.php:244
+msgid "Married"
 msgstr ""
 
-#: src/Core/Installer.php:418
-msgid ""
-"Error: GD graphics PHP module with JPEG support required but not installed."
+#: src/Content/ContactSelector.php:245
+msgid "Imaginarily married"
 msgstr ""
 
-#: src/Core/Installer.php:424
-msgid "OpenSSL PHP module"
+#: src/Content/ContactSelector.php:246
+msgid "Partners"
 msgstr ""
 
-#: src/Core/Installer.php:425
-msgid "Error: openssl PHP module required but not installed."
+#: src/Content/ContactSelector.php:247
+msgid "Cohabiting"
 msgstr ""
 
-#: src/Core/Installer.php:431
-msgid "mb_string PHP module"
+#: src/Content/ContactSelector.php:248
+msgid "Common law"
 msgstr ""
 
-#: src/Core/Installer.php:432
-msgid "Error: mb_string PHP module required but not installed."
+#: src/Content/ContactSelector.php:249
+msgid "Happy"
 msgstr ""
 
-#: src/Core/Installer.php:438
-msgid "iconv PHP module"
+#: src/Content/ContactSelector.php:250
+msgid "Not looking"
 msgstr ""
 
-#: src/Core/Installer.php:439
-msgid "Error: iconv PHP module required but not installed."
+#: src/Content/ContactSelector.php:251
+msgid "Swinger"
 msgstr ""
 
-#: src/Core/Installer.php:445
-msgid "POSIX PHP module"
+#: src/Content/ContactSelector.php:252
+msgid "Betrayed"
 msgstr ""
 
-#: src/Core/Installer.php:446
-msgid "Error: POSIX PHP module required but not installed."
+#: src/Content/ContactSelector.php:253
+msgid "Separated"
 msgstr ""
 
-#: src/Core/Installer.php:452
-msgid "JSON PHP module"
+#: src/Content/ContactSelector.php:254
+msgid "Unstable"
 msgstr ""
 
-#: src/Core/Installer.php:453
-msgid "Error: JSON PHP module required but not installed."
+#: src/Content/ContactSelector.php:255
+msgid "Divorced"
 msgstr ""
 
-#: src/Core/Installer.php:459
-msgid "File Information PHP module"
+#: src/Content/ContactSelector.php:256
+msgid "Imaginarily divorced"
 msgstr ""
 
-#: src/Core/Installer.php:460
-msgid "Error: File Information PHP module required but not installed."
+#: src/Content/ContactSelector.php:257
+msgid "Widowed"
 msgstr ""
 
-#: src/Core/Installer.php:483
-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."
+#: src/Content/ContactSelector.php:258
+msgid "Uncertain"
 msgstr ""
 
-#: src/Core/Installer.php:484
-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."
+#: src/Content/ContactSelector.php:259
+msgid "It's complicated"
 msgstr ""
 
-#: src/Core/Installer.php:485
-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."
+#: src/Content/ContactSelector.php:260
+msgid "Don't care"
 msgstr ""
 
-#: src/Core/Installer.php:486
-msgid ""
-"You can alternatively skip this procedure and perform a manual installation. "
-"Please see the file \"INSTALL.txt\" for instructions."
+#: src/Content/ContactSelector.php:261
+msgid "Ask me"
 msgstr ""
 
-#: src/Core/Installer.php:489
-msgid "config/local.config.php is writable"
+#: src/Content/Feature.php:82
+msgid "General Features"
 msgstr ""
 
-#: src/Core/Installer.php:509
-msgid ""
-"Friendica uses the Smarty3 template engine to render its web views. Smarty3 "
-"compiles templates to PHP to speed up rendering."
+#: src/Content/Feature.php:84
+msgid "Multiple Profiles"
 msgstr ""
 
-#: src/Core/Installer.php:510
-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."
+#: src/Content/Feature.php:84
+msgid "Ability to create multiple profiles"
 msgstr ""
 
-#: src/Core/Installer.php:511
-msgid ""
-"Please ensure that the user that your web server runs as (e.g. www-data) has "
-"write access to this folder."
+#: src/Content/Feature.php:85
+msgid "Photo Location"
 msgstr ""
 
-#: src/Core/Installer.php:512
+#: src/Content/Feature.php:85
 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."
+"Photo metadata is normally stripped. This extracts the location (if present) "
+"prior to stripping metadata and links it to a map."
 msgstr ""
 
-#: src/Core/Installer.php:515
-msgid "view/smarty3 is writable"
+#: src/Content/Feature.php:86
+msgid "Export Public Calendar"
 msgstr ""
 
-#: src/Core/Installer.php:544
-msgid ""
-"Url rewrite in .htaccess is not working. Make sure you copied .htaccess-dist "
-"to .htaccess."
+#: src/Content/Feature.php:86
+msgid "Ability for visitors to download the public calendar"
 msgstr ""
 
-#: src/Core/Installer.php:546
-msgid "Error message from Curl when fetching"
+#: src/Content/Feature.php:87
+msgid "Trending Tags"
 msgstr ""
 
-#: src/Core/Installer.php:551
-msgid "Url rewrite is working"
+#: src/Content/Feature.php:87
+msgid ""
+"Show a community page widget with a list of the most popular tags in recent "
+"public posts."
 msgstr ""
 
-#: src/Core/Installer.php:580
-msgid "ImageMagick PHP extension is not installed"
+#: src/Content/Feature.php:92
+msgid "Post Composition Features"
 msgstr ""
 
-#: src/Core/Installer.php:582
-msgid "ImageMagick PHP extension is installed"
+#: src/Content/Feature.php:93
+msgid "Auto-mention Forums"
 msgstr ""
 
-#: src/Core/Installer.php:584 tests/src/Core/InstallerTest.php:347
-#: tests/src/Core/InstallerTest.php:373
-msgid "ImageMagick supports GIF"
+#: src/Content/Feature.php:93
+msgid ""
+"Add/remove mention when a forum page is selected/deselected in ACL window."
 msgstr ""
 
-#: src/Core/Installer.php:609
-msgid "Could not connect to database."
+#: src/Content/Feature.php:94
+msgid "Explicit Mentions"
 msgstr ""
 
-#: src/Core/Installer.php:616
-msgid "Database already in use."
+#: src/Content/Feature.php:94
+msgid ""
+"Add explicit mentions to comment box for manual control over who gets "
+"mentioned in replies."
 msgstr ""
 
-#: src/Core/L10n.php:371 src/Model/Event.php:397
-msgid "Tuesday"
+#: src/Content/Feature.php:99
+msgid "Network Sidebar"
 msgstr ""
 
-#: src/Core/L10n.php:371 src/Model/Event.php:398
-msgid "Wednesday"
+#: src/Content/Feature.php:100 src/Content/Widget.php:501
+msgid "Archives"
 msgstr ""
 
-#: src/Core/L10n.php:371 src/Model/Event.php:399
-msgid "Thursday"
+#: src/Content/Feature.php:100
+msgid "Ability to select posts by date ranges"
 msgstr ""
 
-#: src/Core/L10n.php:371 src/Model/Event.php:400
-msgid "Friday"
+#: src/Content/Feature.php:101
+msgid "Protocol Filter"
 msgstr ""
 
-#: src/Core/L10n.php:371 src/Model/Event.php:401
-msgid "Saturday"
+#: src/Content/Feature.php:101
+msgid "Enable widget to display Network posts only from selected protocols"
 msgstr ""
 
-#: src/Core/L10n.php:375 src/Model/Event.php:416
-msgid "January"
+#: src/Content/Feature.php:106
+msgid "Network Tabs"
 msgstr ""
 
-#: src/Core/L10n.php:375 src/Model/Event.php:417
-msgid "February"
+#: src/Content/Feature.php:107
+msgid "Network New Tab"
 msgstr ""
 
-#: src/Core/L10n.php:375 src/Model/Event.php:418
-msgid "March"
+#: src/Content/Feature.php:107
+msgid "Enable tab to display only new Network posts (from the last 12 hours)"
 msgstr ""
 
-#: src/Core/L10n.php:375 src/Model/Event.php:419
-msgid "April"
+#: src/Content/Feature.php:108
+msgid "Network Shared Links Tab"
 msgstr ""
 
-#: src/Core/L10n.php:375 src/Core/L10n.php:394 src/Model/Event.php:407
-msgid "May"
+#: src/Content/Feature.php:108
+msgid "Enable tab to display only Network posts with links in them"
 msgstr ""
 
-#: src/Core/L10n.php:375 src/Model/Event.php:420
-msgid "June"
+#: src/Content/Feature.php:113
+msgid "Post/Comment Tools"
 msgstr ""
 
-#: src/Core/L10n.php:375 src/Model/Event.php:421
-msgid "July"
+#: src/Content/Feature.php:114
+msgid "Post Categories"
 msgstr ""
 
-#: src/Core/L10n.php:375 src/Model/Event.php:422
-msgid "August"
+#: src/Content/Feature.php:114
+msgid "Add categories to your posts"
 msgstr ""
 
-#: src/Core/L10n.php:375 src/Model/Event.php:423
-msgid "September"
+#: src/Content/Feature.php:119
+msgid "Advanced Profile Settings"
 msgstr ""
 
-#: src/Core/L10n.php:375 src/Model/Event.php:424
-msgid "October"
+#: src/Content/Feature.php:120
+msgid "List Forums"
 msgstr ""
 
-#: src/Core/L10n.php:375 src/Model/Event.php:425
-msgid "November"
+#: src/Content/Feature.php:120
+msgid "Show visitors public community forums at the Advanced Profile Page"
 msgstr ""
 
-#: src/Core/L10n.php:375 src/Model/Event.php:426
-msgid "December"
+#: src/Content/Feature.php:121
+msgid "Tag Cloud"
 msgstr ""
 
-#: src/Core/L10n.php:390 src/Model/Event.php:388
-msgid "Mon"
+#: src/Content/Feature.php:121
+msgid "Provide a personal tag cloud on your profile page"
 msgstr ""
 
-#: src/Core/L10n.php:390 src/Model/Event.php:389
-msgid "Tue"
+#: src/Content/Feature.php:122
+msgid "Display Membership Date"
 msgstr ""
 
-#: src/Core/L10n.php:390 src/Model/Event.php:390
-msgid "Wed"
+#: src/Content/Feature.php:122
+msgid "Display membership date in profile"
 msgstr ""
 
-#: src/Core/L10n.php:390 src/Model/Event.php:391
-msgid "Thu"
+#: src/Content/Nav.php:74
+msgid "Nothing new here"
 msgstr ""
 
-#: src/Core/L10n.php:390 src/Model/Event.php:392
-msgid "Fri"
+#: src/Content/Nav.php:78
+msgid "Clear notifications"
 msgstr ""
 
-#: src/Core/L10n.php:390 src/Model/Event.php:393
-msgid "Sat"
+#: src/Content/Nav.php:153 src/Module/Login.php:315
+msgid "Logout"
 msgstr ""
 
-#: src/Core/L10n.php:390 src/Model/Event.php:387
-msgid "Sun"
+#: src/Content/Nav.php:153
+msgid "End this session"
 msgstr ""
 
-#: src/Core/L10n.php:394 src/Model/Event.php:403
-msgid "Jan"
+#: src/Content/Nav.php:155 src/Module/Bookmarklet.php:25
+#: src/Module/Login.php:316
+msgid "Login"
 msgstr ""
 
-#: src/Core/L10n.php:394 src/Model/Event.php:404
-msgid "Feb"
+#: src/Content/Nav.php:155
+msgid "Sign in"
 msgstr ""
 
-#: src/Core/L10n.php:394 src/Model/Event.php:405
-msgid "Mar"
+#: src/Content/Nav.php:165
+msgid "Personal notes"
 msgstr ""
 
-#: src/Core/L10n.php:394 src/Model/Event.php:406
-msgid "Apr"
+#: src/Content/Nav.php:165
+msgid "Your personal notes"
 msgstr ""
 
-#: src/Core/L10n.php:394 src/Model/Event.php:409
-msgid "Jul"
+#: src/Content/Nav.php:182
+msgid "Home Page"
 msgstr ""
 
-#: src/Core/L10n.php:394 src/Model/Event.php:410
-msgid "Aug"
+#: src/Content/Nav.php:186 src/Module/Login.php:287 src/Module/Register.php:136
+msgid "Register"
 msgstr ""
 
-#: src/Core/L10n.php:394
-msgid "Sep"
+#: src/Content/Nav.php:186
+msgid "Create an account"
 msgstr ""
 
-#: src/Core/L10n.php:394 src/Model/Event.php:412
-msgid "Oct"
+#: src/Content/Nav.php:192
+msgid "Help and documentation"
 msgstr ""
 
-#: src/Core/L10n.php:394 src/Model/Event.php:413
-msgid "Nov"
+#: src/Content/Nav.php:196
+msgid "Apps"
 msgstr ""
 
-#: src/Core/L10n.php:394 src/Model/Event.php:414
-msgid "Dec"
+#: src/Content/Nav.php:196
+msgid "Addon applications, utilities, games"
 msgstr ""
 
-#: src/Core/L10n.php:413
-msgid "poke"
+#: src/Content/Nav.php:200
+msgid "Search site content"
 msgstr ""
 
-#: src/Core/L10n.php:413
-msgid "poked"
+#: src/Content/Nav.php:224
+msgid "Community"
 msgstr ""
 
-#: src/Core/L10n.php:414
-msgid "ping"
+#: src/Content/Nav.php:224
+msgid "Conversations on this and other servers"
 msgstr ""
 
-#: src/Core/L10n.php:414
-msgid "pinged"
+#: src/Content/Nav.php:231
+msgid "Directory"
 msgstr ""
 
-#: src/Core/L10n.php:415
-msgid "prod"
+#: src/Content/Nav.php:231
+msgid "People directory"
 msgstr ""
 
-#: src/Core/L10n.php:415
-msgid "prodded"
+#: src/Content/Nav.php:233 src/Module/BaseAdminModule.php:75
+msgid "Information"
 msgstr ""
 
-#: src/Core/L10n.php:416
-msgid "slap"
+#: src/Content/Nav.php:233
+msgid "Information about this friendica instance"
 msgstr ""
 
-#: src/Core/L10n.php:416
-msgid "slapped"
+#: src/Content/Nav.php:236 src/Module/Tos.php:73 src/Module/Admin/Tos.php:43
+#: src/Module/BaseAdminModule.php:85 src/Module/Register.php:144
+msgid "Terms of Service"
 msgstr ""
 
-#: src/Core/L10n.php:417
-msgid "finger"
+#: src/Content/Nav.php:236
+msgid "Terms of Service of this Friendica instance"
 msgstr ""
 
-#: src/Core/L10n.php:417
-msgid "fingered"
+#: src/Content/Nav.php:242
+msgid "Network Reset"
 msgstr ""
 
-#: src/Core/L10n.php:418
-msgid "rebuff"
+#: src/Content/Nav.php:242
+msgid "Load Network page with no filters"
 msgstr ""
 
-#: src/Core/L10n.php:418
-msgid "rebuffed"
+#: src/Content/Nav.php:248
+msgid "Friend Requests"
 msgstr ""
 
-#: src/Core/NotificationsManager.php:144
-msgid "System"
+#: src/Content/Nav.php:250
+msgid "See all notifications"
 msgstr ""
 
-#: src/Core/NotificationsManager.php:234 src/Core/NotificationsManager.php:246
-#, php-format
-msgid "%s commented on %s's post"
+#: src/Content/Nav.php:251
+msgid "Mark all system notifications seen"
 msgstr ""
 
-#: src/Core/NotificationsManager.php:245
-#, php-format
-msgid "%s created a new post"
+#: src/Content/Nav.php:255
+msgid "Inbox"
 msgstr ""
 
-#: src/Core/NotificationsManager.php:259
-#, php-format
-msgid "%s liked %s's post"
+#: src/Content/Nav.php:256
+msgid "Outbox"
 msgstr ""
 
-#: src/Core/NotificationsManager.php:272
-#, php-format
-msgid "%s disliked %s's post"
+#: src/Content/Nav.php:260
+msgid "Manage"
 msgstr ""
 
-#: src/Core/NotificationsManager.php:285
-#, php-format
-msgid "%s is attending %s's event"
+#: src/Content/Nav.php:260
+msgid "Manage other pages"
 msgstr ""
 
-#: src/Core/NotificationsManager.php:298
-#, php-format
-msgid "%s is not attending %s's event"
+#: src/Content/Nav.php:268
+msgid "Manage/Edit Profiles"
 msgstr ""
 
-#: src/Core/NotificationsManager.php:311
-#, php-format
-msgid "%s may attend %s's event"
+#: src/Content/Nav.php:276 src/Module/BaseAdminModule.php:114
+msgid "Admin"
 msgstr ""
 
-#: src/Core/NotificationsManager.php:344
-#, php-format
-msgid "%s is now friends with %s"
+#: src/Content/Nav.php:276
+msgid "Site setup and configuration"
 msgstr ""
 
-#: src/Core/NotificationsManager.php:622
-msgid "Friend Suggestion"
+#: src/Content/Nav.php:279
+msgid "Navigation"
 msgstr ""
 
-#: src/Core/NotificationsManager.php:656
-msgid "Friend/Connect Request"
+#: src/Content/Nav.php:279
+msgid "Site map"
 msgstr ""
 
-#: src/Core/NotificationsManager.php:656
-msgid "New Follower"
+#: src/Content/OEmbed.php:254
+msgid "Embedding disabled"
 msgstr ""
 
-#: src/Core/Session.php:194
-#, php-format
-msgid "Welcome %s"
+#: src/Content/OEmbed.php:377
+msgid "Embedded content"
 msgstr ""
 
-#: src/Core/Session.php:195
-msgid "Please upload a profile photo."
+#: src/Content/Widget.php:38
+msgid "Add New Contact"
 msgstr ""
 
-#: src/Core/Session.php:198
-#, php-format
-msgid "Welcome back %s"
+#: src/Content/Widget.php:39
+msgid "Enter address or web location"
 msgstr ""
 
-#: src/Core/Update.php:193
-#, php-format
-msgid "Update %s failed. See error logs."
+#: src/Content/Widget.php:40
+msgid "Example: bob@example.com, http://example.com/barbara"
 msgstr ""
 
-#: src/Core/Update.php:257
+#: src/Content/Widget.php:58
 #, 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 ""
+msgid "%d invitation available"
+msgid_plural "%d invitations available"
+msgstr[0] ""
+msgstr[1] ""
 
-#: src/Core/Update.php:263
-#, php-format
-msgid ""
-"The error message is\n"
-"[pre]%s[/pre]"
+#: src/Content/Widget.php:193 src/Module/Contact.php:798
+#: src/Module/Profile/Contacts.php:127
+msgid "Following"
 msgstr ""
 
-#: src/Core/Update.php:269 src/Core/Update.php:308
-msgid "[Friendica Notify] Database update"
+#: src/Content/Widget.php:194 src/Module/Contact.php:799
+#: src/Module/Profile/Contacts.php:128
+msgid "Mutual friends"
 msgstr ""
 
-#: src/Core/Update.php:300
-#, php-format
-msgid ""
-"\n"
-"\t\t\t\t\tThe friendica database was successfully updated from %s to %s."
+#: src/Content/Widget.php:199
+msgid "Relationships"
+msgstr ""
+
+#: src/Content/Widget.php:201 src/Module/Contact.php:694
+#: src/Module/Group.php:287
+msgid "All Contacts"
 msgstr ""
 
-#: src/Core/UserImport.php:106
-msgid "Error decoding account file"
+#: src/Content/Widget.php:244
+msgid "Protocols"
 msgstr ""
 
-#: src/Core/UserImport.php:112
-msgid "Error! No version data in file! This is not a Friendica account file?"
+#: src/Content/Widget.php:246
+msgid "All Protocols"
 msgstr ""
 
-#: src/Core/UserImport.php:120
-#, php-format
-msgid "User '%s' already exists on this server!"
+#: src/Content/Widget.php:279
+msgid "Saved Folders"
 msgstr ""
 
-#: src/Core/UserImport.php:156
-msgid "User creation error"
+#: src/Content/Widget.php:281 src/Content/Widget.php:320
+msgid "Everything"
 msgstr ""
 
-#: src/Core/UserImport.php:174
-msgid "User profile creation error"
+#: src/Content/Widget.php:318
+msgid "Categories"
 msgstr ""
 
-#: src/Core/UserImport.php:218
+#: src/Content/Widget.php:402
 #, php-format
-msgid "%d contact not imported"
-msgid_plural "%d contacts not imported"
+msgid "%d contact in common"
+msgid_plural "%d contacts in common"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/Core/UserImport.php:283
-msgid "Done. You can now login with your username and password"
-msgstr ""
-
-#: src/Database/DBStructure.php:47
+#: src/Database/DBStructure.php:50
 msgid "There are no tables on MyISAM."
 msgstr ""
 
-#: src/Database/DBStructure.php:71
+#: src/Database/DBStructure.php:74
 #, php-format
 msgid ""
 "\n"
@@ -5764,95 +6038,126 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: src/Database/DBStructure.php:74
+#: src/Database/DBStructure.php:77
 msgid "Errors encountered performing database changes: "
 msgstr ""
 
-#: src/Database/DBStructure.php:263
+#: src/Database/DBStructure.php:266
 #, php-format
 msgid "%s: Database update"
 msgstr ""
 
-#: src/Database/DBStructure.php:524
+#: src/Database/DBStructure.php:527
 #, php-format
 msgid "%s: updating %s table."
 msgstr ""
 
-#: src/LegacyModule.php:30
+#: src/Model/Storage/Filesystem.php:63
 #, php-format
-msgid "Legacy module file not found: %s"
+msgid ""
+"Filesystem storage failed to create \"%s\". Check you write permissions."
+msgstr ""
+
+#: src/Model/Storage/Filesystem.php:105
+#, php-format
+msgid ""
+"Filesystem storage failed to save data to \"%s\". Check your write "
+"permissions"
+msgstr ""
+
+#: src/Model/Storage/Filesystem.php:126
+msgid "Storage base path"
+msgstr ""
+
+#: 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/Contact.php:1116
+#: src/Model/Storage/Filesystem.php:138
+msgid "Enter a valid existing folder"
+msgstr ""
+
+#: src/Model/Storage/Database.php:36
+#, php-format
+msgid "Database storage failed to update %s"
+msgstr ""
+
+#: src/Model/Storage/Database.php:43
+msgid "Database storage failed to insert data"
+msgstr ""
+
+#: src/Model/Contact.php:1203
 msgid "Drop Contact"
 msgstr ""
 
-#: src/Model/Contact.php:1651
+#: src/Model/Contact.php:1705
 msgid "Organisation"
 msgstr ""
 
-#: src/Model/Contact.php:1655
+#: src/Model/Contact.php:1709
 msgid "News"
 msgstr ""
 
-#: src/Model/Contact.php:1659
+#: src/Model/Contact.php:1713
 msgid "Forum"
 msgstr ""
 
-#: src/Model/Contact.php:1888
+#: src/Model/Contact.php:2109
 msgid "Connect URL missing."
 msgstr ""
 
-#: src/Model/Contact.php:1897
+#: src/Model/Contact.php:2118
 msgid ""
 "The contact could not be added. Please check the relevant network "
 "credentials in your Settings -> Social Networks page."
 msgstr ""
 
-#: src/Model/Contact.php:1938
+#: src/Model/Contact.php:2159
 msgid ""
 "This site is not configured to allow communications with other networks."
 msgstr ""
 
-#: src/Model/Contact.php:1939 src/Model/Contact.php:1952
+#: src/Model/Contact.php:2160 src/Model/Contact.php:2173
 msgid "No compatible communication protocols or feeds were discovered."
 msgstr ""
 
-#: src/Model/Contact.php:1950
+#: src/Model/Contact.php:2171
 msgid "The profile address specified does not provide adequate information."
 msgstr ""
 
-#: src/Model/Contact.php:1955
+#: src/Model/Contact.php:2176
 msgid "An author or name was not found."
 msgstr ""
 
-#: src/Model/Contact.php:1958
+#: src/Model/Contact.php:2179
 msgid "No browser URL could be matched to this address."
 msgstr ""
 
-#: src/Model/Contact.php:1961
+#: src/Model/Contact.php:2182
 msgid ""
 "Unable to match @-style Identity Address with a known protocol or email "
 "contact."
 msgstr ""
 
-#: src/Model/Contact.php:1962
+#: src/Model/Contact.php:2183
 msgid "Use mailto: in front of address to force email check."
 msgstr ""
 
-#: src/Model/Contact.php:1968
+#: src/Model/Contact.php:2189
 msgid ""
 "The profile address specified belongs to a network which has been disabled "
 "on this site."
 msgstr ""
 
-#: src/Model/Contact.php:1973
+#: src/Model/Contact.php:2194
 msgid ""
 "Limited profile. This person will be unable to receive direct/personal "
 "notifications from you."
 msgstr ""
 
-#: src/Model/Contact.php:2027
+#: src/Model/Contact.php:2249
 msgid "Unable to retrieve contact information."
 msgstr ""
 
@@ -5875,10 +6180,6 @@ msgstr ""
 msgid "all-day"
 msgstr ""
 
-#: src/Model/Event.php:408
-msgid "Jun"
-msgstr ""
-
 #: src/Model/Event.php:411
 msgid "Sept"
 msgstr ""
@@ -5903,7 +6204,7 @@ msgstr ""
 msgid "Delete event"
 msgstr ""
 
-#: src/Model/Event.php:626 src/Model/Item.php:3523 src/Model/Item.php:3530
+#: src/Model/Event.php:626 src/Model/Item.php:3569 src/Model/Item.php:3576
 msgid "link to source"
 msgstr ""
 
@@ -5937,398 +6238,358 @@ msgstr ""
 msgid "Item filed"
 msgstr ""
 
-#: src/Model/Group.php:63
+#: src/Model/Group.php:77
 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 ""
 
-#: src/Model/Group.php:358
+#: src/Model/Group.php:407
 msgid "Default privacy group for new contacts"
 msgstr ""
 
-#: src/Model/Group.php:390
+#: src/Model/Group.php:439
 msgid "Everybody"
 msgstr ""
 
-#: src/Model/Group.php:410
+#: src/Model/Group.php:458
 msgid "edit"
 msgstr ""
 
-#: src/Model/Group.php:435 src/Module/Contact.php:728 src/Module/Welcome.php:57
+#: src/Model/Group.php:484 src/Module/Contact.php:734 src/Module/Welcome.php:57
 msgid "Groups"
 msgstr ""
 
-#: src/Model/Group.php:439
+#: src/Model/Group.php:488
 msgid "Edit group"
 msgstr ""
 
-#: src/Model/Group.php:440 src/Module/Group.php:186
+#: src/Model/Group.php:489 src/Module/Group.php:186
 msgid "Contacts not in any group"
 msgstr ""
 
-#: src/Model/Group.php:442
+#: src/Model/Group.php:491
 msgid "Create a new group"
 msgstr ""
 
-#: src/Model/Group.php:443 src/Module/Group.php:171 src/Module/Group.php:194
+#: src/Model/Group.php:492 src/Module/Group.php:171 src/Module/Group.php:194
 #: src/Module/Group.php:271
 msgid "Group Name: "
 msgstr ""
 
-#: src/Model/Group.php:444
+#: src/Model/Group.php:493
 msgid "Edit groups"
 msgstr ""
 
-#: src/Model/Item.php:3258
+#: src/Model/Item.php:3304
 msgid "activity"
 msgstr ""
 
-#: src/Model/Item.php:3260 src/Object/Post.php:472
+#: src/Model/Item.php:3306 src/Object/Post.php:473
 msgid "comment"
 msgid_plural "comments"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/Model/Item.php:3263
+#: src/Model/Item.php:3309
 msgid "post"
 msgstr ""
 
-#: src/Model/Item.php:3362
+#: src/Model/Item.php:3408
 #, php-format
 msgid "Content warning: %s"
 msgstr ""
 
-#: src/Model/Item.php:3439
+#: src/Model/Item.php:3485
 msgid "bytes"
 msgstr ""
 
-#: src/Model/Item.php:3517
+#: src/Model/Item.php:3563
 msgid "View on separate page"
 msgstr ""
 
-#: src/Model/Item.php:3518
+#: src/Model/Item.php:3564
 msgid "view on separate page"
 msgstr ""
 
-#: src/Model/Mail.php:109 src/Model/Mail.php:244
+#: src/Model/Mail.php:112 src/Model/Mail.php:247
 msgid "[no subject]"
 msgstr ""
 
-#: src/Model/Profile.php:177 src/Model/Profile.php:421
-#: src/Model/Profile.php:866
+#: src/Model/Profile.php:212 src/Model/Profile.php:428
+#: src/Model/Profile.php:877
 msgid "Edit profile"
 msgstr ""
 
-#: src/Model/Profile.php:355
-msgid "Atom feed"
-msgstr ""
-
-#: src/Model/Profile.php:394
+#: src/Model/Profile.php:402
 msgid "Manage/edit profiles"
 msgstr ""
 
-#: src/Model/Profile.php:443 src/Model/Profile.php:776
-#: src/Module/Directory.php:148
+#: src/Model/Profile.php:451 src/Model/Profile.php:787
+#: src/Module/Directory.php:143
 msgid "Status:"
 msgstr ""
 
-#: src/Model/Profile.php:444 src/Model/Profile.php:793
-#: src/Module/Directory.php:149
+#: src/Model/Profile.php:452 src/Model/Profile.php:804
+#: src/Module/Directory.php:144
 msgid "Homepage:"
 msgstr ""
 
-#: src/Model/Profile.php:446 src/Module/Contact.php:641
+#: src/Model/Profile.php:454 src/Module/Contact.php:647
 msgid "XMPP:"
 msgstr ""
 
-#: src/Model/Profile.php:569 src/Model/Profile.php:666
+#: src/Model/Profile.php:538 src/Module/Contact.php:337
+msgid "Unfollow"
+msgstr ""
+
+#: src/Model/Profile.php:540
+msgid "Atom feed"
+msgstr ""
+
+#: src/Model/Profile.php:580 src/Model/Profile.php:677
 msgid "g A l F d"
 msgstr ""
 
-#: src/Model/Profile.php:570
+#: src/Model/Profile.php:581
 msgid "F d"
 msgstr ""
 
-#: src/Model/Profile.php:632 src/Model/Profile.php:717
+#: src/Model/Profile.php:643 src/Model/Profile.php:728
 msgid "[today]"
 msgstr ""
 
-#: src/Model/Profile.php:642
+#: src/Model/Profile.php:653
 msgid "Birthday Reminders"
 msgstr ""
 
-#: src/Model/Profile.php:643
+#: src/Model/Profile.php:654
 msgid "Birthdays this week:"
 msgstr ""
 
-#: src/Model/Profile.php:704
+#: src/Model/Profile.php:715
 msgid "[No description]"
 msgstr ""
 
-#: src/Model/Profile.php:730
+#: src/Model/Profile.php:741
 msgid "Event Reminders"
 msgstr ""
 
-#: src/Model/Profile.php:731
+#: src/Model/Profile.php:742
 msgid "Upcoming events the next 7 days:"
 msgstr ""
 
-#: src/Model/Profile.php:748
+#: src/Model/Profile.php:759
 msgid "Member since:"
 msgstr ""
 
-#: src/Model/Profile.php:756
+#: src/Model/Profile.php:767
 msgid "j F, Y"
 msgstr ""
 
-#: src/Model/Profile.php:757
+#: src/Model/Profile.php:768
 msgid "j F"
 msgstr ""
 
-#: src/Model/Profile.php:765 src/Util/Temporal.php:147
-msgid "Birthday:"
-msgstr ""
-
-#: src/Model/Profile.php:772
+#: src/Model/Profile.php:783
 msgid "Age:"
 msgstr ""
 
-#: src/Model/Profile.php:785
+#: src/Model/Profile.php:796
 #, php-format
 msgid "for %1$d %2$s"
 msgstr ""
 
-#: src/Model/Profile.php:809
+#: src/Model/Profile.php:820
 msgid "Religion:"
 msgstr ""
 
-#: src/Model/Profile.php:817
+#: src/Model/Profile.php:828
 msgid "Hobbies/Interests:"
 msgstr ""
 
-#: src/Model/Profile.php:829
+#: src/Model/Profile.php:840
 msgid "Contact information and Social Networks:"
 msgstr ""
 
-#: src/Model/Profile.php:833
+#: src/Model/Profile.php:844
 msgid "Musical interests:"
 msgstr ""
 
-#: src/Model/Profile.php:837
+#: src/Model/Profile.php:848
 msgid "Books, literature:"
 msgstr ""
 
-#: src/Model/Profile.php:841
+#: src/Model/Profile.php:852
 msgid "Television:"
 msgstr ""
 
-#: src/Model/Profile.php:845
+#: src/Model/Profile.php:856
 msgid "Film/dance/culture/entertainment:"
 msgstr ""
 
-#: src/Model/Profile.php:849
+#: src/Model/Profile.php:860
 msgid "Love/Romance:"
 msgstr ""
 
-#: src/Model/Profile.php:853
+#: src/Model/Profile.php:864
 msgid "Work/employment:"
 msgstr ""
 
-#: src/Model/Profile.php:857
+#: src/Model/Profile.php:868
 msgid "School/education:"
 msgstr ""
 
-#: src/Model/Profile.php:862
+#: src/Model/Profile.php:873
 msgid "Forums:"
 msgstr ""
 
-#: src/Model/Profile.php:909 src/Module/Contact.php:869
+#: src/Model/Profile.php:920 src/Module/Contact.php:875
 msgid "Profile Details"
 msgstr ""
 
-#: src/Model/Profile.php:959
+#: src/Model/Profile.php:970
 msgid "Only You Can See This"
 msgstr ""
 
-#: src/Model/Profile.php:967 src/Model/Profile.php:970
+#: src/Model/Profile.php:978 src/Model/Profile.php:981
 msgid "Tips for New Members"
 msgstr ""
 
-#: src/Model/Profile.php:1170
+#: src/Model/Profile.php:1178
 #, php-format
 msgid "OpenWebAuth: %1$s welcomes %2$s"
 msgstr ""
 
-#: src/Model/Storage/Database.php:36
-#, php-format
-msgid "Database storage failed to update %s"
-msgstr ""
-
-#: src/Model/Storage/Database.php:43
-msgid "Database storage failed to insert data"
-msgstr ""
-
-#: src/Model/Storage/Filesystem.php:63
-#, php-format
-msgid ""
-"Filesystem storage failed to create \"%s\". Check you write permissions."
-msgstr ""
-
-#: src/Model/Storage/Filesystem.php:105
-#, php-format
-msgid ""
-"Filesystem storage failed to save data to \"%s\". Check your write "
-"permissions"
-msgstr ""
-
-#: src/Model/Storage/Filesystem.php:126
-msgid "Storage base path"
-msgstr ""
-
-#: 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/Storage/Filesystem.php:138
-msgid "Enter a valid existing folder"
-msgstr ""
-
-#: src/Model/User.php:298
+#: src/Model/User.php:331
 msgid "Login failed"
 msgstr ""
 
-#: src/Model/User.php:329
+#: src/Model/User.php:362
 msgid "Not enough information to authenticate"
 msgstr ""
 
-#: src/Model/User.php:407
+#: src/Model/User.php:440
 msgid "Password can't be empty"
 msgstr ""
 
-#: src/Model/User.php:426
+#: src/Model/User.php:459
 msgid "Empty passwords are not allowed."
 msgstr ""
 
-#: src/Model/User.php:430
+#: src/Model/User.php:463
 msgid ""
 "The new password has been exposed in a public data dump, please choose "
 "another."
 msgstr ""
 
-#: src/Model/User.php:436
+#: src/Model/User.php:469
 msgid ""
 "The password can't contain accentuated letters, white spaces or colons (:)"
 msgstr ""
 
-#: src/Model/User.php:536
+#: src/Model/User.php:569
 msgid "Passwords do not match. Password unchanged."
 msgstr ""
 
-#: src/Model/User.php:543
+#: src/Model/User.php:576
 msgid "An invitation is required."
 msgstr ""
 
-#: src/Model/User.php:547
+#: src/Model/User.php:580
 msgid "Invitation could not be verified."
 msgstr ""
 
-#: src/Model/User.php:554
+#: src/Model/User.php:587
 msgid "Invalid OpenID url"
 msgstr ""
 
-#: src/Model/User.php:567 src/Module/Login.php:107
+#: src/Model/User.php:600 src/Module/Login.php:102
 msgid ""
 "We encountered a problem while logging in with the OpenID you provided. "
 "Please check the correct spelling of the ID."
 msgstr ""
 
-#: src/Model/User.php:567 src/Module/Login.php:107
+#: src/Model/User.php:600 src/Module/Login.php:102
 msgid "The error message was:"
 msgstr ""
 
-#: src/Model/User.php:573
+#: src/Model/User.php:606
 msgid "Please enter the required information."
 msgstr ""
 
-#: src/Model/User.php:587
+#: src/Model/User.php:620
 #, php-format
 msgid ""
 "system.username_min_length (%s) and system.username_max_length (%s) are "
 "excluding each other, swapping values."
 msgstr ""
 
-#: src/Model/User.php:594
+#: src/Model/User.php:627
 #, php-format
 msgid "Username should be at least %s character."
 msgid_plural "Username should be at least %s characters."
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/Model/User.php:598
+#: src/Model/User.php:631
 #, php-format
 msgid "Username should be at most %s character."
 msgid_plural "Username should be at most %s characters."
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/Model/User.php:606
+#: src/Model/User.php:639
 msgid "That doesn't appear to be your full (First Last) name."
 msgstr ""
 
-#: src/Model/User.php:611
+#: src/Model/User.php:644
 msgid "Your email domain is not among those allowed on this site."
 msgstr ""
 
-#: src/Model/User.php:615
+#: src/Model/User.php:648
 msgid "Not a valid email address."
 msgstr ""
 
-#: src/Model/User.php:618
+#: src/Model/User.php:651
 msgid "The nickname was blocked from registration by the nodes admin."
 msgstr ""
 
-#: src/Model/User.php:622 src/Model/User.php:630
+#: src/Model/User.php:655 src/Model/User.php:663
 msgid "Cannot use that email."
 msgstr ""
 
-#: src/Model/User.php:637
+#: src/Model/User.php:670
 msgid "Your nickname can only contain a-z, 0-9 and _."
 msgstr ""
 
-#: src/Model/User.php:644 src/Model/User.php:701
+#: src/Model/User.php:677 src/Model/User.php:734
 msgid "Nickname is already registered. Please choose another."
 msgstr ""
 
-#: src/Model/User.php:654
+#: src/Model/User.php:687
 msgid "SERIOUS ERROR: Generation of security keys failed."
 msgstr ""
 
-#: src/Model/User.php:688 src/Model/User.php:692
+#: src/Model/User.php:721 src/Model/User.php:725
 msgid "An error occurred during registration. Please try again."
 msgstr ""
 
-#: src/Model/User.php:712 view/theme/duepuntozero/config.php:55
-msgid "default"
-msgstr ""
-
-#: src/Model/User.php:717
+#: src/Model/User.php:750
 msgid "An error occurred creating your default profile. Please try again."
 msgstr ""
 
-#: src/Model/User.php:724
+#: src/Model/User.php:757
 msgid "An error occurred creating your self contact. Please try again."
 msgstr ""
 
-#: src/Model/User.php:733
+#: src/Model/User.php:766
 msgid ""
 "An error occurred creating your default contact group. Please try again."
 msgstr ""
 
-#: src/Model/User.php:809
+#: src/Model/User.php:842
 #, php-format
 msgid ""
 "\n"
@@ -6344,12 +6605,12 @@ msgid ""
 "\t\t"
 msgstr ""
 
-#: src/Model/User.php:826
+#: src/Model/User.php:859
 #, php-format
 msgid "Registration at %s"
 msgstr ""
 
-#: src/Model/User.php:845
+#: src/Model/User.php:878
 #, php-format
 msgid ""
 "\n"
@@ -6358,7 +6619,7 @@ msgid ""
 "\t\t"
 msgstr ""
 
-#: src/Model/User.php:851
+#: src/Model/User.php:884
 #, php-format
 msgid ""
 "\n"
@@ -6397,11 +6658,110 @@ msgid ""
 "\t\t\tThank you and welcome to %2$s."
 msgstr ""
 
-#: src/Model/User.php:886 src/Module/Admin/Users.php:88
+#: src/Model/User.php:919 src/Module/Admin/Users.php:88
 #, php-format
 msgid "Registration details for %s"
 msgstr ""
 
+#: src/Protocol/Diaspora.php:2495
+msgid "Sharing notification from Diaspora network"
+msgstr ""
+
+#: src/Protocol/Diaspora.php:3640
+msgid "Attachments:"
+msgstr ""
+
+#: src/Protocol/OStatus.php:1300 src/Module/Profile.php:111
+#: src/Module/Profile.php:114
+#, php-format
+msgid "%s's timeline"
+msgstr ""
+
+#: src/Protocol/OStatus.php:1304 src/Module/Profile.php:112
+#, php-format
+msgid "%s's posts"
+msgstr ""
+
+#: src/Protocol/OStatus.php:1307 src/Module/Profile.php:113
+#, php-format
+msgid "%s's comments"
+msgstr ""
+
+#: src/Protocol/OStatus.php:1861
+#, php-format
+msgid "%s is now following %s."
+msgstr ""
+
+#: src/Protocol/OStatus.php:1862
+msgid "following"
+msgstr ""
+
+#: src/Protocol/OStatus.php:1865
+#, php-format
+msgid "%s stopped following %s."
+msgstr ""
+
+#: src/Protocol/OStatus.php:1866
+msgid "stopped following"
+msgstr ""
+
+#: src/Worker/Delivery.php:461
+msgid "(no subject)"
+msgstr ""
+
+#: 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/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/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/Tos.php:40 src/Module/Tos.php:76
+msgid "Privacy Statement"
+msgstr ""
+
+#: src/Module/Apps.php:29
+msgid "No installed applications."
+msgstr ""
+
+#: src/Module/Apps.php:34
+msgid "Applications"
+msgstr ""
+
+#: src/Module/Credits.php:25
+msgid "Credits"
+msgstr ""
+
+#: src/Module/Credits.php:26
+msgid ""
+"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!"
+msgstr ""
+
 #: src/Module/Admin/Addons/Details.php:51
 msgid "Addon not found."
 msgstr ""
@@ -6431,7 +6791,7 @@ msgstr ""
 #: src/Module/Admin/Blocklist/Server.php:73 src/Module/Admin/Federation.php:187
 #: src/Module/Admin/Item/Delete.php:46 src/Module/Admin/Logs/Settings.php:63
 #: src/Module/Admin/Logs/View.php:46 src/Module/Admin/Queue.php:56
-#: src/Module/Admin/Site.php:568 src/Module/Admin/Summary.php:177
+#: src/Module/Admin/Site.php:567 src/Module/Admin/Summary.php:175
 #: src/Module/Admin/Themes/Details.php:104 src/Module/Admin/Themes/Index.php:93
 #: src/Module/Admin/Tos.php:42 src/Module/Admin/Users.php:277
 msgid "Administration"
@@ -6469,6 +6829,17 @@ msgid ""
 "the open addon registry at %2$s"
 msgstr ""
 
+#: src/Module/Admin/Blocklist/Contact.php:28
+#: src/Console/GlobalCommunityBlock.php:87
+msgid "The contact has been blocked from the node"
+msgstr ""
+
+#: src/Module/Admin/Blocklist/Contact.php:30
+#: src/Console/GlobalCommunityBlock.php:82
+#, php-format
+msgid "Could not find any contact entry for this URL (%s)"
+msgstr ""
+
 #: src/Module/Admin/Blocklist/Contact.php:38
 #, php-format
 msgid "%s contact unblocked"
@@ -6499,8 +6870,8 @@ msgid "select none"
 msgstr ""
 
 #: src/Module/Admin/Blocklist/Contact.php:68 src/Module/Admin/Users.php:291
-#: src/Module/Contact.php:617 src/Module/Contact.php:821
-#: src/Module/Contact.php:1074
+#: src/Module/Contact.php:623 src/Module/Contact.php:827
+#: src/Module/Contact.php:1076
 msgid "Unblock"
 msgstr ""
 
@@ -6540,7 +6911,7 @@ msgid "Block Reason"
 msgstr ""
 
 #: src/Module/Admin/Blocklist/Server.php:31
-msgid "Server added to blocklist."
+msgid "Server domain pattern added to blocklist."
 msgstr ""
 
 #: src/Module/Admin/Blocklist/Server.php:47
@@ -6548,80 +6919,91 @@ msgid "Site blocklist updated."
 msgstr ""
 
 #: src/Module/Admin/Blocklist/Server.php:64
-msgid "The blocked domain"
+#: src/Module/Admin/Blocklist/Server.php:89
+msgid "Blocked server domain pattern"
 msgstr ""
 
 #: src/Module/Admin/Blocklist/Server.php:65
-#: src/Module/Admin/Blocklist/Server.php:84 src/Module/Friendica.php:60
+#: src/Module/Admin/Blocklist/Server.php:90 src/Module/Friendica.php:60
 msgid "Reason for the block"
 msgstr ""
 
-#: src/Module/Admin/Blocklist/Server.php:65
-#: src/Module/Admin/Blocklist/Server.php:79
-msgid "The reason why you blocked this domain."
-msgstr ""
-
 #: src/Module/Admin/Blocklist/Server.php:66
-msgid "Delete domain"
+msgid "Delete server domain pattern"
 msgstr ""
 
 #: src/Module/Admin/Blocklist/Server.php:66
 msgid "Check to delete this entry from the blocklist"
 msgstr ""
 
-#: src/Module/Admin/Blocklist/Server.php:74 src/Module/BaseAdminModule.php:94
-msgid "Server Blocklist"
+#: src/Module/Admin/Blocklist/Server.php:74
+msgid "Server Domain Pattern Blocklist"
 msgstr ""
 
 #: src/Module/Admin/Blocklist/Server.php:75
 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 "
-"domains you should also give a reason why you have blocked the remote server."
+"This page can be used to define a blacklist of server domain patterns from "
+"the federated network that are not allowed to interact with your node. For "
+"each domain pattern you should also provide the reason why you block it."
 msgstr ""
 
 #: src/Module/Admin/Blocklist/Server.php:76
 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."
+"The list of blocked server domain patterns will be made publically available "
+"on the <a href=\"/friendica\">/friendica</a> page so that your users and "
+"people investigating communication problems can find the reason easily."
 msgstr ""
 
 #: src/Module/Admin/Blocklist/Server.php:77
+msgid ""
+"<p>The server domain pattern syntax is case-insensitive shell wildcard, "
+"comprising the following special characters:</p>\n"
+"<ul>\n"
+"\t<li><code>*</code>: Any number of characters</li>\n"
+"\t<li><code>?</code>: Any single character</li>\n"
+"\t<li><code>[&lt;char1&gt;&lt;char2&gt;...]</code>: char1 or char2</li>\n"
+"</ul>"
+msgstr ""
+
+#: src/Module/Admin/Blocklist/Server.php:83
 msgid "Add new entry to block list"
 msgstr ""
 
-#: src/Module/Admin/Blocklist/Server.php:78
-msgid "Server Domain"
+#: src/Module/Admin/Blocklist/Server.php:84
+msgid "Server Domain Pattern"
 msgstr ""
 
-#: src/Module/Admin/Blocklist/Server.php:78
+#: src/Module/Admin/Blocklist/Server.php:84
 msgid ""
-"The domain of the new server to add to the block list. Do not include the "
-"protocol."
+"The domain pattern of the new server to add to the block list. Do not "
+"include the protocol."
 msgstr ""
 
-#: src/Module/Admin/Blocklist/Server.php:79
+#: src/Module/Admin/Blocklist/Server.php:85
 msgid "Block reason"
 msgstr ""
 
-#: src/Module/Admin/Blocklist/Server.php:80
+#: src/Module/Admin/Blocklist/Server.php:85
+msgid "The reason why you blocked this server domain pattern."
+msgstr ""
+
+#: src/Module/Admin/Blocklist/Server.php:86
 msgid "Add Entry"
 msgstr ""
 
-#: src/Module/Admin/Blocklist/Server.php:81
+#: src/Module/Admin/Blocklist/Server.php:87
 msgid "Save changes to the blocklist"
 msgstr ""
 
-#: src/Module/Admin/Blocklist/Server.php:82
+#: src/Module/Admin/Blocklist/Server.php:88
 msgid "Current Entries in the Blocklist"
 msgstr ""
 
-#: src/Module/Admin/Blocklist/Server.php:85
+#: src/Module/Admin/Blocklist/Server.php:91
 msgid "Delete entry from blocklist"
 msgstr ""
 
-#: src/Module/Admin/Blocklist/Server.php:88
+#: src/Module/Admin/Blocklist/Server.php:94
 msgid "Delete entry from blocklist?"
 msgstr ""
 
@@ -6870,7 +7252,7 @@ msgstr ""
 msgid "Priority"
 msgstr ""
 
-#: src/Module/Admin/Site.php:49
+#: src/Module/Admin/Site.php:50
 msgid "Can not parse base url. Must have at least <scheme>://<domain>"
 msgstr ""
 
@@ -6878,260 +7260,260 @@ msgstr ""
 msgid "Invalid storage backend setting value."
 msgstr ""
 
-#: src/Module/Admin/Site.php:412
+#: src/Module/Admin/Site.php:411
 msgid "Site settings updated."
 msgstr ""
 
-#: src/Module/Admin/Site.php:464
+#: src/Module/Admin/Site.php:463
 msgid "No community page for local users"
 msgstr ""
 
-#: src/Module/Admin/Site.php:465
+#: src/Module/Admin/Site.php:464
 msgid "No community page"
 msgstr ""
 
-#: src/Module/Admin/Site.php:466
+#: src/Module/Admin/Site.php:465
 msgid "Public postings from users of this site"
 msgstr ""
 
-#: src/Module/Admin/Site.php:467
+#: src/Module/Admin/Site.php:466
 msgid "Public postings from the federated network"
 msgstr ""
 
-#: src/Module/Admin/Site.php:468
+#: src/Module/Admin/Site.php:467
 msgid "Public postings from local users and the federated network"
 msgstr ""
 
-#: src/Module/Admin/Site.php:472 src/Module/Admin/Site.php:668
-#: src/Module/Admin/Site.php:678 src/Module/Contact.php:542
-#: src/Module/Settings/TwoFactor/Index.php:91
+#: src/Module/Admin/Site.php:471 src/Module/Admin/Site.php:666
+#: src/Module/Admin/Site.php:676 src/Module/Contact.php:563
+#: src/Module/Settings/TwoFactor/Index.php:97
 msgid "Disabled"
 msgstr ""
 
-#: src/Module/Admin/Site.php:473 src/Module/Admin/Users.php:278
+#: src/Module/Admin/Site.php:472 src/Module/Admin/Users.php:278
 #: src/Module/Admin/Users.php:295 src/Module/BaseAdminModule.php:81
 msgid "Users"
 msgstr ""
 
-#: src/Module/Admin/Site.php:474
+#: src/Module/Admin/Site.php:473
 msgid "Users, Global Contacts"
 msgstr ""
 
-#: src/Module/Admin/Site.php:475
+#: src/Module/Admin/Site.php:474
 msgid "Users, Global Contacts/fallback"
 msgstr ""
 
-#: src/Module/Admin/Site.php:479
+#: src/Module/Admin/Site.php:478
 msgid "One month"
 msgstr ""
 
-#: src/Module/Admin/Site.php:480
+#: src/Module/Admin/Site.php:479
 msgid "Three months"
 msgstr ""
 
-#: src/Module/Admin/Site.php:481
+#: src/Module/Admin/Site.php:480
 msgid "Half a year"
 msgstr ""
 
-#: src/Module/Admin/Site.php:482
+#: src/Module/Admin/Site.php:481
 msgid "One year"
 msgstr ""
 
-#: src/Module/Admin/Site.php:488
+#: src/Module/Admin/Site.php:487
 msgid "Multi user instance"
 msgstr ""
 
-#: src/Module/Admin/Site.php:510
+#: src/Module/Admin/Site.php:509
 msgid "Closed"
 msgstr ""
 
-#: src/Module/Admin/Site.php:511
+#: src/Module/Admin/Site.php:510
 msgid "Requires approval"
 msgstr ""
 
-#: src/Module/Admin/Site.php:512
+#: src/Module/Admin/Site.php:511
 msgid "Open"
 msgstr ""
 
-#: src/Module/Admin/Site.php:516 src/Module/Install.php:181
+#: src/Module/Admin/Site.php:515 src/Module/Install.php:183
 msgid "No SSL policy, links will track page SSL state"
 msgstr ""
 
-#: src/Module/Admin/Site.php:517 src/Module/Install.php:182
+#: src/Module/Admin/Site.php:516 src/Module/Install.php:184
 msgid "Force all links to use SSL"
 msgstr ""
 
-#: src/Module/Admin/Site.php:518 src/Module/Install.php:183
+#: src/Module/Admin/Site.php:517 src/Module/Install.php:185
 msgid "Self-signed certificate, use SSL for local links only (discouraged)"
 msgstr ""
 
-#: src/Module/Admin/Site.php:522
+#: src/Module/Admin/Site.php:521
 msgid "Don't check"
 msgstr ""
 
-#: src/Module/Admin/Site.php:523
+#: src/Module/Admin/Site.php:522
 msgid "check the stable version"
 msgstr ""
 
-#: src/Module/Admin/Site.php:524
+#: src/Module/Admin/Site.php:523
 msgid "check the development version"
 msgstr ""
 
-#: src/Module/Admin/Site.php:544
+#: src/Module/Admin/Site.php:543
 msgid "Database (legacy)"
 msgstr ""
 
-#: src/Module/Admin/Site.php:569 src/Module/BaseAdminModule.php:80
+#: src/Module/Admin/Site.php:568 src/Module/BaseAdminModule.php:80
 msgid "Site"
 msgstr ""
 
-#: src/Module/Admin/Site.php:571
+#: src/Module/Admin/Site.php:570
 msgid "Republish users to directory"
 msgstr ""
 
-#: src/Module/Admin/Site.php:572 src/Module/Register.php:121
+#: src/Module/Admin/Site.php:571 src/Module/Register.php:121
 msgid "Registration"
 msgstr ""
 
-#: src/Module/Admin/Site.php:573
+#: src/Module/Admin/Site.php:572
 msgid "File upload"
 msgstr ""
 
-#: src/Module/Admin/Site.php:574
+#: src/Module/Admin/Site.php:573
 msgid "Policies"
 msgstr ""
 
-#: src/Module/Admin/Site.php:576
+#: src/Module/Admin/Site.php:575
 msgid "Auto Discovered Contact Directory"
 msgstr ""
 
-#: src/Module/Admin/Site.php:577
+#: src/Module/Admin/Site.php:576
 msgid "Performance"
 msgstr ""
 
-#: src/Module/Admin/Site.php:578
+#: src/Module/Admin/Site.php:577
 msgid "Worker"
 msgstr ""
 
-#: src/Module/Admin/Site.php:579
+#: src/Module/Admin/Site.php:578
 msgid "Message Relay"
 msgstr ""
 
-#: src/Module/Admin/Site.php:580
+#: src/Module/Admin/Site.php:579
 msgid "Relocate Instance"
 msgstr ""
 
-#: src/Module/Admin/Site.php:581
+#: src/Module/Admin/Site.php:580
 msgid "Warning! Advanced function. Could make this server unreachable."
 msgstr ""
 
-#: src/Module/Admin/Site.php:585
+#: src/Module/Admin/Site.php:584
 msgid "Site name"
 msgstr ""
 
-#: src/Module/Admin/Site.php:586
+#: src/Module/Admin/Site.php:585
 msgid "Sender Email"
 msgstr ""
 
-#: src/Module/Admin/Site.php:586
+#: src/Module/Admin/Site.php:585
 msgid ""
 "The email address your server shall use to send notification emails from."
 msgstr ""
 
-#: src/Module/Admin/Site.php:587
+#: src/Module/Admin/Site.php:586
 msgid "Banner/Logo"
 msgstr ""
 
-#: src/Module/Admin/Site.php:588
+#: src/Module/Admin/Site.php:587
 msgid "Shortcut icon"
 msgstr ""
 
-#: src/Module/Admin/Site.php:588
+#: src/Module/Admin/Site.php:587
 msgid "Link to an icon that will be used for browsers."
 msgstr ""
 
-#: src/Module/Admin/Site.php:589
+#: src/Module/Admin/Site.php:588
 msgid "Touch icon"
 msgstr ""
 
-#: src/Module/Admin/Site.php:589
+#: src/Module/Admin/Site.php:588
 msgid "Link to an icon that will be used for tablets and mobiles."
 msgstr ""
 
-#: src/Module/Admin/Site.php:590
+#: src/Module/Admin/Site.php:589
 msgid "Additional Info"
 msgstr ""
 
-#: src/Module/Admin/Site.php:590
+#: src/Module/Admin/Site.php:589
 #, php-format
 msgid ""
 "For public servers: you can add additional information here that will be "
 "listed at %s/servers."
 msgstr ""
 
-#: src/Module/Admin/Site.php:591
+#: src/Module/Admin/Site.php:590
 msgid "System language"
 msgstr ""
 
-#: src/Module/Admin/Site.php:592
+#: src/Module/Admin/Site.php:591
 msgid "System theme"
 msgstr ""
 
-#: src/Module/Admin/Site.php:592
+#: src/Module/Admin/Site.php:591
 msgid ""
 "Default system theme - may be over-ridden by user profiles - <a href=\"/"
 "admin/themes\" id=\"cnftheme\">Change default theme settings</a>"
 msgstr ""
 
-#: src/Module/Admin/Site.php:593
+#: src/Module/Admin/Site.php:592
 msgid "Mobile system theme"
 msgstr ""
 
-#: src/Module/Admin/Site.php:593
+#: src/Module/Admin/Site.php:592
 msgid "Theme for mobile devices"
 msgstr ""
 
-#: src/Module/Admin/Site.php:594 src/Module/Install.php:191
+#: src/Module/Admin/Site.php:593 src/Module/Install.php:193
 msgid "SSL link policy"
 msgstr ""
 
-#: src/Module/Admin/Site.php:594 src/Module/Install.php:193
+#: src/Module/Admin/Site.php:593 src/Module/Install.php:195
 msgid "Determines whether generated links should be forced to use SSL"
 msgstr ""
 
-#: src/Module/Admin/Site.php:595
+#: src/Module/Admin/Site.php:594
 msgid "Force SSL"
 msgstr ""
 
-#: src/Module/Admin/Site.php:595
+#: src/Module/Admin/Site.php:594
 msgid ""
 "Force all Non-SSL requests to SSL - Attention: on some systems it could lead "
 "to endless loops."
 msgstr ""
 
-#: src/Module/Admin/Site.php:596
+#: src/Module/Admin/Site.php:595
 msgid "Hide help entry from navigation menu"
 msgstr ""
 
-#: src/Module/Admin/Site.php:596
+#: src/Module/Admin/Site.php:595
 msgid ""
 "Hides the menu entry for the Help pages from the navigation menu. You can "
 "still access it calling /help directly."
 msgstr ""
 
-#: src/Module/Admin/Site.php:597
+#: src/Module/Admin/Site.php:596
 msgid "Single user instance"
 msgstr ""
 
-#: src/Module/Admin/Site.php:597
+#: src/Module/Admin/Site.php:596
 msgid "Make this instance multi-user or single-user for the named user"
 msgstr ""
 
-#: src/Module/Admin/Site.php:599
+#: src/Module/Admin/Site.php:598
 msgid "File storage backend"
 msgstr ""
 
-#: src/Module/Admin/Site.php:599
+#: src/Module/Admin/Site.php:598
 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 "
@@ -7140,201 +7522,201 @@ msgid ""
 "for more information about the choices and the moving procedure."
 msgstr ""
 
-#: src/Module/Admin/Site.php:601
+#: src/Module/Admin/Site.php:600
 msgid "Maximum image size"
 msgstr ""
 
-#: src/Module/Admin/Site.php:601
+#: src/Module/Admin/Site.php:600
 msgid ""
 "Maximum size in bytes of uploaded images. Default is 0, which means no "
 "limits."
 msgstr ""
 
-#: src/Module/Admin/Site.php:602
+#: src/Module/Admin/Site.php:601
 msgid "Maximum image length"
 msgstr ""
 
-#: src/Module/Admin/Site.php:602
+#: src/Module/Admin/Site.php:601
 msgid ""
 "Maximum length in pixels of the longest side of uploaded images. Default is "
 "-1, which means no limits."
 msgstr ""
 
-#: src/Module/Admin/Site.php:603
+#: src/Module/Admin/Site.php:602
 msgid "JPEG image quality"
 msgstr ""
 
-#: src/Module/Admin/Site.php:603
+#: src/Module/Admin/Site.php:602
 msgid ""
 "Uploaded JPEGS will be saved at this quality setting [0-100]. Default is "
 "100, which is full quality."
 msgstr ""
 
-#: src/Module/Admin/Site.php:605
+#: src/Module/Admin/Site.php:604
 msgid "Register policy"
 msgstr ""
 
-#: src/Module/Admin/Site.php:606
+#: src/Module/Admin/Site.php:605
 msgid "Maximum Daily Registrations"
 msgstr ""
 
-#: src/Module/Admin/Site.php:606
+#: src/Module/Admin/Site.php:605
 msgid ""
 "If registration is permitted above, this sets the maximum number of new user "
 "registrations to accept per day.  If register is set to closed, this setting "
 "has no effect."
 msgstr ""
 
-#: src/Module/Admin/Site.php:607
+#: src/Module/Admin/Site.php:606
 msgid "Register text"
 msgstr ""
 
-#: src/Module/Admin/Site.php:607
+#: src/Module/Admin/Site.php:606
 msgid ""
 "Will be displayed prominently on the registration page. You can use BBCode "
 "here."
 msgstr ""
 
-#: src/Module/Admin/Site.php:608
+#: src/Module/Admin/Site.php:607
 msgid "Forbidden Nicknames"
 msgstr ""
 
-#: src/Module/Admin/Site.php:608
+#: src/Module/Admin/Site.php:607
 msgid ""
 "Comma separated list of nicknames that are forbidden from registration. "
 "Preset is a list of role names according RFC 2142."
 msgstr ""
 
-#: src/Module/Admin/Site.php:609
+#: src/Module/Admin/Site.php:608
 msgid "Accounts abandoned after x days"
 msgstr ""
 
-#: src/Module/Admin/Site.php:609
+#: src/Module/Admin/Site.php:608
 msgid ""
 "Will not waste system resources polling external sites for abandonded "
 "accounts. Enter 0 for no time limit."
 msgstr ""
 
-#: src/Module/Admin/Site.php:610
+#: src/Module/Admin/Site.php:609
 msgid "Allowed friend domains"
 msgstr ""
 
-#: src/Module/Admin/Site.php:610
+#: src/Module/Admin/Site.php:609
 msgid ""
 "Comma separated list of domains which are allowed to establish friendships "
 "with this site. Wildcards are accepted. Empty to allow any domains"
 msgstr ""
 
-#: src/Module/Admin/Site.php:611
+#: src/Module/Admin/Site.php:610
 msgid "Allowed email domains"
 msgstr ""
 
-#: src/Module/Admin/Site.php:611
+#: src/Module/Admin/Site.php:610
 msgid ""
 "Comma separated list of domains which are allowed in email addresses for "
 "registrations to this site. Wildcards are accepted. Empty to allow any "
 "domains"
 msgstr ""
 
-#: src/Module/Admin/Site.php:612
+#: src/Module/Admin/Site.php:611
 msgid "No OEmbed rich content"
 msgstr ""
 
-#: src/Module/Admin/Site.php:612
+#: src/Module/Admin/Site.php:611
 msgid ""
 "Don't show the rich content (e.g. embedded PDF), except from the domains "
 "listed below."
 msgstr ""
 
-#: src/Module/Admin/Site.php:613
+#: src/Module/Admin/Site.php:612
 msgid "Allowed OEmbed domains"
 msgstr ""
 
-#: src/Module/Admin/Site.php:613
+#: src/Module/Admin/Site.php:612
 msgid ""
 "Comma separated list of domains which oembed content is allowed to be "
 "displayed. Wildcards are accepted."
 msgstr ""
 
-#: src/Module/Admin/Site.php:614
+#: src/Module/Admin/Site.php:613
 msgid "Block public"
 msgstr ""
 
-#: src/Module/Admin/Site.php:614
+#: src/Module/Admin/Site.php:613
 msgid ""
 "Check to block public access to all otherwise public personal pages on this "
 "site unless you are currently logged in."
 msgstr ""
 
-#: src/Module/Admin/Site.php:615
+#: src/Module/Admin/Site.php:614
 msgid "Force publish"
 msgstr ""
 
-#: src/Module/Admin/Site.php:615
+#: src/Module/Admin/Site.php:614
 msgid ""
 "Check to force all profiles on this site to be listed in the site directory."
 msgstr ""
 
-#: src/Module/Admin/Site.php:615
+#: src/Module/Admin/Site.php:614
 msgid "Enabling this may violate privacy laws like the GDPR"
 msgstr ""
 
-#: src/Module/Admin/Site.php:616
+#: src/Module/Admin/Site.php:615
 msgid "Global directory URL"
 msgstr ""
 
-#: src/Module/Admin/Site.php:616
+#: src/Module/Admin/Site.php:615
 msgid ""
 "URL to the global directory. If this is not set, the global directory is "
 "completely unavailable to the application."
 msgstr ""
 
-#: src/Module/Admin/Site.php:617
+#: src/Module/Admin/Site.php:616
 msgid "Private posts by default for new users"
 msgstr ""
 
-#: src/Module/Admin/Site.php:617
+#: src/Module/Admin/Site.php:616
 msgid ""
 "Set default post permissions for all new members to the default privacy "
 "group rather than public."
 msgstr ""
 
-#: src/Module/Admin/Site.php:618
+#: src/Module/Admin/Site.php:617
 msgid "Don't include post content in email notifications"
 msgstr ""
 
-#: src/Module/Admin/Site.php:618
+#: src/Module/Admin/Site.php:617
 msgid ""
 "Don't include the content of a post/comment/private message/etc. in the "
 "email notifications that are sent out from this site, as a privacy measure."
 msgstr ""
 
-#: src/Module/Admin/Site.php:619
+#: src/Module/Admin/Site.php:618
 msgid "Disallow public access to addons listed in the apps menu."
 msgstr ""
 
-#: src/Module/Admin/Site.php:619
+#: src/Module/Admin/Site.php:618
 msgid ""
 "Checking this box will restrict addons listed in the apps menu to members "
 "only."
 msgstr ""
 
-#: src/Module/Admin/Site.php:620
+#: src/Module/Admin/Site.php:619
 msgid "Don't embed private images in posts"
 msgstr ""
 
-#: src/Module/Admin/Site.php:620
+#: src/Module/Admin/Site.php:619
 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 "
 "photos will have to authenticate and load each image, which may take a while."
 msgstr ""
 
-#: src/Module/Admin/Site.php:621
+#: src/Module/Admin/Site.php:620
 msgid "Explicit Content"
 msgstr ""
 
-#: src/Module/Admin/Site.php:621
+#: src/Module/Admin/Site.php:620
 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 "
@@ -7343,211 +7725,200 @@ msgid ""
 "will be shown at the user registration page."
 msgstr ""
 
-#: src/Module/Admin/Site.php:622
+#: src/Module/Admin/Site.php:621
 msgid "Allow Users to set remote_self"
 msgstr ""
 
-#: src/Module/Admin/Site.php:622
+#: src/Module/Admin/Site.php:621
 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 ""
 
-#: src/Module/Admin/Site.php:623
+#: src/Module/Admin/Site.php:622
 msgid "Block multiple registrations"
 msgstr ""
 
-#: src/Module/Admin/Site.php:623
+#: src/Module/Admin/Site.php:622
 msgid "Disallow users to register additional accounts for use as pages."
 msgstr ""
 
-#: src/Module/Admin/Site.php:624
+#: src/Module/Admin/Site.php:623
 msgid "Disable OpenID"
 msgstr ""
 
-#: src/Module/Admin/Site.php:624
+#: src/Module/Admin/Site.php:623
 msgid "Disable OpenID support for registration and logins."
 msgstr ""
 
-#: src/Module/Admin/Site.php:625
+#: src/Module/Admin/Site.php:624
 msgid "No Fullname check"
 msgstr ""
 
-#: src/Module/Admin/Site.php:625
+#: src/Module/Admin/Site.php:624
 msgid ""
 "Allow users to register without a space between the first name and the last "
 "name in their full name."
 msgstr ""
 
-#: src/Module/Admin/Site.php:626
+#: src/Module/Admin/Site.php:625
 msgid "Community pages for visitors"
 msgstr ""
 
-#: src/Module/Admin/Site.php:626
+#: src/Module/Admin/Site.php:625
 msgid ""
 "Which community pages should be available for visitors. Local users always "
 "see both pages."
 msgstr ""
 
-#: src/Module/Admin/Site.php:627
+#: src/Module/Admin/Site.php:626
 msgid "Posts per user on community page"
 msgstr ""
 
-#: src/Module/Admin/Site.php:627
+#: src/Module/Admin/Site.php:626
 msgid ""
 "The maximum number of posts per user on the community page. (Not valid for "
 "\"Global Community\")"
 msgstr ""
 
-#: src/Module/Admin/Site.php:628
+#: src/Module/Admin/Site.php:627
 msgid "Disable OStatus support"
 msgstr ""
 
-#: src/Module/Admin/Site.php:628
+#: src/Module/Admin/Site.php:627
 msgid ""
 "Disable built-in OStatus (StatusNet, GNU Social etc.) compatibility. All "
 "communications in OStatus are public, so privacy warnings will be "
 "occasionally displayed."
 msgstr ""
 
-#: src/Module/Admin/Site.php:629
-msgid "Only import OStatus/ActivityPub threads from our contacts"
-msgstr ""
-
-#: src/Module/Admin/Site.php:629
-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 ""
-
-#: src/Module/Admin/Site.php:630
+#: src/Module/Admin/Site.php:628
 msgid "OStatus support can only be enabled if threading is enabled."
 msgstr ""
 
-#: src/Module/Admin/Site.php:632
+#: src/Module/Admin/Site.php:630
 msgid ""
 "Diaspora support can't be enabled because Friendica was installed into a sub "
 "directory."
 msgstr ""
 
-#: src/Module/Admin/Site.php:633
+#: src/Module/Admin/Site.php:631
 msgid "Enable Diaspora support"
 msgstr ""
 
-#: src/Module/Admin/Site.php:633
+#: src/Module/Admin/Site.php:631
 msgid "Provide built-in Diaspora network compatibility."
 msgstr ""
 
-#: src/Module/Admin/Site.php:634
+#: src/Module/Admin/Site.php:632
 msgid "Only allow Friendica contacts"
 msgstr ""
 
-#: src/Module/Admin/Site.php:634
+#: src/Module/Admin/Site.php:632
 msgid ""
 "All contacts must use Friendica protocols. All other built-in communication "
 "protocols disabled."
 msgstr ""
 
-#: src/Module/Admin/Site.php:635
+#: src/Module/Admin/Site.php:633
 msgid "Verify SSL"
 msgstr ""
 
-#: src/Module/Admin/Site.php:635
+#: src/Module/Admin/Site.php:633
 msgid ""
 "If you wish, you can turn on strict certificate checking. This will mean you "
 "cannot connect (at all) to self-signed SSL sites."
 msgstr ""
 
-#: src/Module/Admin/Site.php:636
+#: src/Module/Admin/Site.php:634
 msgid "Proxy user"
 msgstr ""
 
-#: src/Module/Admin/Site.php:637
+#: src/Module/Admin/Site.php:635
 msgid "Proxy URL"
 msgstr ""
 
-#: src/Module/Admin/Site.php:638
+#: src/Module/Admin/Site.php:636
 msgid "Network timeout"
 msgstr ""
 
-#: src/Module/Admin/Site.php:638
+#: src/Module/Admin/Site.php:636
 msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
 msgstr ""
 
-#: src/Module/Admin/Site.php:639
+#: src/Module/Admin/Site.php:637
 msgid "Maximum Load Average"
 msgstr ""
 
-#: src/Module/Admin/Site.php:639
+#: src/Module/Admin/Site.php:637
 #, php-format
 msgid ""
 "Maximum system load before delivery and poll processes are deferred - "
 "default %d."
 msgstr ""
 
-#: src/Module/Admin/Site.php:640
+#: src/Module/Admin/Site.php:638
 msgid "Maximum Load Average (Frontend)"
 msgstr ""
 
-#: src/Module/Admin/Site.php:640
+#: src/Module/Admin/Site.php:638
 msgid "Maximum system load before the frontend quits service - default 50."
 msgstr ""
 
-#: src/Module/Admin/Site.php:641
+#: src/Module/Admin/Site.php:639
 msgid "Minimal Memory"
 msgstr ""
 
-#: src/Module/Admin/Site.php:641
+#: src/Module/Admin/Site.php:639
 msgid ""
 "Minimal free memory in MB for the worker. Needs access to /proc/meminfo - "
 "default 0 (deactivated)."
 msgstr ""
 
-#: src/Module/Admin/Site.php:642
+#: src/Module/Admin/Site.php:640
 msgid "Maximum table size for optimization"
 msgstr ""
 
-#: src/Module/Admin/Site.php:642
+#: src/Module/Admin/Site.php:640
 msgid ""
 "Maximum table size (in MB) for the automatic optimization. Enter -1 to "
 "disable it."
 msgstr ""
 
-#: src/Module/Admin/Site.php:643
+#: src/Module/Admin/Site.php:641
 msgid "Minimum level of fragmentation"
 msgstr ""
 
-#: src/Module/Admin/Site.php:643
+#: src/Module/Admin/Site.php:641
 msgid ""
 "Minimum fragmenation level to start the automatic optimization - default "
 "value is 30%."
 msgstr ""
 
-#: src/Module/Admin/Site.php:645
+#: src/Module/Admin/Site.php:643
 msgid "Periodical check of global contacts"
 msgstr ""
 
-#: src/Module/Admin/Site.php:645
+#: src/Module/Admin/Site.php:643
 msgid ""
 "If enabled, the global contacts are checked periodically for missing or "
 "outdated data and the vitality of the contacts and servers."
 msgstr ""
 
-#: src/Module/Admin/Site.php:646
+#: src/Module/Admin/Site.php:644
 msgid "Days between requery"
 msgstr ""
 
-#: src/Module/Admin/Site.php:646
+#: src/Module/Admin/Site.php:644
 msgid "Number of days after which a server is requeried for his contacts."
 msgstr ""
 
-#: src/Module/Admin/Site.php:647
+#: src/Module/Admin/Site.php:645
 msgid "Discover contacts from other servers"
 msgstr ""
 
-#: src/Module/Admin/Site.php:647
+#: src/Module/Admin/Site.php:645
 msgid ""
 "Periodically query other servers for contacts. You can choose between \"Users"
 "\": the users on the remote system, \"Global Contacts\": active contacts "
@@ -7557,32 +7928,32 @@ msgid ""
 "Global Contacts\"."
 msgstr ""
 
-#: src/Module/Admin/Site.php:648
+#: src/Module/Admin/Site.php:646
 msgid "Timeframe for fetching global contacts"
 msgstr ""
 
-#: src/Module/Admin/Site.php:648
+#: src/Module/Admin/Site.php:646
 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 ""
 
-#: src/Module/Admin/Site.php:649
+#: src/Module/Admin/Site.php:647
 msgid "Search the local directory"
 msgstr ""
 
-#: src/Module/Admin/Site.php:649
+#: src/Module/Admin/Site.php:647
 msgid ""
 "Search the local directory instead of the global directory. When searching "
 "locally, every search will be executed on the global directory in the "
 "background. This improves the search results when the search is repeated."
 msgstr ""
 
-#: src/Module/Admin/Site.php:651
+#: src/Module/Admin/Site.php:649
 msgid "Publish server information"
 msgstr ""
 
-#: src/Module/Admin/Site.php:651
+#: src/Module/Admin/Site.php:649
 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 "
@@ -7590,50 +7961,50 @@ msgid ""
 "href=\"http://the-federation.info/\">the-federation.info</a> for details."
 msgstr ""
 
-#: src/Module/Admin/Site.php:653
+#: src/Module/Admin/Site.php:651
 msgid "Check upstream version"
 msgstr ""
 
-#: src/Module/Admin/Site.php:653
+#: src/Module/Admin/Site.php:651
 msgid ""
 "Enables checking for new Friendica versions at github. If there is a new "
 "version, you will be informed in the admin panel overview."
 msgstr ""
 
-#: src/Module/Admin/Site.php:654
+#: src/Module/Admin/Site.php:652
 msgid "Suppress Tags"
 msgstr ""
 
-#: src/Module/Admin/Site.php:654
+#: src/Module/Admin/Site.php:652
 msgid "Suppress showing a list of hashtags at the end of the posting."
 msgstr ""
 
-#: src/Module/Admin/Site.php:655
+#: src/Module/Admin/Site.php:653
 msgid "Clean database"
 msgstr ""
 
-#: src/Module/Admin/Site.php:655
+#: src/Module/Admin/Site.php:653
 msgid ""
 "Remove old remote items, orphaned database records and old content from some "
 "other helper tables."
 msgstr ""
 
-#: src/Module/Admin/Site.php:656
+#: src/Module/Admin/Site.php:654
 msgid "Lifespan of remote items"
 msgstr ""
 
-#: src/Module/Admin/Site.php:656
+#: src/Module/Admin/Site.php:654
 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 ""
 
-#: src/Module/Admin/Site.php:657
+#: src/Module/Admin/Site.php:655
 msgid "Lifespan of unclaimed items"
 msgstr ""
 
-#: src/Module/Admin/Site.php:657
+#: src/Module/Admin/Site.php:655
 msgid ""
 "When the database cleanup is enabled, this defines the days after which "
 "unclaimed remote items (mostly content from the relay) will be deleted. "
@@ -7641,130 +8012,130 @@ msgid ""
 "items if set to 0."
 msgstr ""
 
-#: src/Module/Admin/Site.php:658
+#: src/Module/Admin/Site.php:656
 msgid "Lifespan of raw conversation data"
 msgstr ""
 
-#: src/Module/Admin/Site.php:658
+#: src/Module/Admin/Site.php:656
 msgid ""
 "The conversation data is used for ActivityPub and OStatus, as well as for "
 "debug purposes. It should be safe to remove it after 14 days, default is 90 "
 "days."
 msgstr ""
 
-#: src/Module/Admin/Site.php:659
+#: src/Module/Admin/Site.php:657
 msgid "Path to item cache"
 msgstr ""
 
-#: src/Module/Admin/Site.php:659
+#: src/Module/Admin/Site.php:657
 msgid "The item caches buffers generated bbcode and external images."
 msgstr ""
 
-#: src/Module/Admin/Site.php:660
+#: src/Module/Admin/Site.php:658
 msgid "Cache duration in seconds"
 msgstr ""
 
-#: src/Module/Admin/Site.php:660
+#: src/Module/Admin/Site.php:658
 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 ""
 
-#: src/Module/Admin/Site.php:661
+#: src/Module/Admin/Site.php:659
 msgid "Maximum numbers of comments per post"
 msgstr ""
 
-#: src/Module/Admin/Site.php:661
+#: src/Module/Admin/Site.php:659
 msgid "How much comments should be shown for each post? Default value is 100."
 msgstr ""
 
-#: src/Module/Admin/Site.php:662
+#: src/Module/Admin/Site.php:660
 msgid "Temp path"
 msgstr ""
 
-#: src/Module/Admin/Site.php:662
+#: src/Module/Admin/Site.php:660
 msgid ""
 "If you have a restricted system where the webserver can't access the system "
 "temp path, enter another path here."
 msgstr ""
 
-#: src/Module/Admin/Site.php:663
+#: src/Module/Admin/Site.php:661
 msgid "Disable picture proxy"
 msgstr ""
 
-#: src/Module/Admin/Site.php:663
+#: src/Module/Admin/Site.php:661
 msgid ""
 "The picture proxy increases performance and privacy. It shouldn't be used on "
 "systems with very low bandwidth."
 msgstr ""
 
-#: src/Module/Admin/Site.php:664
+#: src/Module/Admin/Site.php:662
 msgid "Only search in tags"
 msgstr ""
 
-#: src/Module/Admin/Site.php:664
+#: src/Module/Admin/Site.php:662
 msgid "On large systems the text search can slow down the system extremely."
 msgstr ""
 
-#: src/Module/Admin/Site.php:666
+#: src/Module/Admin/Site.php:664
 msgid "New base url"
 msgstr ""
 
-#: src/Module/Admin/Site.php:666
+#: src/Module/Admin/Site.php:664
 msgid ""
 "Change base url for this server. Sends relocate message to all Friendica and "
 "Diaspora* contacts of all users."
 msgstr ""
 
-#: src/Module/Admin/Site.php:668
+#: src/Module/Admin/Site.php:666
 msgid "RINO Encryption"
 msgstr ""
 
-#: src/Module/Admin/Site.php:668
+#: src/Module/Admin/Site.php:666
 msgid "Encryption layer between nodes."
 msgstr ""
 
-#: src/Module/Admin/Site.php:668
+#: src/Module/Admin/Site.php:666
 msgid "Enabled"
 msgstr ""
 
-#: src/Module/Admin/Site.php:670
+#: src/Module/Admin/Site.php:668
 msgid "Maximum number of parallel workers"
 msgstr ""
 
-#: src/Module/Admin/Site.php:670
+#: src/Module/Admin/Site.php:668
 #, php-format
 msgid ""
 "On shared hosters set this to %d. On larger systems, values of %d are great. "
 "Default value is %d."
 msgstr ""
 
-#: src/Module/Admin/Site.php:671
+#: src/Module/Admin/Site.php:669
 msgid "Don't use \"proc_open\" with the worker"
 msgstr ""
 
-#: src/Module/Admin/Site.php:671
+#: src/Module/Admin/Site.php:669
 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 ""
 
-#: src/Module/Admin/Site.php:672
+#: src/Module/Admin/Site.php:670
 msgid "Enable fastlane"
 msgstr ""
 
-#: src/Module/Admin/Site.php:672
+#: src/Module/Admin/Site.php:670
 msgid ""
 "When enabed, the fastlane mechanism starts an additional worker if processes "
 "with higher priority are blocked by processes of lower priority."
 msgstr ""
 
-#: src/Module/Admin/Site.php:673
+#: src/Module/Admin/Site.php:671
 msgid "Enable frontend worker"
 msgstr ""
 
-#: src/Module/Admin/Site.php:673
+#: src/Module/Admin/Site.php:671
 #, php-format
 msgid ""
 "When enabled the Worker process is triggered when backend access is "
@@ -7774,73 +8145,73 @@ msgid ""
 "server."
 msgstr ""
 
-#: src/Module/Admin/Site.php:675
+#: src/Module/Admin/Site.php:673
 msgid "Subscribe to relay"
 msgstr ""
 
-#: src/Module/Admin/Site.php:675
+#: src/Module/Admin/Site.php:673
 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 ""
 
-#: src/Module/Admin/Site.php:676
+#: src/Module/Admin/Site.php:674
 msgid "Relay server"
 msgstr ""
 
-#: src/Module/Admin/Site.php:676
+#: src/Module/Admin/Site.php:674
 msgid ""
 "Address of the relay server where public posts should be send to. For "
 "example https://relay.diasp.org"
 msgstr ""
 
-#: src/Module/Admin/Site.php:677
+#: src/Module/Admin/Site.php:675
 msgid "Direct relay transfer"
 msgstr ""
 
-#: src/Module/Admin/Site.php:677
+#: src/Module/Admin/Site.php:675
 msgid ""
 "Enables the direct transfer to other servers without using the relay servers"
 msgstr ""
 
-#: src/Module/Admin/Site.php:678
+#: src/Module/Admin/Site.php:676
 msgid "Relay scope"
 msgstr ""
 
-#: src/Module/Admin/Site.php:678
+#: src/Module/Admin/Site.php:676
 msgid ""
 "Can be \"all\" or \"tags\". \"all\" means that every public post should be "
 "received. \"tags\" means that only posts with selected tags should be "
 "received."
 msgstr ""
 
-#: src/Module/Admin/Site.php:678
+#: src/Module/Admin/Site.php:676
 msgid "all"
 msgstr ""
 
-#: src/Module/Admin/Site.php:678
+#: src/Module/Admin/Site.php:676
 msgid "tags"
 msgstr ""
 
-#: src/Module/Admin/Site.php:679
+#: src/Module/Admin/Site.php:677
 msgid "Server tags"
 msgstr ""
 
-#: src/Module/Admin/Site.php:679
+#: src/Module/Admin/Site.php:677
 msgid "Comma separated list of tags for the \"tags\" subscription."
 msgstr ""
 
-#: src/Module/Admin/Site.php:680
+#: src/Module/Admin/Site.php:678
 msgid "Allow user tags"
 msgstr ""
 
-#: src/Module/Admin/Site.php:680
+#: src/Module/Admin/Site.php:678
 msgid ""
 "If enabled, the tags from the saved searches will used for the \"tags\" "
 "subscription in addition to the \"relay_server_tags\"."
 msgstr ""
 
-#: src/Module/Admin/Site.php:683
+#: src/Module/Admin/Site.php:681
 msgid "Start Relocation"
 msgstr ""
 
@@ -7958,31 +8329,31 @@ msgstr ""
 msgid "Private Forum Account"
 msgstr ""
 
-#: src/Module/Admin/Summary.php:158
+#: src/Module/Admin/Summary.php:156
 msgid "Message queues"
 msgstr ""
 
-#: src/Module/Admin/Summary.php:164
+#: src/Module/Admin/Summary.php:162
 msgid "Server Settings"
 msgstr ""
 
-#: src/Module/Admin/Summary.php:178
+#: src/Module/Admin/Summary.php:176
 msgid "Summary"
 msgstr ""
 
-#: src/Module/Admin/Summary.php:180
+#: src/Module/Admin/Summary.php:178
 msgid "Registered users"
 msgstr ""
 
-#: src/Module/Admin/Summary.php:182
+#: src/Module/Admin/Summary.php:180
 msgid "Pending registrations"
 msgstr ""
 
-#: src/Module/Admin/Summary.php:183
+#: src/Module/Admin/Summary.php:181
 msgid "Version"
 msgstr ""
 
-#: src/Module/Admin/Summary.php:187
+#: src/Module/Admin/Summary.php:185
 msgid "Active addons"
 msgstr ""
 
@@ -8265,14 +8636,6 @@ msgstr ""
 msgid "No friends to display."
 msgstr ""
 
-#: src/Module/Apps.php:29
-msgid "No installed applications."
-msgstr ""
-
-#: src/Module/Apps.php:34
-msgid "Applications"
-msgstr ""
-
 #: src/Module/Attach.php:36 src/Module/Attach.php:48
 msgid "Item was not found."
 msgstr ""
@@ -8315,6 +8678,10 @@ msgstr ""
 msgid "Contact Blocklist"
 msgstr ""
 
+#: src/Module/BaseAdminModule.php:94
+msgid "Server Blocklist"
+msgstr ""
+
 #: src/Module/BaseAdminModule.php:101
 msgid "Diagnostics"
 msgstr ""
@@ -8352,7 +8719,7 @@ msgstr ""
 msgid "People Search - %s"
 msgstr ""
 
-#: src/Module/BaseSearchModule.php:59
+#: src/Module/BaseSearchModule.php:62
 #, php-format
 msgid "Forum Search - %s"
 msgstr ""
@@ -8384,345 +8751,334 @@ msgstr ""
 msgid "Contact updated."
 msgstr ""
 
-#: src/Module/Contact.php:372
+#: src/Module/Contact.php:393
 msgid "Contact not found"
 msgstr ""
 
-#: src/Module/Contact.php:391
+#: src/Module/Contact.php:412
 msgid "Contact has been blocked"
 msgstr ""
 
-#: src/Module/Contact.php:391
+#: src/Module/Contact.php:412
 msgid "Contact has been unblocked"
 msgstr ""
 
-#: src/Module/Contact.php:401
+#: src/Module/Contact.php:422
 msgid "Contact has been ignored"
 msgstr ""
 
-#: src/Module/Contact.php:401
+#: src/Module/Contact.php:422
 msgid "Contact has been unignored"
 msgstr ""
 
-#: src/Module/Contact.php:411
+#: src/Module/Contact.php:432
 msgid "Contact has been archived"
 msgstr ""
 
-#: src/Module/Contact.php:411
+#: src/Module/Contact.php:432
 msgid "Contact has been unarchived"
 msgstr ""
 
-#: src/Module/Contact.php:435
+#: src/Module/Contact.php:456
 msgid "Drop contact"
 msgstr ""
 
-#: src/Module/Contact.php:438 src/Module/Contact.php:817
+#: src/Module/Contact.php:459 src/Module/Contact.php:823
 msgid "Do you really want to delete this contact?"
 msgstr ""
 
-#: src/Module/Contact.php:452
+#: src/Module/Contact.php:473
 msgid "Contact has been removed."
 msgstr ""
 
-#: src/Module/Contact.php:482
+#: src/Module/Contact.php:503
 #, php-format
 msgid "You are mutual friends with %s"
 msgstr ""
 
-#: src/Module/Contact.php:487
+#: src/Module/Contact.php:508
 #, php-format
 msgid "You are sharing with %s"
 msgstr ""
 
-#: src/Module/Contact.php:492
+#: src/Module/Contact.php:513
 #, php-format
 msgid "%s is sharing with you"
 msgstr ""
 
-#: src/Module/Contact.php:516
+#: src/Module/Contact.php:537
 msgid "Private communications are not available for this contact."
 msgstr ""
 
-#: src/Module/Contact.php:518
+#: src/Module/Contact.php:539
 msgid "Never"
 msgstr ""
 
-#: src/Module/Contact.php:521
+#: src/Module/Contact.php:542
 msgid "(Update was successful)"
 msgstr ""
 
-#: src/Module/Contact.php:521
+#: src/Module/Contact.php:542
 msgid "(Update was not successful)"
 msgstr ""
 
-#: src/Module/Contact.php:523 src/Module/Contact.php:1055
+#: src/Module/Contact.php:544 src/Module/Contact.php:1057
 msgid "Suggest friends"
 msgstr ""
 
-#: src/Module/Contact.php:527
+#: src/Module/Contact.php:548
 #, php-format
 msgid "Network type: %s"
 msgstr ""
 
-#: src/Module/Contact.php:532
+#: src/Module/Contact.php:553
 msgid "Communications lost with this contact!"
 msgstr ""
 
-#: src/Module/Contact.php:538
+#: src/Module/Contact.php:559
 msgid "Fetch further information for feeds"
 msgstr ""
 
-#: src/Module/Contact.php:540
+#: src/Module/Contact.php:561
 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 ""
 
-#: src/Module/Contact.php:543
+#: src/Module/Contact.php:564
 msgid "Fetch information"
 msgstr ""
 
-#: src/Module/Contact.php:544
+#: src/Module/Contact.php:565
 msgid "Fetch keywords"
 msgstr ""
 
-#: src/Module/Contact.php:545
+#: src/Module/Contact.php:566
 msgid "Fetch information and keywords"
 msgstr ""
 
-#: src/Module/Contact.php:577
+#: src/Module/Contact.php:585
 msgid "Profile Visibility"
 msgstr ""
 
-#: src/Module/Contact.php:578
+#: src/Module/Contact.php:586
 msgid "Contact Information / Notes"
 msgstr ""
 
-#: src/Module/Contact.php:579
+#: src/Module/Contact.php:587
 msgid "Contact Settings"
 msgstr ""
 
-#: src/Module/Contact.php:588
+#: src/Module/Contact.php:596
 msgid "Contact"
 msgstr ""
 
-#: src/Module/Contact.php:592
+#: src/Module/Contact.php:600
 #, php-format
 msgid ""
 "Please choose the profile you would like to display to %s when viewing your "
 "profile securely."
 msgstr ""
 
-#: src/Module/Contact.php:594
+#: src/Module/Contact.php:602
 msgid "Their personal note"
 msgstr ""
 
-#: src/Module/Contact.php:596
+#: src/Module/Contact.php:604
 msgid "Edit contact notes"
 msgstr ""
 
-#: src/Module/Contact.php:599 src/Module/Contact.php:1021
+#: src/Module/Contact.php:607 src/Module/Contact.php:1023
 #: src/Module/Profile/Contacts.php:93
 #, php-format
 msgid "Visit %s's profile [%s]"
 msgstr ""
 
-#: src/Module/Contact.php:600
+#: src/Module/Contact.php:608
 msgid "Block/Unblock contact"
 msgstr ""
 
-#: src/Module/Contact.php:601
+#: src/Module/Contact.php:609
 msgid "Ignore contact"
 msgstr ""
 
-#: src/Module/Contact.php:602
+#: src/Module/Contact.php:610
 msgid "Repair URL settings"
 msgstr ""
 
-#: src/Module/Contact.php:603
+#: src/Module/Contact.php:611
 msgid "View conversations"
 msgstr ""
 
-#: src/Module/Contact.php:608
+#: src/Module/Contact.php:616
 msgid "Last update:"
 msgstr ""
 
-#: src/Module/Contact.php:610
+#: src/Module/Contact.php:618
 msgid "Update public posts"
 msgstr ""
 
-#: src/Module/Contact.php:612 src/Module/Contact.php:1065
+#: src/Module/Contact.php:620 src/Module/Contact.php:1067
 msgid "Update now"
 msgstr ""
 
-#: src/Module/Contact.php:618 src/Module/Contact.php:822
-#: src/Module/Contact.php:1082
+#: src/Module/Contact.php:624 src/Module/Contact.php:828
+#: src/Module/Contact.php:1084
 msgid "Unignore"
 msgstr ""
 
-#: src/Module/Contact.php:622
+#: src/Module/Contact.php:628
 msgid "Currently blocked"
 msgstr ""
 
-#: src/Module/Contact.php:623
+#: src/Module/Contact.php:629
 msgid "Currently ignored"
 msgstr ""
 
-#: src/Module/Contact.php:624
+#: src/Module/Contact.php:630
 msgid "Currently archived"
 msgstr ""
 
-#: src/Module/Contact.php:625
+#: src/Module/Contact.php:631
 msgid "Awaiting connection acknowledge"
 msgstr ""
 
-#: src/Module/Contact.php:626
+#: src/Module/Contact.php:632
 msgid ""
 "Replies/likes to your public posts <strong>may</strong> still be visible"
 msgstr ""
 
-#: src/Module/Contact.php:627
+#: src/Module/Contact.php:633
 msgid "Notification for new posts"
 msgstr ""
 
-#: src/Module/Contact.php:627
+#: src/Module/Contact.php:633
 msgid "Send a notification of every new post of this contact"
 msgstr ""
 
-#: src/Module/Contact.php:629
+#: src/Module/Contact.php:635
 msgid "Blacklisted keywords"
 msgstr ""
 
-#: src/Module/Contact.php:629
+#: src/Module/Contact.php:635
 msgid ""
 "Comma separated list of keywords that should not be converted to hashtags, "
 "when \"Fetch information and keywords\" is selected"
 msgstr ""
 
-#: src/Module/Contact.php:646 src/Module/Settings/TwoFactor/Index.php:100
+#: src/Module/Contact.php:652 src/Module/Settings/TwoFactor/Index.php:111
 msgid "Actions"
 msgstr ""
 
-#: src/Module/Contact.php:691
+#: src/Module/Contact.php:697
 msgid "Show all contacts"
 msgstr ""
 
-#: src/Module/Contact.php:696 src/Module/Contact.php:798
+#: src/Module/Contact.php:702 src/Module/Contact.php:804
 msgid "Blocked"
 msgstr ""
 
-#: src/Module/Contact.php:699
+#: src/Module/Contact.php:705
 msgid "Only show blocked contacts"
 msgstr ""
 
-#: src/Module/Contact.php:704 src/Module/Contact.php:800
+#: src/Module/Contact.php:710 src/Module/Contact.php:806
 msgid "Ignored"
 msgstr ""
 
-#: src/Module/Contact.php:707
+#: src/Module/Contact.php:713
 msgid "Only show ignored contacts"
 msgstr ""
 
-#: src/Module/Contact.php:712 src/Module/Contact.php:801
+#: src/Module/Contact.php:718 src/Module/Contact.php:807
 msgid "Archived"
 msgstr ""
 
-#: src/Module/Contact.php:715
+#: src/Module/Contact.php:721
 msgid "Only show archived contacts"
 msgstr ""
 
-#: src/Module/Contact.php:720 src/Module/Contact.php:799
+#: src/Module/Contact.php:726 src/Module/Contact.php:805
 msgid "Hidden"
 msgstr ""
 
-#: src/Module/Contact.php:723
+#: src/Module/Contact.php:729
 msgid "Only show hidden contacts"
 msgstr ""
 
-#: src/Module/Contact.php:731
+#: src/Module/Contact.php:737
 msgid "Organize your contact groups"
 msgstr ""
 
-#: src/Module/Contact.php:812
+#: src/Module/Contact.php:818
 msgid "Search your contacts"
 msgstr ""
 
-#: src/Module/Contact.php:823 src/Module/Contact.php:1091
+#: src/Module/Contact.php:829 src/Module/Contact.php:1093
 msgid "Archive"
 msgstr ""
 
-#: src/Module/Contact.php:823 src/Module/Contact.php:1091
+#: src/Module/Contact.php:829 src/Module/Contact.php:1093
 msgid "Unarchive"
 msgstr ""
 
-#: src/Module/Contact.php:826
+#: src/Module/Contact.php:832
 msgid "Batch Actions"
 msgstr ""
 
-#: src/Module/Contact.php:853
+#: src/Module/Contact.php:859
 msgid "Conversations started by this contact"
 msgstr ""
 
-#: src/Module/Contact.php:858
+#: src/Module/Contact.php:864
 msgid "Posts and Comments"
 msgstr ""
 
-#: src/Module/Contact.php:881
+#: src/Module/Contact.php:887
 msgid "View all contacts"
 msgstr ""
 
-#: src/Module/Contact.php:892
+#: src/Module/Contact.php:898
 msgid "View all common friends"
 msgstr ""
 
-#: src/Module/Contact.php:902
+#: src/Module/Contact.php:908
 msgid "Advanced Contact Settings"
 msgstr ""
 
-#: src/Module/Contact.php:988
+#: src/Module/Contact.php:990
 msgid "Mutual Friendship"
 msgstr ""
 
-#: src/Module/Contact.php:993
+#: src/Module/Contact.php:995
 msgid "is a fan of yours"
 msgstr ""
 
-#: src/Module/Contact.php:998
+#: src/Module/Contact.php:1000
 msgid "you are a fan of"
 msgstr ""
 
-#: src/Module/Contact.php:1022
+#: src/Module/Contact.php:1024
 msgid "Edit contact"
 msgstr ""
 
-#: src/Module/Contact.php:1076
+#: src/Module/Contact.php:1078
 msgid "Toggle Blocked status"
 msgstr ""
 
-#: src/Module/Contact.php:1084
+#: src/Module/Contact.php:1086
 msgid "Toggle Ignored status"
 msgstr ""
 
-#: src/Module/Contact.php:1093
+#: src/Module/Contact.php:1095
 msgid "Toggle Archive status"
 msgstr ""
 
-#: src/Module/Contact.php:1101
+#: src/Module/Contact.php:1103
 msgid "Delete contact"
 msgstr ""
 
-#: src/Module/Credits.php:25
-msgid "Credits"
-msgstr ""
-
-#: src/Module/Credits.php:26
-msgid ""
-"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!"
-msgstr ""
-
 #: src/Module/Debug/Babel.php:32
 msgid "Source input"
 msgstr ""
@@ -8804,26 +9160,34 @@ msgid "HTML::toBBCode => BBCode::convert (raw HTML)"
 msgstr ""
 
 #: src/Module/Debug/Babel.php:153
-msgid "HTML::toMarkdown"
+msgid "HTML::toBBCode => BBCode::toPlaintext"
 msgstr ""
 
 #: src/Module/Debug/Babel.php:159
+msgid "HTML::toMarkdown"
+msgstr ""
+
+#: src/Module/Debug/Babel.php:165
 msgid "HTML::toPlaintext"
 msgstr ""
 
-#: src/Module/Debug/Babel.php:167
+#: src/Module/Debug/Babel.php:171
+msgid "HTML::toPlaintext (compact)"
+msgstr ""
+
+#: src/Module/Debug/Babel.php:179
 msgid "Source text"
 msgstr ""
 
-#: src/Module/Debug/Babel.php:168
+#: src/Module/Debug/Babel.php:180
 msgid "BBCode"
 msgstr ""
 
-#: src/Module/Debug/Babel.php:169
+#: src/Module/Debug/Babel.php:181
 msgid "Markdown"
 msgstr ""
 
-#: src/Module/Debug/Babel.php:170
+#: src/Module/Debug/Babel.php:182
 msgid "HTML"
 msgstr ""
 
@@ -8872,19 +9236,19 @@ msgstr ""
 msgid "Lookup address"
 msgstr ""
 
-#: src/Module/Directory.php:66
+#: src/Module/Directory.php:61
 msgid "No entries (some entries may be hidden)."
 msgstr ""
 
-#: src/Module/Directory.php:85
+#: src/Module/Directory.php:80
 msgid "Find on this site"
 msgstr ""
 
-#: src/Module/Directory.php:87
+#: src/Module/Directory.php:82
 msgid "Results for:"
 msgstr ""
 
-#: src/Module/Directory.php:89
+#: src/Module/Directory.php:84
 msgid "Site Directory"
 msgstr ""
 
@@ -9049,142 +9413,142 @@ msgstr ""
 msgid "Welcome to %s"
 msgstr ""
 
-#: src/Module/Install.php:158
+#: src/Module/Install.php:160
 msgid "Friendica Communications Server - Setup"
 msgstr ""
 
-#: src/Module/Install.php:169
+#: src/Module/Install.php:171
 msgid "System check"
 msgstr ""
 
-#: src/Module/Install.php:174
+#: src/Module/Install.php:176
 msgid "Check again"
 msgstr ""
 
-#: src/Module/Install.php:189
+#: src/Module/Install.php:191
 msgid "Base settings"
 msgstr ""
 
-#: src/Module/Install.php:196
+#: src/Module/Install.php:198
 msgid "Host name"
 msgstr ""
 
-#: src/Module/Install.php:198
+#: src/Module/Install.php:200
 msgid ""
 "Overwrite this field in case the determinated hostname isn't right, "
 "otherweise leave it as is."
 msgstr ""
 
-#: src/Module/Install.php:201
+#: src/Module/Install.php:203
 msgid "Base path to installation"
 msgstr ""
 
-#: src/Module/Install.php:203
+#: src/Module/Install.php:205
 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 ""
 
-#: src/Module/Install.php:206
+#: src/Module/Install.php:208
 msgid "Sub path of the URL"
 msgstr ""
 
-#: src/Module/Install.php:208
+#: src/Module/Install.php:210
 msgid ""
 "Overwrite this field in case the sub path determination isn't right, "
 "otherwise leave it as is. Leaving this field blank means the installation is "
 "at the base URL without sub path."
 msgstr ""
 
-#: src/Module/Install.php:219
+#: src/Module/Install.php:221
 msgid "Database connection"
 msgstr ""
 
-#: src/Module/Install.php:220
+#: src/Module/Install.php:222
 msgid ""
 "In order to install Friendica we need to know how to connect to your "
 "database."
 msgstr ""
 
-#: src/Module/Install.php:221
+#: src/Module/Install.php:223
 msgid ""
 "Please contact your hosting provider or site administrator if you have "
 "questions about these settings."
 msgstr ""
 
-#: src/Module/Install.php:222
+#: src/Module/Install.php:224
 msgid ""
 "The database you specify below should already exist. If it does not, please "
 "create it before continuing."
 msgstr ""
 
-#: src/Module/Install.php:229
+#: src/Module/Install.php:231
 msgid "Database Server Name"
 msgstr ""
 
-#: src/Module/Install.php:234
+#: src/Module/Install.php:236
 msgid "Database Login Name"
 msgstr ""
 
-#: src/Module/Install.php:240
+#: src/Module/Install.php:242
 msgid "Database Login Password"
 msgstr ""
 
-#: src/Module/Install.php:242
+#: src/Module/Install.php:244
 msgid "For security reasons the password must not be empty"
 msgstr ""
 
-#: src/Module/Install.php:245
+#: src/Module/Install.php:247
 msgid "Database Name"
 msgstr ""
 
-#: src/Module/Install.php:249 src/Module/Install.php:278
+#: src/Module/Install.php:251 src/Module/Install.php:280
 msgid "Please select a default timezone for your website"
 msgstr ""
 
-#: src/Module/Install.php:263
+#: src/Module/Install.php:265
 msgid "Site settings"
 msgstr ""
 
-#: src/Module/Install.php:273
+#: src/Module/Install.php:275
 msgid "Site administrator email address"
 msgstr ""
 
-#: src/Module/Install.php:275
+#: src/Module/Install.php:277
 msgid ""
 "Your account email address must match this in order to use the web admin "
 "panel."
 msgstr ""
 
-#: src/Module/Install.php:282
+#: src/Module/Install.php:284
 msgid "System Language:"
 msgstr ""
 
-#: src/Module/Install.php:284
+#: src/Module/Install.php:286
 msgid ""
 "Set the default language for your Friendica installation interface and to "
 "send emails."
 msgstr ""
 
-#: src/Module/Install.php:296
+#: src/Module/Install.php:298
 msgid "Your Friendica site database has been installed."
 msgstr ""
 
-#: src/Module/Install.php:304
+#: src/Module/Install.php:306
 msgid "Installation finished"
 msgstr ""
 
-#: src/Module/Install.php:326
+#: src/Module/Install.php:328
 msgid "<h1>What next</h1>"
 msgstr ""
 
-#: src/Module/Install.php:327
+#: src/Module/Install.php:329
 msgid ""
 "IMPORTANT: You will need to [manually] setup a scheduled task for the worker."
 msgstr ""
 
-#: src/Module/Install.php:330
+#: src/Module/Install.php:332
 #, php-format
 msgid ""
 "Go to your new Friendica node <a href=\"%s/register\">registration page</a> "
@@ -9296,43 +9660,93 @@ msgid ""
 "important, please visit http://friendi.ca"
 msgstr ""
 
-#: src/Module/Login.php:295
+#: src/Module/Item/Compose.php:30
+msgid "Please enter a post body."
+msgstr ""
+
+#: src/Module/Item/Compose.php:43
+msgid "This feature is only available with the frio theme."
+msgstr ""
+
+#: src/Module/Item/Compose.php:63
+msgid "Compose new personal note"
+msgstr ""
+
+#: src/Module/Item/Compose.php:70
+msgid "Compose new post"
+msgstr ""
+
+#: src/Module/Item/Compose.php:190
+msgid "Clear the location"
+msgstr ""
+
+#: src/Module/Item/Compose.php:191
+msgid "Location services are unavailable on your device"
+msgstr ""
+
+#: src/Module/Item/Compose.php:192
+msgid ""
+"Location services are disabled. Please check the website's permissions on "
+"your device"
+msgstr ""
+
+#: src/Module/Item/Compose.php:196
+msgid "Public"
+msgstr ""
+
+#: src/Module/Item/Compose.php:197
+msgid ""
+"This post will be sent to all your followers and can be seen in the "
+"community pages and by anyone with its link."
+msgstr ""
+
+#: src/Module/Item/Compose.php:198
+msgid "Limited/Private"
+msgstr ""
+
+#: src/Module/Item/Compose.php:199
+msgid ""
+"This post will be sent only to the people in the first box, to the exception "
+"of the people mentioned in the second box. It won't appear anywhere public."
+msgstr ""
+
+#: src/Module/Login.php:286
 msgid "Create a New Account"
 msgstr ""
 
-#: src/Module/Login.php:328
+#: src/Module/Login.php:319
 msgid "Password: "
 msgstr ""
 
-#: src/Module/Login.php:329
+#: src/Module/Login.php:320
 msgid "Remember me"
 msgstr ""
 
-#: src/Module/Login.php:332
+#: src/Module/Login.php:323
 msgid "Or login using OpenID: "
 msgstr ""
 
-#: src/Module/Login.php:338
+#: src/Module/Login.php:329
 msgid "Forgot your password?"
 msgstr ""
 
-#: src/Module/Login.php:341
+#: src/Module/Login.php:332
 msgid "Website Terms of Service"
 msgstr ""
 
-#: src/Module/Login.php:342
+#: src/Module/Login.php:333
 msgid "terms of service"
 msgstr ""
 
-#: src/Module/Login.php:344
+#: src/Module/Login.php:335
 msgid "Website Privacy Policy"
 msgstr ""
 
-#: src/Module/Login.php:345
+#: src/Module/Login.php:336
 msgid "privacy policy"
 msgstr ""
 
-#: src/Module/Logout.php:27
+#: src/Module/Logout.php:38
 msgid "Logged out."
 msgstr ""
 
@@ -9389,22 +9803,6 @@ msgstr[1] ""
 msgid "All contacts"
 msgstr ""
 
-#: src/Module/Profile.php:110 src/Module/Profile.php:113
-#: src/Protocol/OStatus.php:1295
-#, php-format
-msgid "%s's timeline"
-msgstr ""
-
-#: src/Module/Profile.php:111 src/Protocol/OStatus.php:1299
-#, php-format
-msgid "%s's posts"
-msgstr ""
-
-#: src/Module/Profile.php:112 src/Protocol/OStatus.php:1302
-#, php-format
-msgid "%s's comments"
-msgstr ""
-
 #: src/Module/Register.php:83
 msgid ""
 "You may (optionally) fill in this form via OpenID by supplying your OpenID "
@@ -9498,79 +9896,170 @@ msgstr ""
 msgid "Your registration is pending approval by the site owner."
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:50
+#: src/Module/Settings/TwoFactor/AppSpecific.php:36
+#: src/Module/Settings/TwoFactor/Recovery.php:34
+#: src/Module/Settings/TwoFactor/Verify.php:41
+msgid "Please enter your password to access this page."
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:54
+msgid "App-specific password generation failed: The description is empty."
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:57
+msgid ""
+"App-specific password generation failed: This description already exists."
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:61
+msgid "New app-specific password generated."
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:67
+msgid "App-specific passwords successfully revoked."
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:77
+msgid "App-specific password successfully revoked."
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:98
+msgid "Two-factor app-specific passwords"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:100
+msgid ""
+"<p>App-specific passwords are randomly generated passwords used instead your "
+"regular password to authenticate your account on third-party applications "
+"that don't support two-factor authentication.</p>"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:101
+msgid ""
+"Make sure to copy your new app-specific password now. You won’t be able to "
+"see it again!"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:104
+msgid "Description"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:105
+msgid "Last Used"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:106
+msgid "Revoke"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:107
+msgid "Revoke All"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:110
+msgid ""
+"When you generate a new app-specific password, you must use it right away, "
+"it will be shown to you once after you generate it."
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:111
+msgid "Generate new app-specific password"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:112
+msgid "Friendiqa on my Fairphone 2..."
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:113
+msgid "Generate"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/Index.php:51
 msgid "Two-factor authentication successfully disabled."
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:86
+#: src/Module/Settings/TwoFactor/Index.php:92
 msgid ""
 "<p>Use an application on a mobile device to get two-factor authentication "
 "codes when prompted on login.</p>"
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:90
+#: src/Module/Settings/TwoFactor/Index.php:96
 msgid "Authenticator app"
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:91
+#: src/Module/Settings/TwoFactor/Index.php:97
 msgid "Configured"
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:91
+#: src/Module/Settings/TwoFactor/Index.php:97
 msgid "Not Configured"
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:92
+#: src/Module/Settings/TwoFactor/Index.php:98
 msgid "<p>You haven't finished configuring your authenticator app.</p>"
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:93
+#: src/Module/Settings/TwoFactor/Index.php:99
 msgid "<p>Your authenticator app is correctly configured.</p>"
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:95
+#: src/Module/Settings/TwoFactor/Index.php:101
 msgid "Recovery codes"
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:96
+#: src/Module/Settings/TwoFactor/Index.php:102
 msgid "Remaining valid codes"
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:98
+#: src/Module/Settings/TwoFactor/Index.php:104
 msgid ""
 "<p>These one-use codes can replace an authenticator app code in case you "
 "have lost access to it.</p>"
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:101
+#: src/Module/Settings/TwoFactor/Index.php:106
+msgid "App-specific passwords"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/Index.php:107
+msgid "Generated app-specific passwords"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/Index.php:109
+msgid ""
+"<p>These randomly generated passwords allow you to authenticate on apps not "
+"supporting two-factor authentication.</p>"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/Index.php:112
 msgid "Current password:"
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:101
+#: src/Module/Settings/TwoFactor/Index.php:112
 msgid ""
 "You need to provide your current password to change two-factor "
 "authentication settings."
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:102
+#: src/Module/Settings/TwoFactor/Index.php:113
 msgid "Enable two-factor authentication"
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:103
+#: src/Module/Settings/TwoFactor/Index.php:114
 msgid "Disable two-factor authentication"
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:104
+#: src/Module/Settings/TwoFactor/Index.php:115
 msgid "Show recovery codes"
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:105
-msgid "Finish app configuration"
+#: src/Module/Settings/TwoFactor/Index.php:116
+msgid "Manage app-specific passwords"
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Recovery.php:34
-#: src/Module/Settings/TwoFactor/Verify.php:41
-msgid "Please enter your password to access this page."
+#: src/Module/Settings/TwoFactor/Index.php:117
+msgid "Finish app configuration"
 msgstr ""
 
 #: src/Module/Settings/TwoFactor/Recovery.php:50
@@ -9608,7 +10097,7 @@ msgid "Two-factor authentication successfully activated."
 msgstr ""
 
 #: src/Module/Settings/TwoFactor/Verify.php:67
-#: src/Module/TwoFactor/Recovery.php:46 src/Module/TwoFactor/Verify.php:41
+#: src/Module/TwoFactor/Recovery.php:46 src/Module/TwoFactor/Verify.php:43
 msgid "Invalid code, please retry."
 msgstr ""
 
@@ -9650,7 +10139,7 @@ msgid ""
 msgstr ""
 
 #: src/Module/Settings/TwoFactor/Verify.php:126
-#: src/Module/TwoFactor/Verify.php:63
+#: src/Module/TwoFactor/Verify.php:67
 msgid "Please enter a code from your authentication app"
 msgstr ""
 
@@ -9703,54 +10192,20 @@ msgid ""
 "The requested resource could not be found but may be available in the future."
 msgstr ""
 
-#: src/Module/Special/HTTPException.php:48
-msgid ""
-"An unexpected condition was encountered and no more specific message is "
-"suitable."
-msgstr ""
-
-#: src/Module/Special/HTTPException.php:49
-msgid ""
-"The server is currently unavailable (because it is overloaded or down for "
-"maintenance). Please try again later."
-msgstr ""
-
-#: src/Module/Special/HTTPException.php:55
-msgid "Go back"
-msgstr ""
-
-#: 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/Tos.php:36 src/Module/Tos.php:78
+#: src/Module/Special/HTTPException.php:48
 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."
+"An unexpected condition was encountered and no more specific message is "
+"suitable."
 msgstr ""
 
-#: src/Module/Tos.php:37 src/Module/Tos.php:79
-#, php-format
+#: src/Module/Special/HTTPException.php:49
 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."
+"The server is currently unavailable (because it is overloaded or down for "
+"maintenance). Please try again later."
 msgstr ""
 
-#: src/Module/Tos.php:40 src/Module/Tos.php:76
-msgid "Privacy Statement"
+#: src/Module/Special/HTTPException.php:55
+msgid "Go back"
 msgstr ""
 
 #: src/Module/TwoFactor/Recovery.php:41
@@ -9768,7 +10223,7 @@ msgid ""
 "to your mobile device.</p>"
 msgstr ""
 
-#: src/Module/TwoFactor/Recovery.php:67 src/Module/TwoFactor/Verify.php:62
+#: src/Module/TwoFactor/Recovery.php:67 src/Module/TwoFactor/Verify.php:66
 #, php-format
 msgid ""
 "Don’t have your phone? <a href=\"%s\">Enter a two-factor recovery code</a>"
@@ -9782,13 +10237,13 @@ msgstr ""
 msgid "Submit recovery code and complete login"
 msgstr ""
 
-#: src/Module/TwoFactor/Verify.php:61
+#: src/Module/TwoFactor/Verify.php:63
 msgid ""
 "<p>Open the two-factor authentication app on your device to get an "
 "authentication code and verify your identity.</p>"
 msgstr ""
 
-#: src/Module/TwoFactor/Verify.php:64
+#: src/Module/TwoFactor/Verify.php:68
 msgid "Verify code and complete login"
 msgstr ""
 
@@ -9879,524 +10334,291 @@ msgstr ""
 msgid "Importing Emails"
 msgstr ""
 
-#: src/Module/Welcome.php:49
-msgid ""
-"Enter your email access information on your Connector Settings page if you "
-"wish to import and interact with friends or mailing lists from your email "
-"INBOX"
-msgstr ""
-
-#: src/Module/Welcome.php:50
-msgid "Go to Your Contacts Page"
-msgstr ""
-
-#: src/Module/Welcome.php:51
-msgid ""
-"Your Contacts page is your gateway to managing friendships and connecting "
-"with friends on other networks. Typically you enter their address or site "
-"URL in the <em>Add New Contact</em> dialog."
-msgstr ""
-
-#: src/Module/Welcome.php:52
-msgid "Go to Your Site's Directory"
-msgstr ""
-
-#: src/Module/Welcome.php:53
-msgid ""
-"The Directory page lets you find other people in this network or other "
-"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
-"their profile page. Provide your own Identity Address if requested."
-msgstr ""
-
-#: src/Module/Welcome.php:54
-msgid "Finding New People"
-msgstr ""
-
-#: src/Module/Welcome.php:55
-msgid ""
-"On the side panel of the Contacts page are several tools to find new "
-"friends. We can match people by interest, look up people by name or "
-"interest, and provide suggestions based on network relationships. On a brand "
-"new site, friend suggestions will usually begin to be populated within 24 "
-"hours."
-msgstr ""
-
-#: src/Module/Welcome.php:58
-msgid "Group Your Contacts"
-msgstr ""
-
-#: src/Module/Welcome.php:59
-msgid ""
-"Once you have made some friends, organize them into private conversation "
-"groups from the sidebar of your Contacts page and then you can interact with "
-"each group privately on your Network page."
-msgstr ""
-
-#: src/Module/Welcome.php:61
-msgid "Why Aren't My Posts Public?"
-msgstr ""
-
-#: src/Module/Welcome.php:62
-msgid ""
-"Friendica respects your privacy. By default, your posts will only show up to "
-"people you've added as friends. For more information, see the help section "
-"from the link above."
-msgstr ""
-
-#: src/Module/Welcome.php:64
-msgid "Getting Help"
-msgstr ""
-
-#: src/Module/Welcome.php:65
-msgid "Go to the Help Section"
-msgstr ""
-
-#: src/Module/Welcome.php:66
-msgid ""
-"Our <strong>help</strong> pages may be consulted for detail on other program "
-"features and resources."
-msgstr ""
-
-#: src/Object/Post.php:137
-msgid "This entry was edited"
-msgstr ""
-
-#: src/Object/Post.php:157
-msgid "Private Message"
-msgstr ""
-
-#: src/Object/Post.php:199
-msgid "Delete locally"
-msgstr ""
-
-#: src/Object/Post.php:202
-msgid "Delete globally"
-msgstr ""
-
-#: src/Object/Post.php:202
-msgid "Remove locally"
-msgstr ""
-
-#: src/Object/Post.php:216
-msgid "save to folder"
-msgstr ""
-
-#: src/Object/Post.php:251
-msgid "I will attend"
-msgstr ""
-
-#: src/Object/Post.php:251
-msgid "I will not attend"
-msgstr ""
-
-#: src/Object/Post.php:251
-msgid "I might attend"
-msgstr ""
-
-#: src/Object/Post.php:279
-msgid "ignore thread"
-msgstr ""
-
-#: src/Object/Post.php:280
-msgid "unignore thread"
-msgstr ""
-
-#: src/Object/Post.php:281
-msgid "toggle ignore status"
-msgstr ""
-
-#: src/Object/Post.php:292
-msgid "add star"
-msgstr ""
-
-#: src/Object/Post.php:293
-msgid "remove star"
-msgstr ""
-
-#: src/Object/Post.php:294
-msgid "toggle star status"
-msgstr ""
-
-#: src/Object/Post.php:297
-msgid "starred"
-msgstr ""
-
-#: src/Object/Post.php:301
-msgid "add tag"
-msgstr ""
-
-#: src/Object/Post.php:312
-msgid "like"
-msgstr ""
-
-#: src/Object/Post.php:313
-msgid "dislike"
-msgstr ""
-
-#: src/Object/Post.php:316
-msgid "Share this"
-msgstr ""
-
-#: src/Object/Post.php:316
-msgid "share"
-msgstr ""
-
-#: src/Object/Post.php:384
-msgid "to"
-msgstr ""
-
-#: src/Object/Post.php:385
-msgid "via"
-msgstr ""
-
-#: src/Object/Post.php:386
-msgid "Wall-to-Wall"
-msgstr ""
-
-#: src/Object/Post.php:387
-msgid "via Wall-To-Wall:"
-msgstr ""
-
-#: src/Object/Post.php:420
-#, php-format
-msgid "Reply to %s"
-msgstr ""
-
-#: src/Object/Post.php:435
-msgid "Notifier task is pending"
-msgstr ""
-
-#: src/Object/Post.php:436
-msgid "Delivery to remote servers is pending"
-msgstr ""
-
-#: src/Object/Post.php:437
-msgid "Delivery to remote servers is underway"
-msgstr ""
-
-#: src/Object/Post.php:438
-msgid "Delivery to remote servers is mostly done"
-msgstr ""
-
-#: src/Object/Post.php:439
-msgid "Delivery to remote servers is done"
-msgstr ""
-
-#: src/Object/Post.php:459
-#, php-format
-msgid "%d comment"
-msgid_plural "%d comments"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/Object/Post.php:460
-msgid "Show more"
-msgstr ""
-
-#: src/Object/Post.php:461
-msgid "Show fewer"
-msgstr ""
-
-#: src/Protocol/Diaspora.php:2438
-msgid "Sharing notification from Diaspora network"
-msgstr ""
-
-#: src/Protocol/Diaspora.php:3599
-msgid "Attachments:"
-msgstr ""
-
-#: src/Protocol/OStatus.php:1856
-#, php-format
-msgid "%s is now following %s."
-msgstr ""
-
-#: src/Protocol/OStatus.php:1857
-msgid "following"
-msgstr ""
-
-#: src/Protocol/OStatus.php:1860
-#, php-format
-msgid "%s stopped following %s."
-msgstr ""
-
-#: src/Protocol/OStatus.php:1861
-msgid "stopped following"
-msgstr ""
-
-#: src/Util/Temporal.php:151
-msgid "YYYY-MM-DD or MM-DD"
-msgstr ""
-
-#: src/Util/Temporal.php:298
-msgid "never"
-msgstr ""
-
-#: src/Util/Temporal.php:305
-msgid "less than a second ago"
-msgstr ""
-
-#: src/Util/Temporal.php:313
-msgid "year"
-msgstr ""
-
-#: src/Util/Temporal.php:313
-msgid "years"
+#: src/Module/Welcome.php:49
+msgid ""
+"Enter your email access information on your Connector Settings page if you "
+"wish to import and interact with friends or mailing lists from your email "
+"INBOX"
 msgstr ""
 
-#: src/Util/Temporal.php:314
-msgid "months"
+#: src/Module/Welcome.php:50
+msgid "Go to Your Contacts Page"
 msgstr ""
 
-#: src/Util/Temporal.php:315
-msgid "weeks"
+#: src/Module/Welcome.php:51
+msgid ""
+"Your Contacts page is your gateway to managing friendships and connecting "
+"with friends on other networks. Typically you enter their address or site "
+"URL in the <em>Add New Contact</em> dialog."
 msgstr ""
 
-#: src/Util/Temporal.php:316
-msgid "days"
+#: src/Module/Welcome.php:52
+msgid "Go to Your Site's Directory"
 msgstr ""
 
-#: src/Util/Temporal.php:317
-msgid "hour"
+#: src/Module/Welcome.php:53
+msgid ""
+"The Directory page lets you find other people in this network or other "
+"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
+"their profile page. Provide your own Identity Address if requested."
 msgstr ""
 
-#: src/Util/Temporal.php:317
-msgid "hours"
+#: src/Module/Welcome.php:54
+msgid "Finding New People"
 msgstr ""
 
-#: src/Util/Temporal.php:318
-msgid "minute"
+#: src/Module/Welcome.php:55
+msgid ""
+"On the side panel of the Contacts page are several tools to find new "
+"friends. We can match people by interest, look up people by name or "
+"interest, and provide suggestions based on network relationships. On a brand "
+"new site, friend suggestions will usually begin to be populated within 24 "
+"hours."
 msgstr ""
 
-#: src/Util/Temporal.php:318
-msgid "minutes"
+#: src/Module/Welcome.php:58
+msgid "Group Your Contacts"
 msgstr ""
 
-#: src/Util/Temporal.php:319
-msgid "second"
+#: src/Module/Welcome.php:59
+msgid ""
+"Once you have made some friends, organize them into private conversation "
+"groups from the sidebar of your Contacts page and then you can interact with "
+"each group privately on your Network page."
 msgstr ""
 
-#: src/Util/Temporal.php:319
-msgid "seconds"
+#: src/Module/Welcome.php:61
+msgid "Why Aren't My Posts Public?"
 msgstr ""
 
-#: src/Util/Temporal.php:329
-#, php-format
-msgid "in %1$d %2$s"
+#: src/Module/Welcome.php:62
+msgid ""
+"Friendica respects your privacy. By default, your posts will only show up to "
+"people you've added as friends. For more information, see the help section "
+"from the link above."
 msgstr ""
 
-#: src/Util/Temporal.php:332
-#, php-format
-msgid "%1$d %2$s ago"
+#: src/Module/Welcome.php:64
+msgid "Getting Help"
 msgstr ""
 
-#: src/Worker/Delivery.php:450
-msgid "(no subject)"
+#: src/Module/Welcome.php:65
+msgid "Go to the Help Section"
 msgstr ""
 
-#: update.php:218
-#, php-format
-msgid "%s: Updating author-id and owner-id in item and thread table. "
+#: src/Module/Welcome.php:66
+msgid ""
+"Our <strong>help</strong> pages may be consulted for detail on other program "
+"features and resources."
 msgstr ""
 
-#: update.php:273
-#, php-format
-msgid "%s: Updating post-type."
+#: src/Object/Post.php:138
+msgid "This entry was edited"
 msgstr ""
 
-#: view/theme/duepuntozero/config.php:56
-msgid "greenzero"
+#: src/Object/Post.php:158
+msgid "Private Message"
 msgstr ""
 
-#: view/theme/duepuntozero/config.php:57
-msgid "purplezero"
+#: src/Object/Post.php:200
+msgid "Delete locally"
 msgstr ""
 
-#: view/theme/duepuntozero/config.php:58
-msgid "easterbunny"
+#: src/Object/Post.php:203
+msgid "Delete globally"
 msgstr ""
 
-#: view/theme/duepuntozero/config.php:59
-msgid "darkzero"
+#: src/Object/Post.php:203
+msgid "Remove locally"
 msgstr ""
 
-#: view/theme/duepuntozero/config.php:60
-msgid "comix"
+#: src/Object/Post.php:217
+msgid "save to folder"
 msgstr ""
 
-#: view/theme/duepuntozero/config.php:61
-msgid "slackr"
+#: src/Object/Post.php:252
+msgid "I will attend"
 msgstr ""
 
-#: view/theme/duepuntozero/config.php:74
-msgid "Variations"
+#: src/Object/Post.php:252
+msgid "I will not attend"
 msgstr ""
 
-#: view/theme/frio/config.php:105
-msgid "Custom"
+#: src/Object/Post.php:252
+msgid "I might attend"
 msgstr ""
 
-#: view/theme/frio/config.php:117
-msgid "Note"
+#: src/Object/Post.php:280
+msgid "ignore thread"
 msgstr ""
 
-#: view/theme/frio/config.php:117
-msgid "Check image permissions if all users are allowed to see the image"
+#: src/Object/Post.php:281
+msgid "unignore thread"
 msgstr ""
 
-#: view/theme/frio/config.php:123
-msgid "Select color scheme"
+#: src/Object/Post.php:282
+msgid "toggle ignore status"
 msgstr ""
 
-#: view/theme/frio/config.php:124
-msgid "Copy or paste schemestring"
+#: src/Object/Post.php:293
+msgid "add star"
 msgstr ""
 
-#: view/theme/frio/config.php:124
-msgid ""
-"You can copy this string to share your theme with others. Pasting here "
-"applies the schemestring"
+#: src/Object/Post.php:294
+msgid "remove star"
 msgstr ""
 
-#: view/theme/frio/config.php:125
-msgid "Navigation bar background color"
+#: src/Object/Post.php:295
+msgid "toggle star status"
 msgstr ""
 
-#: view/theme/frio/config.php:126
-msgid "Navigation bar icon color "
+#: src/Object/Post.php:298
+msgid "starred"
 msgstr ""
 
-#: view/theme/frio/config.php:127
-msgid "Link color"
+#: src/Object/Post.php:302
+msgid "add tag"
 msgstr ""
 
-#: view/theme/frio/config.php:128
-msgid "Set the background color"
+#: src/Object/Post.php:313
+msgid "like"
 msgstr ""
 
-#: view/theme/frio/config.php:129
-msgid "Content background opacity"
+#: src/Object/Post.php:314
+msgid "dislike"
 msgstr ""
 
-#: view/theme/frio/config.php:130
-msgid "Set the background image"
+#: src/Object/Post.php:317
+msgid "Share this"
 msgstr ""
 
-#: view/theme/frio/config.php:131
-msgid "Background image style"
+#: src/Object/Post.php:317
+msgid "share"
 msgstr ""
 
-#: view/theme/frio/config.php:136
-msgid "Login page background image"
+#: src/Object/Post.php:385
+msgid "to"
 msgstr ""
 
-#: view/theme/frio/config.php:140
-msgid "Login page background color"
+#: src/Object/Post.php:386
+msgid "via"
 msgstr ""
 
-#: view/theme/frio/config.php:140
-msgid "Leave background image and color empty for theme defaults"
+#: src/Object/Post.php:387
+msgid "Wall-to-Wall"
 msgstr ""
 
-#: view/theme/frio/php/Image.php:24
-msgid "Top Banner"
+#: src/Object/Post.php:388
+msgid "via Wall-To-Wall:"
 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."
+#: src/Object/Post.php:421
+#, php-format
+msgid "Reply to %s"
 msgstr ""
 
-#: view/theme/frio/php/Image.php:25
-msgid "Full screen"
+#: src/Object/Post.php:436
+msgid "Notifier task is pending"
 msgstr ""
 
-#: view/theme/frio/php/Image.php:25
-msgid ""
-"Resize image to fill entire screen, clipping either the right or the bottom."
+#: src/Object/Post.php:437
+msgid "Delivery to remote servers is pending"
 msgstr ""
 
-#: view/theme/frio/php/Image.php:26
-msgid "Single row mosaic"
+#: src/Object/Post.php:438
+msgid "Delivery to remote servers is underway"
 msgstr ""
 
-#: view/theme/frio/php/Image.php:26
-msgid ""
-"Resize image to repeat it on a single row, either vertical or horizontal."
+#: src/Object/Post.php:439
+msgid "Delivery to remote servers is mostly done"
 msgstr ""
 
-#: view/theme/frio/php/Image.php:27
-msgid "Mosaic"
+#: src/Object/Post.php:440
+msgid "Delivery to remote servers is done"
 msgstr ""
 
-#: view/theme/frio/php/Image.php:27
-msgid "Repeat image to fill the screen."
+#: src/Object/Post.php:460
+#, php-format
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Object/Post.php:461
+msgid "Show more"
 msgstr ""
 
-#: view/theme/frio/theme.php:239
-msgid "Guest"
+#: src/Object/Post.php:462
+msgid "Show fewer"
 msgstr ""
 
-#: view/theme/frio/theme.php:244
-msgid "Visitor"
+#: src/LegacyModule.php:30
+#, php-format
+msgid "Legacy module file not found: %s"
 msgstr ""
 
-#: view/theme/quattro/config.php:76
-msgid "Alignment"
+#: src/App.php:505
+msgid "Delete this item?"
 msgstr ""
 
-#: view/theme/quattro/config.php:76
-msgid "Left"
+#: src/App.php:547
+msgid "toggle mobile"
 msgstr ""
 
-#: view/theme/quattro/config.php:76
-msgid "Center"
+#: src/App.php:863
+msgid "No system theme config value set."
 msgstr ""
 
-#: view/theme/quattro/config.php:77
-msgid "Color scheme"
+#: src/App.php:1151
+msgid "You must be logged in to use addons. "
 msgstr ""
 
-#: view/theme/quattro/config.php:78
-msgid "Posts font size"
+#: src/BaseModule.php:135
+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 ""
 
-#: view/theme/quattro/config.php:79
-msgid "Textareas font size"
+#: src/Console/ArchiveContact.php:86
+#, php-format
+msgid "Could not find any unarchived contact entry for this URL (%s)"
 msgstr ""
 
-#: view/theme/vier/config.php:76
-msgid "Comma separated list of helper forums"
+#: src/Console/ArchiveContact.php:89
+msgid "The contact entries have been archived"
 msgstr ""
 
-#: view/theme/vier/config.php:122
-msgid "Set style"
+#: src/Console/NewPassword.php:93
+msgid "Enter new password: "
 msgstr ""
 
-#: view/theme/vier/config.php:123
-msgid "Community Pages"
+#: src/Console/PostUpdate.php:73
+#, php-format
+msgid "Post update version number has been set to %s."
 msgstr ""
 
-#: view/theme/vier/config.php:124 view/theme/vier/theme.php:151
-msgid "Community Profiles"
+#: src/Console/PostUpdate.php:81
+msgid "Check for pending update actions."
 msgstr ""
 
-#: view/theme/vier/config.php:125
-msgid "Help or @NewHere ?"
+#: src/Console/PostUpdate.php:83
+msgid "Done."
 msgstr ""
 
-#: view/theme/vier/config.php:126 view/theme/vier/theme.php:373
-msgid "Connect Services"
+#: src/Console/PostUpdate.php:85
+msgid "Execute pending post updates."
 msgstr ""
 
-#: view/theme/vier/config.php:127
-msgid "Find Friends"
+#: src/Console/PostUpdate.php:91
+msgid "All pending post updates are done."
 msgstr ""
 
-#: view/theme/vier/config.php:128 view/theme/vier/theme.php:181
-msgid "Last users"
+#: update.php:218
+#, php-format
+msgid "%s: Updating author-id and owner-id in item and thread table. "
 msgstr ""
 
-#: view/theme/vier/theme.php:288
-msgid "Quick Start"
+#: update.php:273
+#, php-format
+msgid "%s: Updating post-type."
 msgstr ""
index c57ca914e33b7bbc04975627928b7f4aeae9d26d..57d1758f67fabeed059bb25363ea52c372c375a9 100644 (file)
@@ -18,7 +18,7 @@
 # greeneyedred <greeneyedred@googlemail.com>, 2012
 # Hauke <hzuehl@phone-talk.net>, 2012,2018
 # Herbert Thielen <thielen@hs-worms.de>, 2017
-# hoergen <hoergen@hoergen.org>, 2018
+# hoergen <hoergen@hoergen.org>, 2018-2019
 # hoergen <hoergen@hoergen.org>, 2018
 # Hauke <hzuehl@phone-talk.net>, 2011-2012
 # Johannes Schwab <johannes_schwab@gmx.de>, 2015
@@ -45,8 +45,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-15 08:55-0400\n"
-"PO-Revision-Date: 2019-06-18 10:37+0000\n"
+"POT-Creation-Date: 2019-08-06 16:52+0200\n"
+"PO-Revision-Date: 2019-08-07 10:53+0000\n"
 "Last-Translator: Copiis Praeesse <richard@zsemberi.de>\n"
 "Language-Team: German (http://www.transifex.com/Friendica/friendica/language/de/)\n"
 "MIME-Version: 1.0\n"
@@ -55,825 +55,837 @@ msgstr ""
 "Language: de\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: include/api.php:1116
-#, 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] "Das tägliche Limit von %d Beitrag wurde erreicht. Die Nachricht wurde verworfen."
-msgstr[1] "Das tägliche Limit von %d Beiträgen wurde erreicht. Der Beitrag wurde verworfen."
+#: include/enotify.php:57
+msgid "Friendica Notification"
+msgstr "Friendica-Benachrichtigung"
 
-#: include/api.php:1130
-#, 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] "Das wöchentliche Limit von %d Beitrag wurde erreicht. Die Nachricht wurde verworfen."
-msgstr[1] "Das wöchentliche Limit von %d Beiträgen wurde erreicht. Der Beitrag wurde verworfen."
+#: include/enotify.php:60
+msgid "Thank You,"
+msgstr "Danke,"
 
-#: include/api.php:1144
+#: include/enotify.php:63
 #, php-format
-msgid "Monthly posting limit of %d post reached. The post was rejected."
-msgstr "Das monatliche Limit von %d Beiträgen wurde erreicht. Der Beitrag wurde verworfen."
+msgid "%1$s, %2$s Administrator"
+msgstr "%1$s, %2$s Administrator"
 
-#: include/api.php:4511 mod/photos.php:91 mod/photos.php:193
-#: mod/photos.php:636 mod/photos.php:1082 mod/photos.php:1099
-#: mod/photos.php:1601 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:763
-#: src/Model/User.php:771 src/Model/User.php:779
-msgid "Profile Photos"
-msgstr "Profilbilder"
+#: include/enotify.php:65
+#, php-format
+msgid "%s Administrator"
+msgstr "der Administrator von %s"
 
-#: include/conversation.php:160 include/conversation.php:297
-#: src/Model/Item.php:3253
-msgid "event"
-msgstr "Veranstaltung"
+#: include/enotify.php:134
+#, php-format
+msgid "[Friendica:Notify] New mail received at %s"
+msgstr "[Friendica-Meldung] Neue Email erhalten um %s"
 
-#: include/conversation.php:163 include/conversation.php:173
-#: include/conversation.php:300 include/conversation.php:309
-#: mod/subthread.php:88 mod/tagger.php:68
-msgid "status"
-msgstr "Status"
+#: include/enotify.php:136
+#, php-format
+msgid "%1$s sent you a new private message at %2$s."
+msgstr "%1$s hat dir eine neue, private Nachricht um %2$s geschickt."
 
-#: include/conversation.php:168 include/conversation.php:305
-#: mod/subthread.php:88 mod/tagger.php:68 src/Model/Item.php:3255
-msgid "photo"
-msgstr "Foto"
+#: include/enotify.php:137
+msgid "a private message"
+msgstr "eine private Nachricht"
 
-#: include/conversation.php:181
+#: include/enotify.php:137
 #, php-format
-msgid "%1$s likes %2$s's %3$s"
-msgstr "%1$s Gefällt %2$ss %3$s"
+msgid "%1$s sent you %2$s."
+msgstr "%1$s schickte dir %2$s."
 
-#: include/conversation.php:183
+#: include/enotify.php:139
 #, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
-msgstr "%1$s Gefällt %2$ss %3$s nicht"
+msgid "Please visit %s to view and/or reply to your private messages."
+msgstr "Bitte besuche %s, um Deine privaten Nachrichten anzusehen und/oder zu beantworten."
 
-#: include/conversation.php:185
+#: include/enotify.php:172
 #, php-format
-msgid "%1$s attends %2$s's %3$s"
-msgstr "%1$s nimmt an %2$ss %3$s teil."
+msgid "%1$s tagged you on [url=%2$s]a %3$s[/url]"
+msgstr "%1$s erwähnte dich in [url=%2$s] einem %3$s[/url]"
 
-#: include/conversation.php:187
+#: include/enotify.php:178
 #, php-format
-msgid "%1$s doesn't attend %2$s's %3$s"
-msgstr "%1$s nimmt nicht an %2$ss %3$s teil."
+msgid "%1$s commented on [url=%2$s]a %3$s[/url]"
+msgstr "%1$s kommentierte [url=%2$s]a %3$s[/url]"
 
-#: include/conversation.php:189
+#: include/enotify.php:188
 #, php-format
-msgid "%1$s attends maybe %2$s's %3$s"
-msgstr "%1$s nimmt eventuell an %2$ss %3$s teil."
+msgid "%1$s tagged you on [url=%2$s]%3$s's %4$s[/url]"
+msgstr "%1$s erwähnte dich auf  [url=%2$s]%3$s's %4$s[/url]"
 
-#: include/conversation.php:224
+#: include/enotify.php:195
 #, php-format
-msgid "%1$s is now friends with %2$s"
-msgstr "%1$s ist nun mit %2$s befreundet"
+msgid "%1$s commented on [url=%2$s]%3$s's %4$s[/url]"
+msgstr "%1$s kommentierte [url=%2$s]%3$ss %4$s[/url]"
 
-#: include/conversation.php:265
+#: include/enotify.php:207
 #, php-format
-msgid "%1$s poked %2$s"
-msgstr "%1$s stupste %2$s"
+msgid "%1$s tagged you on [url=%2$s]your %3$s[/url]"
+msgstr "%1$s erwähnte dich auf [url=%2$s]deinem %3$s[/url]"
 
-#: include/conversation.php:319 mod/tagger.php:101
+#: include/enotify.php:213
 #, php-format
-msgid "%1$s tagged %2$s's %3$s with %4$s"
-msgstr "%1$s hat %2$ss %3$s mit %4$s getaggt"
-
-#: include/conversation.php:341
-msgid "post/item"
-msgstr "Nachricht/Beitrag"
+msgid "%1$s commented on [url=%2$s]your %3$s[/url]"
+msgstr "%1$s kommentierte [url=%2$s]deinen %3$s[/url]"
 
-#: include/conversation.php:342
+#: include/enotify.php:224
 #, php-format
-msgid "%1$s marked %2$s's %3$s as favorite"
-msgstr "%1$s hat %2$s\\s %3$s als Favorit markiert"
-
-#: include/conversation.php:568 mod/photos.php:1433 mod/profiles.php:352
-msgid "Likes"
-msgstr "Likes"
-
-#: include/conversation.php:569 mod/photos.php:1433 mod/profiles.php:355
-msgid "Dislikes"
-msgstr "Dislikes"
-
-#: include/conversation.php:570 include/conversation.php:1564
-#: mod/photos.php:1434
-msgid "Attending"
-msgid_plural "Attending"
-msgstr[0] "Teilnehmend"
-msgstr[1] "Teilnehmend"
-
-#: include/conversation.php:571 mod/photos.php:1434
-msgid "Not attending"
-msgstr "Nicht teilnehmend"
-
-#: include/conversation.php:572 mod/photos.php:1434
-msgid "Might attend"
-msgstr "Eventuell teilnehmend"
-
-#: include/conversation.php:573
-msgid "Reshares"
-msgstr "Reshares"
-
-#: include/conversation.php:653 mod/photos.php:1490 src/Object/Post.php:208
-msgid "Select"
-msgstr "Auswählen"
-
-#: include/conversation.php:654 mod/photos.php:1491 mod/settings.php:735
-#: src/Module/Admin/Users.php:288 src/Module/Contact.php:830
-#: src/Module/Contact.php:1105
-msgid "Delete"
-msgstr "Löschen"
+msgid "%1$s tagged you on [url=%2$s]their %3$s[/url]"
+msgstr "%1$s erwähnte dich im [url=%2$s]eigenen %3$s[/url]"
 
-#: include/conversation.php:679 src/Object/Post.php:382
-#: src/Object/Post.php:383
+#: include/enotify.php:230
 #, php-format
-msgid "View %s's profile @ %s"
-msgstr "Das Profil von %s auf %s betrachten."
-
-#: include/conversation.php:692 src/Object/Post.php:370
-msgid "Categories:"
-msgstr "Kategorien:"
-
-#: include/conversation.php:693 src/Object/Post.php:371
-msgid "Filed under:"
-msgstr "Abgelegt unter:"
+msgid "%1$s commented on [url=%2$s]their %3$s[/url]"
+msgstr "%1$s kommentierte den [url=%2$s]eigenen %3$s[/url]"
 
-#: include/conversation.php:700 src/Object/Post.php:396
+#: include/enotify.php:243
 #, php-format
-msgid "%s from %s"
-msgstr "%s von %s"
-
-#: include/conversation.php:715
-msgid "View in context"
-msgstr "Im Zusammenhang betrachten"
-
-#: include/conversation.php:717 include/conversation.php:1230
-#: mod/editpost.php:86 mod/message.php:260 mod/message.php:442
-#: mod/photos.php:1406 mod/wallmessage.php:141 src/Object/Post.php:423
-msgid "Please wait"
-msgstr "Bitte warten"
-
-#: include/conversation.php:781
-msgid "remove"
-msgstr "löschen"
-
-#: include/conversation.php:785
-msgid "Delete Selected Items"
-msgstr "Lösche die markierten Beiträge"
-
-#: include/conversation.php:940 view/theme/frio/theme.php:358
-msgid "Follow Thread"
-msgstr "Folge der Unterhaltung"
-
-#: include/conversation.php:941 src/Model/Contact.php:1111
-msgid "View Status"
-msgstr "Pinnwand anschauen"
-
-#: include/conversation.php:942 include/conversation.php:960
-#: mod/dirfind.php:226 mod/match.php:87 mod/suggest.php:87
-#: src/Model/Contact.php:1051 src/Model/Contact.php:1104
-#: src/Model/Contact.php:1112 src/Module/AllFriends.php:74
-#: src/Module/Directory.php:155
-msgid "View Profile"
-msgstr "Profil anschauen"
-
-#: include/conversation.php:943 src/Model/Contact.php:1113
-msgid "View Photos"
-msgstr "Bilder anschauen"
-
-#: include/conversation.php:944 src/Model/Contact.php:1105
-#: src/Model/Contact.php:1114
-msgid "Network Posts"
-msgstr "Netzwerkbeiträge"
-
-#: include/conversation.php:945 src/Model/Contact.php:1106
-#: src/Model/Contact.php:1115
-msgid "View Contact"
-msgstr "Kontakt anzeigen"
-
-#: include/conversation.php:946 src/Model/Contact.php:1117
-msgid "Send PM"
-msgstr "Private Nachricht senden"
-
-#: include/conversation.php:947 src/Module/Admin/Blocklist/Contact.php:66
-#: src/Module/Admin/Users.php:289 src/Module/Contact.php:624
-#: src/Module/Contact.php:827 src/Module/Contact.php:1080
-msgid "Block"
-msgstr "Sperren"
-
-#: include/conversation.php:948 mod/notifications.php:60
-#: mod/notifications.php:186 mod/notifications.php:279
-#: src/Module/Contact.php:625 src/Module/Contact.php:828
-#: src/Module/Contact.php:1088
-msgid "Ignore"
-msgstr "Ignorieren"
-
-#: include/conversation.php:952 src/Model/Contact.php:1118
-msgid "Poke"
-msgstr "Anstupsen"
-
-#: include/conversation.php:957 mod/dirfind.php:227 mod/follow.php:158
-#: mod/match.php:88 mod/suggest.php:88 src/Content/Widget.php:63
-#: src/Model/Contact.php:1107 src/Module/AllFriends.php:75
-#: src/Module/Contact.php:577 view/theme/vier/theme.php:201
-msgid "Connect/Follow"
-msgstr "Verbinden/Folgen"
+msgid "[Friendica:Notify] %s tagged you"
+msgstr "[Friendica-Meldung] %s hat dich erwähnt"
 
-#: include/conversation.php:1082
+#: include/enotify.php:245
 #, php-format
-msgid "%s likes this."
-msgstr "%s mag das."
+msgid "%1$s tagged you at %2$s"
+msgstr "%1$s erwähnte dich auf %2$s"
 
-#: include/conversation.php:1085
+#: include/enotify.php:247
 #, php-format
-msgid "%s doesn't like this."
-msgstr "%s mag das nicht."
+msgid "[Friendica:Notify] Comment to conversation #%1$d by %2$s"
+msgstr "[Friendica-Meldung] Kommentar zum Beitrag #%1$d von %2$s"
 
-#: include/conversation.php:1088
+#: include/enotify.php:249
 #, php-format
-msgid "%s attends."
-msgstr "%s nimmt teil."
+msgid "%s commented on an item/conversation you have been following."
+msgstr "%s hat einen Beitrag kommentiert, dem du folgst."
 
-#: include/conversation.php:1091
+#: include/enotify.php:254 include/enotify.php:269 include/enotify.php:284
+#: include/enotify.php:303 include/enotify.php:319
 #, php-format
-msgid "%s doesn't attend."
-msgstr "%s nimmt nicht teil."
+msgid "Please visit %s to view and/or reply to the conversation."
+msgstr "Bitte besuche %s, um die Konversation anzusehen und/oder zu kommentieren."
 
-#: include/conversation.php:1094
+#: include/enotify.php:261
 #, php-format
-msgid "%s attends maybe."
-msgstr "%s nimmt eventuell teil."
+msgid "[Friendica:Notify] %s posted to your profile wall"
+msgstr "[Friendica-Meldung] %s hat auf Deine Pinnwand geschrieben"
 
-#: include/conversation.php:1097 include/conversation.php:1140
+#: include/enotify.php:263
 #, php-format
-msgid "%s reshared this."
-msgstr "%s hat dies geteilt"
-
-#: include/conversation.php:1105
-msgid "and"
-msgstr "und"
+msgid "%1$s posted to your profile wall at %2$s"
+msgstr "%1$s schrieb um %2$s auf Deine Pinnwand"
 
-#: include/conversation.php:1111
+#: include/enotify.php:264
 #, php-format
-msgid "and %d other people"
-msgstr "und %dandere"
+msgid "%1$s posted to [url=%2$s]your wall[/url]"
+msgstr "%1$s hat etwas auf [url=%2$s]Deiner Pinnwand[/url] gepostet"
 
-#: include/conversation.php:1119
+#: include/enotify.php:276
 #, php-format
-msgid "<span  %1$s>%2$d people</span> like this"
-msgstr "<span  %1$s>%2$d Personen</span> mögen das"
+msgid "[Friendica:Notify] %s shared a new post"
+msgstr "[Friendica Benachrichtigung] %s hat einen Beitrag geteilt"
 
-#: include/conversation.php:1120
+#: include/enotify.php:278
 #, php-format
-msgid "%s like this."
-msgstr "%s mögen das."
+msgid "%1$s shared a new post at %2$s"
+msgstr "%1$s hat einen neuen Beitrag auf %2$s geteilt"
 
-#: include/conversation.php:1123
+#: include/enotify.php:279
 #, php-format
-msgid "<span  %1$s>%2$d people</span> don't like this"
-msgstr "<span  %1$s>%2$d Personen</span> mögen das nicht"
+msgid "%1$s [url=%2$s]shared a post[/url]."
+msgstr "%1$s [url=%2$s]hat einen Beitrag geteilt[/url]."
 
-#: include/conversation.php:1124
+#: include/enotify.php:291
 #, php-format
-msgid "%s don't like this."
-msgstr "%s mögen dies nicht."
+msgid "[Friendica:Notify] %1$s poked you"
+msgstr "[Friendica-Meldung] %1$s hat dich angestupst"
 
-#: include/conversation.php:1127
+#: include/enotify.php:293
 #, php-format
-msgid "<span  %1$s>%2$d people</span> attend"
-msgstr "<span %1$s>%2$d Personen</span> nehmen teil"
+msgid "%1$s poked you at %2$s"
+msgstr "%1$s hat dich auf %2$s angestupst"
 
-#: include/conversation.php:1128
+#: include/enotify.php:294
 #, php-format
-msgid "%s attend."
-msgstr "%s nehmen teil."
+msgid "%1$s [url=%2$s]poked you[/url]."
+msgstr "%1$s [url=%2$s]hat dich angestupst[/url]."
 
-#: include/conversation.php:1131
+#: include/enotify.php:311
 #, php-format
-msgid "<span  %1$s>%2$d people</span> don't attend"
-msgstr "<span %1$s>%2$d Personen</span> nehmen nicht teil"
+msgid "[Friendica:Notify] %s tagged your post"
+msgstr "[Friendica-Meldung] %s hat Deinen Beitrag getaggt"
 
-#: include/conversation.php:1132
+#: include/enotify.php:313
 #, php-format
-msgid "%s don't attend."
-msgstr "%s nehmen nicht teil."
+msgid "%1$s tagged your post at %2$s"
+msgstr "%1$s erwähnte Deinen Beitrag auf %2$s"
 
-#: include/conversation.php:1135
+#: include/enotify.php:314
 #, php-format
-msgid "<span  %1$s>%2$d people</span> attend maybe"
-msgstr "<span %1$s>%2$d Personen</span> nehmen eventuell teil"
+msgid "%1$s tagged [url=%2$s]your post[/url]"
+msgstr "%1$s erwähnte [url=%2$s]Deinen Beitrag[/url]"
 
-#: include/conversation.php:1136
-#, php-format
-msgid "%s attend maybe."
-msgstr "%s nimmt eventuell teil."
+#: include/enotify.php:326
+msgid "[Friendica:Notify] Introduction received"
+msgstr "[Friendica-Meldung] Kontaktanfrage erhalten"
 
-#: include/conversation.php:1139
+#: include/enotify.php:328
 #, php-format
-msgid "<span  %1$s>%2$d people</span> reshared this"
-msgstr "<span  %1$s>%2$d Personen</span> haben dies geteilt"
+msgid "You've received an introduction from '%1$s' at %2$s"
+msgstr "Du hast eine Kontaktanfrage von '%1$s' auf %2$s erhalten"
 
-#: include/conversation.php:1169
-msgid "Visible to <strong>everybody</strong>"
-msgstr "Für <strong>jedermann</strong> sichtbar"
+#: include/enotify.php:329
+#, php-format
+msgid "You've received [url=%1$s]an introduction[/url] from %2$s."
+msgstr "Du hast eine [url=%1$s]Kontaktanfrage[/url] von %2$s erhalten."
 
-#: include/conversation.php:1170 src/Object/Post.php:886
-msgid "Please enter a image/video/audio/webpage URL:"
-msgstr "Bitte gib eine Bild/Video/Audio/Webseiten-URL ein:"
+#: include/enotify.php:334 include/enotify.php:380
+#, php-format
+msgid "You may visit their profile at %s"
+msgstr "Hier kannst du das Profil betrachten: %s"
 
-#: include/conversation.php:1171
-msgid "Tag term:"
-msgstr "Tag:"
+#: include/enotify.php:336
+#, php-format
+msgid "Please visit %s to approve or reject the introduction."
+msgstr "Bitte besuche %s, um die Kontaktanfrage anzunehmen oder abzulehnen."
 
-#: include/conversation.php:1172 src/Module/Filer/SaveTag.php:49
-msgid "Save to Folder:"
-msgstr "In diesem Ordner speichern:"
+#: include/enotify.php:343
+msgid "[Friendica:Notify] A new person is sharing with you"
+msgstr "[Friendica Benachrichtigung] Eine neue Person teilt mit dir"
 
-#: include/conversation.php:1173
-msgid "Where are you right now?"
-msgstr "Wo hältst du dich jetzt gerade auf?"
+#: include/enotify.php:345 include/enotify.php:346
+#, php-format
+msgid "%1$s is sharing with you at %2$s"
+msgstr "%1$s teilt mit dir auf %2$s"
 
-#: include/conversation.php:1174
-msgid "Delete item(s)?"
-msgstr "Einträge löschen?"
+#: include/enotify.php:353
+msgid "[Friendica:Notify] You have a new follower"
+msgstr "[Friendica-Benachrichtigung] Du hast einen neuen Kontakt"
 
-#: include/conversation.php:1206
-msgid "New Post"
-msgstr "Neuer Beitrag"
+#: include/enotify.php:355 include/enotify.php:356
+#, php-format
+msgid "You have a new follower at %2$s : %1$s"
+msgstr "Du hast einen neuen Kontakt auf %2$s: %1$s"
 
-#: include/conversation.php:1209
-msgid "Share"
-msgstr "Teilen"
+#: include/enotify.php:369
+msgid "[Friendica:Notify] Friend suggestion received"
+msgstr "[Friendica-Meldung] Kontaktvorschlag erhalten"
 
-#: include/conversation.php:1210 mod/editpost.php:72 mod/message.php:258
-#: mod/message.php:439 mod/wallmessage.php:139
-msgid "Upload photo"
-msgstr "Foto hochladen"
+#: include/enotify.php:371
+#, php-format
+msgid "You've received a friend suggestion from '%1$s' at %2$s"
+msgstr "Du hast einen Kontakt-Vorschlag von '%1$s' auf %2$s erhalten"
 
-#: include/conversation.php:1211 mod/editpost.php:73
-msgid "upload photo"
-msgstr "Bild hochladen"
+#: include/enotify.php:372
+#, php-format
+msgid ""
+"You've received [url=%1$s]a friend suggestion[/url] for %2$s from %3$s."
+msgstr "Du hast einen [url=%1$s]Kontakt-Vorschlag[/url] %2$s von %3$s erhalten."
 
-#: include/conversation.php:1212 mod/editpost.php:74
-msgid "Attach file"
-msgstr "Datei anhängen"
+#: include/enotify.php:378
+msgid "Name:"
+msgstr "Name:"
 
-#: include/conversation.php:1213 mod/editpost.php:75
-msgid "attach file"
-msgstr "Datei anhängen"
+#: include/enotify.php:379
+msgid "Photo:"
+msgstr "Foto:"
 
-#: include/conversation.php:1214 src/Object/Post.php:878
-msgid "Bold"
-msgstr "Fett"
+#: include/enotify.php:382
+#, php-format
+msgid "Please visit %s to approve or reject the suggestion."
+msgstr "Bitte besuche %s, um den Vorschlag zu akzeptieren oder abzulehnen."
 
-#: include/conversation.php:1215 src/Object/Post.php:879
-msgid "Italic"
-msgstr "Kursiv"
+#: include/enotify.php:390 include/enotify.php:405
+msgid "[Friendica:Notify] Connection accepted"
+msgstr "[Friendica-Benachrichtigung] Kontaktanfrage bestätigt"
 
-#: include/conversation.php:1216 src/Object/Post.php:880
-msgid "Underline"
-msgstr "Unterstrichen"
+#: include/enotify.php:392 include/enotify.php:407
+#, php-format
+msgid "'%1$s' has accepted your connection request at %2$s"
+msgstr "'%1$s' hat Deine Kontaktanfrage auf  %2$s bestätigt"
 
-#: include/conversation.php:1217 src/Object/Post.php:881
-msgid "Quote"
-msgstr "Zitat"
+#: include/enotify.php:393 include/enotify.php:408
+#, php-format
+msgid "%2$s has accepted your [url=%1$s]connection request[/url]."
+msgstr "%2$s hat Deine [url=%1$s]Kontaktanfrage[/url] akzeptiert."
 
-#: include/conversation.php:1218 src/Object/Post.php:882
-msgid "Code"
-msgstr "Code"
+#: include/enotify.php:398
+msgid ""
+"You are now mutual friends and may exchange status updates, photos, and "
+"email without restriction."
+msgstr "Ihr seid nun beidseitige Kontakte und könnt Statusmitteilungen, Bilder und E-Mails ohne Einschränkungen austauschen."
 
-#: include/conversation.php:1219 src/Object/Post.php:883
-msgid "Image"
-msgstr "Bild"
+#: include/enotify.php:400
+#, php-format
+msgid "Please visit %s if you wish to make any changes to this relationship."
+msgstr "Bitte besuche %s, wenn du Änderungen an eurer Beziehung vornehmen willst."
 
-#: include/conversation.php:1220 src/Object/Post.php:884
-msgid "Link"
-msgstr "Link"
+#: include/enotify.php:413
+#, php-format
+msgid ""
+"'%1$s' has chosen to accept you a fan, which restricts some forms of "
+"communication - such as private messaging and some profile interactions. If "
+"this is a celebrity or community page, these settings were applied "
+"automatically."
+msgstr "'%1$s' hat sich entschieden dich als Fan zu akzeptieren, dies schränkt einige Kommunikationswege - wie private Nachrichten und einige Interaktionsmöglichkeiten auf der Profilseite - ein. Wenn dies eine Berühmtheiten- oder Gemeinschaftsseite ist, werden diese Einstellungen automatisch vorgenommen."
 
-#: include/conversation.php:1221 src/Object/Post.php:885
-msgid "Link or Media"
-msgstr "Link oder Mediendatei"
+#: include/enotify.php:415
+#, php-format
+msgid ""
+"'%1$s' may choose to extend this into a two-way or more permissive "
+"relationship in the future."
+msgstr "'%1$s' kann den Kontaktstatus zu einem späteren Zeitpunkt erweitern und diese Einschränkungen aufheben. "
 
-#: include/conversation.php:1222 mod/editpost.php:82
-msgid "Set your location"
-msgstr "Deinen Standort festlegen"
+#: include/enotify.php:417
+#, php-format
+msgid "Please visit %s  if you wish to make any changes to this relationship."
+msgstr "Bitte besuche %s, wenn du Änderungen an eurer Beziehung vornehmen willst."
 
-#: include/conversation.php:1223 mod/editpost.php:83
-msgid "set location"
-msgstr "Ort setzen"
+#: include/enotify.php:427 mod/removeme.php:46
+msgid "[Friendica System Notify]"
+msgstr "[Friendica-Systembenachrichtigung]"
 
-#: include/conversation.php:1224 mod/editpost.php:84
-msgid "Clear browser location"
-msgstr "Browser-Standort leeren"
+#: include/enotify.php:427
+msgid "registration request"
+msgstr "Registrierungsanfrage"
 
-#: include/conversation.php:1225 mod/editpost.php:85
-msgid "clear location"
-msgstr "Ort löschen"
+#: include/enotify.php:429
+#, php-format
+msgid "You've received a registration request from '%1$s' at %2$s"
+msgstr "Du hast eine Registrierungsanfrage von %2$s auf '%1$s' erhalten"
 
-#: include/conversation.php:1227 mod/editpost.php:99
-msgid "Set title"
-msgstr "Titel setzen"
+#: include/enotify.php:430
+#, php-format
+msgid "You've received a [url=%1$s]registration request[/url] from %2$s."
+msgstr "Du hast eine [url=%1$s]Registrierungsanfrage[/url] von %2$s erhalten."
 
-#: include/conversation.php:1229 mod/editpost.php:101
-msgid "Categories (comma-separated list)"
-msgstr "Kategorien (kommasepariert)"
+#: include/enotify.php:435
+#, php-format
+msgid ""
+"Full Name:\t%s\n"
+"Site Location:\t%s\n"
+"Login Name:\t%s (%s)"
+msgstr "Kompletter Name: %s\nURL der Seite: %s\nLogin Name: %s(%s)"
 
-#: include/conversation.php:1231 mod/editpost.php:87
-msgid "Permission settings"
-msgstr "Berechtigungseinstellungen"
+#: include/enotify.php:441
+#, php-format
+msgid "Please visit %s to approve or reject the request."
+msgstr "Bitte besuche %s, um die Anfrage zu bearbeiten."
 
-#: include/conversation.php:1232 mod/editpost.php:116
-msgid "permissions"
-msgstr "Zugriffsrechte"
+#: include/api.php:1119
+#, 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] "Das tägliche Limit von %d Beitrag wurde erreicht. Die Nachricht wurde verworfen."
+msgstr[1] "Das tägliche Limit von %d Beiträgen wurde erreicht. Der Beitrag wurde verworfen."
 
-#: include/conversation.php:1241 mod/editpost.php:96
-msgid "Public post"
-msgstr "Öffentlicher Beitrag"
+#: include/api.php:1133
+#, 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] "Das wöchentliche Limit von %d Beitrag wurde erreicht. Die Nachricht wurde verworfen."
+msgstr[1] "Das wöchentliche Limit von %d Beiträgen wurde erreicht. Der Beitrag wurde verworfen."
 
-#: include/conversation.php:1245 mod/editpost.php:107 mod/events.php:549
-#: mod/photos.php:1424 mod/photos.php:1463 mod/photos.php:1523
-#: src/Object/Post.php:887
-msgid "Preview"
-msgstr "Vorschau"
+#: include/api.php:1147
+#, php-format
+msgid "Monthly posting limit of %d post reached. The post was rejected."
+msgstr "Das monatliche Limit von %d Beiträgen wurde erreicht. Der Beitrag wurde verworfen."
 
-#: include/conversation.php:1249 include/items.php:397
-#: mod/dfrn_request.php:650 mod/editpost.php:110 mod/fbrowser.php:110
-#: mod/fbrowser.php:139 mod/follow.php:172 mod/message.php:153
-#: mod/photos.php:1076 mod/photos.php:1183 mod/settings.php:675
-#: mod/settings.php:701 mod/suggest.php:76 mod/tagrm.php:20 mod/tagrm.php:115
-#: mod/unfollow.php:132 src/Module/Contact.php:450
-msgid "Cancel"
-msgstr "Abbrechen"
+#: include/api.php:4587 mod/photos.php:91 mod/photos.php:196
+#: mod/photos.php:640 mod/photos.php:1090 mod/photos.php:1107
+#: mod/photos.php:1610 mod/profile_photo.php:85 mod/profile_photo.php:94
+#: mod/profile_photo.php:103 mod/profile_photo.php:210
+#: mod/profile_photo.php:298 mod/profile_photo.php:308 src/Model/User.php:796
+#: src/Model/User.php:804 src/Model/User.php:812
+msgid "Profile Photos"
+msgstr "Profilbilder"
 
-#: include/conversation.php:1254
-msgid "Post to Groups"
-msgstr "Poste an Gruppe"
+#: include/conversation.php:161 include/conversation.php:298
+#: src/Model/Item.php:3300
+msgid "event"
+msgstr "Veranstaltung"
 
-#: include/conversation.php:1255
-msgid "Post to Contacts"
-msgstr "Poste an Kontakte"
+#: include/conversation.php:164 include/conversation.php:174
+#: include/conversation.php:301 include/conversation.php:310
+#: mod/subthread.php:88 mod/tagger.php:69
+msgid "status"
+msgstr "Status"
 
-#: include/conversation.php:1256
-msgid "Private post"
-msgstr "Privater Beitrag"
+#: include/conversation.php:169 include/conversation.php:306
+#: mod/subthread.php:88 mod/tagger.php:69 src/Model/Item.php:3302
+msgid "photo"
+msgstr "Foto"
 
-#: include/conversation.php:1261 mod/editpost.php:114
-#: src/Model/Profile.php:366
-msgid "Message"
-msgstr "Nachricht"
+#: include/conversation.php:182
+#, php-format
+msgid "%1$s likes %2$s's %3$s"
+msgstr "%1$s Gefällt %2$ss %3$s"
 
-#: include/conversation.php:1262 mod/editpost.php:115
-msgid "Browser"
-msgstr "Browser"
+#: include/conversation.php:184
+#, php-format
+msgid "%1$s doesn't like %2$s's %3$s"
+msgstr "%1$s Gefällt %2$ss %3$s nicht"
 
-#: include/conversation.php:1534
-msgid "View all"
-msgstr "Zeige alle"
+#: include/conversation.php:186
+#, php-format
+msgid "%1$s attends %2$s's %3$s"
+msgstr "%1$s nimmt an %2$ss %3$s teil."
 
-#: include/conversation.php:1558
-msgid "Like"
-msgid_plural "Likes"
-msgstr[0] "mag ich"
-msgstr[1] "Mag ich"
+#: include/conversation.php:188
+#, php-format
+msgid "%1$s doesn't attend %2$s's %3$s"
+msgstr "%1$s nimmt nicht an %2$ss %3$s teil."
 
-#: include/conversation.php:1561
-msgid "Dislike"
-msgid_plural "Dislikes"
-msgstr[0] "mag ich nicht"
-msgstr[1] "Mag ich nicht"
+#: include/conversation.php:190
+#, php-format
+msgid "%1$s attends maybe %2$s's %3$s"
+msgstr "%1$s nimmt eventuell an %2$ss %3$s teil."
 
-#: include/conversation.php:1567
-msgid "Not Attending"
-msgid_plural "Not Attending"
-msgstr[0] "Nicht teilnehmend "
-msgstr[1] "Nicht teilnehmend"
+#: include/conversation.php:225
+#, php-format
+msgid "%1$s is now friends with %2$s"
+msgstr "%1$s ist nun mit %2$s befreundet"
 
-#: include/conversation.php:1570 src/Content/ContactSelector.php:167
-msgid "Undecided"
-msgid_plural "Undecided"
-msgstr[0] "Unentschieden"
-msgstr[1] "Unentschieden"
+#: include/conversation.php:266
+#, php-format
+msgid "%1$s poked %2$s"
+msgstr "%1$s stupste %2$s"
 
-#: include/enotify.php:57
-msgid "Friendica Notification"
-msgstr "Friendica-Benachrichtigung"
+#: include/conversation.php:320 mod/tagger.php:102
+#, php-format
+msgid "%1$s tagged %2$s's %3$s with %4$s"
+msgstr "%1$s hat %2$ss %3$s mit %4$s getaggt"
 
-#: include/enotify.php:60
-msgid "Thank You,"
-msgstr "Danke,"
+#: include/conversation.php:342
+msgid "post/item"
+msgstr "Nachricht/Beitrag"
 
-#: include/enotify.php:63
+#: include/conversation.php:343
 #, php-format
-msgid "%1$s, %2$s Administrator"
-msgstr "%1$s, %2$s Administrator"
+msgid "%1$s marked %2$s's %3$s as favorite"
+msgstr "%1$s hat %2$s\\s %3$s als Favorit markiert"
 
-#: include/enotify.php:65
-#, php-format
-msgid "%s Administrator"
-msgstr "der Administrator von %s"
+#: include/conversation.php:569 mod/profiles.php:352 mod/photos.php:1442
+msgid "Likes"
+msgstr "Likes"
 
-#: include/enotify.php:134
-#, php-format
-msgid "[Friendica:Notify] New mail received at %s"
-msgstr "[Friendica-Meldung] Neue Email erhalten um %s"
+#: include/conversation.php:570 mod/profiles.php:355 mod/photos.php:1442
+msgid "Dislikes"
+msgstr "Dislikes"
 
-#: include/enotify.php:136
-#, php-format
-msgid "%1$s sent you a new private message at %2$s."
-msgstr "%1$s hat dir eine neue, private Nachricht um %2$s geschickt."
+#: include/conversation.php:571 include/conversation.php:1565
+#: mod/photos.php:1443
+msgid "Attending"
+msgid_plural "Attending"
+msgstr[0] "Teilnehmend"
+msgstr[1] "Teilnehmend"
 
-#: include/enotify.php:137
-msgid "a private message"
-msgstr "eine private Nachricht"
+#: include/conversation.php:572 mod/photos.php:1443
+msgid "Not attending"
+msgstr "Nicht teilnehmend"
 
-#: include/enotify.php:137
-#, php-format
-msgid "%1$s sent you %2$s."
-msgstr "%1$s schickte dir %2$s."
+#: include/conversation.php:573 mod/photos.php:1443
+msgid "Might attend"
+msgstr "Eventuell teilnehmend"
 
-#: include/enotify.php:139
-#, php-format
-msgid "Please visit %s to view and/or reply to your private messages."
-msgstr "Bitte besuche %s, um Deine privaten Nachrichten anzusehen und/oder zu beantworten."
+#: include/conversation.php:574
+msgid "Reshares"
+msgstr "Reshares"
 
-#: include/enotify.php:172
-#, php-format
-msgid "%1$s tagged you on [url=%2$s]a %3$s[/url]"
-msgstr "%1$s erwähnte dich in [url=%2$s] einem %3$s[/url]"
+#: include/conversation.php:654 mod/photos.php:1499 src/Object/Post.php:209
+msgid "Select"
+msgstr "Auswählen"
 
-#: include/enotify.php:178
-#, php-format
-msgid "%1$s commented on [url=%2$s]a %3$s[/url]"
-msgstr "%1$s kommentierte [url=%2$s]a %3$s[/url]"
+#: include/conversation.php:655 mod/photos.php:1500 mod/settings.php:738
+#: src/Module/Admin/Users.php:288 src/Module/Contact.php:830
+#: src/Module/Contact.php:1101
+msgid "Delete"
+msgstr "Löschen"
 
-#: include/enotify.php:188
+#: include/conversation.php:680 src/Object/Post.php:383
+#: src/Object/Post.php:384
 #, php-format
-msgid "%1$s tagged you on [url=%2$s]%3$s's %4$s[/url]"
-msgstr "%1$s erwähnte dich auf  [url=%2$s]%3$s's %4$s[/url]"
+msgid "View %s's profile @ %s"
+msgstr "Das Profil von %s auf %s betrachten."
 
-#: include/enotify.php:195
-#, php-format
-msgid "%1$s commented on [url=%2$s]%3$s's %4$s[/url]"
-msgstr "%1$s kommentierte [url=%2$s]%3$ss %4$s[/url]"
+#: include/conversation.php:693 src/Object/Post.php:371
+msgid "Categories:"
+msgstr "Kategorien:"
 
-#: include/enotify.php:207
-#, php-format
-msgid "%1$s tagged you on [url=%2$s]your %3$s[/url]"
-msgstr "%1$s erwähnte dich auf [url=%2$s]deinem %3$s[/url]"
+#: include/conversation.php:694 src/Object/Post.php:372
+msgid "Filed under:"
+msgstr "Abgelegt unter:"
 
-#: include/enotify.php:213
+#: include/conversation.php:701 src/Object/Post.php:397
 #, php-format
-msgid "%1$s commented on [url=%2$s]your %3$s[/url]"
-msgstr "%1$s kommentierte [url=%2$s]deinen %3$s[/url]"
+msgid "%s from %s"
+msgstr "%s von %s"
 
-#: include/enotify.php:224
-#, php-format
-msgid "%1$s tagged you on [url=%2$s]their %3$s[/url]"
-msgstr "%1$s erwähnte dich im [url=%2$s]eigenen %3$s[/url]"
+#: include/conversation.php:716
+msgid "View in context"
+msgstr "Im Zusammenhang betrachten"
 
-#: include/enotify.php:230
-#, php-format
-msgid "%1$s commented on [url=%2$s]their %3$s[/url]"
-msgstr "%1$s kommentierte den [url=%2$s]eigenen %3$s[/url]"
+#: include/conversation.php:718 include/conversation.php:1231
+#: mod/wallmessage.php:141 mod/editpost.php:86 mod/message.php:260
+#: mod/message.php:442 mod/photos.php:1415 src/Module/Item/Compose.php:193
+#: src/Object/Post.php:424
+msgid "Please wait"
+msgstr "Bitte warten"
 
-#: include/enotify.php:243
+#: include/conversation.php:782
+msgid "remove"
+msgstr "löschen"
+
+#: include/conversation.php:786
+msgid "Delete Selected Items"
+msgstr "Lösche die markierten Beiträge"
+
+#: include/conversation.php:941 view/theme/frio/theme.php:363
+msgid "Follow Thread"
+msgstr "Folge der Unterhaltung"
+
+#: include/conversation.php:942 src/Model/Contact.php:1198
+msgid "View Status"
+msgstr "Pinnwand anschauen"
+
+#: include/conversation.php:943 include/conversation.php:961 mod/match.php:87
+#: mod/suggest.php:87 src/Model/Contact.php:1138 src/Model/Contact.php:1191
+#: src/Model/Contact.php:1199 src/Module/AllFriends.php:74
+#: src/Module/BaseSearchModule.php:133 src/Module/Directory.php:150
+msgid "View Profile"
+msgstr "Profil anschauen"
+
+#: include/conversation.php:944 src/Model/Contact.php:1200
+msgid "View Photos"
+msgstr "Bilder anschauen"
+
+#: include/conversation.php:945 src/Model/Contact.php:1192
+#: src/Model/Contact.php:1201
+msgid "Network Posts"
+msgstr "Netzwerkbeiträge"
+
+#: include/conversation.php:946 src/Model/Contact.php:1193
+#: src/Model/Contact.php:1202
+msgid "View Contact"
+msgstr "Kontakt anzeigen"
+
+#: include/conversation.php:947 src/Model/Contact.php:1204
+msgid "Send PM"
+msgstr "Private Nachricht senden"
+
+#: include/conversation.php:948 src/Module/Admin/Blocklist/Contact.php:67
+#: src/Module/Admin/Users.php:289 src/Module/Contact.php:623
+#: src/Module/Contact.php:827 src/Module/Contact.php:1076
+msgid "Block"
+msgstr "Sperren"
+
+#: include/conversation.php:949 mod/notifications.php:60
+#: mod/notifications.php:189 mod/notifications.php:282
+#: src/Module/Contact.php:624 src/Module/Contact.php:828
+#: src/Module/Contact.php:1084
+msgid "Ignore"
+msgstr "Ignorieren"
+
+#: include/conversation.php:953 src/Model/Contact.php:1205
+msgid "Poke"
+msgstr "Anstupsen"
+
+#: include/conversation.php:958 mod/match.php:88 mod/follow.php:160
+#: mod/suggest.php:88 view/theme/vier/theme.php:201 src/Content/Widget.php:66
+#: src/Model/Contact.php:1194 src/Module/AllFriends.php:75
+#: src/Module/BaseSearchModule.php:134
+msgid "Connect/Follow"
+msgstr "Verbinden/Folgen"
+
+#: include/conversation.php:1083
 #, php-format
-msgid "[Friendica:Notify] %s tagged you"
-msgstr "[Friendica-Meldung] %s hat dich erwähnt"
+msgid "%s likes this."
+msgstr "%s mag das."
 
-#: include/enotify.php:245
+#: include/conversation.php:1086
 #, php-format
-msgid "%1$s tagged you at %2$s"
-msgstr "%1$s erwähnte dich auf %2$s"
+msgid "%s doesn't like this."
+msgstr "%s mag das nicht."
 
-#: include/enotify.php:247
+#: include/conversation.php:1089
 #, php-format
-msgid "[Friendica:Notify] Comment to conversation #%1$d by %2$s"
-msgstr "[Friendica-Meldung] Kommentar zum Beitrag #%1$d von %2$s"
+msgid "%s attends."
+msgstr "%s nimmt teil."
 
-#: include/enotify.php:249
+#: include/conversation.php:1092
 #, php-format
-msgid "%s commented on an item/conversation you have been following."
-msgstr "%s hat einen Beitrag kommentiert, dem du folgst."
+msgid "%s doesn't attend."
+msgstr "%s nimmt nicht teil."
 
-#: include/enotify.php:254 include/enotify.php:269 include/enotify.php:284
-#: include/enotify.php:303 include/enotify.php:319
+#: include/conversation.php:1095
 #, php-format
-msgid "Please visit %s to view and/or reply to the conversation."
-msgstr "Bitte besuche %s, um die Konversation anzusehen und/oder zu kommentieren."
+msgid "%s attends maybe."
+msgstr "%s nimmt eventuell teil."
 
-#: include/enotify.php:261
+#: include/conversation.php:1098 include/conversation.php:1141
 #, php-format
-msgid "[Friendica:Notify] %s posted to your profile wall"
-msgstr "[Friendica-Meldung] %s hat auf Deine Pinnwand geschrieben"
+msgid "%s reshared this."
+msgstr "%s hat dies geteilt"
 
-#: include/enotify.php:263
+#: include/conversation.php:1106
+msgid "and"
+msgstr "und"
+
+#: include/conversation.php:1112
 #, php-format
-msgid "%1$s posted to your profile wall at %2$s"
-msgstr "%1$s schrieb um %2$s auf Deine Pinnwand"
+msgid "and %d other people"
+msgstr "und %dandere"
 
-#: include/enotify.php:264
+#: include/conversation.php:1120
 #, php-format
-msgid "%1$s posted to [url=%2$s]your wall[/url]"
-msgstr "%1$s hat etwas auf [url=%2$s]Deiner Pinnwand[/url] gepostet"
+msgid "<span  %1$s>%2$d people</span> like this"
+msgstr "<span  %1$s>%2$d Personen</span> mögen das"
 
-#: include/enotify.php:276
+#: include/conversation.php:1121
 #, php-format
-msgid "[Friendica:Notify] %s shared a new post"
-msgstr "[Friendica Benachrichtigung] %s hat einen Beitrag geteilt"
+msgid "%s like this."
+msgstr "%s mögen das."
 
-#: include/enotify.php:278
+#: include/conversation.php:1124
 #, php-format
-msgid "%1$s shared a new post at %2$s"
-msgstr "%1$s hat einen neuen Beitrag auf %2$s geteilt"
+msgid "<span  %1$s>%2$d people</span> don't like this"
+msgstr "<span  %1$s>%2$d Personen</span> mögen das nicht"
 
-#: include/enotify.php:279
+#: include/conversation.php:1125
 #, php-format
-msgid "%1$s [url=%2$s]shared a post[/url]."
-msgstr "%1$s [url=%2$s]hat einen Beitrag geteilt[/url]."
+msgid "%s don't like this."
+msgstr "%s mögen dies nicht."
 
-#: include/enotify.php:291
+#: include/conversation.php:1128
 #, php-format
-msgid "[Friendica:Notify] %1$s poked you"
-msgstr "[Friendica-Meldung] %1$s hat dich angestupst"
+msgid "<span  %1$s>%2$d people</span> attend"
+msgstr "<span %1$s>%2$d Personen</span> nehmen teil"
 
-#: include/enotify.php:293
+#: include/conversation.php:1129
 #, php-format
-msgid "%1$s poked you at %2$s"
-msgstr "%1$s hat dich auf %2$s angestupst"
+msgid "%s attend."
+msgstr "%s nehmen teil."
 
-#: include/enotify.php:294
+#: include/conversation.php:1132
 #, php-format
-msgid "%1$s [url=%2$s]poked you[/url]."
-msgstr "%1$s [url=%2$s]hat dich angestupst[/url]."
+msgid "<span  %1$s>%2$d people</span> don't attend"
+msgstr "<span %1$s>%2$d Personen</span> nehmen nicht teil"
 
-#: include/enotify.php:311
+#: include/conversation.php:1133
 #, php-format
-msgid "[Friendica:Notify] %s tagged your post"
-msgstr "[Friendica-Meldung] %s hat Deinen Beitrag getaggt"
+msgid "%s don't attend."
+msgstr "%s nehmen nicht teil."
 
-#: include/enotify.php:313
+#: include/conversation.php:1136
 #, php-format
-msgid "%1$s tagged your post at %2$s"
-msgstr "%1$s erwähnte Deinen Beitrag auf %2$s"
+msgid "<span  %1$s>%2$d people</span> attend maybe"
+msgstr "<span %1$s>%2$d Personen</span> nehmen eventuell teil"
 
-#: include/enotify.php:314
+#: include/conversation.php:1137
 #, php-format
-msgid "%1$s tagged [url=%2$s]your post[/url]"
-msgstr "%1$s erwähnte [url=%2$s]Deinen Beitrag[/url]"
+msgid "%s attend maybe."
+msgstr "%s nimmt eventuell teil."
 
-#: include/enotify.php:326
-msgid "[Friendica:Notify] Introduction received"
-msgstr "[Friendica-Meldung] Kontaktanfrage erhalten"
-
-#: include/enotify.php:328
+#: include/conversation.php:1140
 #, php-format
-msgid "You've received an introduction from '%1$s' at %2$s"
-msgstr "Du hast eine Kontaktanfrage von '%1$s' auf %2$s erhalten"
+msgid "<span  %1$s>%2$d people</span> reshared this"
+msgstr "<span  %1$s>%2$d Personen</span> haben dies geteilt"
 
-#: include/enotify.php:329
-#, php-format
-msgid "You've received [url=%1$s]an introduction[/url] from %2$s."
-msgstr "Du hast eine [url=%1$s]Kontaktanfrage[/url] von %2$s erhalten."
+#: include/conversation.php:1170
+msgid "Visible to <strong>everybody</strong>"
+msgstr "Für <strong>jedermann</strong> sichtbar"
 
-#: include/enotify.php:334 include/enotify.php:380
-#, php-format
-msgid "You may visit their profile at %s"
-msgstr "Hier kannst du das Profil betrachten: %s"
+#: include/conversation.php:1171 src/Module/Item/Compose.php:187
+#: src/Object/Post.php:887
+msgid "Please enter a image/video/audio/webpage URL:"
+msgstr "Bitte gib eine Bild/Video/Audio/Webseiten-URL ein:"
 
-#: include/enotify.php:336
-#, php-format
-msgid "Please visit %s to approve or reject the introduction."
-msgstr "Bitte besuche %s, um die Kontaktanfrage anzunehmen oder abzulehnen."
+#: include/conversation.php:1172
+msgid "Tag term:"
+msgstr "Tag:"
 
-#: include/enotify.php:343
-msgid "[Friendica:Notify] A new person is sharing with you"
-msgstr "[Friendica Benachrichtigung] Eine neue Person teilt mit dir"
+#: include/conversation.php:1173 src/Module/Filer/SaveTag.php:48
+msgid "Save to Folder:"
+msgstr "In diesem Ordner speichern:"
 
-#: include/enotify.php:345 include/enotify.php:346
-#, php-format
-msgid "%1$s is sharing with you at %2$s"
-msgstr "%1$s teilt mit dir auf %2$s"
+#: include/conversation.php:1174
+msgid "Where are you right now?"
+msgstr "Wo hältst du dich jetzt gerade auf?"
 
-#: include/enotify.php:353
-msgid "[Friendica:Notify] You have a new follower"
-msgstr "[Friendica-Benachrichtigung] Du hast einen neuen Kontakt"
+#: include/conversation.php:1175
+msgid "Delete item(s)?"
+msgstr "Einträge löschen?"
 
-#: include/enotify.php:355 include/enotify.php:356
-#, php-format
-msgid "You have a new follower at %2$s : %1$s"
-msgstr "Du hast einen neuen Kontakt auf %2$s: %1$s"
+#: include/conversation.php:1207
+msgid "New Post"
+msgstr "Neuer Beitrag"
 
-#: include/enotify.php:369
-msgid "[Friendica:Notify] Friend suggestion received"
-msgstr "[Friendica-Meldung] Kontaktvorschlag erhalten"
+#: include/conversation.php:1210
+msgid "Share"
+msgstr "Teilen"
 
-#: include/enotify.php:371
-#, php-format
-msgid "You've received a friend suggestion from '%1$s' at %2$s"
-msgstr "Du hast einen Kontakt-Vorschlag von '%1$s' auf %2$s erhalten"
+#: include/conversation.php:1211 mod/wallmessage.php:139 mod/editpost.php:72
+#: mod/message.php:258 mod/message.php:439
+msgid "Upload photo"
+msgstr "Foto hochladen"
 
-#: include/enotify.php:372
-#, php-format
-msgid ""
-"You've received [url=%1$s]a friend suggestion[/url] for %2$s from %3$s."
-msgstr "Du hast einen [url=%1$s]Kontakt-Vorschlag[/url] %2$s von %3$s erhalten."
+#: include/conversation.php:1212 mod/editpost.php:73
+msgid "upload photo"
+msgstr "Bild hochladen"
 
-#: include/enotify.php:378
-msgid "Name:"
-msgstr "Name:"
+#: include/conversation.php:1213 mod/editpost.php:74
+msgid "Attach file"
+msgstr "Datei anhängen"
 
-#: include/enotify.php:379
-msgid "Photo:"
-msgstr "Foto:"
+#: include/conversation.php:1214 mod/editpost.php:75
+msgid "attach file"
+msgstr "Datei anhängen"
 
-#: include/enotify.php:382
-#, php-format
-msgid "Please visit %s to approve or reject the suggestion."
-msgstr "Bitte besuche %s, um den Vorschlag zu akzeptieren oder abzulehnen."
+#: include/conversation.php:1215 src/Module/Item/Compose.php:179
+#: src/Object/Post.php:879
+msgid "Bold"
+msgstr "Fett"
 
-#: include/enotify.php:390 include/enotify.php:405
-msgid "[Friendica:Notify] Connection accepted"
-msgstr "[Friendica-Benachrichtigung] Kontaktanfrage bestätigt"
+#: include/conversation.php:1216 src/Module/Item/Compose.php:180
+#: src/Object/Post.php:880
+msgid "Italic"
+msgstr "Kursiv"
 
-#: include/enotify.php:392 include/enotify.php:407
-#, php-format
-msgid "'%1$s' has accepted your connection request at %2$s"
-msgstr "'%1$s' hat Deine Kontaktanfrage auf  %2$s bestätigt"
+#: include/conversation.php:1217 src/Module/Item/Compose.php:181
+#: src/Object/Post.php:881
+msgid "Underline"
+msgstr "Unterstrichen"
 
-#: include/enotify.php:393 include/enotify.php:408
-#, php-format
-msgid "%2$s has accepted your [url=%1$s]connection request[/url]."
-msgstr "%2$s hat Deine [url=%1$s]Kontaktanfrage[/url] akzeptiert."
+#: include/conversation.php:1218 src/Module/Item/Compose.php:182
+#: src/Object/Post.php:882
+msgid "Quote"
+msgstr "Zitat"
 
-#: include/enotify.php:398
-msgid ""
-"You are now mutual friends and may exchange status updates, photos, and "
-"email without restriction."
-msgstr "Ihr seid nun beidseitige Kontakte und könnt Statusmitteilungen, Bilder und E-Mails ohne Einschränkungen austauschen."
+#: include/conversation.php:1219 src/Module/Item/Compose.php:183
+#: src/Object/Post.php:883
+msgid "Code"
+msgstr "Code"
 
-#: include/enotify.php:400
-#, php-format
-msgid "Please visit %s if you wish to make any changes to this relationship."
-msgstr "Bitte besuche %s, wenn du Änderungen an eurer Beziehung vornehmen willst."
+#: include/conversation.php:1220 src/Module/Item/Compose.php:184
+#: src/Object/Post.php:884
+msgid "Image"
+msgstr "Bild"
 
-#: include/enotify.php:413
-#, php-format
-msgid ""
-"'%1$s' has chosen to accept you a fan, which restricts some forms of "
-"communication - such as private messaging and some profile interactions. If "
-"this is a celebrity or community page, these settings were applied "
-"automatically."
-msgstr "'%1$s' hat sich entschieden dich als Fan zu akzeptieren, dies schränkt einige Kommunikationswege - wie private Nachrichten und einige Interaktionsmöglichkeiten auf der Profilseite - ein. Wenn dies eine Berühmtheiten- oder Gemeinschaftsseite ist, werden diese Einstellungen automatisch vorgenommen."
+#: include/conversation.php:1221 src/Module/Item/Compose.php:185
+#: src/Object/Post.php:885
+msgid "Link"
+msgstr "Link"
 
-#: include/enotify.php:415
-#, php-format
-msgid ""
-"'%1$s' may choose to extend this into a two-way or more permissive "
-"relationship in the future."
-msgstr "'%1$s' kann den Kontaktstatus zu einem späteren Zeitpunkt erweitern und diese Einschränkungen aufheben. "
+#: include/conversation.php:1222 src/Module/Item/Compose.php:186
+#: src/Object/Post.php:886
+msgid "Link or Media"
+msgstr "Link oder Mediendatei"
 
-#: include/enotify.php:417
-#, php-format
-msgid "Please visit %s  if you wish to make any changes to this relationship."
-msgstr "Bitte besuche %s, wenn du Änderungen an eurer Beziehung vornehmen willst."
+#: include/conversation.php:1223 mod/editpost.php:82
+#: src/Module/Item/Compose.php:189
+msgid "Set your location"
+msgstr "Deinen Standort festlegen"
 
-#: include/enotify.php:427 mod/removeme.php:46
-msgid "[Friendica System Notify]"
-msgstr "[Friendica-Systembenachrichtigung]"
+#: include/conversation.php:1224 mod/editpost.php:83
+msgid "set location"
+msgstr "Ort setzen"
 
-#: include/enotify.php:427
-msgid "registration request"
-msgstr "Registrierungsanfrage"
+#: include/conversation.php:1225 mod/editpost.php:84
+msgid "Clear browser location"
+msgstr "Browser-Standort leeren"
 
-#: include/enotify.php:429
-#, php-format
-msgid "You've received a registration request from '%1$s' at %2$s"
-msgstr "Du hast eine Registrierungsanfrage von %2$s auf '%1$s' erhalten"
+#: include/conversation.php:1226 mod/editpost.php:85
+msgid "clear location"
+msgstr "Ort löschen"
 
-#: include/enotify.php:430
-#, php-format
-msgid "You've received a [url=%1$s]registration request[/url] from %2$s."
-msgstr "Du hast eine [url=%1$s]Registrierungsanfrage[/url] von %2$s erhalten."
+#: include/conversation.php:1228 mod/editpost.php:99
+#: src/Module/Item/Compose.php:194
+msgid "Set title"
+msgstr "Titel setzen"
 
-#: include/enotify.php:435
-#, php-format
-msgid ""
-"Full Name:\t%s\n"
-"Site Location:\t%s\n"
-"Login Name:\t%s (%s)"
-msgstr "Kompletter Name: %s\nURL der Seite: %s\nLogin Name: %s(%s)"
+#: include/conversation.php:1230 mod/editpost.php:101
+#: src/Module/Item/Compose.php:195
+msgid "Categories (comma-separated list)"
+msgstr "Kategorien (kommasepariert)"
 
-#: include/enotify.php:441
-#, php-format
-msgid "Please visit %s to approve or reject the request."
-msgstr "Bitte besuche %s, um die Anfrage zu bearbeiten."
+#: include/conversation.php:1232 mod/editpost.php:87
+msgid "Permission settings"
+msgstr "Berechtigungseinstellungen"
+
+#: include/conversation.php:1233 mod/editpost.php:116
+msgid "permissions"
+msgstr "Zugriffsrechte"
+
+#: include/conversation.php:1242 mod/editpost.php:96
+msgid "Public post"
+msgstr "Öffentlicher Beitrag"
+
+#: include/conversation.php:1246 mod/editpost.php:107 mod/events.php:550
+#: mod/photos.php:1433 mod/photos.php:1472 mod/photos.php:1532
+#: src/Module/Item/Compose.php:188 src/Object/Post.php:888
+msgid "Preview"
+msgstr "Vorschau"
+
+#: include/conversation.php:1250 include/items.php:397 mod/tagrm.php:20
+#: mod/tagrm.php:115 mod/unfollow.php:132 mod/dfrn_request.php:650
+#: mod/editpost.php:110 mod/fbrowser.php:110 mod/fbrowser.php:139
+#: mod/follow.php:174 mod/message.php:153 mod/photos.php:1084
+#: mod/photos.php:1191 mod/settings.php:678 mod/settings.php:704
+#: mod/suggest.php:76 src/Module/Contact.php:464
+msgid "Cancel"
+msgstr "Abbrechen"
+
+#: include/conversation.php:1255
+msgid "Post to Groups"
+msgstr "Poste an Gruppe"
 
-#: include/items.php:354 mod/notice.php:19
-#: src/Module/Admin/Themes/Details.php:53 src/Module/Admin/Themes/Index.php:41
-#: src/Module/ItemBody.php:27 src/Module/ItemBody.php:40
+#: include/conversation.php:1256
+msgid "Post to Contacts"
+msgstr "Poste an Kontakte"
+
+#: include/conversation.php:1257
+msgid "Private post"
+msgstr "Privater Beitrag"
+
+#: include/conversation.php:1262 mod/editpost.php:114
+#: src/Model/Profile.php:542 src/Module/Contact.php:339
+msgid "Message"
+msgstr "Nachricht"
+
+#: include/conversation.php:1263 mod/editpost.php:115
+msgid "Browser"
+msgstr "Browser"
+
+#: include/conversation.php:1535
+msgid "View all"
+msgstr "Zeige alle"
+
+#: include/conversation.php:1559
+msgid "Like"
+msgid_plural "Likes"
+msgstr[0] "mag ich"
+msgstr[1] "Mag ich"
+
+#: include/conversation.php:1562
+msgid "Dislike"
+msgid_plural "Dislikes"
+msgstr[0] "mag ich nicht"
+msgstr[1] "Mag ich nicht"
+
+#: include/conversation.php:1568
+msgid "Not Attending"
+msgid_plural "Not Attending"
+msgstr[0] "Nicht teilnehmend "
+msgstr[1] "Nicht teilnehmend"
+
+#: include/conversation.php:1571 src/Content/ContactSelector.php:167
+msgid "Undecided"
+msgid_plural "Undecided"
+msgstr[0] "Unentschieden"
+msgstr[1] "Unentschieden"
+
+#: include/items.php:354 src/Module/Admin/Themes/Details.php:53
+#: src/Module/Admin/Themes/Index.php:41 src/Module/Debug/ItemBody.php:27
+#: src/Module/Debug/ItemBody.php:40
 msgid "Item not found."
 msgstr "Beitrag nicht gefunden."
 
@@ -881,48 +893,41 @@ msgstr "Beitrag nicht gefunden."
 msgid "Do you really want to delete this item?"
 msgstr "Möchtest du wirklich dieses Item löschen?"
 
-#: include/items.php:394 mod/api.php:109 mod/dfrn_request.php:640
-#: mod/follow.php:161 mod/message.php:150 mod/profiles.php:526
-#: mod/profiles.php:529 mod/profiles.php:551 mod/settings.php:1084
-#: mod/settings.php:1090 mod/settings.php:1097 mod/settings.php:1101
-#: mod/settings.php:1105 mod/settings.php:1109 mod/settings.php:1113
-#: mod/settings.php:1117 mod/settings.php:1137 mod/settings.php:1138
-#: mod/settings.php:1139 mod/settings.php:1140 mod/settings.php:1141
-#: mod/suggest.php:73 src/Module/Contact.php:447 src/Module/Register.php:97
+#: include/items.php:394 mod/api.php:109 mod/profiles.php:526
+#: mod/profiles.php:529 mod/profiles.php:551 mod/dfrn_request.php:640
+#: mod/follow.php:163 mod/message.php:150 mod/settings.php:1089
+#: mod/settings.php:1095 mod/settings.php:1102 mod/settings.php:1106
+#: mod/settings.php:1110 mod/settings.php:1114 mod/settings.php:1118
+#: mod/settings.php:1122 mod/settings.php:1142 mod/settings.php:1143
+#: mod/settings.php:1144 mod/settings.php:1145 mod/settings.php:1146
+#: mod/suggest.php:73 src/Module/Contact.php:461 src/Module/Register.php:97
 msgid "Yes"
 msgstr "Ja"
 
-#: include/items.php:444 mod/api.php:34 mod/api.php:39 mod/cal.php:301
-#: mod/common.php:27 mod/crepair.php:90 mod/delegate.php:30
-#: mod/delegate.php:48 mod/delegate.php:59 mod/dfrn_confirm.php:64
-#: mod/dirfind.php:29 mod/editpost.php:21 mod/events.php:207 mod/follow.php:57
-#: mod/follow.php:132 mod/fsuggest.php:77 mod/item.php:169 mod/manage.php:130
-#: mod/message.php:56 mod/message.php:101 mod/network.php:36 mod/notes.php:27
-#: mod/notifications.php:70 mod/ostatus_subscribe.php:18 mod/photos.php:178
-#: mod/photos.php:958 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:50 mod/settings.php:163 mod/settings.php:664
-#: mod/suggest.php:39 mod/uimport.php:17 mod/unfollow.php:22
-#: 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/Module/Attach.php:42
-#: src/Module/Contact.php:362 src/Module/FollowConfirm.php:27
+#: include/items.php:444 mod/api.php:34 mod/api.php:39 mod/delegate.php:30
+#: mod/delegate.php:48 mod/delegate.php:59 mod/ostatus_subscribe.php:18
+#: mod/regmod.php:89 mod/repair_ostatus.php:16 mod/uimport.php:17
+#: mod/unfollow.php:22 mod/unfollow.php:77 mod/unfollow.php:109
+#: 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 mod/profiles.php:182
+#: mod/profiles.php:499 mod/cal.php:301 mod/common.php:27 mod/crepair.php:90
+#: mod/dfrn_confirm.php:64 mod/editpost.php:21 mod/events.php:208
+#: mod/follow.php:57 mod/follow.php:134 mod/fsuggest.php:63 mod/item.php:170
+#: mod/manage.php:130 mod/message.php:56 mod/message.php:101
+#: mod/network.php:37 mod/notes.php:27 mod/notifications.php:70
+#: mod/photos.php:178 mod/photos.php:962 mod/poke.php:141
+#: mod/profile_photo.php:32 mod/profile_photo.php:177
+#: mod/profile_photo.php:197 mod/settings.php:52 mod/settings.php:165
+#: mod/settings.php:667 mod/suggest.php:39 src/Module/Attach.php:42
+#: src/Module/Contact.php:378 src/Module/FollowConfirm.php:27
 #: src/Module/Group.php:31 src/Module/Group.php:77 src/Module/Invite.php:22
-#: src/Module/Invite.php:110 src/Module/Register.php:192
+#: src/Module/Invite.php:110 src/Module/Notifications/Notify.php:19
+#: src/Module/Profile/Contacts.php:50 src/Module/Register.php:192
+#: src/Module/Search/Directory.php:17
 msgid "Permission denied."
 msgstr "Zugriff verweigert."
 
-#: include/items.php:515 src/Content/Feature.php:99
-msgid "Archives"
-msgstr "Archiv"
-
-#: include/items.php:521 src/Content/ForumManager.php:135
-#: src/Content/Widget.php:329 view/theme/vier/theme.php:255
-msgid "show more"
-msgstr "mehr anzeigen"
-
 #: mod/api.php:84 mod/api.php:106
 msgid "Authorize application connection"
 msgstr "Verbindung der Applikation autorisieren"
@@ -931,7 +936,7 @@ msgstr "Verbindung der Applikation autorisieren"
 msgid "Return to your app and insert this Securty Code:"
 msgstr "Gehe zu Deiner Anwendung zurück und trage dort folgenden Sicherheitscode ein:"
 
-#: mod/api.php:94
+#: mod/api.php:94 src/Module/BaseAdminModule.php:56
 msgid "Please login to continue."
 msgstr "Bitte melde dich an, um fortzufahren."
 
@@ -941,263 +946,32 @@ msgid ""
 " and/or create new posts for you?"
 msgstr "Möchtest du dieser Anwendung den Zugriff auf Deine Beiträge und Kontakte sowie das Erstellen neuer Beiträge in Deinem Namen gestatten?"
 
-#: mod/api.php:110 mod/dfrn_request.php:640 mod/follow.php:161
-#: mod/profiles.php:526 mod/profiles.php:530 mod/profiles.php:551
-#: mod/settings.php:1084 mod/settings.php:1090 mod/settings.php:1097
-#: mod/settings.php:1101 mod/settings.php:1105 mod/settings.php:1109
-#: mod/settings.php:1113 mod/settings.php:1117 mod/settings.php:1137
-#: mod/settings.php:1138 mod/settings.php:1139 mod/settings.php:1140
-#: mod/settings.php:1141 src/Module/Register.php:98
+#: mod/api.php:110 mod/profiles.php:526 mod/profiles.php:530
+#: mod/profiles.php:551 mod/dfrn_request.php:640 mod/follow.php:163
+#: mod/settings.php:1089 mod/settings.php:1095 mod/settings.php:1102
+#: mod/settings.php:1106 mod/settings.php:1110 mod/settings.php:1114
+#: mod/settings.php:1118 mod/settings.php:1122 mod/settings.php:1142
+#: mod/settings.php:1143 mod/settings.php:1144 mod/settings.php:1145
+#: mod/settings.php:1146 src/Module/Register.php:98
 msgid "No"
 msgstr "Nein"
 
-#: mod/cal.php:34 mod/cal.php:38 mod/community.php:39 mod/follow.php:20
-#: mod/viewcontacts.php:23 mod/viewcontacts.php:27 src/Module/ItemBody.php:18
-msgid "Access denied."
-msgstr "Zugriff verweigert."
+#: mod/delegate.php:42
+msgid "Parent user not found."
+msgstr "Verwalter nicht gefunden."
 
-#: mod/cal.php:140 mod/display.php:306 src/Module/Profile.php:176
-msgid "Access to this profile has been restricted."
-msgstr "Der Zugriff zu diesem Profil wurde eingeschränkt."
+#: mod/delegate.php:149
+msgid "No parent user"
+msgstr "Kein Verwalter"
 
-#: mod/cal.php:271 mod/events.php:382 src/Content/Nav.php:159
-#: src/Content/Nav.php:225 src/Model/Profile.php:931 src/Model/Profile.php:942
-#: view/theme/frio/theme.php:266 view/theme/frio/theme.php:270
-msgid "Events"
-msgstr "Veranstaltungen"
+#: mod/delegate.php:164
+msgid "Parent Password:"
+msgstr "Passwort des Verwalters"
 
-#: mod/cal.php:272 mod/events.php:383
-msgid "View"
-msgstr "Ansehen"
-
-#: mod/cal.php:273 mod/events.php:385
-msgid "Previous"
-msgstr "Vorherige"
-
-#: mod/cal.php:274 mod/events.php:386 src/Module/Install.php:173
-msgid "Next"
-msgstr "Nächste"
-
-#: mod/cal.php:277 mod/events.php:391 src/Model/Event.php:428
-msgid "today"
-msgstr "Heute"
-
-#: mod/cal.php:278 mod/events.php:392 src/Model/Event.php:429
-#: src/Util/Temporal.php:314
-msgid "month"
-msgstr "Monat"
-
-#: mod/cal.php:279 mod/events.php:393 src/Model/Event.php:430
-#: src/Util/Temporal.php:315
-msgid "week"
-msgstr "Woche"
-
-#: mod/cal.php:280 mod/events.php:394 src/Model/Event.php:431
-#: src/Util/Temporal.php:316
-msgid "day"
-msgstr "Tag"
-
-#: mod/cal.php:281 mod/events.php:395
-msgid "list"
-msgstr "Liste"
-
-#: mod/cal.php:294 src/Console/NewPassword.php:67 src/Model/User.php:351
-msgid "User not found"
-msgstr "Nutzer nicht gefunden"
-
-#: mod/cal.php:310
-msgid "This calendar format is not supported"
-msgstr "Dieses Kalenderformat wird nicht unterstützt."
-
-#: mod/cal.php:312
-msgid "No exportable data found"
-msgstr "Keine exportierbaren Daten gefunden"
-
-#: mod/cal.php:329
-msgid "calendar"
-msgstr "Kalender"
-
-#: mod/common.php:90
-msgid "No contacts in common."
-msgstr "Keine gemeinsamen Kontakte."
-
-#: mod/common.php:141 src/Module/Contact.php:895
-msgid "Common Friends"
-msgstr "Gemeinsame Kontakte"
-
-#: mod/community.php:32 mod/dfrn_request.php:597 mod/display.php:204
-#: mod/photos.php:846 mod/probe.php:14 mod/search.php:96 mod/search.php:102
-#: mod/videos.php:118 mod/viewcontacts.php:46 src/Module/Directory.php:43
-#: src/Module/WebFinger.php:19
-msgid "Public access denied."
-msgstr "Öffentlicher Zugriff verweigert."
-
-#: mod/community.php:75
-msgid "Community option not available."
-msgstr "Optionen für die Gemeinschaftsseite nicht verfügbar."
-
-#: mod/community.php:92
-msgid "Not available."
-msgstr "Nicht verfügbar."
-
-#: mod/community.php:102
-msgid "Local Community"
-msgstr "Lokale Gemeinschaft"
-
-#: mod/community.php:105
-msgid "Posts from local users on this server"
-msgstr "Beiträge von Nutzern dieses Servers"
-
-#: mod/community.php:113
-msgid "Global Community"
-msgstr "Globale Gemeinschaft"
-
-#: mod/community.php:116
-msgid "Posts from users of the whole federated network"
-msgstr "Beiträge von Nutzern des gesamten  föderalen Netzwerks"
-
-#: mod/community.php:162 mod/search.php:223
-msgid "No results."
-msgstr "Keine Ergebnisse."
-
-#: mod/community.php:206
-msgid ""
-"This community stream shows all public posts received by this node. They may"
-" not reflect the opinions of this node’s users."
-msgstr "Diese Gemeinschaftsseite zeigt alle öffentlichen Beiträge, die auf diesem Knoten eingegangen sind. Der Inhalt entspricht nicht zwingend der Meinung der Nutzer dieses Servers."
-
-#: mod/crepair.php:79
-msgid "Contact settings applied."
-msgstr "Einstellungen zum Kontakt angewandt."
-
-#: mod/crepair.php:81
-msgid "Contact update failed."
-msgstr "Konnte den Kontakt nicht aktualisieren."
-
-#: mod/crepair.php:102 mod/dfrn_confirm.php:125 mod/fsuggest.php:28
-#: mod/fsuggest.php:89 mod/redir.php:31 mod/redir.php:137
-#: src/Module/FollowConfirm.php:46 src/Module/Group.php:92
-msgid "Contact not found."
-msgstr "Kontakt nicht gefunden."
-
-#: 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>ACHTUNG: Das sind Experten-Einstellungen!</strong> Wenn du etwas Falsches eingibst, funktioniert die Kommunikation mit diesem Kontakt evtl. nicht mehr."
-
-#: 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 "Bitte nutze den Zurück-Button Deines Browsers <strong>jetzt</strong>, wenn du dir unsicher bist, was du tun willst."
-
-#: mod/crepair.php:130 mod/crepair.php:132
-msgid "No mirroring"
-msgstr "Kein Spiegeln"
-
-#: mod/crepair.php:130
-msgid "Mirror as forwarded posting"
-msgstr "Spiegeln als weitergeleitete Beiträge"
-
-#: mod/crepair.php:130 mod/crepair.php:132
-msgid "Mirror as my own posting"
-msgstr "Spiegeln als meine eigenen Beiträge"
-
-#: mod/crepair.php:145
-msgid "Return to contact editor"
-msgstr "Zurück zum Kontakteditor"
-
-#: mod/crepair.php:147
-msgid "Refetch contact data"
-msgstr "Kontaktdaten neu laden"
-
-#: mod/crepair.php:149 mod/events.php:551 mod/fsuggest.php:106
-#: mod/manage.php:183 mod/message.php:261 mod/message.php:441
-#: mod/photos.php:987 mod/photos.php:1093 mod/photos.php:1378
-#: mod/photos.php:1423 mod/photos.php:1462 mod/photos.php:1522
-#: mod/poke.php:184 mod/profiles.php:562 src/Module/Contact.php:597
-#: src/Module/Install.php:211 src/Module/Install.php:251
-#: src/Module/Install.php:287 src/Module/Invite.php:157
-#: src/Module/Localtime.php:45 src/Object/Post.php:877
-#: view/theme/duepuntozero/config.php:72 view/theme/frio/config.php:121
-#: view/theme/quattro/config.php:74 view/theme/vier/config.php:120
-msgid "Submit"
-msgstr "Senden"
-
-#: mod/crepair.php:150
-msgid "Remote Self"
-msgstr "Entfernte Konten"
-
-#: mod/crepair.php:153
-msgid "Mirror postings from this contact"
-msgstr "Spiegle Beiträge dieses Kontakts"
-
-#: mod/crepair.php:155
-msgid ""
-"Mark this contact as remote_self, this will cause friendica to repost new "
-"entries from this contact."
-msgstr "Markiere diesen Kontakt als remote_self (entferntes Konto), dies veranlasst Friendica, alle Top-Level Beiträge dieses Kontakts an all Deine Kontakte zu senden (spiegeln)."
-
-#: mod/crepair.php:159 mod/settings.php:676 mod/settings.php:702
-#: src/Module/Admin/Blocklist/Contact.php:72 src/Module/Admin/Users.php:272
-#: src/Module/Admin/Users.php:283 src/Module/Admin/Users.php:297
-#: src/Module/Admin/Users.php:313
-msgid "Name"
-msgstr "Name"
-
-#: mod/crepair.php:160
-msgid "Account Nickname"
-msgstr "Konto-Spitzname"
-
-#: mod/crepair.php:161
-msgid "@Tagname - overrides Name/Nickname"
-msgstr "@Tagname - überschreibt Name/Spitzname"
-
-#: mod/crepair.php:162
-msgid "Account URL"
-msgstr "Konto-URL"
-
-#: mod/crepair.php:163
-msgid "Account URL Alias"
-msgstr "Konto URL Alias"
-
-#: mod/crepair.php:164
-msgid "Friend Request URL"
-msgstr "URL für Kontaktschaftsanfragen"
-
-#: mod/crepair.php:165
-msgid "Friend Confirm URL"
-msgstr "URL für Bestätigungen von Kontaktanfragen"
-
-#: mod/crepair.php:166
-msgid "Notification Endpoint URL"
-msgstr "URL-Endpunkt für Benachrichtigungen"
-
-#: mod/crepair.php:167
-msgid "Poll/Feed URL"
-msgstr "Pull/Feed-URL"
-
-#: mod/crepair.php:168
-msgid "New photo from this URL"
-msgstr "Neues Foto von dieser URL"
-
-#: mod/delegate.php:42
-msgid "Parent user not found."
-msgstr "Verwalter nicht gefunden."
-
-#: mod/delegate.php:149
-msgid "No parent user"
-msgstr "Kein Verwalter"
-
-#: mod/delegate.php:164
-msgid "Parent Password:"
-msgstr "Passwort des Verwalters"
-
-#: mod/delegate.php:164
-msgid ""
-"Please enter the password of the parent account to legitimize your request."
-msgstr "Bitte gib das Passwort des Verwalters ein, um deine Anfrage zu bestätigen."
+#: mod/delegate.php:164
+msgid ""
+"Please enter the password of the parent account to legitimize your request."
+msgstr "Bitte gib das Passwort des Verwalters ein, um deine Anfrage zu bestätigen."
 
 #: mod/delegate.php:171
 msgid "Parent User"
@@ -1209,15 +983,15 @@ msgid ""
 "settings. Please double check whom you give this access."
 msgstr "Verwalter haben Zugriff auf alle Funktionen dieses Benutzerkontos und können dessen Einstellungen ändern."
 
-#: mod/delegate.php:175 mod/settings.php:674 mod/settings.php:781
-#: mod/settings.php:869 mod/settings.php:948 mod/settings.php:1173
+#: mod/delegate.php:175 mod/settings.php:677 mod/settings.php:784
+#: mod/settings.php:874 mod/settings.php:953 mod/settings.php:1178
 #: src/Module/Admin/Addons/Index.php:52 src/Module/Admin/Features.php:69
-#: src/Module/Admin/Logs/Settings.php:59 src/Module/Admin/Site.php:570
+#: src/Module/Admin/Logs/Settings.php:65 src/Module/Admin/Site.php:569
 #: src/Module/Admin/Themes/Index.php:95 src/Module/Admin/Tos.php:50
 msgid "Save Settings"
 msgstr "Einstellungen speichern"
 
-#: mod/delegate.php:176 src/Content/Nav.php:260
+#: mod/delegate.php:176 src/Content/Nav.php:263
 msgid "Delegate Page Management"
 msgstr "Delegiere das Management für die Seite"
 
@@ -1252,1896 +1026,2149 @@ msgstr "Hinzufügen"
 msgid "No entries."
 msgstr "Keine Einträge."
 
-#: mod/dfrn_confirm.php:70 mod/profiles.php:43 mod/profiles.php:152
-#: mod/profiles.php:196 mod/profiles.php:511
-msgid "Profile not found."
-msgstr "Profil nicht gefunden."
+#: mod/oexchange.php:32
+msgid "Post successful."
+msgstr "Beitrag erfolgreich veröffentlicht."
 
-#: mod/dfrn_confirm.php:126
-msgid ""
-"This may occasionally happen if contact was requested by both persons and it"
-" has already been approved."
-msgstr "Das kann passieren, wenn sich zwei Kontakte gegenseitig eingeladen haben und bereits einer angenommen wurde."
+#: mod/ostatus_subscribe.php:23
+msgid "Subscribing to OStatus contacts"
+msgstr "OStatus-Kontakten folgen"
 
-#: mod/dfrn_confirm.php:227
-msgid "Response from remote site was not understood."
-msgstr "Antwort der Gegenstelle unverständlich."
+#: mod/ostatus_subscribe.php:35
+msgid "No contact provided."
+msgstr "Keine Kontakte gefunden."
 
-#: mod/dfrn_confirm.php:234 mod/dfrn_confirm.php:240
-msgid "Unexpected response from remote site: "
-msgstr "Unerwartete Antwort der Gegenstelle: "
+#: mod/ostatus_subscribe.php:42
+msgid "Couldn't fetch information for contact."
+msgstr "Konnte die Kontaktinformationen nicht einholen."
 
-#: mod/dfrn_confirm.php:249
-msgid "Confirmation completed successfully."
-msgstr "Bestätigung erfolgreich abgeschlossen."
+#: mod/ostatus_subscribe.php:52
+msgid "Couldn't fetch friends for contact."
+msgstr "Konnte die Kontaktliste des Kontakts nicht abfragen."
 
-#: mod/dfrn_confirm.php:261
-msgid "Temporary failure. Please wait and try again."
-msgstr "Zeitweiser Fehler. Bitte warte einige Momente und versuche es dann noch einmal."
+#: mod/ostatus_subscribe.php:70 mod/repair_ostatus.php:52
+msgid "Done"
+msgstr "Erledigt"
 
-#: mod/dfrn_confirm.php:264
-msgid "Introduction failed or was revoked."
-msgstr "Kontaktanfrage schlug fehl oder wurde zurückgezogen."
+#: mod/ostatus_subscribe.php:84
+msgid "success"
+msgstr "Erfolg"
 
-#: mod/dfrn_confirm.php:269
-msgid "Remote site reported: "
-msgstr "Gegenstelle meldet: "
+#: mod/ostatus_subscribe.php:86
+msgid "failed"
+msgstr "Fehlgeschlagen"
 
-#: mod/dfrn_confirm.php:374
-#, php-format
-msgid "No user record found for '%s' "
-msgstr "Für '%s' wurde kein Nutzer gefunden"
+#: mod/ostatus_subscribe.php:89 src/Object/Post.php:285
+msgid "ignored"
+msgstr "Ignoriert"
 
-#: mod/dfrn_confirm.php:384
-msgid "Our site encryption key is apparently messed up."
-msgstr "Der Verschlüsselungsschlüssel unserer Seite ist anscheinend nicht in Ordnung."
+#: mod/ostatus_subscribe.php:94 mod/repair_ostatus.php:58
+msgid "Keep this window open until done."
+msgstr "Lasse dieses Fenster offen, bis der Vorgang abgeschlossen ist."
 
-#: mod/dfrn_confirm.php:395
-msgid "Empty site URL was provided or URL could not be decrypted by us."
-msgstr "Leere URL für die Seite erhalten oder die URL konnte nicht entschlüsselt werden."
+#: mod/profperm.php:30
+msgid "Permission denied"
+msgstr "Zugriff verweigert"
 
-#: mod/dfrn_confirm.php:411
-msgid "Contact record was not found for you on our site."
-msgstr "Für diesen Kontakt wurde auf unserer Seite kein Eintrag gefunden."
+#: mod/profperm.php:36 mod/profperm.php:69
+msgid "Invalid profile identifier."
+msgstr "Ungültiger Profil-Bezeichner."
 
-#: mod/dfrn_confirm.php:425
-#, php-format
-msgid "Site public key not available in contact record for URL %s."
-msgstr "Die Kontaktdaten für URL %s enthalten keinen Public Key für den Server."
+#: mod/profperm.php:115
+msgid "Profile Visibility Editor"
+msgstr "Editor für die Profil-Sichtbarkeit"
 
-#: mod/dfrn_confirm.php:441
-msgid ""
-"The ID provided by your system is a duplicate on our system. It should work "
-"if you try again."
-msgstr "Die ID, die uns dein System angeboten hat, ist hier bereits vergeben. Bitte versuche es noch einmal."
+#: mod/profperm.php:117 view/theme/frio/theme.php:268 src/Content/Nav.php:161
+#: src/Model/Profile.php:881 src/Model/Profile.php:917
+#: src/Module/Contact.php:656 src/Module/Contact.php:872
+#: src/Module/Welcome.php:38
+msgid "Profile"
+msgstr "Profil"
 
-#: mod/dfrn_confirm.php:452
-msgid "Unable to set your contact credentials on our system."
-msgstr "Deine Kontaktreferenzen konnten nicht in unserem System gespeichert werden."
+#: mod/profperm.php:119 src/Module/Group.php:321
+msgid "Click on a contact to add or remove."
+msgstr "Klicke einen Kontakt an, um ihn hinzuzufügen oder zu entfernen"
 
-#: mod/dfrn_confirm.php:508
-msgid "Unable to update your contact profile details on our system"
-msgstr "Die Updates für dein Profil konnten nicht gespeichert werden"
+#: mod/profperm.php:128
+msgid "Visible To"
+msgstr "Sichtbar für"
 
-#: mod/dfrn_confirm.php:538 mod/dfrn_request.php:560
-#: src/Model/Contact.php:2217
-msgid "[Name Withheld]"
-msgstr "[Name unterdrückt]"
+#: mod/profperm.php:144
+msgid "All Contacts (with secure profile access)"
+msgstr "Alle Kontakte (mit gesichertem Profilzugriff)"
 
-#: mod/dfrn_poll.php:125 mod/dfrn_poll.php:530
-#, php-format
-msgid "%1$s welcomes %2$s"
-msgstr "%1$s heißt %2$s herzlich willkommen"
+#: mod/regmod.php:53
+msgid "Account approved."
+msgstr "Konto freigegeben."
 
-#: mod/dfrn_request.php:98
-msgid "This introduction has already been accepted."
-msgstr "Diese Kontaktanfrage wurde bereits akzeptiert."
+#: mod/regmod.php:77
+#, php-format
+msgid "Registration revoked for %s"
+msgstr "Registrierung für %s wurde zurückgezogen"
 
-#: mod/dfrn_request.php:116 mod/dfrn_request.php:354
-msgid "Profile location is not valid or does not contain profile information."
-msgstr "Profiladresse ist ungültig oder stellt keine Profildaten zur Verfügung."
+#: mod/regmod.php:84
+msgid "Please login."
+msgstr "Bitte melde dich an."
 
-#: mod/dfrn_request.php:120 mod/dfrn_request.php:358
-msgid "Warning: profile location has no identifiable owner name."
-msgstr "Warnung: Es konnte kein Name des Besitzers an der angegebenen Profiladresse gefunden werden."
+#: mod/removeme.php:46
+msgid "User deleted their account"
+msgstr "Gelöschter Nutzeraccount"
 
-#: mod/dfrn_request.php:123 mod/dfrn_request.php:361
-msgid "Warning: profile location has no profile photo."
-msgstr "Warnung: Es gibt kein Profilbild an der angegebenen Profiladresse."
+#: mod/removeme.php:47
+msgid ""
+"On your Friendica node an user deleted their account. Please ensure that "
+"their data is removed from the backups."
+msgstr "Ein Nutzer deiner Friendica-Instanz hat seinen Account gelöscht. Bitte stelle sicher, dass dessen Daten aus deinen Backups entfernt werden."
 
-#: mod/dfrn_request.php:127 mod/dfrn_request.php:365
+#: mod/removeme.php:48
 #, php-format
-msgid "%d required parameter was not found at the given location"
-msgid_plural "%d required parameters were not found at the given location"
-msgstr[0] "%d benötigter Parameter wurde an der angegebenen Stelle nicht gefunden"
-msgstr[1] "%d benötigte Parameter wurden an der angegebenen Stelle nicht gefunden"
+msgid "The user id is %d"
+msgstr "Die ID des Users lautet %d"
 
-#: mod/dfrn_request.php:165
-msgid "Introduction complete."
-msgstr "Kontaktanfrage abgeschlossen."
+#: mod/removeme.php:84 mod/removeme.php:87
+msgid "Remove My Account"
+msgstr "Konto löschen"
 
-#: mod/dfrn_request.php:201
-msgid "Unrecoverable protocol error."
-msgstr "Nicht behebbarer Protokollfehler."
+#: mod/removeme.php:85
+msgid ""
+"This will completely remove your account. Once this has been done it is not "
+"recoverable."
+msgstr "Dein Konto wird endgültig gelöscht. Es gibt keine Möglichkeit, es wiederherzustellen."
 
-#: mod/dfrn_request.php:228
-msgid "Profile unavailable."
-msgstr "Profil nicht verfügbar."
+#: mod/removeme.php:86
+msgid "Please enter your password for verification:"
+msgstr "Bitte gib dein Passwort zur Verifikation ein:"
 
-#: mod/dfrn_request.php:249
-#, php-format
-msgid "%s has received too many connection requests today."
-msgstr "%s hat heute zu viele Kontaktanfragen erhalten."
+#: mod/repair_ostatus.php:21
+msgid "Resubscribing to OStatus contacts"
+msgstr "Erneuern der OStatus-Abonements"
 
-#: mod/dfrn_request.php:250
-msgid "Spam protection measures have been invoked."
-msgstr "Maßnahmen zum Spamschutz wurden ergriffen."
+#: mod/repair_ostatus.php:37 src/Module/TwoFactor/Verify.php:64
+msgid "Error"
+msgid_plural "Errors"
+msgstr[0] "Fehler"
+msgstr[1] "Fehler"
 
-#: mod/dfrn_request.php:251
-msgid "Friends are advised to please try again in 24 hours."
-msgstr "Freunde sind angehalten, es in 24 Stunden erneut zu versuchen."
+#: mod/tagrm.php:31
+msgid "Tag(s) removed"
+msgstr "Tag(s) entfernt"
 
-#: mod/dfrn_request.php:275
-msgid "Invalid locator"
-msgstr "Ungültiger Locator"
+#: mod/tagrm.php:101
+msgid "Remove Item Tag"
+msgstr "Gegenstands-Tag entfernen"
 
-#: mod/dfrn_request.php:311
-msgid "You have already introduced yourself here."
-msgstr "Du hast dich hier bereits vorgestellt."
+#: mod/tagrm.php:103
+msgid "Select a tag to remove: "
+msgstr "Wähle ein Tag zum Entfernen aus: "
 
-#: mod/dfrn_request.php:314
-#, php-format
-msgid "Apparently you are already friends with %s."
-msgstr "Es scheint so, als ob du bereits mit %s in Kontakt stehst."
+#: mod/uimport.php:30
+msgid "User imports on closed servers can only be done by an administrator."
+msgstr "Auf geschlossenen Servern können ausschließlich die Administratoren Benutzerkonten importieren."
 
-#: mod/dfrn_request.php:334
-msgid "Invalid profile URL."
-msgstr "Ungültige Profil-URL."
+#: mod/uimport.php:39 src/Module/Register.php:59
+msgid ""
+"This site has exceeded the number of allowed daily account registrations. "
+"Please try again tomorrow."
+msgstr "Die maximale Anzahl täglicher Registrierungen auf dieser Seite wurde überschritten. Bitte versuche es morgen noch einmal."
 
-#: mod/dfrn_request.php:340 src/Model/Contact.php:1878
-msgid "Disallowed profile URL."
-msgstr "Nicht erlaubte Profil-URL."
+#: mod/uimport.php:54 src/Module/Register.php:141
+msgid "Import"
+msgstr "Import"
 
-#: mod/dfrn_request.php:346 src/Model/Contact.php:1883
-#: src/Module/Admin/Blocklist/Server.php:64
-#: src/Module/Admin/Blocklist/Server.php:83 src/Module/Friendica.php:59
-msgid "Blocked domain"
-msgstr "Blockierte Domain"
+#: mod/uimport.php:56
+msgid "Move account"
+msgstr "Account umziehen"
 
-#: mod/dfrn_request.php:413 src/Module/Contact.php:237
-msgid "Failed to update contact record."
-msgstr "Aktualisierung der Kontaktdaten fehlgeschlagen."
+#: mod/uimport.php:57
+msgid "You can import an account from another Friendica server."
+msgstr "Du kannst einen Account von einem anderen Friendica Server importieren."
 
-#: mod/dfrn_request.php:433
-msgid "Your introduction has been sent."
-msgstr "Deine Kontaktanfrage wurde gesendet."
+#: mod/uimport.php:58
+msgid ""
+"You need to export your account from the old server and upload it here. We "
+"will recreate your old account here with all your contacts. We will try also"
+" to inform your friends that you moved here."
+msgstr "Du musst deinen Account vom alten Server exportieren und hier hochladen. Wir stellen deinen alten Account mit all deinen Kontakten wieder her. Wir werden auch versuchen, deine Kontakte darüber zu informieren, dass du hierher umgezogen bist."
 
-#: mod/dfrn_request.php:471
+#: mod/uimport.php:59
 msgid ""
-"Remote subscription can't be done for your network. Please subscribe "
-"directly on your system."
-msgstr "Entferntes Abon­nie­ren kann für dein Netzwerk nicht durchgeführt werden. Bitte nutze direkt die Abonnieren-Funktion deines Systems.   "
+"This feature is experimental. We can't import contacts from the OStatus "
+"network (GNU Social/Statusnet) or from Diaspora"
+msgstr "Dieses Feature ist experimentell. Wir können keine Kontakte vom OStatus-Netzwerk (GNU Social/Statusnet) oder von Diaspora importieren"
 
-#: mod/dfrn_request.php:487
-msgid "Please login to confirm introduction."
-msgstr "Bitte melde dich an, um die Kontaktanfrage zu bestätigen."
+#: mod/uimport.php:60
+msgid "Account file"
+msgstr "Account-Datei"
 
-#: mod/dfrn_request.php:495
+#: mod/uimport.php:60
 msgid ""
-"Incorrect identity currently logged in. Please login to "
-"<strong>this</strong> profile."
-msgstr "Momentan bist du mit einer anderen Identität angemeldet. Bitte melde dich mit <strong>diesem</strong> Profil an."
+"To export your account, go to \"Settings->Export your personal data\" and "
+"select \"Export account\""
+msgstr "Um Deinen Account zu exportieren, rufe \"Einstellungen -> Persönliche Daten exportieren\" auf und wähle \"Account exportieren\""
 
-#: mod/dfrn_request.php:509 mod/dfrn_request.php:524
-msgid "Confirm"
-msgstr "Bestätigen"
+#: mod/unfollow.php:36 mod/unfollow.php:92
+msgid "You aren't following this contact."
+msgstr "Du folgst diesem Kontakt."
 
-#: mod/dfrn_request.php:520
-msgid "Hide this contact"
-msgstr "Verberge diesen Kontakt"
+#: mod/unfollow.php:46 mod/unfollow.php:98
+msgid "Unfollowing is currently not supported by your network."
+msgstr "Bei diesem Netzwerk wird das Entfolgen derzeit nicht unterstützt."
 
-#: mod/dfrn_request.php:522
-#, php-format
-msgid "Welcome home %s."
-msgstr "Willkommen zurück %s."
+#: mod/unfollow.php:67
+msgid "Contact unfollowed"
+msgstr "Kontakt wird nicht mehr gefolgt"
 
-#: mod/dfrn_request.php:523
-#, php-format
-msgid "Please confirm your introduction/connection request to %s."
-msgstr "Bitte bestätige Deine Kontaktanfrage bei %s."
+#: mod/unfollow.php:118
+msgid "Disconnect/Unfollow"
+msgstr "Verbindung lösen/Nicht mehr folgen"
 
-#: mod/dfrn_request.php:632
-msgid ""
-"Please enter your 'Identity Address' from one of the following supported "
-"communications networks:"
-msgstr "Bitte gib die Adresse Deines Profils in einem der unterstützten sozialen Netzwerke an:"
+#: mod/unfollow.php:128 mod/dfrn_request.php:647 mod/follow.php:170
+msgid "Your Identity Address:"
+msgstr "Adresse Deines Profils:"
 
-#: mod/dfrn_request.php:634
-#, php-format
-msgid ""
-"If you are not yet a member of the free social web, <a href=\"%s\">follow "
-"this link to find a public Friendica site and join us today</a>."
-msgstr "Wenn du noch kein Mitglied dieses freien sozialen Netzwerks bist, <a href=\"%s\">folge diesem Link</a> um einen öffentlichen Friendica-Server zu finden und beizutreten."
+#: mod/unfollow.php:131 mod/dfrn_request.php:649 mod/follow.php:76
+msgid "Submit Request"
+msgstr "Anfrage abschicken"
 
-#: mod/dfrn_request.php:637
-msgid "Friend/Connection Request"
-msgstr "Kontaktanfrage"
+#: mod/unfollow.php:137 mod/follow.php:179 mod/notifications.php:182
+#: mod/notifications.php:274 src/Module/Admin/Blocklist/Contact.php:83
+#: src/Module/Contact.php:641
+msgid "Profile URL"
+msgstr "Profil URL"
 
-#: mod/dfrn_request.php:638
-msgid ""
-"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
-"testuser@gnusocial.de"
-msgstr "Beispiele: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@gnusocial.de"
+#: mod/unfollow.php:147 mod/follow.php:195 src/Model/Profile.php:912
+#: src/Module/Contact.php:867
+msgid "Status Messages and Posts"
+msgstr "Statusnachrichten und Beiträge"
 
-#: mod/dfrn_request.php:639 mod/follow.php:160
-msgid "Please answer the following:"
-msgstr "Bitte beantworte folgendes:"
+#: mod/update_community.php:23 mod/update_contact.php:23
+#: mod/update_display.php:24 mod/update_network.php:33 mod/update_notes.php:36
+#: mod/update_profile.php:34
+msgid "[Embedded content - reload page to view]"
+msgstr "[Eingebetteter Inhalt - Seite neu laden zum Betrachten]"
 
-#: mod/dfrn_request.php:640 mod/follow.php:161
-#, php-format
-msgid "Does %s know you?"
-msgstr "Kennt %s dich?"
+#: 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
+msgid "Invalid request."
+msgstr "Ungültige Anfrage"
 
-#: mod/dfrn_request.php:641 mod/follow.php:162
-msgid "Add a personal note:"
-msgstr "Eine persönliche Notiz beifügen:"
+#: mod/wall_attach.php:103
+msgid "Sorry, maybe your upload is bigger than the PHP configuration allows"
+msgstr "Entschuldige, die Datei scheint größer zu sein, als es die PHP-Konfiguration erlaubt."
 
-#: mod/dfrn_request.php:643
-msgid "Friendica"
-msgstr "Friendica"
+#: mod/wall_attach.php:103
+msgid "Or - did you try to upload an empty file?"
+msgstr "Oder - hast du versucht, eine leere Datei hochzuladen?"
 
-#: mod/dfrn_request.php:644
-msgid "GNU Social (Pleroma, Mastodon)"
-msgstr "GNU Social (Pleroma, Mastodon)"
+#: mod/wall_attach.php:114
+#, php-format
+msgid "File exceeds size limit of %s"
+msgstr "Die Datei ist größer als das erlaubte Limit von %s"
 
-#: mod/dfrn_request.php:645
-msgid "Diaspora (Socialhome, Hubzilla)"
-msgstr "Diaspora (Socialhome, Hubzilla)"
+#: mod/wall_attach.php:129
+msgid "File upload failed."
+msgstr "Hochladen der Datei fehlgeschlagen."
 
-#: mod/dfrn_request.php:646
+#: mod/wall_upload.php:198 mod/photos.php:683 mod/photos.php:686
+#: mod/photos.php:715 mod/profile_photo.php:152
 #, php-format
-msgid ""
-" - please do not use this form.  Instead, enter %s into your Diaspora search"
-" bar."
-msgstr " - bitte verwende dieses Formular nicht. Stattdessen suche nach %s in Deiner Diaspora-Suchleiste."
+msgid "Image exceeds size limit of %s"
+msgstr "Bildgröße überschreitet das Limit von %s"
 
-#: mod/dfrn_request.php:647 mod/follow.php:168 mod/unfollow.php:128
-msgid "Your Identity Address:"
-msgstr "Adresse Deines Profils:"
+#: mod/wall_upload.php:212 mod/photos.php:738 mod/profile_photo.php:161
+msgid "Unable to process image."
+msgstr "Konnte das Bild nicht bearbeiten."
 
-#: mod/dfrn_request.php:649 mod/follow.php:74 mod/unfollow.php:131
-msgid "Submit Request"
-msgstr "Anfrage abschicken"
+#: mod/wall_upload.php:243
+msgid "Wall Photos"
+msgstr "Pinnwand-Bilder"
 
-#: mod/dirfind.php:55
-#, php-format
-msgid "People Search - %s"
-msgstr "Personensuche - %s"
+#: mod/wall_upload.php:251 mod/photos.php:767 mod/profile_photo.php:303
+msgid "Image upload failed."
+msgstr "Hochladen des Bildes gescheitert."
 
-#: mod/dirfind.php:66
+#: mod/wallmessage.php:52 mod/wallmessage.php:115
 #, php-format
-msgid "Forum Search - %s"
-msgstr "Forensuche - %s"
-
-#: mod/dirfind.php:217 mod/match.php:102 mod/suggest.php:106
-#: src/Content/Widget.php:39 src/Model/Profile.php:309
-#: src/Module/AllFriends.php:91
-msgid "Connect"
-msgstr "Verbinden"
+msgid "Number of daily wall messages for %s exceeded. Message failed."
+msgstr "Maximale Anzahl der täglichen Pinnwand-Nachrichten für %s ist überschritten. Zustellung fehlgeschlagen."
 
-#: mod/dirfind.php:259 mod/match.php:130
-msgid "No matches"
-msgstr "Keine Übereinstimmungen"
+#: mod/wallmessage.php:60 mod/message.php:70
+msgid "No recipient selected."
+msgstr "Kein Empfänger gewählt."
 
-#: mod/display.php:257 mod/display.php:342
-msgid "The requested item doesn't exist or has been deleted."
-msgstr "Der angeforderte Beitrag existiert nicht oder wurde gelöscht."
+#: mod/wallmessage.php:63
+msgid "Unable to check your home location."
+msgstr "Konnte Deinen Heimatort nicht bestimmen."
 
-#: mod/display.php:417
-msgid "The feed for this item is unavailable."
-msgstr "Der Feed für diesen Beitrag ist nicht verfügbar."
+#: mod/wallmessage.php:66 mod/message.php:77
+msgid "Message could not be sent."
+msgstr "Nachricht konnte nicht gesendet werden."
 
-#: mod/editpost.php:28 mod/editpost.php:38
-msgid "Item not found"
-msgstr "Beitrag nicht gefunden"
+#: mod/wallmessage.php:69 mod/message.php:80
+msgid "Message collection failure."
+msgstr "Konnte Nachrichten nicht abrufen."
 
-#: mod/editpost.php:45
-msgid "Edit post"
-msgstr "Beitrag bearbeiten"
+#: mod/wallmessage.php:72 mod/message.php:83
+msgid "Message sent."
+msgstr "Nachricht gesendet."
 
-#: mod/editpost.php:71 mod/notes.php:46 src/Content/Text/HTML.php:894
-#: src/Module/Filer/SaveTag.php:50
-msgid "Save"
-msgstr "Speichern"
+#: mod/wallmessage.php:89 mod/wallmessage.php:98
+msgid "No recipient."
+msgstr "Kein Empfänger."
 
-#: mod/editpost.php:76 mod/message.php:259 mod/message.php:440
-#: mod/wallmessage.php:140
-msgid "Insert web link"
-msgstr "Einen Link einfügen"
+#: mod/wallmessage.php:123 mod/message.php:204 mod/message.php:360
+msgid "Please enter a link URL:"
+msgstr "Bitte gib die URL des Links ein:"
 
-#: mod/editpost.php:77
-msgid "web link"
-msgstr "Weblink"
+#: mod/wallmessage.php:128 mod/message.php:246
+msgid "Send Private Message"
+msgstr "Private Nachricht senden"
 
-#: mod/editpost.php:78
-msgid "Insert video link"
-msgstr "Video-Adresse einfügen"
+#: 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 "Wenn du möchtest, dass %s dir antworten kann, überprüfe deine Privatsphären-Einstellungen und erlaube private Nachrichten von unbekannten Absendern."
 
-#: mod/editpost.php:79
-msgid "video link"
-msgstr "Video-Link"
+#: mod/wallmessage.php:130 mod/message.php:247 mod/message.php:430
+msgid "To:"
+msgstr "An:"
 
-#: mod/editpost.php:80
-msgid "Insert audio link"
-msgstr "Audio-Adresse einfügen"
+#: mod/wallmessage.php:131 mod/message.php:251 mod/message.php:432
+msgid "Subject:"
+msgstr "Betreff:"
 
-#: mod/editpost.php:81
-msgid "audio link"
-msgstr "Audio-Link"
+#: mod/wallmessage.php:137 mod/message.php:255 mod/message.php:435
+#: src/Module/Invite.php:150
+msgid "Your message:"
+msgstr "Deine Nachricht:"
 
-#: mod/editpost.php:95 src/Core/ACL.php:308
-msgid "CC: email addresses"
-msgstr "Cc: E-Mail-Addressen"
+#: mod/wallmessage.php:140 mod/editpost.php:76 mod/message.php:259
+#: mod/message.php:440
+msgid "Insert web link"
+msgstr "Einen Link einfügen"
 
-#: mod/editpost.php:102 src/Core/ACL.php:309
-msgid "Example: bob@example.com, mary@example.com"
-msgstr "Z.B.: bob@example.com, mary@example.com"
+#: mod/match.php:49
+msgid "No keywords to match. Please add keywords to your default profile."
+msgstr "Keine Schlüsselwörter zum Abgleichen gefunden. Bitte füge einige Schlüsselwörter zu Deinem Standardprofil hinzu."
 
-#: mod/events.php:117 mod/events.php:119
-msgid "Event can not end before it has started."
-msgstr "Die Veranstaltung kann nicht enden, bevor sie beginnt."
+#: mod/match.php:102 mod/suggest.php:106 src/Content/Widget.php:42
+#: src/Module/AllFriends.php:91 src/Module/BaseSearchModule.php:131
+msgid "Connect"
+msgstr "Verbinden"
 
-#: mod/events.php:126 mod/events.php:128
-msgid "Event title and start time are required."
-msgstr "Der Veranstaltungstitel und die Anfangszeit müssen angegeben werden."
+#: mod/match.php:115 src/Content/Pager.php:198
+msgid "first"
+msgstr "erste"
 
-#: mod/events.php:384
-msgid "Create New Event"
-msgstr "Neue Veranstaltung erstellen"
+#: mod/match.php:120 src/Content/Pager.php:258
+msgid "next"
+msgstr "nächste"
 
-#: mod/events.php:507
-msgid "Event details"
-msgstr "Veranstaltungsdetails"
+#: mod/match.php:130 src/Module/BaseSearchModule.php:92
+msgid "No matches"
+msgstr "Keine Übereinstimmungen"
 
-#: mod/events.php:508
-msgid "Starting date and Title are required."
-msgstr "Anfangszeitpunkt und Titel werden benötigt"
+#: mod/match.php:135
+msgid "Profile Match"
+msgstr "Profilübereinstimmungen"
 
-#: mod/events.php:509 mod/events.php:514
-msgid "Event Starts:"
-msgstr "Veranstaltungsbeginn:"
+#: mod/profiles.php:43 mod/profiles.php:152 mod/profiles.php:196
+#: mod/profiles.php:511 mod/dfrn_confirm.php:70
+msgid "Profile not found."
+msgstr "Profil nicht gefunden."
 
-#: mod/events.php:509 mod/events.php:541 mod/profiles.php:592
-msgid "Required"
-msgstr "Benötigt"
+#: mod/profiles.php:62
+msgid "Profile deleted."
+msgstr "Profil gelöscht."
 
-#: mod/events.php:522 mod/events.php:547
-msgid "Finish date/time is not known or not relevant"
-msgstr "Enddatum/-zeit ist nicht bekannt oder nicht relevant"
+#: mod/profiles.php:78 mod/profiles.php:114
+msgid "Profile-"
+msgstr "Profil-"
 
-#: mod/events.php:524 mod/events.php:529
-msgid "Event Finishes:"
-msgstr "Veranstaltungsende:"
+#: mod/profiles.php:97 mod/profiles.php:135
+msgid "New profile created."
+msgstr "Neues Profil angelegt."
 
-#: mod/events.php:535 mod/events.php:548
-msgid "Adjust for viewer timezone"
-msgstr "An Zeitzone des Betrachters anpassen"
+#: mod/profiles.php:120
+msgid "Profile unavailable to clone."
+msgstr "Profil nicht zum Duplizieren verfügbar."
 
-#: mod/events.php:537
-msgid "Description:"
-msgstr "Beschreibung"
+#: mod/profiles.php:206
+msgid "Profile Name is required."
+msgstr "Profilname ist erforderlich."
 
-#: mod/events.php:539 mod/notifications.php:261 src/Model/Event.php:68
-#: src/Model/Event.php:95 src/Model/Event.php:437 src/Model/Event.php:933
-#: src/Model/Profile.php:439 src/Module/Contact.php:646
-#: src/Module/Directory.php:142
-msgid "Location:"
-msgstr "Ort:"
+#: mod/profiles.php:346
+msgid "Marital Status"
+msgstr "Familienstand"
 
-#: mod/events.php:541 mod/events.php:543
-msgid "Title:"
-msgstr "Titel:"
+#: mod/profiles.php:349
+msgid "Romantic Partner"
+msgstr "Romanze"
 
-#: mod/events.php:544 mod/events.php:545
-msgid "Share this event"
-msgstr "Veranstaltung teilen"
+#: mod/profiles.php:358
+msgid "Work/Employment"
+msgstr "Arbeit / Beschäftigung"
 
-#: mod/events.php:552 src/Model/Profile.php:871
-msgid "Basic"
-msgstr "Allgemein"
+#: mod/profiles.php:361
+msgid "Religion"
+msgstr "Religion"
 
-#: mod/events.php:553 src/Model/Profile.php:872 src/Module/Admin/Site.php:575
-#: src/Module/Contact.php:905
-msgid "Advanced"
-msgstr "Erweitert"
+#: mod/profiles.php:364
+msgid "Political Views"
+msgstr "Politische Ansichten"
 
-#: mod/events.php:554 mod/photos.php:1005 mod/photos.php:1374
-#: src/Core/ACL.php:314
-msgid "Permissions"
-msgstr "Berechtigungen"
+#: mod/profiles.php:367
+msgid "Gender"
+msgstr "Geschlecht"
 
-#: mod/events.php:570
-msgid "Failed to remove event"
-msgstr "Entfernen der Veranstaltung fehlgeschlagen"
+#: mod/profiles.php:370
+msgid "Sexual Preference"
+msgstr "Sexuelle Vorlieben"
 
-#: mod/events.php:572
-msgid "Event removed"
-msgstr "Veranstaltung enfternt"
+#: mod/profiles.php:373
+msgid "XMPP"
+msgstr "XMPP"
 
-#: mod/fbrowser.php:43 src/Content/Nav.php:157 src/Model/Profile.php:911
-#: view/theme/frio/theme.php:264
-msgid "Photos"
-msgstr "Bilder"
+#: mod/profiles.php:376
+msgid "Homepage"
+msgstr "Webseite"
 
-#: mod/fbrowser.php:52 mod/fbrowser.php:76 mod/photos.php:193
-#: mod/photos.php:969 mod/photos.php:1082 mod/photos.php:1099
-#: mod/photos.php:1575 mod/photos.php:1590 src/Model/Photo.php:552
-#: src/Model/Photo.php:561
-msgid "Contact Photos"
-msgstr "Kontaktbilder"
+#: mod/profiles.php:379 mod/profiles.php:578
+msgid "Interests"
+msgstr "Interessen"
 
-#: mod/fbrowser.php:112 mod/fbrowser.php:141 mod/profile_photo.php:254
-msgid "Upload"
-msgstr "Hochladen"
+#: mod/profiles.php:382
+msgid "Address"
+msgstr "Adresse"
 
-#: mod/fbrowser.php:136
-msgid "Files"
-msgstr "Dateien"
+#: mod/profiles.php:389 mod/profiles.php:574
+msgid "Location"
+msgstr "Wohnort"
 
-#: mod/follow.php:46
-msgid "The contact could not be added."
-msgstr "Der Kontakt konnte nicht hinzugefügt werden."
+#: mod/profiles.php:469
+msgid "Profile updated."
+msgstr "Profil aktualisiert."
 
-#: mod/follow.php:85
-msgid "You already added this contact."
-msgstr "Du hast den Kontakt bereits hinzugefügt."
+#: mod/profiles.php:523
+msgid "Hide contacts and friends:"
+msgstr "Kontakte und Freunde verbergen"
 
-#: mod/follow.php:97
-msgid "Diaspora support isn't enabled. Contact can't be added."
-msgstr "Diaspora-Unterstützung ist nicht aktiviert. Der Kontakt kann nicht zugefügt werden."
+#: mod/profiles.php:528
+msgid "Hide your contact/friend list from viewers of this profile?"
+msgstr "Liste der Kontakte vor Betrachtern dieses Profils verbergen?"
 
-#: mod/follow.php:104
-msgid "OStatus support is disabled. Contact can't be added."
-msgstr "OStatus-Unterstützung ist nicht aktiviert. Der Kontakt kann nicht zugefügt werden."
+#: mod/profiles.php:548
+msgid "Show more profile fields:"
+msgstr "Zeige mehr Profil-Felder:"
 
-#: mod/follow.php:111
-msgid "The network type couldn't be detected. Contact can't be added."
-msgstr "Der Netzwerktyp wurde nicht erkannt. Der Kontakt kann nicht hinzugefügt werden."
+#: mod/profiles.php:560
+msgid "Profile Actions"
+msgstr "Profilaktionen"
 
-#: mod/follow.php:177 mod/notifications.php:179 mod/notifications.php:271
-#: mod/unfollow.php:137 src/Module/Admin/Blocklist/Contact.php:72
-#: src/Module/Admin/Blocklist/Contact.php:82 src/Module/Contact.php:642
-msgid "Profile URL"
-msgstr "Profil URL"
+#: mod/profiles.php:561
+msgid "Edit Profile Details"
+msgstr "Profil bearbeiten"
 
-#: mod/follow.php:181 mod/notifications.php:265 src/Model/Profile.php:801
-#: src/Module/Contact.php:652
-msgid "Tags:"
-msgstr "Tags:"
+#: mod/profiles.php:562 mod/crepair.php:149 mod/events.php:552
+#: mod/fsuggest.php:92 mod/manage.php:183 mod/message.php:261
+#: mod/message.php:441 mod/photos.php:991 mod/photos.php:1101
+#: mod/photos.php:1387 mod/photos.php:1432 mod/photos.php:1471
+#: mod/photos.php:1531 mod/poke.php:184 view/theme/duepuntozero/config.php:72
+#: view/theme/frio/config.php:127 view/theme/quattro/config.php:74
+#: view/theme/vier/config.php:120 src/Module/Contact.php:598
+#: src/Module/Debug/Localtime.php:45 src/Module/Install.php:213
+#: src/Module/Install.php:253 src/Module/Install.php:289
+#: src/Module/Invite.php:157 src/Module/Item/Compose.php:178
+#: src/Object/Post.php:878
+msgid "Submit"
+msgstr "Senden"
 
-#: mod/follow.php:193 mod/unfollow.php:147 src/Model/Profile.php:898
-#: src/Module/Contact.php:867
-msgid "Status Messages and Posts"
-msgstr "Statusnachrichten und Beiträge"
+#: mod/profiles.php:563
+msgid "Change Profile Photo"
+msgstr "Profilbild ändern"
 
-#: mod/fsuggest.php:69
-msgid "Friend suggestion sent."
-msgstr "Kontaktvorschlag gesendet."
+#: mod/profiles.php:565
+msgid "View this profile"
+msgstr "Dieses Profil anzeigen"
 
-#: mod/fsuggest.php:93
-msgid "Suggest Friends"
-msgstr "Kontakte vorschlagen"
+#: mod/profiles.php:566
+msgid "View all profiles"
+msgstr "Alle Profile anzeigen"
 
-#: mod/fsuggest.php:95
-#, php-format
-msgid "Suggest a friend for %s"
-msgstr "Schlage %s einen Kontakt vor"
+#: mod/profiles.php:567 mod/profiles.php:662 src/Model/Profile.php:423
+msgid "Edit visibility"
+msgstr "Sichtbarkeit bearbeiten"
 
-#: mod/hcard.php:20
-msgid "No profile"
-msgstr "Kein Profil"
+#: mod/profiles.php:568
+msgid "Create a new profile using these settings"
+msgstr "Neues Profil anlegen und diese Einstellungen verwenden"
 
-#: mod/item.php:122
-msgid "Unable to locate original post."
-msgstr "Konnte den Originalbeitrag nicht finden."
+#: mod/profiles.php:569
+msgid "Clone this profile"
+msgstr "Dieses Profil duplizieren"
 
-#: mod/item.php:322
-msgid "Empty post discarded."
-msgstr "Leerer Beitrag wurde verworfen."
+#: mod/profiles.php:570
+msgid "Delete this profile"
+msgstr "Dieses Profil löschen"
 
-#: mod/item.php:839
-#, php-format
-msgid ""
-"This message was sent to you by %s, a member of the Friendica social "
-"network."
-msgstr "Diese Nachricht wurde dir von %s geschickt, einem Mitglied des Sozialen Netzwerks Friendica."
+#: mod/profiles.php:572
+msgid "Basic information"
+msgstr "Grundinformationen"
 
-#: mod/item.php:841
-#, php-format
-msgid "You may visit them online at %s"
-msgstr "Du kannst sie online unter %s besuchen"
+#: mod/profiles.php:573
+msgid "Profile picture"
+msgstr "Profilbild"
 
-#: mod/item.php:842
-msgid ""
-"Please contact the sender by replying to this post if you do not wish to "
-"receive these messages."
-msgstr "Falls du diese Beiträge nicht erhalten möchtest, kontaktiere bitte den Autor, indem du auf diese Nachricht antwortest."
+#: mod/profiles.php:575
+msgid "Preferences"
+msgstr "Vorlieben"
 
-#: mod/item.php:846
-#, php-format
-msgid "%s posted an update."
-msgstr "%s hat ein Update veröffentlicht."
+#: mod/profiles.php:576
+msgid "Status information"
+msgstr "Status-Informationen"
 
-#: mod/lockview.php:46 mod/lockview.php:57
-msgid "Remote privacy information not available."
-msgstr "Entfernte Privatsphäreneinstellungen nicht verfügbar."
+#: mod/profiles.php:577
+msgid "Additional information"
+msgstr "Zusätzliche Informationen"
 
-#: mod/lockview.php:66
-msgid "Visible to:"
-msgstr "Sichtbar für:"
+#: mod/profiles.php:579 mod/network.php:992
+#: src/Core/NotificationsManager.php:158
+msgid "Personal"
+msgstr "Persönlich"
 
-#: mod/lostpass.php:26
-msgid "No valid account found."
-msgstr "Kein gültiges Konto gefunden."
+#: mod/profiles.php:580
+msgid "Relation"
+msgstr "Beziehung"
 
-#: mod/lostpass.php:38
-msgid "Password reset request issued. Check your email."
-msgstr "Zurücksetzen des Passworts eingeleitet. Bitte überprüfe Deine E-Mail."
+#: mod/profiles.php:581 src/Util/Temporal.php:79 src/Util/Temporal.php:81
+msgid "Miscellaneous"
+msgstr "Verschiedenes"
 
-#: mod/lostpass.php:44
-#, php-format
-msgid ""
-"\n"
-"\t\tDear %1$s,\n"
-"\t\t\tA request was recently received at \"%2$s\" to reset your account\n"
-"\t\tpassword. In order to confirm this request, please select the verification link\n"
-"\t\tbelow or paste it into your web browser address bar.\n"
-"\n"
-"\t\tIf you did NOT request this change, please DO NOT follow the link\n"
-"\t\tprovided and ignore and/or delete this email, the request will expire shortly.\n"
-"\n"
-"\t\tYour password will not be changed unless we can verify that you\n"
-"\t\tissued this request."
-msgstr "\nHallo %1$s,\n\nAuf \"%2$s\" ist eine Anfrage auf das Zurücksetzen deines Passworts gestellt\nworden. Um diese Anfrage zu verifizieren, folge bitte dem unten stehenden\nLink oder kopiere und füge ihn in die Adressleiste deines Browsers ein.\n\nSolltest du die Anfrage NICHT gestellt haben, ignoriere und/oder lösche diese\nE-Mail bitte.\n\nDein Passwort wird nicht geändert, solange wir nicht verifiziert haben, dass\ndu diese Änderung angefragt hast."
+#: mod/profiles.php:583 mod/profile_photo.php:246 src/Module/Welcome.php:39
+msgid "Upload Profile Photo"
+msgstr "Profilbild hochladen"
 
-#: mod/lostpass.php:55
-#, php-format
+#: mod/profiles.php:584
+msgid "Your Gender:"
+msgstr "Dein Geschlecht:"
+
+#: mod/profiles.php:585
+msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
+msgstr "<span class=\"heart\">&hearts;</span> Beziehungsstatus:"
+
+#: mod/profiles.php:586 src/Model/Profile.php:800
+msgid "Sexual Preference:"
+msgstr "Sexuelle Vorlieben:"
+
+#: mod/profiles.php:587
+msgid "Example: fishing photography software"
+msgstr "Beispiel: Fischen Fotografie Software"
+
+#: mod/profiles.php:592
+msgid "Profile Name:"
+msgstr "Profilname:"
+
+#: mod/profiles.php:592 mod/events.php:510 mod/events.php:542
+msgid "Required"
+msgstr "Benötigt"
+
+#: mod/profiles.php:594
 msgid ""
-"\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"
-msgstr "\nUm deine Identität zu verifizieren, folge bitte diesem Link:\n\n%1$s\n\nDu wirst eine weitere E-Mail mit deinem neuen Passwort erhalten. Sobald du dich\nangemeldet hast, kannst du dein Passwort in den Einstellungen ändern.\n\nDie Anmeldedetails sind die folgenden:\n\nAdresse der Seite:\t%2$s\nBenutzername:\t%3$s"
+"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
+"be visible to anybody using the internet."
+msgstr "Dies ist dein <strong>öffentliches</strong> Profil.<br />Es <strong>könnte</strong> für jeden Nutzer des Internets sichtbar sein."
 
-#: mod/lostpass.php:74
-#, php-format
-msgid "Password reset requested at %s"
-msgstr "Anfrage zum Zurücksetzen des Passworts auf %s erhalten"
+#: mod/profiles.php:595
+msgid "Your Full Name:"
+msgstr "Dein kompletter Name:"
 
-#: mod/lostpass.php:89
+#: mod/profiles.php:596
+msgid "Title/Description:"
+msgstr "Titel/Beschreibung:"
+
+#: mod/profiles.php:599
+msgid "Street Address:"
+msgstr "Adresse:"
+
+#: mod/profiles.php:600
+msgid "Locality/City:"
+msgstr "Wohnort:"
+
+#: mod/profiles.php:601
+msgid "Region/State:"
+msgstr "Region/Bundesstaat:"
+
+#: mod/profiles.php:602
+msgid "Postal/Zip Code:"
+msgstr "Postleitzahl:"
+
+#: mod/profiles.php:603
+msgid "Country:"
+msgstr "Land:"
+
+#: mod/profiles.php:604 src/Util/Temporal.php:149
+msgid "Age: "
+msgstr "Alter: "
+
+#: mod/profiles.php:607
+msgid "Who: (if applicable)"
+msgstr "Wer: (falls anwendbar)"
+
+#: mod/profiles.php:607
+msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
+msgstr "Beispiele: cathy123, Cathy Williams, cathy@example.com"
+
+#: mod/profiles.php:608
+msgid "Since [date]:"
+msgstr "Seit [Datum]:"
+
+#: mod/profiles.php:610
+msgid "Tell us about yourself..."
+msgstr "Erzähle uns ein bisschen von dir …"
+
+#: mod/profiles.php:611
+msgid "XMPP (Jabber) address:"
+msgstr "XMPP (Jabber) Adresse"
+
+#: mod/profiles.php:611
 msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
-msgstr "Anfrage konnte nicht verifiziert werden. (Eventuell hast du bereits eine ähnliche Anfrage gestellt.) Zurücksetzen des Passworts gescheitert."
+"The XMPP address will be propagated to your contacts so that they can follow"
+" you."
+msgstr "Die XMPP Adresse wird an deine Kontakte verteilt werden, so dass sie auch über XMPP mit dir in Kontakt treten können."
 
-#: mod/lostpass.php:102
-msgid "Request has expired, please make a new one."
-msgstr "Die Anfrage ist abgelaufen. Bitte stelle eine erneute."
+#: mod/profiles.php:612
+msgid "Homepage URL:"
+msgstr "Adresse der Homepage:"
 
-#: mod/lostpass.php:117
-msgid "Forgot your Password?"
-msgstr "Hast du dein Passwort vergessen?"
+#: mod/profiles.php:613 src/Model/Profile.php:808
+msgid "Hometown:"
+msgstr "Heimatort:"
+
+#: mod/profiles.php:614 src/Model/Profile.php:816
+msgid "Political Views:"
+msgstr "Politische Ansichten:"
+
+#: mod/profiles.php:615
+msgid "Religious Views:"
+msgstr "Religiöse Ansichten:"
+
+#: mod/profiles.php:616
+msgid "Public Keywords:"
+msgstr "Öffentliche Schlüsselwörter:"
+
+#: mod/profiles.php:616
+msgid "(Used for suggesting potential friends, can be seen by others)"
+msgstr "(Wird verwendet, um potentielle Kontakte zu finden, kann von Kontakten eingesehen werden)"
+
+#: mod/profiles.php:617
+msgid "Private Keywords:"
+msgstr "Private Schlüsselwörter:"
+
+#: mod/profiles.php:617
+msgid "(Used for searching profiles, never shown to others)"
+msgstr "(Wird für die Suche nach Profilen verwendet und niemals veröffentlicht)"
+
+#: mod/profiles.php:618 src/Model/Profile.php:832
+msgid "Likes:"
+msgstr "Likes:"
+
+#: mod/profiles.php:619 src/Model/Profile.php:836
+msgid "Dislikes:"
+msgstr "Dislikes:"
+
+#: mod/profiles.php:620
+msgid "Musical interests"
+msgstr "Musikalische Interessen"
+
+#: mod/profiles.php:621
+msgid "Books, literature"
+msgstr "Bücher, Literatur"
+
+#: mod/profiles.php:622
+msgid "Television"
+msgstr "Fernsehen"
+
+#: mod/profiles.php:623
+msgid "Film/dance/culture/entertainment"
+msgstr "Filme/Tänze/Kultur/Unterhaltung"
+
+#: mod/profiles.php:624
+msgid "Hobbies/Interests"
+msgstr "Hobbies/Interessen"
+
+#: mod/profiles.php:625
+msgid "Love/romance"
+msgstr "Liebe/Romantik"
+
+#: mod/profiles.php:626
+msgid "Work/employment"
+msgstr "Arbeit/Anstellung"
+
+#: mod/profiles.php:627
+msgid "School/education"
+msgstr "Schule/Ausbildung"
+
+#: mod/profiles.php:628
+msgid "Contact information and Social Networks"
+msgstr "Kontaktinformationen und Soziale Netzwerke"
+
+#: mod/profiles.php:659 src/Model/Profile.php:419
+msgid "Profile Image"
+msgstr "Profilbild"
+
+#: mod/profiles.php:661 src/Model/Profile.php:422
+msgid "visible to everybody"
+msgstr "sichtbar für jeden"
+
+#: mod/profiles.php:668
+msgid "Edit/Manage Profiles"
+msgstr "Bearbeite/Verwalte Profile"
+
+#: mod/profiles.php:669 src/Model/Profile.php:409 src/Model/Profile.php:430
+msgid "Change profile photo"
+msgstr "Profilbild ändern"
+
+#: mod/profiles.php:670 src/Model/Profile.php:410
+msgid "Create New Profile"
+msgstr "Neues Profil anlegen"
+
+#: mod/cal.php:34 mod/cal.php:38 mod/community.php:40 mod/follow.php:20
+#: src/Module/Debug/ItemBody.php:18
+msgid "Access denied."
+msgstr "Zugriff verweigert."
+
+#: mod/cal.php:140 mod/display.php:301 src/Module/Profile.php:177
+msgid "Access to this profile has been restricted."
+msgstr "Der Zugriff zu diesem Profil wurde eingeschränkt."
+
+#: mod/cal.php:271 mod/events.php:383 view/theme/frio/theme.php:271
+#: view/theme/frio/theme.php:275 src/Content/Nav.php:164
+#: src/Content/Nav.php:228 src/Model/Profile.php:945 src/Model/Profile.php:956
+msgid "Events"
+msgstr "Veranstaltungen"
+
+#: mod/cal.php:272 mod/events.php:384
+msgid "View"
+msgstr "Ansehen"
+
+#: mod/cal.php:273 mod/events.php:386
+msgid "Previous"
+msgstr "Vorherige"
+
+#: mod/cal.php:274 mod/events.php:387 src/Module/Install.php:175
+msgid "Next"
+msgstr "Nächste"
+
+#: mod/cal.php:277 mod/events.php:392 src/Model/Event.php:428
+msgid "today"
+msgstr "Heute"
+
+#: mod/cal.php:278 mod/events.php:393 src/Util/Temporal.php:314
+#: src/Model/Event.php:429
+msgid "month"
+msgstr "Monat"
+
+#: mod/cal.php:279 mod/events.php:394 src/Util/Temporal.php:315
+#: src/Model/Event.php:430
+msgid "week"
+msgstr "Woche"
+
+#: mod/cal.php:280 mod/events.php:395 src/Util/Temporal.php:316
+#: src/Model/Event.php:431
+msgid "day"
+msgstr "Tag"
+
+#: mod/cal.php:281 mod/events.php:396
+msgid "list"
+msgstr "Liste"
+
+#: mod/cal.php:294 src/Model/User.php:384 src/Console/NewPassword.php:88
+msgid "User not found"
+msgstr "Nutzer nicht gefunden"
 
-#: mod/lostpass.php:118
-msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
-msgstr "Gib Deine E-Mail-Adresse an und fordere ein neues Passwort an. Es werden dir dann weitere Informationen per Mail zugesendet."
+#: mod/cal.php:310
+msgid "This calendar format is not supported"
+msgstr "Dieses Kalenderformat wird nicht unterstützt."
 
-#: mod/lostpass.php:119 src/Module/Login.php:327
-msgid "Nickname or Email: "
-msgstr "Spitzname oder E-Mail:"
+#: mod/cal.php:312
+msgid "No exportable data found"
+msgstr "Keine exportierbaren Daten gefunden"
 
-#: mod/lostpass.php:120
-msgid "Reset"
-msgstr "Zurücksetzen"
+#: mod/cal.php:329
+msgid "calendar"
+msgstr "Kalender"
 
-#: mod/lostpass.php:135 src/Module/Login.php:339
-msgid "Password Reset"
-msgstr "Passwort zurücksetzen"
+#: mod/common.php:90
+msgid "No contacts in common."
+msgstr "Keine gemeinsamen Kontakte."
 
-#: mod/lostpass.php:136
-msgid "Your password has been reset as requested."
-msgstr "Dein Passwort wurde wie gewünscht zurückgesetzt."
+#: mod/common.php:141 src/Module/Contact.php:895
+msgid "Common Friends"
+msgstr "Gemeinsame Kontakte"
 
-#: mod/lostpass.php:137
-msgid "Your new password is"
-msgstr "Dein neues Passwort lautet"
+#: mod/community.php:33 mod/dfrn_request.php:597 mod/display.php:199
+#: mod/photos.php:850 mod/search.php:87 mod/search.php:93 mod/videos.php:118
+#: src/Module/Debug/Probe.php:20 src/Module/Debug/WebFinger.php:19
+#: src/Module/Directory.php:30
+msgid "Public access denied."
+msgstr "Öffentlicher Zugriff verweigert."
 
-#: mod/lostpass.php:138
-msgid "Save or copy your new password - and then"
-msgstr "Speichere oder kopiere dein neues Passwort - und dann"
+#: mod/community.php:76
+msgid "Community option not available."
+msgstr "Optionen für die Gemeinschaftsseite nicht verfügbar."
 
-#: mod/lostpass.php:139
-msgid "click here to login"
-msgstr "hier klicken, um dich anzumelden"
+#: mod/community.php:93
+msgid "Not available."
+msgstr "Nicht verfügbar."
 
-#: mod/lostpass.php:140
-msgid ""
-"Your password may be changed from the <em>Settings</em> page after "
-"successful login."
-msgstr "Du kannst das Passwort in den <em>Einstellungen</em> ändern, sobald du dich erfolgreich angemeldet hast."
+#: mod/community.php:103
+msgid "Local Community"
+msgstr "Lokale Gemeinschaft"
 
-#: mod/lostpass.php:147
-#, php-format
-msgid ""
-"\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"
-msgstr "\nHallo %1$s,\n\nDein Passwort wurde wie gewünscht geändert. Bitte bewahre diese Informationen gut auf (oder ändere dein Passwort in eines, das du dir leicht merken kannst)."
+#: mod/community.php:106
+msgid "Posts from local users on this server"
+msgstr "Beiträge von Nutzern dieses Servers"
 
-#: mod/lostpass.php:153
-#, php-format
-msgid ""
-"\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"
-msgstr "\nDie Anmeldedaten sind die folgenden:\n\nAdresse der Seite: %1$s\nLogin Name: %2$s\nPasswort: %3$s\n\nDas Passwort kann und sollte in den Kontoeinstellungen nach der Anmeldung geändert werden."
+#: mod/community.php:114
+msgid "Global Community"
+msgstr "Globale Gemeinschaft"
 
-#: mod/lostpass.php:169
-#, php-format
-msgid "Your password has been changed at %s"
-msgstr "Auf %s wurde dein Passwort geändert"
+#: mod/community.php:117
+msgid "Posts from users of the whole federated network"
+msgstr "Beiträge von Nutzern des gesamten  föderalen Netzwerks"
 
-#: mod/manage.php:179
-msgid "Manage Identities and/or Pages"
-msgstr "Verwalte Identitäten und/oder Seiten"
+#: mod/community.php:163 mod/search.php:222
+msgid "No results."
+msgstr "Keine Ergebnisse."
 
-#: mod/manage.php:180
+#: mod/community.php:215
 msgid ""
-"Toggle between different identities or community/group pages which share "
-"your account details or which you have been granted \"manage\" permissions"
-msgstr "Zwischen verschiedenen Identitäten oder Gemeinschafts-/Gruppenseiten wechseln, die deine Kontoinformationen teilen oder zu denen du „Verwalten“-Befugnisse bekommen hast."
+"This community stream shows all public posts received by this node. They may"
+" not reflect the opinions of this node’s users."
+msgstr "Diese Gemeinschaftsseite zeigt alle öffentlichen Beiträge, die auf diesem Knoten eingegangen sind. Der Inhalt entspricht nicht zwingend der Meinung der Nutzer dieses Servers."
 
-#: mod/manage.php:181
-msgid "Select an identity to manage: "
-msgstr "Wähle eine Identität zum Verwalten aus: "
+#: mod/crepair.php:79
+msgid "Contact settings applied."
+msgstr "Einstellungen zum Kontakt angewandt."
 
-#: mod/match.php:49
-msgid "No keywords to match. Please add keywords to your default profile."
-msgstr "Keine Schlüsselwörter zum Abgleichen gefunden. Bitte füge einige Schlüsselwörter zu Deinem Standardprofil hinzu."
+#: mod/crepair.php:81
+msgid "Contact update failed."
+msgstr "Konnte den Kontakt nicht aktualisieren."
 
-#: mod/match.php:115 src/Content/Pager.php:198
-msgid "first"
-msgstr "erste"
+#: mod/crepair.php:102 mod/dfrn_confirm.php:125 mod/fsuggest.php:32
+#: mod/fsuggest.php:75 mod/redir.php:32 mod/redir.php:140
+#: src/Module/FollowConfirm.php:46 src/Module/Group.php:92
+msgid "Contact not found."
+msgstr "Kontakt nicht gefunden."
 
-#: mod/match.php:120 src/Content/Pager.php:258
-msgid "next"
-msgstr "nächste"
+#: 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>ACHTUNG: Das sind Experten-Einstellungen!</strong> Wenn du etwas Falsches eingibst, funktioniert die Kommunikation mit diesem Kontakt evtl. nicht mehr."
 
-#: mod/match.php:135
-msgid "Profile Match"
-msgstr "Profilübereinstimmungen"
+#: 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 "Bitte nutze den Zurück-Button Deines Browsers <strong>jetzt</strong>, wenn du dir unsicher bist, was du tun willst."
 
-#: mod/message.php:33 mod/message.php:116 src/Content/Nav.php:254
-msgid "New Message"
-msgstr "Neue Nachricht"
+#: mod/crepair.php:130 mod/crepair.php:132
+msgid "No mirroring"
+msgstr "Kein Spiegeln"
 
-#: mod/message.php:70 mod/wallmessage.php:60
-msgid "No recipient selected."
-msgstr "Kein Empfänger gewählt."
+#: mod/crepair.php:130
+msgid "Mirror as forwarded posting"
+msgstr "Spiegeln als weitergeleitete Beiträge"
 
-#: mod/message.php:74
-msgid "Unable to locate contact information."
-msgstr "Konnte die Kontaktinformationen nicht finden."
+#: mod/crepair.php:130 mod/crepair.php:132
+msgid "Mirror as my own posting"
+msgstr "Spiegeln als meine eigenen Beiträge"
 
-#: mod/message.php:77 mod/wallmessage.php:66
-msgid "Message could not be sent."
-msgstr "Nachricht konnte nicht gesendet werden."
+#: mod/crepair.php:145
+msgid "Return to contact editor"
+msgstr "Zurück zum Kontakteditor"
 
-#: mod/message.php:80 mod/wallmessage.php:69
-msgid "Message collection failure."
-msgstr "Konnte Nachrichten nicht abrufen."
+#: mod/crepair.php:147
+msgid "Refetch contact data"
+msgstr "Kontaktdaten neu laden"
 
-#: mod/message.php:83 mod/wallmessage.php:72
-msgid "Message sent."
-msgstr "Nachricht gesendet."
+#: mod/crepair.php:150
+msgid "Remote Self"
+msgstr "Entfernte Konten"
 
-#: mod/message.php:110 mod/notifications.php:47 mod/notifications.php:187
-#: mod/notifications.php:243
-msgid "Discard"
-msgstr "Verwerfen"
+#: mod/crepair.php:153
+msgid "Mirror postings from this contact"
+msgstr "Spiegle Beiträge dieses Kontakts"
 
-#: mod/message.php:123 src/Content/Nav.php:251 view/theme/frio/theme.php:271
-msgid "Messages"
-msgstr "Nachrichten"
+#: mod/crepair.php:155
+msgid ""
+"Mark this contact as remote_self, this will cause friendica to repost new "
+"entries from this contact."
+msgstr "Markiere diesen Kontakt als remote_self (entferntes Konto), dies veranlasst Friendica, alle Top-Level Beiträge dieses Kontakts an all Deine Kontakte zu senden (spiegeln)."
 
-#: mod/message.php:148
-msgid "Do you really want to delete this message?"
-msgstr "Möchtest du diese Nachricht wirklich löschen?"
+#: mod/crepair.php:159 mod/settings.php:679 mod/settings.php:705
+#: src/Module/Admin/Blocklist/Contact.php:73 src/Module/Admin/Users.php:272
+#: src/Module/Admin/Users.php:283 src/Module/Admin/Users.php:297
+#: src/Module/Admin/Users.php:313
+msgid "Name"
+msgstr "Name"
 
-#: mod/message.php:166
-msgid "Conversation not found."
-msgstr "Unterhaltung nicht gefunden."
+#: mod/crepair.php:160
+msgid "Account Nickname"
+msgstr "Konto-Spitzname"
 
-#: mod/message.php:171
-msgid "Message deleted."
-msgstr "Nachricht gelöscht."
+#: mod/crepair.php:161
+msgid "@Tagname - overrides Name/Nickname"
+msgstr "@Tagname - überschreibt Name/Spitzname"
 
-#: mod/message.php:176 mod/message.php:190
-msgid "Conversation removed."
-msgstr "Unterhaltung gelöscht."
+#: mod/crepair.php:162
+msgid "Account URL"
+msgstr "Konto-URL"
 
-#: mod/message.php:204 mod/message.php:360 mod/wallmessage.php:123
-msgid "Please enter a link URL:"
-msgstr "Bitte gib die URL des Links ein:"
+#: mod/crepair.php:163
+msgid "Account URL Alias"
+msgstr "Konto URL Alias"
 
-#: mod/message.php:246 mod/wallmessage.php:128
-msgid "Send Private Message"
-msgstr "Private Nachricht senden"
+#: mod/crepair.php:164
+msgid "Friend Request URL"
+msgstr "URL für Kontaktschaftsanfragen"
 
-#: mod/message.php:247 mod/message.php:430 mod/wallmessage.php:130
-msgid "To:"
-msgstr "An:"
+#: mod/crepair.php:165
+msgid "Friend Confirm URL"
+msgstr "URL für Bestätigungen von Kontaktanfragen"
 
-#: mod/message.php:251 mod/message.php:432 mod/wallmessage.php:131
-msgid "Subject:"
-msgstr "Betreff:"
+#: mod/crepair.php:166
+msgid "Notification Endpoint URL"
+msgstr "URL-Endpunkt für Benachrichtigungen"
 
-#: mod/message.php:255 mod/message.php:435 mod/wallmessage.php:137
-#: src/Module/Invite.php:150
-msgid "Your message:"
-msgstr "Deine Nachricht:"
+#: mod/crepair.php:167
+msgid "Poll/Feed URL"
+msgstr "Pull/Feed-URL"
 
-#: mod/message.php:289
-msgid "No messages."
-msgstr "Keine Nachrichten."
+#: mod/crepair.php:168
+msgid "New photo from this URL"
+msgstr "Neues Foto von dieser URL"
 
-#: mod/message.php:352
-msgid "Message not available."
-msgstr "Nachricht nicht verfügbar."
+#: mod/dfrn_confirm.php:126
+msgid ""
+"This may occasionally happen if contact was requested by both persons and it"
+" has already been approved."
+msgstr "Das kann passieren, wenn sich zwei Kontakte gegenseitig eingeladen haben und bereits einer angenommen wurde."
 
-#: mod/message.php:406
-msgid "Delete message"
-msgstr "Nachricht löschen"
+#: mod/dfrn_confirm.php:227
+msgid "Response from remote site was not understood."
+msgstr "Antwort der Gegenstelle unverständlich."
 
-#: mod/message.php:408 mod/message.php:540
-msgid "D, d M Y - g:i A"
-msgstr "D, d. M Y - H:i"
+#: mod/dfrn_confirm.php:234 mod/dfrn_confirm.php:240
+msgid "Unexpected response from remote site: "
+msgstr "Unerwartete Antwort der Gegenstelle: "
+
+#: mod/dfrn_confirm.php:249
+msgid "Confirmation completed successfully."
+msgstr "Bestätigung erfolgreich abgeschlossen."
 
-#: mod/message.php:423 mod/message.php:537
-msgid "Delete conversation"
-msgstr "Unterhaltung löschen"
+#: mod/dfrn_confirm.php:261
+msgid "Temporary failure. Please wait and try again."
+msgstr "Zeitweiser Fehler. Bitte warte einige Momente und versuche es dann noch einmal."
 
-#: mod/message.php:425
-msgid ""
-"No secure communications available. You <strong>may</strong> be able to "
-"respond from the sender's profile page."
-msgstr "Sichere Kommunikation ist nicht verfügbar. <strong>Eventuell</strong> kannst du auf der Profilseite des Absenders antworten."
+#: mod/dfrn_confirm.php:264
+msgid "Introduction failed or was revoked."
+msgstr "Kontaktanfrage schlug fehl oder wurde zurückgezogen."
 
-#: mod/message.php:429
-msgid "Send Reply"
-msgstr "Antwort senden"
+#: mod/dfrn_confirm.php:269
+msgid "Remote site reported: "
+msgstr "Gegenstelle meldet: "
 
-#: mod/message.php:512
+#: mod/dfrn_confirm.php:374
 #, php-format
-msgid "Unknown sender - %s"
-msgstr "Unbekannter Absender - %s"
+msgid "No user record found for '%s' "
+msgstr "Für '%s' wurde kein Nutzer gefunden"
 
-#: mod/message.php:514
-#, php-format
-msgid "You and %s"
-msgstr "Du und %s"
+#: mod/dfrn_confirm.php:384
+msgid "Our site encryption key is apparently messed up."
+msgstr "Der Verschlüsselungsschlüssel unserer Seite ist anscheinend nicht in Ordnung."
 
-#: mod/message.php:516
-#, php-format
-msgid "%s and You"
-msgstr "%s und du"
+#: mod/dfrn_confirm.php:395
+msgid "Empty site URL was provided or URL could not be decrypted by us."
+msgstr "Leere URL für die Seite erhalten oder die URL konnte nicht entschlüsselt werden."
 
-#: mod/message.php:543
+#: mod/dfrn_confirm.php:411
+msgid "Contact record was not found for you on our site."
+msgstr "Für diesen Kontakt wurde auf unserer Seite kein Eintrag gefunden."
+
+#: mod/dfrn_confirm.php:425
 #, php-format
-msgid "%d message"
-msgid_plural "%d messages"
-msgstr[0] "%d Nachricht"
-msgstr[1] "%d Nachrichten"
+msgid "Site public key not available in contact record for URL %s."
+msgstr "Die Kontaktdaten für URL %s enthalten keinen Public Key für den Server."
 
-#: mod/network.php:184 mod/search.php:38
-msgid "Remove term"
-msgstr "Begriff entfernen"
+#: mod/dfrn_confirm.php:441
+msgid ""
+"The ID provided by your system is a duplicate on our system. It should work "
+"if you try again."
+msgstr "Die ID, die uns dein System angeboten hat, ist hier bereits vergeben. Bitte versuche es noch einmal."
 
-#: mod/network.php:191 mod/search.php:47
-msgid "Saved Searches"
-msgstr "Gespeicherte Suchen"
+#: mod/dfrn_confirm.php:452
+msgid "Unable to set your contact credentials on our system."
+msgstr "Deine Kontaktreferenzen konnten nicht in unserem System gespeichert werden."
 
-#: mod/network.php:192 src/Model/Group.php:434
-msgid "add"
-msgstr "hinzufügen"
+#: mod/dfrn_confirm.php:508
+msgid "Unable to update your contact profile details on our system"
+msgstr "Die Updates für dein Profil konnten nicht gespeichert werden"
+
+#: mod/dfrn_confirm.php:538 mod/dfrn_request.php:560
+#: src/Model/Contact.php:2457
+msgid "[Name Withheld]"
+msgstr "[Name unterdrückt]"
 
-#: mod/network.php:572
+#: mod/dfrn_poll.php:125 mod/dfrn_poll.php:530
 #, php-format
-msgid ""
-"Warning: This group contains %s member from a network that doesn't allow non"
-" public messages."
-msgid_plural ""
-"Warning: This group contains %s members from a network that doesn't allow "
-"non public messages."
-msgstr[0] "Warnung: Diese Gruppe beinhaltet %s Person aus einem Netzwerk das keine nicht öffentlichen Beiträge empfangen kann."
-msgstr[1] "Warnung: Diese Gruppe beinhaltet %s Personen aus Netzwerken, die keine nicht-öffentlichen Beiträge empfangen können."
+msgid "%1$s welcomes %2$s"
+msgstr "%1$s heißt %2$s herzlich willkommen"
 
-#: mod/network.php:575
-msgid "Messages in this group won't be send to these receivers."
-msgstr "Beiträge in dieser Gruppe werden deshalb nicht an diese Personen zugestellt werden."
+#: mod/dfrn_request.php:98
+msgid "This introduction has already been accepted."
+msgstr "Diese Kontaktanfrage wurde bereits akzeptiert."
 
-#: mod/network.php:642
-msgid "No such group"
-msgstr "Es gibt keine solche Gruppe"
+#: mod/dfrn_request.php:116 mod/dfrn_request.php:354
+msgid "Profile location is not valid or does not contain profile information."
+msgstr "Profiladresse ist ungültig oder stellt keine Profildaten zur Verfügung."
 
-#: mod/network.php:663 src/Module/Group.php:288
-msgid "Group is empty"
-msgstr "Gruppe ist leer"
+#: mod/dfrn_request.php:120 mod/dfrn_request.php:358
+msgid "Warning: profile location has no identifiable owner name."
+msgstr "Warnung: Es konnte kein Name des Besitzers an der angegebenen Profiladresse gefunden werden."
+
+#: mod/dfrn_request.php:123 mod/dfrn_request.php:361
+msgid "Warning: profile location has no profile photo."
+msgstr "Warnung: Es gibt kein Profilbild an der angegebenen Profiladresse."
 
-#: mod/network.php:667
+#: mod/dfrn_request.php:127 mod/dfrn_request.php:365
 #, php-format
-msgid "Group: %s"
-msgstr "Gruppe: %s"
+msgid "%d required parameter was not found at the given location"
+msgid_plural "%d required parameters were not found at the given location"
+msgstr[0] "%d benötigter Parameter wurde an der angegebenen Stelle nicht gefunden"
+msgstr[1] "%d benötigte Parameter wurden an der angegebenen Stelle nicht gefunden"
 
-#: mod/network.php:693
-msgid "Private messages to this person are at risk of public disclosure."
-msgstr "Private Nachrichten an diese Person könnten an die Öffentlichkeit gelangen."
+#: mod/dfrn_request.php:165
+msgid "Introduction complete."
+msgstr "Kontaktanfrage abgeschlossen."
 
-#: mod/network.php:696 src/Module/AllFriends.php:35
-#: src/Module/AllFriends.php:43
-msgid "Invalid contact."
-msgstr "Ungültiger Kontakt."
+#: mod/dfrn_request.php:201
+msgid "Unrecoverable protocol error."
+msgstr "Nicht behebbarer Protokollfehler."
 
-#: mod/network.php:975
-msgid "Commented Order"
-msgstr "Neueste Kommentare"
+#: mod/dfrn_request.php:228
+msgid "Profile unavailable."
+msgstr "Profil nicht verfügbar."
 
-#: mod/network.php:978
-msgid "Sort by Comment Date"
-msgstr "Nach Kommentardatum sortieren"
+#: mod/dfrn_request.php:249
+#, php-format
+msgid "%s has received too many connection requests today."
+msgstr "%s hat heute zu viele Kontaktanfragen erhalten."
 
-#: mod/network.php:983
-msgid "Posted Order"
-msgstr "Neueste Beiträge"
+#: mod/dfrn_request.php:250
+msgid "Spam protection measures have been invoked."
+msgstr "Maßnahmen zum Spamschutz wurden ergriffen."
 
-#: mod/network.php:986
-msgid "Sort by Post Date"
-msgstr "Nach Beitragsdatum sortieren"
+#: mod/dfrn_request.php:251
+msgid "Friends are advised to please try again in 24 hours."
+msgstr "Freunde sind angehalten, es in 24 Stunden erneut zu versuchen."
 
-#: mod/network.php:993 mod/profiles.php:579
-#: src/Core/NotificationsManager.php:158
-msgid "Personal"
-msgstr "Persönlich"
+#: mod/dfrn_request.php:275
+msgid "Invalid locator"
+msgstr "Ungültiger Locator"
 
-#: mod/network.php:996
-msgid "Posts that mention or involve you"
-msgstr "Beiträge, in denen es um dich geht"
+#: mod/dfrn_request.php:311
+msgid "You have already introduced yourself here."
+msgstr "Du hast dich hier bereits vorgestellt."
 
-#: mod/network.php:1003
-msgid "New"
-msgstr "Neue"
+#: mod/dfrn_request.php:314
+#, php-format
+msgid "Apparently you are already friends with %s."
+msgstr "Es scheint so, als ob du bereits mit %s in Kontakt stehst."
 
-#: mod/network.php:1006
-msgid "Activity Stream - by date"
-msgstr "Aktivitäten-Stream - nach Datum"
+#: mod/dfrn_request.php:334
+msgid "Invalid profile URL."
+msgstr "Ungültige Profil-URL."
 
-#: mod/network.php:1014
-msgid "Shared Links"
-msgstr "Geteilte Links"
+#: mod/dfrn_request.php:340 src/Model/Contact.php:2099
+msgid "Disallowed profile URL."
+msgstr "Nicht erlaubte Profil-URL."
 
-#: mod/network.php:1017
-msgid "Interesting Links"
-msgstr "Interessante Links"
+#: mod/dfrn_request.php:346 src/Model/Contact.php:2104
+#: src/Module/Friendica.php:59
+msgid "Blocked domain"
+msgstr "Blockierte Domain"
 
-#: mod/network.php:1024
-msgid "Starred"
-msgstr "Markierte"
+#: mod/dfrn_request.php:413 src/Module/Contact.php:143
+msgid "Failed to update contact record."
+msgstr "Aktualisierung der Kontaktdaten fehlgeschlagen."
 
-#: mod/network.php:1027
-msgid "Favourite Posts"
-msgstr "Favorisierte Beiträge"
+#: mod/dfrn_request.php:433
+msgid "Your introduction has been sent."
+msgstr "Deine Kontaktanfrage wurde gesendet."
 
-#: mod/newmember.php:12
-msgid "Welcome to Friendica"
-msgstr "Willkommen bei Friendica"
+#: mod/dfrn_request.php:471
+msgid ""
+"Remote subscription can't be done for your network. Please subscribe "
+"directly on your system."
+msgstr "Entferntes Abon­nie­ren kann für dein Netzwerk nicht durchgeführt werden. Bitte nutze direkt die Abonnieren-Funktion deines Systems.   "
 
-#: mod/newmember.php:13
-msgid "New Member Checklist"
-msgstr "Checkliste für neue Mitglieder"
+#: mod/dfrn_request.php:487
+msgid "Please login to confirm introduction."
+msgstr "Bitte melde dich an, um die Kontaktanfrage zu bestätigen."
 
-#: mod/newmember.php:15
+#: mod/dfrn_request.php:495
 msgid ""
-"We would like to offer some tips and links to help make your experience "
-"enjoyable. Click any item to visit the relevant page. A link to this page "
-"will be visible from your home page for two weeks after your initial "
-"registration and then will quietly disappear."
-msgstr "Wir möchten dir einige Tipps und Links anbieten, die dir helfen könnten, den Einstieg angenehmer zu machen. Klicke auf ein Element, um die entsprechende Seite zu besuchen. Ein Link zu dieser Seite hier bleibt für dich an deiner Pinnwand für zwei Wochen nach dem Registrierungsdatum sichtbar und wird dann verschwinden."
+"Incorrect identity currently logged in. Please login to "
+"<strong>this</strong> profile."
+msgstr "Momentan bist du mit einer anderen Identität angemeldet. Bitte melde dich mit <strong>diesem</strong> Profil an."
 
-#: mod/newmember.php:16
-msgid "Getting Started"
-msgstr "Einstieg"
+#: mod/dfrn_request.php:509 mod/dfrn_request.php:524
+msgid "Confirm"
+msgstr "Bestätigen"
 
-#: mod/newmember.php:18
-msgid "Friendica Walk-Through"
-msgstr "Friendica Rundgang"
+#: mod/dfrn_request.php:520
+msgid "Hide this contact"
+msgstr "Verberge diesen Kontakt"
 
-#: mod/newmember.php:18
-msgid ""
-"On your <em>Quick Start</em> page - find a brief introduction to your "
-"profile and network tabs, make some new connections, and find some groups to"
-" join."
-msgstr "Auf der <em>Quick Start</em>-Seite findest du eine kurze Einleitung in die einzelnen Funktionen deines Profils und die Netzwerk-Reiter, wo du interessante Foren findest und neue Kontakte knüpfst."
+#: mod/dfrn_request.php:522
+#, php-format
+msgid "Welcome home %s."
+msgstr "Willkommen zurück %s."
 
-#: mod/newmember.php:20 mod/settings.php:145 src/Content/Nav.php:262
-#: src/Module/Admin/Addons/Details.php:102
-#: src/Module/Admin/Themes/Details.php:107
-#: src/Module/BaseSettingsModule.php:105 view/theme/frio/theme.php:272
-msgid "Settings"
-msgstr "Einstellungen"
+#: mod/dfrn_request.php:523
+#, php-format
+msgid "Please confirm your introduction/connection request to %s."
+msgstr "Bitte bestätige Deine Kontaktanfrage bei %s."
 
-#: mod/newmember.php:22
-msgid "Go to Your Settings"
-msgstr "Gehe zu deinen Einstellungen"
+#: mod/dfrn_request.php:632
+msgid ""
+"Please enter your 'Identity Address' from one of the following supported "
+"communications networks:"
+msgstr "Bitte gib die Adresse Deines Profils in einem der unterstützten sozialen Netzwerke an:"
 
-#: mod/newmember.php:22
+#: mod/dfrn_request.php:634
+#, php-format
 msgid ""
-"On your <em>Settings</em> page -  change your initial password. Also make a "
-"note of your Identity Address. This looks just like an email address - and "
-"will be useful in making friends on the free social web."
-msgstr "Ändere bitte unter <em>Einstellungen</em> dein Passwort. Außerdem merke dir deine Identifikationsadresse. Diese sieht aus wie eine E-Mail-Adresse und wird benötigt, um Kontakte mit anderen im Friendica Netzwerk zu knüpfen.."
+"If you are not yet a member of the free social web, <a href=\"%s\">follow "
+"this link to find a public Friendica site and join us today</a>."
+msgstr "Wenn du noch kein Mitglied dieses freien sozialen Netzwerks bist, <a href=\"%s\">folge diesem Link</a> um einen öffentlichen Friendica-Server zu finden und beizutreten."
+
+#: mod/dfrn_request.php:637
+msgid "Friend/Connection Request"
+msgstr "Kontaktanfrage"
 
-#: mod/newmember.php:23
+#: mod/dfrn_request.php:638
 msgid ""
-"Review the other settings, particularly the privacy settings. An unpublished"
-" directory listing is like having an unlisted phone number. In general, you "
-"should probably publish your listing - unless all of your friends and "
-"potential friends know exactly how to find you."
-msgstr "Überprüfe die restlichen Einstellungen, insbesondere die Einstellungen zur Privatsphäre. Wenn du dein Profil nicht veröffentlichst, ist das, als wenn du deine Telefonnummer nicht ins Telefonbuch einträgst. Im Allgemeinen solltest du es veröffentlichen - außer all deine Kontakte und potentiellen Kontakte wissen genau, wie sie dich finden können."
+"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
+"testuser@gnusocial.de"
+msgstr "Beispiele: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@gnusocial.de"
 
-#: mod/newmember.php:25 mod/profperm.php:117 src/Content/Nav.php:156
-#: src/Model/Profile.php:870 src/Model/Profile.php:903
-#: src/Module/Contact.php:657 src/Module/Contact.php:872
-#: view/theme/frio/theme.php:263
-msgid "Profile"
-msgstr "Profil"
+#: mod/dfrn_request.php:639 mod/follow.php:162
+msgid "Please answer the following:"
+msgstr "Bitte beantworte folgendes:"
 
-#: mod/newmember.php:27 mod/profiles.php:583 mod/profile_photo.php:253
-msgid "Upload Profile Photo"
-msgstr "Profilbild hochladen"
+#: mod/dfrn_request.php:640 mod/follow.php:163
+#, php-format
+msgid "Does %s know you?"
+msgstr "Kennt %s dich?"
 
-#: mod/newmember.php:27
-msgid ""
-"Upload a profile photo if you have not done so already. Studies have shown "
-"that people with real photos of themselves are ten times more likely to make"
-" friends than people who do not."
-msgstr "Lade ein Profilbild hoch, falls du es noch nicht getan hast. Studien haben gezeigt, dass es zehnmal wahrscheinlicher ist, neue Kontakte zu finden, wenn du ein Bild von dir selbst verwendest, als wenn du dies nicht tust."
+#: mod/dfrn_request.php:641 mod/follow.php:164
+msgid "Add a personal note:"
+msgstr "Eine persönliche Notiz beifügen:"
 
-#: mod/newmember.php:28
-msgid "Edit Your Profile"
-msgstr "Editiere dein Profil"
+#: mod/dfrn_request.php:643
+msgid "Friendica"
+msgstr "Friendica"
 
-#: mod/newmember.php:28
-msgid ""
-"Edit your <strong>default</strong> profile to your liking. Review the "
-"settings for hiding your list of friends and hiding the profile from unknown"
-" visitors."
-msgstr "Editiere dein <strong>Standard</strong>-Profil nach deinen Vorlieben. Überprüfe die Einstellungen zum Verbergen deiner Kontaktliste vor unbekannten Betrachtern des Profils."
+#: mod/dfrn_request.php:644
+msgid "GNU Social (Pleroma, Mastodon)"
+msgstr "GNU Social (Pleroma, Mastodon)"
 
-#: mod/newmember.php:29
-msgid "Profile Keywords"
-msgstr "Profil-Schlüsselbegriffe"
+#: mod/dfrn_request.php:645
+msgid "Diaspora (Socialhome, Hubzilla)"
+msgstr "Diaspora (Socialhome, Hubzilla)"
 
-#: mod/newmember.php:29
+#: mod/dfrn_request.php:646
+#, php-format
 msgid ""
-"Set some public keywords for your default profile which describe your "
-"interests. We may be able to find other people with similar interests and "
-"suggest friendships."
-msgstr "Trage ein paar öffentliche Stichwörter in dein Standardprofil ein, die deine Interessen beschreiben. Eventuell sind wir in der Lage, Leute zu finden, die deine Interessen teilen, und können dir dann Kontakte vorschlagen."
+" - please do not use this form.  Instead, enter %s into your Diaspora search"
+" bar."
+msgstr " - bitte verwende dieses Formular nicht. Stattdessen suche nach %s in Deiner Diaspora-Suchleiste."
 
-#: mod/newmember.php:31
-msgid "Connecting"
-msgstr "Verbindungen knüpfen"
+#: mod/display.php:252 mod/display.php:337
+msgid "The requested item doesn't exist or has been deleted."
+msgstr "Der angeforderte Beitrag existiert nicht oder wurde gelöscht."
 
-#: mod/newmember.php:37
-msgid "Importing Emails"
-msgstr "Emails Importieren"
+#: mod/display.php:412
+msgid "The feed for this item is unavailable."
+msgstr "Der Feed für diesen Beitrag ist nicht verfügbar."
 
-#: mod/newmember.php:37
-msgid ""
-"Enter your email access information on your Connector Settings page if you "
-"wish to import and interact with friends or mailing lists from your email "
-"INBOX"
-msgstr "Gib deine E-Mail-Zugangsinformationen auf der Connector-Einstellungsseite ein, falls du E-Mails aus Deinem Posteingang importieren und mit Kontakten und Mailinglisten interagieren willst."
+#: mod/editpost.php:28 mod/editpost.php:38
+msgid "Item not found"
+msgstr "Beitrag nicht gefunden"
 
-#: mod/newmember.php:40
-msgid "Go to Your Contacts Page"
-msgstr "Gehe zu deiner Kontakt-Seite"
+#: mod/editpost.php:45
+msgid "Edit post"
+msgstr "Beitrag bearbeiten"
 
-#: mod/newmember.php:40
-msgid ""
-"Your Contacts page is your gateway to managing friendships and connecting "
-"with friends on other networks. Typically you enter their address or site "
-"URL in the <em>Add New Contact</em> dialog."
-msgstr "Die Kontakte-Seite ist die Einstiegsseite, von der aus du Kontakte verwalten und dich mit Personen in anderen Netzwerken verbinden kannst. Normalerweise gibst du dazu einfach ihre Adresse oder die URL der Seite im Kasten <em>Neuen Kontakt hinzufügen</em> ein."
+#: mod/editpost.php:71 mod/notes.php:46 src/Content/Text/HTML.php:883
+#: src/Module/Filer/SaveTag.php:49
+msgid "Save"
+msgstr "Speichern"
 
-#: mod/newmember.php:41
-msgid "Go to Your Site's Directory"
-msgstr "Gehe zum Verzeichnis Deiner Friendica-Instanz"
+#: mod/editpost.php:77
+msgid "web link"
+msgstr "Weblink"
 
-#: mod/newmember.php:41
-msgid ""
-"The Directory page lets you find other people in this network or other "
-"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
-"their profile page. Provide your own Identity Address if requested."
-msgstr "Über die Verzeichnisseite kannst du andere Personen auf diesem Server oder anderen, verknüpften Seiten finden. Halte nach einem <em>Verbinden</em>- oder <em>Folgen</em>-Link auf deren Profilseiten Ausschau und gib deine eigene Profiladresse an, falls du danach gefragt wirst."
+#: mod/editpost.php:78
+msgid "Insert video link"
+msgstr "Video-Adresse einfügen"
 
-#: mod/newmember.php:42
-msgid "Finding New People"
-msgstr "Neue Leute kennenlernen"
+#: mod/editpost.php:79
+msgid "video link"
+msgstr "Video-Link"
 
-#: mod/newmember.php:42
-msgid ""
-"On the side panel of the Contacts page are several tools to find new "
-"friends. We can match people by interest, look up people by name or "
-"interest, and provide suggestions based on network relationships. On a brand"
-" new site, friend suggestions will usually begin to be populated within 24 "
-"hours."
-msgstr "Im seitlichen Bedienfeld der Kontakteseite gibt es diverse Werkzeuge, um neue Personen zu finden. Wir können Menschen mit den gleichen Interessen finden, anhand von Namen oder Interessen suchen oder aber aufgrund vorhandener Kontakte neue Leute vorschlagen.\nAuf einer brandneuen - soeben erstellten - Seite starten die Kontaktvorschläge innerhalb von 24 Stunden."
+#: mod/editpost.php:80
+msgid "Insert audio link"
+msgstr "Audio-Adresse einfügen"
 
-#: mod/newmember.php:44 src/Model/Group.php:435 src/Module/Contact.php:756
-msgid "Groups"
-msgstr "Gruppen"
+#: mod/editpost.php:81
+msgid "audio link"
+msgstr "Audio-Link"
 
-#: mod/newmember.php:46
-msgid "Group Your Contacts"
-msgstr "Gruppiere deine Kontakte"
+#: mod/editpost.php:95 src/Core/ACL.php:308 src/Module/Item/Compose.php:200
+msgid "CC: email addresses"
+msgstr "Cc: E-Mail-Addressen"
 
-#: mod/newmember.php:46
-msgid ""
-"Once you have made some friends, organize them into private conversation "
-"groups from the sidebar of your Contacts page and then you can interact with"
-" each group privately on your Network page."
-msgstr "Sobald du einige Kontakte gefunden hast, organisiere sie in Gruppen zur privaten Kommunikation im Seitenmenü der Kontakte-Seite. Du kannst dann mit jeder dieser Gruppen von der Netzwerkseite aus privat interagieren."
+#: mod/editpost.php:102 src/Core/ACL.php:309
+msgid "Example: bob@example.com, mary@example.com"
+msgstr "Z.B.: bob@example.com, mary@example.com"
 
-#: mod/newmember.php:49
-msgid "Why Aren't My Posts Public?"
-msgstr "Warum sind meine Beiträge nicht öffentlich?"
+#: mod/events.php:118 mod/events.php:120
+msgid "Event can not end before it has started."
+msgstr "Die Veranstaltung kann nicht enden, bevor sie beginnt."
 
-#: mod/newmember.php:49
-msgid ""
-"Friendica respects your privacy. By default, your posts will only show up to"
-" people you've added as friends. For more information, see the help section "
-"from the link above."
-msgstr "Friendica respektiert Deine Privatsphäre. Mit der Grundeinstellung werden Deine Beiträge ausschließlich Deinen Kontakten angezeigt. Für weitere Informationen diesbezüglich lies dir bitte den entsprechenden Abschnitt in der Hilfe unter dem obigen Link durch."
+#: mod/events.php:127 mod/events.php:129
+msgid "Event title and start time are required."
+msgstr "Der Veranstaltungstitel und die Anfangszeit müssen angegeben werden."
 
-#: mod/newmember.php:53
-msgid "Getting Help"
-msgstr "Hilfe bekommen"
+#: mod/events.php:385
+msgid "Create New Event"
+msgstr "Neue Veranstaltung erstellen"
 
-#: mod/newmember.php:55
-msgid "Go to the Help Section"
-msgstr "Zum Hilfe Abschnitt gehen"
+#: mod/events.php:508
+msgid "Event details"
+msgstr "Veranstaltungsdetails"
 
-#: mod/newmember.php:55
-msgid ""
-"Our <strong>help</strong> pages may be consulted for detail on other program"
-" features and resources."
-msgstr "Unsere <strong>Hilfe</strong>-Seiten können herangezogen werden, um weitere Einzelheiten zu anderen Programm-Features zu erhalten."
+#: mod/events.php:509
+msgid "Starting date and Title are required."
+msgstr "Anfangszeitpunkt und Titel werden benötigt"
 
-#: mod/notes.php:34 src/Model/Profile.php:953
-msgid "Personal Notes"
-msgstr "Persönliche Notizen"
+#: mod/events.php:510 mod/events.php:515
+msgid "Event Starts:"
+msgstr "Veranstaltungsbeginn:"
 
-#: mod/notifications.php:38
-msgid "Invalid request identifier."
-msgstr "Invalid request identifier."
+#: mod/events.php:523 mod/events.php:548
+msgid "Finish date/time is not known or not relevant"
+msgstr "Enddatum/-zeit ist nicht bekannt oder nicht relevant"
 
-#: mod/notifications.php:93 src/Content/Nav.php:246
-msgid "Notifications"
-msgstr "Benachrichtigungen"
+#: mod/events.php:525 mod/events.php:530
+msgid "Event Finishes:"
+msgstr "Veranstaltungsende:"
 
-#: mod/notifications.php:107
-msgid "Network Notifications"
-msgstr "Netzwerkbenachrichtigungen"
+#: mod/events.php:536 mod/events.php:549
+msgid "Adjust for viewer timezone"
+msgstr "An Zeitzone des Betrachters anpassen"
 
-#: mod/notifications.php:112 mod/notify.php:72
-msgid "System Notifications"
-msgstr "Systembenachrichtigungen"
+#: mod/events.php:538
+msgid "Description:"
+msgstr "Beschreibung"
 
-#: mod/notifications.php:117
-msgid "Personal Notifications"
-msgstr "Persönliche Benachrichtigungen"
+#: mod/events.php:540 mod/notifications.php:264 src/Model/Event.php:68
+#: src/Model/Event.php:95 src/Model/Event.php:437 src/Model/Event.php:933
+#: src/Model/Profile.php:447 src/Module/Contact.php:645
+#: src/Module/Directory.php:137
+msgid "Location:"
+msgstr "Ort:"
 
-#: mod/notifications.php:122
-msgid "Home Notifications"
-msgstr "Pinnwandbenachrichtigungen"
+#: mod/events.php:542 mod/events.php:544
+msgid "Title:"
+msgstr "Titel:"
 
-#: mod/notifications.php:142
-msgid "Show unread"
-msgstr "Ungelesene anzeigen"
+#: mod/events.php:545 mod/events.php:546
+msgid "Share this event"
+msgstr "Veranstaltung teilen"
 
-#: mod/notifications.php:142
-msgid "Show all"
-msgstr "Alle anzeigen"
+#: mod/events.php:553 src/Model/Profile.php:882
+msgid "Basic"
+msgstr "Allgemein"
 
-#: mod/notifications.php:153
-msgid "Show Ignored Requests"
-msgstr "Zeige ignorierte Anfragen"
+#: mod/events.php:554 src/Model/Profile.php:883 src/Module/Admin/Site.php:574
+#: src/Module/Contact.php:905
+msgid "Advanced"
+msgstr "Erweitert"
 
-#: mod/notifications.php:153
-msgid "Hide Ignored Requests"
-msgstr "Verberge ignorierte Anfragen"
+#: mod/events.php:555 mod/photos.php:1009 mod/photos.php:1383
+#: src/Core/ACL.php:314
+msgid "Permissions"
+msgstr "Berechtigungen"
 
-#: mod/notifications.php:166 mod/notifications.php:251
-msgid "Notification type:"
-msgstr "Art der Benachrichtigung:"
+#: mod/events.php:571
+msgid "Failed to remove event"
+msgstr "Entfernen der Veranstaltung fehlgeschlagen"
 
-#: mod/notifications.php:169
-msgid "Suggested by:"
-msgstr "Vorgeschlagen von:"
+#: mod/events.php:573
+msgid "Event removed"
+msgstr "Veranstaltung enfternt"
 
-#: mod/notifications.php:181 mod/notifications.php:268
-#: src/Module/Contact.php:633
-msgid "Hide this contact from others"
-msgstr "Verbirg diesen Kontakt vor Anderen"
+#: mod/fbrowser.php:43 view/theme/frio/theme.php:269 src/Content/Nav.php:162
+#: src/Model/Profile.php:925
+msgid "Photos"
+msgstr "Bilder"
 
-#: mod/notifications.php:183 mod/notifications.php:277
-#: src/Module/Admin/Users.php:286
-msgid "Approve"
-msgstr "Genehmigen"
+#: mod/fbrowser.php:52 mod/fbrowser.php:76 mod/photos.php:196
+#: mod/photos.php:973 mod/photos.php:1090 mod/photos.php:1107
+#: mod/photos.php:1584 mod/photos.php:1599 src/Model/Photo.php:574
+#: src/Model/Photo.php:583
+msgid "Contact Photos"
+msgstr "Kontaktbilder"
 
-#: mod/notifications.php:203
-msgid "Claims to be known to you: "
-msgstr "Behauptet, dich zu kennen: "
+#: mod/fbrowser.php:112 mod/fbrowser.php:141 mod/profile_photo.php:247
+msgid "Upload"
+msgstr "Hochladen"
 
-#: mod/notifications.php:204
-msgid "yes"
-msgstr "ja"
+#: mod/fbrowser.php:136
+msgid "Files"
+msgstr "Dateien"
 
-#: mod/notifications.php:204
-msgid "no"
-msgstr "nein"
+#: mod/follow.php:46
+msgid "The contact could not be added."
+msgstr "Der Kontakt konnte nicht hinzugefügt werden."
 
-#: mod/notifications.php:205 mod/notifications.php:209
-msgid "Shall your connection be bidirectional or not?"
-msgstr "Soll die Verbindung beidseitig sein oder nicht?"
+#: mod/follow.php:87
+msgid "You already added this contact."
+msgstr "Du hast den Kontakt bereits hinzugefügt."
 
-#: mod/notifications.php:206 mod/notifications.php:210
-#, php-format
-msgid ""
-"Accepting %s as a friend allows %s to subscribe to your posts, and you will "
-"also receive updates from them in your news feed."
-msgstr "Akzeptierst du %s als Kontakt, erlaubst du damit das Lesen deiner Beiträge und abonnierst selbst auch die Beiträge von %s."
+#: mod/follow.php:99
+msgid "Diaspora support isn't enabled. Contact can't be added."
+msgstr "Diaspora-Unterstützung ist nicht aktiviert. Der Kontakt kann nicht zugefügt werden."
 
-#: mod/notifications.php:207
-#, php-format
-msgid ""
-"Accepting %s as a subscriber allows them to subscribe to your posts, but you"
-" will not receive updates from them in your news feed."
-msgstr "Wenn du %s als Abonnent akzeptierst, erlaubst du damit das Lesen deiner Beiträge, wirst aber selbst die Beiträge der anderen Seite nicht erhalten."
+#: mod/follow.php:106
+msgid "OStatus support is disabled. Contact can't be added."
+msgstr "OStatus-Unterstützung ist nicht aktiviert. Der Kontakt kann nicht zugefügt werden."
 
-#: mod/notifications.php:211
-#, php-format
-msgid ""
-"Accepting %s as a sharer allows them to subscribe to your posts, but you "
-"will not receive updates from them in your news feed."
-msgstr "Wenn du %s als Teilender akzeptierst, erlaubst du damit das Lesen deiner Beiträge, wirst aber selbst die Beiträge der anderen Seite nicht erhalten."
+#: mod/follow.php:113
+msgid "The network type couldn't be detected. Contact can't be added."
+msgstr "Der Netzwerktyp wurde nicht erkannt. Der Kontakt kann nicht hinzugefügt werden."
+
+#: mod/follow.php:183 mod/notifications.php:268 src/Model/Profile.php:812
+#: src/Module/Contact.php:651
+msgid "Tags:"
+msgstr "Tags:"
 
-#: mod/notifications.php:222
-msgid "Friend"
-msgstr "Kontakt"
+#: mod/fsuggest.php:44
+msgid "Suggested contact not found."
+msgstr "Vorgeschlagener Kontakt wurde nicht gefunden."
 
-#: mod/notifications.php:223
-msgid "Sharer"
-msgstr "Teilender"
+#: mod/fsuggest.php:57
+msgid "Friend suggestion sent."
+msgstr "Kontaktvorschlag gesendet."
 
-#: mod/notifications.php:223
-msgid "Subscriber"
-msgstr "Abonnent"
+#: mod/fsuggest.php:79
+msgid "Suggest Friends"
+msgstr "Kontakte vorschlagen"
 
-#: mod/notifications.php:263 src/Model/Profile.php:445
-#: src/Model/Profile.php:813 src/Module/Contact.php:650
-#: src/Module/Directory.php:150
-msgid "About:"
-msgstr "Über:"
+#: mod/fsuggest.php:81
+#, php-format
+msgid "Suggest a friend for %s"
+msgstr "Schlage %s einen Kontakt vor"
 
-#: mod/notifications.php:267 src/Model/Profile.php:442
-#: src/Model/Profile.php:752 src/Module/Directory.php:147
-msgid "Gender:"
-msgstr "Geschlecht:"
+#: mod/hcard.php:20
+msgid "No profile"
+msgstr "Kein Profil"
 
-#: mod/notifications.php:274 src/Model/Profile.php:539
-#: src/Module/Contact.php:90
-msgid "Network:"
-msgstr "Netzwerk:"
+#: mod/item.php:123
+msgid "Unable to locate original post."
+msgstr "Konnte den Originalbeitrag nicht finden."
 
-#: mod/notifications.php:288
-msgid "No introductions."
-msgstr "Keine Kontaktanfragen."
+#: mod/item.php:323
+msgid "Empty post discarded."
+msgstr "Leerer Beitrag wurde verworfen."
 
-#: mod/notifications.php:322
+#: mod/item.php:803
 #, php-format
-msgid "No more %s notifications."
-msgstr "Keine weiteren %s-Benachrichtigungen"
+msgid ""
+"This message was sent to you by %s, a member of the Friendica social "
+"network."
+msgstr "Diese Nachricht wurde dir von %s geschickt, einem Mitglied des Sozialen Netzwerks Friendica."
 
-#: mod/notify.php:68
-msgid "No more system notifications."
-msgstr "Keine weiteren Systembenachrichtigungen."
+#: mod/item.php:805
+#, php-format
+msgid "You may visit them online at %s"
+msgstr "Du kannst sie online unter %s besuchen"
 
-#: mod/oexchange.php:32
-msgid "Post successful."
-msgstr "Beitrag erfolgreich veröffentlicht."
+#: mod/item.php:806
+msgid ""
+"Please contact the sender by replying to this post if you do not wish to "
+"receive these messages."
+msgstr "Falls du diese Beiträge nicht erhalten möchtest, kontaktiere bitte den Autor, indem du auf diese Nachricht antwortest."
 
-#: mod/openid.php:31
-msgid "OpenID protocol error. No ID returned."
-msgstr "OpenID Protokollfehler. Keine ID zurückgegeben."
+#: mod/item.php:810
+#, php-format
+msgid "%s posted an update."
+msgstr "%s hat ein Update veröffentlicht."
 
-#: mod/openid.php:67
-msgid ""
-"Account not found and OpenID registration is not permitted on this site."
-msgstr "Nutzerkonto wurde nicht gefunden und OpenID-Registrierung ist auf diesem Server nicht gestattet."
+#: mod/lockview.php:47 mod/lockview.php:58
+msgid "Remote privacy information not available."
+msgstr "Entfernte Privatsphäreneinstellungen nicht verfügbar."
 
-#: mod/openid.php:117 src/Module/Login.php:93 src/Module/Login.php:144
-msgid "Login failed."
-msgstr "Anmeldung fehlgeschlagen."
+#: mod/lockview.php:67
+msgid "Visible to:"
+msgstr "Sichtbar für:"
 
-#: mod/ostatus_subscribe.php:23
-msgid "Subscribing to OStatus contacts"
-msgstr "OStatus-Kontakten folgen"
+#: mod/lockview.php:73 mod/lockview.php:108 src/Content/Widget.php:192
+#: src/Module/Contact.php:797 src/Module/Item/Compose.php:97
+#: src/Module/Profile/Contacts.php:126
+msgid "Followers"
+msgstr "Folgende"
 
-#: mod/ostatus_subscribe.php:35
-msgid "No contact provided."
-msgstr "Keine Kontakte gefunden."
+#: mod/lockview.php:79 mod/lockview.php:114 src/Module/Item/Compose.php:104
+msgid "Mutuals"
+msgstr "Beidseitige Freundschaft"
 
-#: mod/ostatus_subscribe.php:42
-msgid "Couldn't fetch information for contact."
-msgstr "Konnte die Kontaktinformationen nicht einholen."
+#: mod/lostpass.php:26
+msgid "No valid account found."
+msgstr "Kein gültiges Konto gefunden."
 
-#: mod/ostatus_subscribe.php:52
-msgid "Couldn't fetch friends for contact."
-msgstr "Konnte die Kontaktliste des Kontakts nicht abfragen."
+#: mod/lostpass.php:38
+msgid "Password reset request issued. Check your email."
+msgstr "Zurücksetzen des Passworts eingeleitet. Bitte überprüfe Deine E-Mail."
 
-#: mod/ostatus_subscribe.php:70 mod/repair_ostatus.php:52
-msgid "Done"
-msgstr "Erledigt"
+#: mod/lostpass.php:44
+#, php-format
+msgid ""
+"\n"
+"\t\tDear %1$s,\n"
+"\t\t\tA request was recently received at \"%2$s\" to reset your account\n"
+"\t\tpassword. In order to confirm this request, please select the verification link\n"
+"\t\tbelow or paste it into your web browser address bar.\n"
+"\n"
+"\t\tIf you did NOT request this change, please DO NOT follow the link\n"
+"\t\tprovided and ignore and/or delete this email, the request will expire shortly.\n"
+"\n"
+"\t\tYour password will not be changed unless we can verify that you\n"
+"\t\tissued this request."
+msgstr "\nHallo %1$s,\n\nAuf \"%2$s\" ist eine Anfrage auf das Zurücksetzen deines Passworts gestellt\nworden. Um diese Anfrage zu verifizieren, folge bitte dem unten stehenden\nLink oder kopiere und füge ihn in die Adressleiste deines Browsers ein.\n\nSolltest du die Anfrage NICHT gestellt haben, ignoriere und/oder lösche diese\nE-Mail bitte.\n\nDein Passwort wird nicht geändert, solange wir nicht verifiziert haben, dass\ndu diese Änderung angefragt hast."
 
-#: mod/ostatus_subscribe.php:84
-msgid "success"
-msgstr "Erfolg"
+#: mod/lostpass.php:55
+#, php-format
+msgid ""
+"\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"
+msgstr "\nUm deine Identität zu verifizieren, folge bitte diesem Link:\n\n%1$s\n\nDu wirst eine weitere E-Mail mit deinem neuen Passwort erhalten. Sobald du dich\nangemeldet hast, kannst du dein Passwort in den Einstellungen ändern.\n\nDie Anmeldedetails sind die folgenden:\n\nAdresse der Seite:\t%2$s\nBenutzername:\t%3$s"
 
-#: mod/ostatus_subscribe.php:86
-msgid "failed"
-msgstr "Fehlgeschlagen"
+#: mod/lostpass.php:74
+#, php-format
+msgid "Password reset requested at %s"
+msgstr "Anfrage zum Zurücksetzen des Passworts auf %s erhalten"
 
-#: mod/ostatus_subscribe.php:89 src/Object/Post.php:284
-msgid "ignored"
-msgstr "Ignoriert"
+#: mod/lostpass.php:89
+msgid ""
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
+msgstr "Anfrage konnte nicht verifiziert werden. (Eventuell hast du bereits eine ähnliche Anfrage gestellt.) Zurücksetzen des Passworts gescheitert."
 
-#: mod/ostatus_subscribe.php:94 mod/repair_ostatus.php:58
-msgid "Keep this window open until done."
-msgstr "Lasse dieses Fenster offen, bis der Vorgang abgeschlossen ist."
+#: mod/lostpass.php:102
+msgid "Request has expired, please make a new one."
+msgstr "Die Anfrage ist abgelaufen. Bitte stelle eine erneute."
 
-#: mod/photos.php:113 src/Model/Profile.php:914
-msgid "Photo Albums"
-msgstr "Fotoalben"
+#: mod/lostpass.php:117
+msgid "Forgot your Password?"
+msgstr "Hast du dein Passwort vergessen?"
 
-#: mod/photos.php:114 mod/photos.php:1630
-msgid "Recent Photos"
-msgstr "Neueste Fotos"
+#: mod/lostpass.php:118
+msgid ""
+"Enter your email address and submit to have your password reset. Then check "
+"your email for further instructions."
+msgstr "Gib Deine E-Mail-Adresse an und fordere ein neues Passwort an. Es werden dir dann weitere Informationen per Mail zugesendet."
 
-#: mod/photos.php:116 mod/photos.php:1144 mod/photos.php:1632
-msgid "Upload New Photos"
-msgstr "Neue Fotos hochladen"
+#: mod/lostpass.php:119 src/Module/Login.php:318
+msgid "Nickname or Email: "
+msgstr "Spitzname oder E-Mail:"
 
-#: mod/photos.php:134 mod/settings.php:58 src/Module/BaseSettingsModule.php:18
-msgid "everybody"
-msgstr "jeder"
+#: mod/lostpass.php:120
+msgid "Reset"
+msgstr "Zurücksetzen"
 
-#: mod/photos.php:185
-msgid "Contact information unavailable"
-msgstr "Kontaktinformationen nicht verfügbar"
+#: mod/lostpass.php:135 src/Module/Login.php:330
+msgid "Password Reset"
+msgstr "Passwort zurücksetzen"
 
-#: mod/photos.php:204
-msgid "Album not found."
-msgstr "Album nicht gefunden."
+#: mod/lostpass.php:136
+msgid "Your password has been reset as requested."
+msgstr "Dein Passwort wurde wie gewünscht zurückgesetzt."
 
-#: mod/photos.php:262
-msgid "Album successfully deleted"
-msgstr "Album wurde erfolgreich gelöscht."
+#: mod/lostpass.php:137
+msgid "Your new password is"
+msgstr "Dein neues Passwort lautet"
 
-#: mod/photos.php:264
-msgid "Album was empty."
-msgstr "Album ist leer."
+#: mod/lostpass.php:138
+msgid "Save or copy your new password - and then"
+msgstr "Speichere oder kopiere dein neues Passwort - und dann"
 
-#: mod/photos.php:586
-msgid "a photo"
-msgstr "einem Foto"
+#: mod/lostpass.php:139
+msgid "click here to login"
+msgstr "hier klicken, um dich anzumelden"
+
+#: mod/lostpass.php:140
+msgid ""
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
+msgstr "Du kannst das Passwort in den <em>Einstellungen</em> ändern, sobald du dich erfolgreich angemeldet hast."
 
-#: mod/photos.php:586
+#: mod/lostpass.php:147
 #, php-format
-msgid "%1$s was tagged in %2$s by %3$s"
-msgstr "%1$s wurde von %3$s in %2$s getaggt"
+msgid ""
+"\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"
+msgstr "\nHallo %1$s,\n\nDein Passwort wurde wie gewünscht geändert. Bitte bewahre diese Informationen gut auf (oder ändere dein Passwort in eines, das du dir leicht merken kannst)."
 
-#: mod/photos.php:679 mod/photos.php:682 mod/photos.php:711
-#: mod/profile_photo.php:152 mod/wall_upload.php:198
+#: mod/lostpass.php:153
 #, php-format
-msgid "Image exceeds size limit of %s"
-msgstr "Bildgröße überschreitet das Limit von %s"
+msgid ""
+"\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"
+msgstr "\nDie Anmeldedaten sind die folgenden:\n\nAdresse der Seite: %1$s\nLogin Name: %2$s\nPasswort: %3$s\n\nDas Passwort kann und sollte in den Kontoeinstellungen nach der Anmeldung geändert werden."
 
-#: mod/photos.php:685
-msgid "Image upload didn't complete, please try again"
-msgstr "Der Upload des Bildes war nicht vollständig. Bitte versuche es erneut."
+#: mod/lostpass.php:169
+#, php-format
+msgid "Your password has been changed at %s"
+msgstr "Auf %s wurde dein Passwort geändert"
 
-#: mod/photos.php:688
-msgid "Image file is missing"
-msgstr "Bilddatei konnte nicht gefunden werden."
+#: mod/manage.php:179
+msgid "Manage Identities and/or Pages"
+msgstr "Verwalte Identitäten und/oder Seiten"
 
-#: mod/photos.php:693
+#: mod/manage.php:180
 msgid ""
-"Server can't accept new file upload at this time, please contact your "
-"administrator"
-msgstr "Der Server kann derzeit keine neuen Datei-Uploads akzeptieren. Bitte kontaktiere deinen Administrator."
+"Toggle between different identities or community/group pages which share "
+"your account details or which you have been granted \"manage\" permissions"
+msgstr "Zwischen verschiedenen Identitäten oder Gemeinschafts-/Gruppenseiten wechseln, die deine Kontoinformationen teilen oder zu denen du „Verwalten“-Befugnisse bekommen hast."
 
-#: mod/photos.php:719
-msgid "Image file is empty."
-msgstr "Bilddatei ist leer."
+#: mod/manage.php:181
+msgid "Select an identity to manage: "
+msgstr "Wähle eine Identität zum Verwalten aus: "
 
-#: mod/photos.php:734 mod/profile_photo.php:161 mod/wall_upload.php:212
-msgid "Unable to process image."
-msgstr "Konnte das Bild nicht bearbeiten."
+#: mod/message.php:33 mod/message.php:116 src/Content/Nav.php:257
+msgid "New Message"
+msgstr "Neue Nachricht"
 
-#: mod/photos.php:763 mod/profile_photo.php:310 mod/wall_upload.php:251
-msgid "Image upload failed."
-msgstr "Hochladen des Bildes gescheitert."
+#: mod/message.php:74
+msgid "Unable to locate contact information."
+msgstr "Konnte die Kontaktinformationen nicht finden."
 
-#: mod/photos.php:851
-msgid "No photos selected"
-msgstr "Keine Bilder ausgewählt"
+#: mod/message.php:110 mod/notifications.php:47 mod/notifications.php:190
+#: mod/notifications.php:246
+msgid "Discard"
+msgstr "Verwerfen"
+
+#: mod/message.php:123 view/theme/frio/theme.php:276 src/Content/Nav.php:254
+msgid "Messages"
+msgstr "Nachrichten"
+
+#: mod/message.php:148
+msgid "Do you really want to delete this message?"
+msgstr "Möchtest du diese Nachricht wirklich löschen?"
 
-#: mod/photos.php:943 mod/videos.php:210
-msgid "Access to this item is restricted."
-msgstr "Zugriff zu diesem Eintrag wurde eingeschränkt."
+#: mod/message.php:166
+msgid "Conversation not found."
+msgstr "Unterhaltung nicht gefunden."
 
-#: mod/photos.php:997
-msgid "Upload Photos"
-msgstr "Bilder hochladen"
+#: mod/message.php:171
+msgid "Message deleted."
+msgstr "Nachricht gelöscht."
 
-#: mod/photos.php:1001 mod/photos.php:1089
-msgid "New album name: "
-msgstr "Name des neuen Albums: "
+#: mod/message.php:176 mod/message.php:190
+msgid "Conversation removed."
+msgstr "Unterhaltung gelöscht."
 
-#: mod/photos.php:1002
-msgid "or select existing album:"
-msgstr "oder wähle ein bestehendes Album:"
+#: mod/message.php:289
+msgid "No messages."
+msgstr "Keine Nachrichten."
 
-#: mod/photos.php:1003
-msgid "Do not show a status post for this upload"
-msgstr "Keine Status-Mitteilung für diesen Beitrag anzeigen"
+#: mod/message.php:352
+msgid "Message not available."
+msgstr "Nachricht nicht verfügbar."
 
-#: mod/photos.php:1019 mod/photos.php:1382 mod/settings.php:1208
-msgid "Show to Groups"
-msgstr "Zeige den Gruppen"
+#: mod/message.php:406
+msgid "Delete message"
+msgstr "Nachricht löschen"
 
-#: mod/photos.php:1020 mod/photos.php:1383 mod/settings.php:1209
-msgid "Show to Contacts"
-msgstr "Zeige den Kontakten"
+#: mod/message.php:408 mod/message.php:540
+msgid "D, d M Y - g:i A"
+msgstr "D, d. M Y - H:i"
 
-#: mod/photos.php:1071
-msgid "Do you really want to delete this photo album and all its photos?"
-msgstr "Möchtest du wirklich dieses Foto-Album und all seine Foto löschen?"
+#: mod/message.php:423 mod/message.php:537
+msgid "Delete conversation"
+msgstr "Unterhaltung löschen"
 
-#: mod/photos.php:1073 mod/photos.php:1094
-msgid "Delete Album"
-msgstr "Album löschen"
+#: mod/message.php:425
+msgid ""
+"No secure communications available. You <strong>may</strong> be able to "
+"respond from the sender's profile page."
+msgstr "Sichere Kommunikation ist nicht verfügbar. <strong>Eventuell</strong> kannst du auf der Profilseite des Absenders antworten."
 
-#: mod/photos.php:1100
-msgid "Edit Album"
-msgstr "Album bearbeiten"
+#: mod/message.php:429
+msgid "Send Reply"
+msgstr "Antwort senden"
 
-#: mod/photos.php:1101
-msgid "Drop Album"
-msgstr "Album löschen"
+#: mod/message.php:512
+#, php-format
+msgid "Unknown sender - %s"
+msgstr "Unbekannter Absender - %s"
 
-#: mod/photos.php:1106
-msgid "Show Newest First"
-msgstr "Zeige neueste zuerst"
+#: mod/message.php:514
+#, php-format
+msgid "You and %s"
+msgstr "Du und %s"
 
-#: mod/photos.php:1108
-msgid "Show Oldest First"
-msgstr "Zeige älteste zuerst"
+#: mod/message.php:516
+#, php-format
+msgid "%s and You"
+msgstr "%s und du"
 
-#: mod/photos.php:1129 mod/photos.php:1615
-msgid "View Photo"
-msgstr "Foto betrachten"
+#: mod/message.php:543
+#, php-format
+msgid "%d message"
+msgid_plural "%d messages"
+msgstr[0] "%d Nachricht"
+msgstr[1] "%d Nachrichten"
 
-#: mod/photos.php:1166
-msgid "Permission denied. Access to this item may be restricted."
-msgstr "Zugriff verweigert. Zugriff zu diesem Eintrag könnte eingeschränkt sein."
+#: mod/network.php:183 mod/search.php:35
+msgid "Remove term"
+msgstr "Begriff entfernen"
 
-#: mod/photos.php:1168
-msgid "Photo not available"
-msgstr "Foto nicht verfügbar"
+#: mod/network.php:190 mod/search.php:44
+msgid "Saved Searches"
+msgstr "Gespeicherte Suchen"
 
-#: mod/photos.php:1178
-msgid "Do you really want to delete this photo?"
-msgstr "Möchtest du wirklich dieses Foto löschen?"
+#: mod/network.php:191 src/Model/Group.php:483
+msgid "add"
+msgstr "hinzufügen"
 
-#: mod/photos.php:1180 mod/photos.php:1379
-msgid "Delete Photo"
-msgstr "Foto löschen"
+#: mod/network.php:571
+#, php-format
+msgid ""
+"Warning: This group contains %s member from a network that doesn't allow non"
+" public messages."
+msgid_plural ""
+"Warning: This group contains %s members from a network that doesn't allow "
+"non public messages."
+msgstr[0] "Warnung: Diese Gruppe beinhaltet %s Person aus einem Netzwerk das keine nicht öffentlichen Beiträge empfangen kann."
+msgstr[1] "Warnung: Diese Gruppe beinhaltet %s Personen aus Netzwerken, die keine nicht-öffentlichen Beiträge empfangen können."
 
-#: mod/photos.php:1271
-msgid "View photo"
-msgstr "Fotos ansehen"
+#: mod/network.php:574
+msgid "Messages in this group won't be send to these receivers."
+msgstr "Beiträge in dieser Gruppe werden deshalb nicht an diese Personen zugestellt werden."
 
-#: mod/photos.php:1273
-msgid "Edit photo"
-msgstr "Foto bearbeiten"
+#: mod/network.php:641
+msgid "No such group"
+msgstr "Es gibt keine solche Gruppe"
 
-#: mod/photos.php:1274
-msgid "Delete photo"
-msgstr "Foto löschen"
+#: mod/network.php:662 src/Module/Group.php:288
+msgid "Group is empty"
+msgstr "Gruppe ist leer"
 
-#: mod/photos.php:1275
-msgid "Use as profile photo"
-msgstr "Als Profilbild verwenden"
+#: mod/network.php:666
+#, php-format
+msgid "Group: %s"
+msgstr "Gruppe: %s"
 
-#: mod/photos.php:1282
-msgid "Private Photo"
-msgstr "Privates Foto"
+#: mod/network.php:692
+msgid "Private messages to this person are at risk of public disclosure."
+msgstr "Private Nachrichten an diese Person könnten an die Öffentlichkeit gelangen."
 
-#: mod/photos.php:1288
-msgid "View Full Size"
-msgstr "Betrachte Originalgröße"
+#: mod/network.php:695 src/Module/AllFriends.php:35
+#: src/Module/AllFriends.php:43
+msgid "Invalid contact."
+msgstr "Ungültiger Kontakt."
 
-#: mod/photos.php:1347
-msgid "Tags: "
-msgstr "Tags: "
+#: mod/network.php:974
+msgid "Commented Order"
+msgstr "Neueste Kommentare"
 
-#: mod/photos.php:1350
-msgid "[Select tags to remove]"
-msgstr "[Zu entfernende Tags auswählen]"
+#: mod/network.php:977
+msgid "Sort by Comment Date"
+msgstr "Nach Kommentardatum sortieren"
 
-#: mod/photos.php:1365
-msgid "New album name"
-msgstr "Name des neuen Albums"
+#: mod/network.php:982
+msgid "Posted Order"
+msgstr "Neueste Beiträge"
 
-#: mod/photos.php:1366
-msgid "Caption"
-msgstr "Bildunterschrift"
+#: mod/network.php:985
+msgid "Sort by Post Date"
+msgstr "Nach Beitragsdatum sortieren"
 
-#: mod/photos.php:1367
-msgid "Add a Tag"
-msgstr "Tag hinzufügen"
+#: mod/network.php:995
+msgid "Posts that mention or involve you"
+msgstr "Beiträge, in denen es um dich geht"
 
-#: mod/photos.php:1367
-msgid ""
-"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
-msgstr "Beispiel: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+#: mod/network.php:1002
+msgid "New"
+msgstr "Neue"
 
-#: mod/photos.php:1368
-msgid "Do not rotate"
-msgstr "Nicht rotieren"
+#: mod/network.php:1005
+msgid "Activity Stream - by date"
+msgstr "Aktivitäten-Stream - nach Datum"
 
-#: mod/photos.php:1369
-msgid "Rotate CW (right)"
-msgstr "Drehen US (rechts)"
+#: mod/network.php:1013
+msgid "Shared Links"
+msgstr "Geteilte Links"
 
-#: mod/photos.php:1370
-msgid "Rotate CCW (left)"
-msgstr "Drehen EUS (links)"
+#: mod/network.php:1016
+msgid "Interesting Links"
+msgstr "Interessante Links"
 
-#: mod/photos.php:1404 src/Object/Post.php:312
-msgid "I like this (toggle)"
-msgstr "Ich mag das (toggle)"
+#: mod/network.php:1023
+msgid "Starred"
+msgstr "Markierte"
 
-#: mod/photos.php:1405 src/Object/Post.php:313
-msgid "I don't like this (toggle)"
-msgstr "Ich mag das nicht (toggle)"
+#: mod/network.php:1026
+msgid "Favourite Posts"
+msgstr "Favorisierte Beiträge"
 
-#: mod/photos.php:1420 mod/photos.php:1459 mod/photos.php:1519
-#: src/Module/Contact.php:1021 src/Object/Post.php:874
-msgid "This is you"
-msgstr "Das bist du"
+#: mod/notes.php:34 src/Model/Profile.php:967
+msgid "Personal Notes"
+msgstr "Persönliche Notizen"
 
-#: mod/photos.php:1422 mod/photos.php:1461 mod/photos.php:1521
-#: src/Object/Post.php:419 src/Object/Post.php:876
-msgid "Comment"
-msgstr "Kommentar"
+#: mod/notifications.php:38
+msgid "Invalid request identifier."
+msgstr "Invalid request identifier."
 
-#: mod/photos.php:1550
-msgid "Map"
-msgstr "Karte"
+#: mod/notifications.php:93 src/Content/Nav.php:249
+msgid "Notifications"
+msgstr "Benachrichtigungen"
 
-#: mod/photos.php:1621 mod/videos.php:287
-msgid "View Album"
-msgstr "Album betrachten"
+#: mod/notifications.php:107
+msgid "Network Notifications"
+msgstr "Netzwerkbenachrichtigungen"
 
-#: mod/ping.php:272
-msgid "{0} wants to be your friend"
-msgstr "{0} möchte mit dir in Kontakt treten"
+#: mod/notifications.php:112
+msgid "System Notifications"
+msgstr "Systembenachrichtigungen"
 
-#: mod/ping.php:288
-msgid "{0} requested registration"
-msgstr "{0} möchte sich registrieren"
+#: mod/notifications.php:117
+msgid "Personal Notifications"
+msgstr "Persönliche Benachrichtigungen"
 
-#: mod/poke.php:177
-msgid "Poke/Prod"
-msgstr "Anstupsen"
+#: mod/notifications.php:122
+msgid "Home Notifications"
+msgstr "Pinnwandbenachrichtigungen"
 
-#: mod/poke.php:178
-msgid "poke, prod or do other things to somebody"
-msgstr "Stupse Leute an oder mache anderes mit ihnen"
+#: mod/notifications.php:145
+msgid "Show unread"
+msgstr "Ungelesene anzeigen"
 
-#: mod/poke.php:179
-msgid "Recipient"
-msgstr "Empfänger"
+#: mod/notifications.php:145
+msgid "Show all"
+msgstr "Alle anzeigen"
 
-#: mod/poke.php:180
-msgid "Choose what you wish to do to recipient"
-msgstr "Was willst du mit dem Empfänger machen:"
+#: mod/notifications.php:156
+msgid "Show Ignored Requests"
+msgstr "Zeige ignorierte Anfragen"
 
-#: mod/poke.php:183
-msgid "Make this post private"
-msgstr "Diesen Beitrag privat machen"
+#: mod/notifications.php:156
+msgid "Hide Ignored Requests"
+msgstr "Verberge ignorierte Anfragen"
 
-#: mod/probe.php:13 src/Module/WebFinger.php:18
-msgid "Only logged in users are permitted to perform a probing."
-msgstr "Nur eingeloggten Benutzern ist das Untersuchen von Adressen gestattet."
+#: mod/notifications.php:169 mod/notifications.php:254
+msgid "Notification type:"
+msgstr "Art der Benachrichtigung:"
 
-#: mod/profiles.php:62
-msgid "Profile deleted."
-msgstr "Profil gelöscht."
+#: mod/notifications.php:172
+msgid "Suggested by:"
+msgstr "Vorgeschlagen von:"
 
-#: mod/profiles.php:78 mod/profiles.php:114
-msgid "Profile-"
-msgstr "Profil-"
+#: mod/notifications.php:184 mod/notifications.php:271
+#: src/Module/Contact.php:632
+msgid "Hide this contact from others"
+msgstr "Verbirg diesen Kontakt vor Anderen"
 
-#: mod/profiles.php:97 mod/profiles.php:135
-msgid "New profile created."
-msgstr "Neues Profil angelegt."
+#: mod/notifications.php:186 mod/notifications.php:280
+#: src/Module/Admin/Users.php:286
+msgid "Approve"
+msgstr "Genehmigen"
 
-#: mod/profiles.php:120
-msgid "Profile unavailable to clone."
-msgstr "Profil nicht zum Duplizieren verfügbar."
+#: mod/notifications.php:206
+msgid "Claims to be known to you: "
+msgstr "Behauptet, dich zu kennen: "
 
-#: mod/profiles.php:206
-msgid "Profile Name is required."
-msgstr "Profilname ist erforderlich."
+#: mod/notifications.php:207
+msgid "yes"
+msgstr "ja"
 
-#: mod/profiles.php:346
-msgid "Marital Status"
-msgstr "Familienstand"
+#: mod/notifications.php:207
+msgid "no"
+msgstr "nein"
 
-#: mod/profiles.php:349
-msgid "Romantic Partner"
-msgstr "Romanze"
+#: mod/notifications.php:208 mod/notifications.php:212
+msgid "Shall your connection be bidirectional or not?"
+msgstr "Soll die Verbindung beidseitig sein oder nicht?"
 
-#: mod/profiles.php:358
-msgid "Work/Employment"
-msgstr "Arbeit / Beschäftigung"
+#: mod/notifications.php:209 mod/notifications.php:213
+#, php-format
+msgid ""
+"Accepting %s as a friend allows %s to subscribe to your posts, and you will "
+"also receive updates from them in your news feed."
+msgstr "Akzeptierst du %s als Kontakt, erlaubst du damit das Lesen deiner Beiträge und abonnierst selbst auch die Beiträge von %s."
 
-#: mod/profiles.php:361
-msgid "Religion"
-msgstr "Religion"
+#: mod/notifications.php:210
+#, php-format
+msgid ""
+"Accepting %s as a subscriber allows them to subscribe to your posts, but you"
+" will not receive updates from them in your news feed."
+msgstr "Wenn du %s als Abonnent akzeptierst, erlaubst du damit das Lesen deiner Beiträge, wirst aber selbst die Beiträge der anderen Seite nicht erhalten."
 
-#: mod/profiles.php:364
-msgid "Political Views"
-msgstr "Politische Ansichten"
+#: mod/notifications.php:214
+#, php-format
+msgid ""
+"Accepting %s as a sharer allows them to subscribe to your posts, but you "
+"will not receive updates from them in your news feed."
+msgstr "Wenn du %s als Teilender akzeptierst, erlaubst du damit das Lesen deiner Beiträge, wirst aber selbst die Beiträge der anderen Seite nicht erhalten."
 
-#: mod/profiles.php:367
-msgid "Gender"
-msgstr "Geschlecht"
+#: mod/notifications.php:225
+msgid "Friend"
+msgstr "Kontakt"
 
-#: mod/profiles.php:370
-msgid "Sexual Preference"
-msgstr "Sexuelle Vorlieben"
+#: mod/notifications.php:226
+msgid "Sharer"
+msgstr "Teilender"
 
-#: mod/profiles.php:373
-msgid "XMPP"
-msgstr "XMPP"
+#: mod/notifications.php:226
+msgid "Subscriber"
+msgstr "Abonnent"
 
-#: mod/profiles.php:376
-msgid "Homepage"
-msgstr "Webseite"
+#: mod/notifications.php:266 src/Model/Profile.php:453
+#: src/Model/Profile.php:824 src/Module/Contact.php:649
+#: src/Module/Directory.php:145
+msgid "About:"
+msgstr "Über:"
 
-#: mod/profiles.php:379 mod/profiles.php:578
-msgid "Interests"
-msgstr "Interessen"
+#: mod/notifications.php:270 src/Model/Profile.php:450
+#: src/Model/Profile.php:763 src/Module/Directory.php:142
+msgid "Gender:"
+msgstr "Geschlecht:"
 
-#: mod/profiles.php:382 src/Module/Admin/Blocklist/Contact.php:72
-msgid "Address"
-msgstr "Adresse"
+#: mod/notifications.php:277 src/Model/Profile.php:550
+#: src/Module/Contact.php:333
+msgid "Network:"
+msgstr "Netzwerk:"
 
-#: mod/profiles.php:389 mod/profiles.php:574
-msgid "Location"
-msgstr "Wohnort"
+#: mod/notifications.php:291
+msgid "No introductions."
+msgstr "Keine Kontaktanfragen."
 
-#: mod/profiles.php:469
-msgid "Profile updated."
-msgstr "Profil aktualisiert."
+#: mod/notifications.php:325
+#, php-format
+msgid "No more %s notifications."
+msgstr "Keine weiteren %s-Benachrichtigungen"
 
-#: mod/profiles.php:523
-msgid "Hide contacts and friends:"
-msgstr "Kontakte und Freunde verbergen"
+#: mod/openid.php:31
+msgid "OpenID protocol error. No ID returned."
+msgstr "OpenID Protokollfehler. Keine ID zurückgegeben."
 
-#: mod/profiles.php:528
-msgid "Hide your contact/friend list from viewers of this profile?"
-msgstr "Liste der Kontakte vor Betrachtern dieses Profils verbergen?"
+#: mod/openid.php:67
+msgid ""
+"Account not found and OpenID registration is not permitted on this site."
+msgstr "Nutzerkonto wurde nicht gefunden und OpenID-Registrierung ist auf diesem Server nicht gestattet."
 
-#: mod/profiles.php:548
-msgid "Show more profile fields:"
-msgstr "Zeige mehr Profil-Felder:"
+#: mod/openid.php:117 src/Module/Login.php:88 src/Module/Login.php:139
+msgid "Login failed."
+msgstr "Anmeldung fehlgeschlagen."
 
-#: mod/profiles.php:560
-msgid "Profile Actions"
-msgstr "Profilaktionen"
+#: mod/photos.php:113 src/Model/Profile.php:928
+msgid "Photo Albums"
+msgstr "Fotoalben"
 
-#: mod/profiles.php:561
-msgid "Edit Profile Details"
-msgstr "Profil bearbeiten"
+#: mod/photos.php:114 mod/photos.php:1639
+msgid "Recent Photos"
+msgstr "Neueste Fotos"
 
-#: mod/profiles.php:563
-msgid "Change Profile Photo"
-msgstr "Profilbild ändern"
+#: mod/photos.php:116 mod/photos.php:1152 mod/photos.php:1641
+msgid "Upload New Photos"
+msgstr "Neue Fotos hochladen"
 
-#: mod/profiles.php:565
-msgid "View this profile"
-msgstr "Dieses Profil anzeigen"
+#: mod/photos.php:134 mod/settings.php:60 src/Module/BaseSettingsModule.php:18
+msgid "everybody"
+msgstr "jeder"
 
-#: mod/profiles.php:566
-msgid "View all profiles"
-msgstr "Alle Profile anzeigen"
+#: mod/photos.php:185
+msgid "Contact information unavailable"
+msgstr "Kontaktinformationen nicht verfügbar"
 
-#: mod/profiles.php:567 mod/profiles.php:662 src/Model/Profile.php:415
-msgid "Edit visibility"
-msgstr "Sichtbarkeit bearbeiten"
+#: mod/photos.php:207
+msgid "Album not found."
+msgstr "Album nicht gefunden."
 
-#: mod/profiles.php:568
-msgid "Create a new profile using these settings"
-msgstr "Neues Profil anlegen und diese Einstellungen verwenden"
+#: mod/photos.php:265
+msgid "Album successfully deleted"
+msgstr "Album wurde erfolgreich gelöscht."
 
-#: mod/profiles.php:569
-msgid "Clone this profile"
-msgstr "Dieses Profil duplizieren"
+#: mod/photos.php:267
+msgid "Album was empty."
+msgstr "Album ist leer."
 
-#: mod/profiles.php:570
-msgid "Delete this profile"
-msgstr "Dieses Profil löschen"
+#: mod/photos.php:590
+msgid "a photo"
+msgstr "einem Foto"
 
-#: mod/profiles.php:572
-msgid "Basic information"
-msgstr "Grundinformationen"
+#: mod/photos.php:590
+#, php-format
+msgid "%1$s was tagged in %2$s by %3$s"
+msgstr "%1$s wurde von %3$s in %2$s getaggt"
 
-#: mod/profiles.php:573
-msgid "Profile picture"
-msgstr "Profilbild"
+#: mod/photos.php:689
+msgid "Image upload didn't complete, please try again"
+msgstr "Der Upload des Bildes war nicht vollständig. Bitte versuche es erneut."
 
-#: mod/profiles.php:575
-msgid "Preferences"
-msgstr "Vorlieben"
+#: mod/photos.php:692
+msgid "Image file is missing"
+msgstr "Bilddatei konnte nicht gefunden werden."
 
-#: mod/profiles.php:576
-msgid "Status information"
-msgstr "Status-Informationen"
+#: mod/photos.php:697
+msgid ""
+"Server can't accept new file upload at this time, please contact your "
+"administrator"
+msgstr "Der Server kann derzeit keine neuen Datei-Uploads akzeptieren. Bitte kontaktiere deinen Administrator."
 
-#: mod/profiles.php:577
-msgid "Additional information"
-msgstr "Zusätzliche Informationen"
+#: mod/photos.php:723
+msgid "Image file is empty."
+msgstr "Bilddatei ist leer."
 
-#: mod/profiles.php:580
-msgid "Relation"
-msgstr "Beziehung"
+#: mod/photos.php:855
+msgid "No photos selected"
+msgstr "Keine Bilder ausgewählt"
 
-#: mod/profiles.php:581 src/Util/Temporal.php:79 src/Util/Temporal.php:81
-msgid "Miscellaneous"
-msgstr "Verschiedenes"
+#: mod/photos.php:947 mod/videos.php:210
+msgid "Access to this item is restricted."
+msgstr "Zugriff zu diesem Eintrag wurde eingeschränkt."
 
-#: mod/profiles.php:584
-msgid "Your Gender:"
-msgstr "Dein Geschlecht:"
+#: mod/photos.php:1001
+msgid "Upload Photos"
+msgstr "Bilder hochladen"
 
-#: mod/profiles.php:585
-msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
-msgstr "<span class=\"heart\">&hearts;</span> Beziehungsstatus:"
+#: mod/photos.php:1005 mod/photos.php:1097
+msgid "New album name: "
+msgstr "Name des neuen Albums: "
 
-#: mod/profiles.php:586 src/Model/Profile.php:789
-msgid "Sexual Preference:"
-msgstr "Sexuelle Vorlieben:"
+#: mod/photos.php:1006
+msgid "or select existing album:"
+msgstr "oder wähle ein bestehendes Album:"
 
-#: mod/profiles.php:587
-msgid "Example: fishing photography software"
-msgstr "Beispiel: Fischen Fotografie Software"
+#: mod/photos.php:1007
+msgid "Do not show a status post for this upload"
+msgstr "Keine Status-Mitteilung für diesen Beitrag anzeigen"
 
-#: mod/profiles.php:592
-msgid "Profile Name:"
-msgstr "Profilname:"
+#: mod/photos.php:1023 mod/photos.php:1391 mod/settings.php:1213
+msgid "Show to Groups"
+msgstr "Zeige den Gruppen"
 
-#: mod/profiles.php:594
-msgid ""
-"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
-"be visible to anybody using the internet."
-msgstr "Dies ist dein <strong>öffentliches</strong> Profil.<br />Es <strong>könnte</strong> für jeden Nutzer des Internets sichtbar sein."
+#: mod/photos.php:1024 mod/photos.php:1392 mod/settings.php:1214
+msgid "Show to Contacts"
+msgstr "Zeige den Kontakten"
 
-#: mod/profiles.php:595
-msgid "Your Full Name:"
-msgstr "Dein kompletter Name:"
+#: mod/photos.php:1079
+msgid "Do you really want to delete this photo album and all its photos?"
+msgstr "Möchtest du wirklich dieses Foto-Album und all seine Foto löschen?"
 
-#: mod/profiles.php:596
-msgid "Title/Description:"
-msgstr "Titel/Beschreibung:"
+#: mod/photos.php:1081 mod/photos.php:1102
+msgid "Delete Album"
+msgstr "Album löschen"
 
-#: mod/profiles.php:599
-msgid "Street Address:"
-msgstr "Adresse:"
+#: mod/photos.php:1108
+msgid "Edit Album"
+msgstr "Album bearbeiten"
 
-#: mod/profiles.php:600
-msgid "Locality/City:"
-msgstr "Wohnort:"
+#: mod/photos.php:1109
+msgid "Drop Album"
+msgstr "Album löschen"
 
-#: mod/profiles.php:601
-msgid "Region/State:"
-msgstr "Region/Bundesstaat:"
+#: mod/photos.php:1114
+msgid "Show Newest First"
+msgstr "Zeige neueste zuerst"
 
-#: mod/profiles.php:602
-msgid "Postal/Zip Code:"
-msgstr "Postleitzahl:"
+#: mod/photos.php:1116
+msgid "Show Oldest First"
+msgstr "Zeige älteste zuerst"
 
-#: mod/profiles.php:603
-msgid "Country:"
-msgstr "Land:"
+#: mod/photos.php:1137 mod/photos.php:1624
+msgid "View Photo"
+msgstr "Foto betrachten"
 
-#: mod/profiles.php:604 src/Util/Temporal.php:149
-msgid "Age: "
-msgstr "Alter: "
+#: mod/photos.php:1174
+msgid "Permission denied. Access to this item may be restricted."
+msgstr "Zugriff verweigert. Zugriff zu diesem Eintrag könnte eingeschränkt sein."
+
+#: mod/photos.php:1176
+msgid "Photo not available"
+msgstr "Foto nicht verfügbar"
 
-#: mod/profiles.php:607
-msgid "Who: (if applicable)"
-msgstr "Wer: (falls anwendbar)"
+#: mod/photos.php:1186
+msgid "Do you really want to delete this photo?"
+msgstr "Möchtest du wirklich dieses Foto löschen?"
 
-#: mod/profiles.php:607
-msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
-msgstr "Beispiele: cathy123, Cathy Williams, cathy@example.com"
+#: mod/photos.php:1188 mod/photos.php:1388
+msgid "Delete Photo"
+msgstr "Foto löschen"
 
-#: mod/profiles.php:608
-msgid "Since [date]:"
-msgstr "Seit [Datum]:"
+#: mod/photos.php:1279
+msgid "View photo"
+msgstr "Fotos ansehen"
 
-#: mod/profiles.php:610
-msgid "Tell us about yourself..."
-msgstr "Erzähle uns ein bisschen von dir …"
+#: mod/photos.php:1281
+msgid "Edit photo"
+msgstr "Foto bearbeiten"
 
-#: mod/profiles.php:611
-msgid "XMPP (Jabber) address:"
-msgstr "XMPP (Jabber) Adresse"
+#: mod/photos.php:1282
+msgid "Delete photo"
+msgstr "Foto löschen"
 
-#: mod/profiles.php:611
-msgid ""
-"The XMPP address will be propagated to your contacts so that they can follow"
-" you."
-msgstr "Die XMPP Adresse wird an deine Kontakte verteilt werden, so dass sie auch über XMPP mit dir in Kontakt treten können."
+#: mod/photos.php:1283
+msgid "Use as profile photo"
+msgstr "Als Profilbild verwenden"
 
-#: mod/profiles.php:612
-msgid "Homepage URL:"
-msgstr "Adresse der Homepage:"
+#: mod/photos.php:1290
+msgid "Private Photo"
+msgstr "Privates Foto"
 
-#: mod/profiles.php:613 src/Model/Profile.php:797
-msgid "Hometown:"
-msgstr "Heimatort:"
+#: mod/photos.php:1296
+msgid "View Full Size"
+msgstr "Betrachte Originalgröße"
 
-#: mod/profiles.php:614 src/Model/Profile.php:805
-msgid "Political Views:"
-msgstr "Politische Ansichten:"
+#: mod/photos.php:1356
+msgid "Tags: "
+msgstr "Tags: "
 
-#: mod/profiles.php:615
-msgid "Religious Views:"
-msgstr "Religiöse Ansichten:"
+#: mod/photos.php:1359
+msgid "[Select tags to remove]"
+msgstr "[Zu entfernende Tags auswählen]"
 
-#: mod/profiles.php:616
-msgid "Public Keywords:"
-msgstr "Öffentliche Schlüsselwörter:"
+#: mod/photos.php:1374
+msgid "New album name"
+msgstr "Name des neuen Albums"
 
-#: mod/profiles.php:616
-msgid "(Used for suggesting potential friends, can be seen by others)"
-msgstr "(Wird verwendet, um potentielle Kontakte zu finden, kann von Kontakten eingesehen werden)"
+#: mod/photos.php:1375
+msgid "Caption"
+msgstr "Bildunterschrift"
 
-#: mod/profiles.php:617
-msgid "Private Keywords:"
-msgstr "Private Schlüsselwörter:"
+#: mod/photos.php:1376
+msgid "Add a Tag"
+msgstr "Tag hinzufügen"
 
-#: mod/profiles.php:617
-msgid "(Used for searching profiles, never shown to others)"
-msgstr "(Wird für die Suche nach Profilen verwendet und niemals veröffentlicht)"
+#: mod/photos.php:1376
+msgid ""
+"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+msgstr "Beispiel: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
 
-#: mod/profiles.php:618 src/Model/Profile.php:821
-msgid "Likes:"
-msgstr "Likes:"
+#: mod/photos.php:1377
+msgid "Do not rotate"
+msgstr "Nicht rotieren"
 
-#: mod/profiles.php:619 src/Model/Profile.php:825
-msgid "Dislikes:"
-msgstr "Dislikes:"
+#: mod/photos.php:1378
+msgid "Rotate CW (right)"
+msgstr "Drehen US (rechts)"
 
-#: mod/profiles.php:620
-msgid "Musical interests"
-msgstr "Musikalische Interessen"
+#: mod/photos.php:1379
+msgid "Rotate CCW (left)"
+msgstr "Drehen EUS (links)"
 
-#: mod/profiles.php:621
-msgid "Books, literature"
-msgstr "Bücher, Literatur"
+#: mod/photos.php:1413 src/Object/Post.php:313
+msgid "I like this (toggle)"
+msgstr "Ich mag das (toggle)"
 
-#: mod/profiles.php:622
-msgid "Television"
-msgstr "Fernsehen"
+#: mod/photos.php:1414 src/Object/Post.php:314
+msgid "I don't like this (toggle)"
+msgstr "Ich mag das nicht (toggle)"
 
-#: mod/profiles.php:623
-msgid "Film/dance/culture/entertainment"
-msgstr "Filme/Tänze/Kultur/Unterhaltung"
+#: mod/photos.php:1429 mod/photos.php:1468 mod/photos.php:1528
+#: src/Module/Contact.php:1017 src/Module/Item/Compose.php:176
+#: src/Object/Post.php:875
+msgid "This is you"
+msgstr "Das bist du"
 
-#: mod/profiles.php:624
-msgid "Hobbies/Interests"
-msgstr "Hobbies/Interessen"
+#: mod/photos.php:1431 mod/photos.php:1470 mod/photos.php:1530
+#: src/Object/Post.php:420 src/Object/Post.php:877
+msgid "Comment"
+msgstr "Kommentar"
 
-#: mod/profiles.php:625
-msgid "Love/romance"
-msgstr "Liebe/Romantik"
+#: mod/photos.php:1559
+msgid "Map"
+msgstr "Karte"
 
-#: mod/profiles.php:626
-msgid "Work/employment"
-msgstr "Arbeit/Anstellung"
+#: mod/photos.php:1630 mod/videos.php:287
+msgid "View Album"
+msgstr "Album betrachten"
 
-#: mod/profiles.php:627
-msgid "School/education"
-msgstr "Schule/Ausbildung"
+#: mod/ping.php:272
+msgid "{0} wants to be your friend"
+msgstr "{0} möchte mit dir in Kontakt treten"
 
-#: mod/profiles.php:628
-msgid "Contact information and Social Networks"
-msgstr "Kontaktinformationen und Soziale Netzwerke"
+#: mod/ping.php:288
+msgid "{0} requested registration"
+msgstr "{0} möchte sich registrieren"
 
-#: mod/profiles.php:659 src/Model/Profile.php:411
-msgid "Profile Image"
-msgstr "Profilbild"
+#: mod/poke.php:177
+msgid "Poke/Prod"
+msgstr "Anstupsen"
 
-#: mod/profiles.php:661 src/Model/Profile.php:414
-msgid "visible to everybody"
-msgstr "sichtbar für jeden"
+#: mod/poke.php:178
+msgid "poke, prod or do other things to somebody"
+msgstr "Stupse Leute an oder mache anderes mit ihnen"
 
-#: mod/profiles.php:668
-msgid "Edit/Manage Profiles"
-msgstr "Bearbeite/Verwalte Profile"
+#: mod/poke.php:179
+msgid "Recipient"
+msgstr "Empfänger"
 
-#: mod/profiles.php:669 src/Model/Profile.php:401 src/Model/Profile.php:423
-msgid "Change profile photo"
-msgstr "Profilbild ändern"
+#: mod/poke.php:180
+msgid "Choose what you wish to do to recipient"
+msgstr "Was willst du mit dem Empfänger machen:"
 
-#: mod/profiles.php:670 src/Model/Profile.php:402
-msgid "Create New Profile"
-msgstr "Neues Profil anlegen"
+#: mod/poke.php:183
+msgid "Make this post private"
+msgstr "Diesen Beitrag privat machen"
 
 #: mod/profile_photo.php:58
 msgid "Image uploaded but image cropping failed."
 msgstr "Bild hochgeladen, aber das Zuschneiden schlug fehl."
 
 #: mod/profile_photo.php:88 mod/profile_photo.php:97 mod/profile_photo.php:106
-#: mod/profile_photo.php:318
+#: mod/profile_photo.php:311
 #, php-format
 msgid "Image size reduction [%s] failed."
 msgstr "Verkleinern der Bildgröße von [%s] scheiterte."
@@ -3156,363 +3183,313 @@ msgstr "Drücke Umschalt+Neu Laden oder leere den Browser-Cache, falls das neue
 msgid "Unable to process image"
 msgstr "Bild konnte nicht verarbeitet werden"
 
-#: mod/profile_photo.php:251
+#: mod/profile_photo.php:244
 msgid "Upload File:"
 msgstr "Datei hochladen:"
 
-#: mod/profile_photo.php:252
+#: mod/profile_photo.php:245
 msgid "Select a profile:"
 msgstr "Profil auswählen:"
 
-#: mod/profile_photo.php:257
+#: mod/profile_photo.php:250
 msgid "or"
 msgstr "oder"
 
-#: mod/profile_photo.php:258
+#: mod/profile_photo.php:251
 msgid "skip this step"
 msgstr "diesen Schritt überspringen"
 
-#: mod/profile_photo.php:258
+#: mod/profile_photo.php:251
 msgid "select a photo from your photo albums"
 msgstr "wähle ein Foto aus deinen Fotoalben"
 
-#: mod/profile_photo.php:271
+#: mod/profile_photo.php:264
 msgid "Crop Image"
 msgstr "Bild zurechtschneiden"
 
-#: mod/profile_photo.php:272
+#: mod/profile_photo.php:265
 msgid "Please adjust the image cropping for optimum viewing."
 msgstr "Passe bitte den Bildausschnitt an, damit das Bild optimal dargestellt werden kann."
 
-#: mod/profile_photo.php:274
+#: mod/profile_photo.php:267
 msgid "Done Editing"
 msgstr "Bearbeitung abgeschlossen"
 
-#: mod/profile_photo.php:308
+#: mod/profile_photo.php:301
 msgid "Image uploaded successfully."
 msgstr "Bild erfolgreich hochgeladen."
 
-#: mod/profperm.php:30
-msgid "Permission denied"
-msgstr "Zugriff verweigert"
-
-#: mod/profperm.php:36 mod/profperm.php:69
-msgid "Invalid profile identifier."
-msgstr "Ungültiger Profil-Bezeichner."
-
-#: mod/profperm.php:115
-msgid "Profile Visibility Editor"
-msgstr "Editor für die Profil-Sichtbarkeit"
-
-#: mod/profperm.php:119 src/Module/Group.php:321
-msgid "Click on a contact to add or remove."
-msgstr "Klicke einen Kontakt an, um ihn hinzuzufügen oder zu entfernen"
-
-#: mod/profperm.php:128
-msgid "Visible To"
-msgstr "Sichtbar für"
-
-#: mod/profperm.php:144
-msgid "All Contacts (with secure profile access)"
-msgstr "Alle Kontakte (mit gesichertem Profilzugriff)"
-
-#: mod/regmod.php:53
-msgid "Account approved."
-msgstr "Konto freigegeben."
-
-#: mod/regmod.php:77
-#, php-format
-msgid "Registration revoked for %s"
-msgstr "Registrierung für %s wurde zurückgezogen"
-
-#: mod/regmod.php:84
-msgid "Please login."
-msgstr "Bitte melde dich an."
-
-#: mod/removeme.php:46
-msgid "User deleted their account"
-msgstr "Gelöschter Nutzeraccount"
-
-#: mod/removeme.php:47
-msgid ""
-"On your Friendica node an user deleted their account. Please ensure that "
-"their data is removed from the backups."
-msgstr "Ein Nutzer deiner Friendica-Instanz hat seinen Account gelöscht. Bitte stelle sicher, dass dessen Daten aus deinen Backups entfernt werden."
-
-#: mod/removeme.php:48
-#, php-format
-msgid "The user id is %d"
-msgstr "Die ID des Users lautet %d"
-
-#: mod/removeme.php:84 mod/removeme.php:87
-msgid "Remove My Account"
-msgstr "Konto löschen"
-
-#: mod/removeme.php:85
-msgid ""
-"This will completely remove your account. Once this has been done it is not "
-"recoverable."
-msgstr "Dein Konto wird endgültig gelöscht. Es gibt keine Möglichkeit, es wiederherzustellen."
-
-#: mod/removeme.php:86
-msgid "Please enter your password for verification:"
-msgstr "Bitte gib dein Passwort zur Verifikation ein:"
-
-#: mod/repair_ostatus.php:21
-msgid "Resubscribing to OStatus contacts"
-msgstr "Erneuern der OStatus-Abonements"
-
-#: mod/repair_ostatus.php:37
-msgid "Error"
-msgstr "Fehler"
-
-#: mod/search.php:101
+#: mod/search.php:92
 msgid "Only logged in users are permitted to perform a search."
 msgstr "Nur eingeloggten Benutzern ist das Suchen gestattet."
 
-#: mod/search.php:123
+#: mod/search.php:114
 msgid "Only one search per minute is permitted for not logged in users."
 msgstr "Es ist nur eine Suchanfrage pro Minute für nicht eingeloggte Benutzer gestattet."
 
-#: mod/search.php:143 src/Content/Nav.php:197 src/Content/Text/HTML.php:900
+#: mod/search.php:134 src/Content/Text/HTML.php:889 src/Content/Nav.php:200
 msgid "Search"
 msgstr "Suche"
 
-#: mod/search.php:229
+#: mod/search.php:228
 #, php-format
 msgid "Items tagged with: %s"
 msgstr "Beiträge, die mit %s getaggt sind"
 
-#: mod/search.php:231 src/Module/Contact.php:819
+#: mod/search.php:230 src/Module/Contact.php:819
 #, php-format
 msgid "Results for: %s"
 msgstr "Ergebnisse für: %s"
 
-#: mod/settings.php:63 src/Module/BaseSettingsModule.php:24
+#: mod/settings.php:65 src/Module/BaseSettingsModule.php:24
 msgid "Account"
 msgstr "Nutzerkonto"
 
-#: mod/settings.php:71 src/Module/BaseSettingsModule.php:31
-#: src/Module/Settings/TwoFactor/Index.php:83
-#: src/Module/TwoFactor/Verify.php:60
+#: mod/settings.php:73 src/Module/BaseSettingsModule.php:31
+#: src/Module/Settings/TwoFactor/Index.php:89
+#: src/Module/TwoFactor/Verify.php:62
 msgid "Two-factor authentication"
 msgstr "Zwei-Faktor Authentifizierung"
 
-#: mod/settings.php:78 src/Content/Nav.php:265 src/Model/Profile.php:394
+#: mod/settings.php:80 src/Content/Nav.php:268 src/Model/Profile.php:402
 #: src/Module/BaseSettingsModule.php:38
 msgid "Profiles"
 msgstr "Profile"
 
-#: mod/settings.php:86 src/Module/BaseAdminModule.php:84
+#: mod/settings.php:88 src/Module/BaseAdminModule.php:84
 #: src/Module/BaseSettingsModule.php:46
 msgid "Additional features"
 msgstr "Zusätzliche Features"
 
-#: mod/settings.php:94 src/Module/BaseSettingsModule.php:54
+#: mod/settings.php:96 src/Module/BaseSettingsModule.php:54
 msgid "Display"
 msgstr "Anzeige"
 
-#: mod/settings.php:101 mod/settings.php:839
+#: mod/settings.php:103 mod/settings.php:843
 #: src/Module/BaseSettingsModule.php:61
 msgid "Social Networks"
 msgstr "Soziale Netzwerke"
 
-#: mod/settings.php:108 src/Module/Admin/Addons/Details.php:100
+#: mod/settings.php:110 src/Module/Admin/Addons/Details.php:100
 #: src/Module/Admin/Addons/Index.php:51 src/Module/BaseAdminModule.php:82
 #: src/Module/BaseSettingsModule.php:68
 msgid "Addons"
 msgstr "Addons"
 
-#: mod/settings.php:115 src/Content/Nav.php:260
+#: mod/settings.php:117 src/Content/Nav.php:263
 #: src/Module/BaseSettingsModule.php:75
 msgid "Delegations"
 msgstr "Delegationen"
 
-#: mod/settings.php:122 src/Module/BaseSettingsModule.php:82
+#: mod/settings.php:124 src/Module/BaseSettingsModule.php:82
 msgid "Connected apps"
 msgstr "Verbundene Programme"
 
-#: mod/settings.php:129 mod/uexport.php:52
+#: mod/settings.php:131 mod/uexport.php:59
 #: src/Module/BaseSettingsModule.php:89
 msgid "Export personal data"
 msgstr "Persönliche Daten exportieren"
 
-#: mod/settings.php:136 src/Module/BaseSettingsModule.php:96
+#: mod/settings.php:138 src/Module/BaseSettingsModule.php:96
 msgid "Remove account"
 msgstr "Konto löschen"
 
-#: mod/settings.php:188
+#: mod/settings.php:147 view/theme/frio/theme.php:277 src/Content/Nav.php:265
+#: src/Module/Admin/Addons/Details.php:102
+#: src/Module/Admin/Themes/Details.php:107
+#: src/Module/BaseSettingsModule.php:105 src/Module/Welcome.php:33
+msgid "Settings"
+msgstr "Einstellungen"
+
+#: mod/settings.php:190
 msgid "Missing some important data!"
 msgstr "Wichtige Daten fehlen!"
 
-#: mod/settings.php:190 mod/settings.php:700 src/Module/Contact.php:826
+#: mod/settings.php:192 mod/settings.php:703 src/Module/Contact.php:826
 msgid "Update"
 msgstr "Aktualisierungen"
 
-#: mod/settings.php:299
+#: mod/settings.php:302
 msgid "Failed to connect with email account using the settings provided."
 msgstr "Verbindung zum E-Mail-Konto mit den angegebenen Einstellungen nicht möglich."
 
-#: mod/settings.php:304
+#: mod/settings.php:307
 msgid "Email settings updated."
 msgstr "E-Mail Einstellungen bearbeitet."
 
-#: mod/settings.php:320
+#: mod/settings.php:323
 msgid "Features updated"
 msgstr "Features aktualisiert"
 
-#: mod/settings.php:393
+#: mod/settings.php:384
+msgid "The theme you chose isn't available."
+msgstr "Das gewählte Theme ist nicht verfügbar"
+
+#: mod/settings.php:396
 msgid "Relocate message has been send to your contacts"
 msgstr "Die Umzugsbenachrichtigung wurde an Deine Kontakte versendet."
 
-#: mod/settings.php:405
+#: mod/settings.php:408
 msgid "Passwords do not match."
 msgstr "Die Passwörter stimmen nicht überein."
 
-#: mod/settings.php:413 src/Console/NewPassword.php:80
+#: mod/settings.php:416 src/Console/NewPassword.php:101
 msgid "Password update failed. Please try again."
 msgstr "Aktualisierung des Passworts gescheitert, bitte versuche es noch einmal."
 
-#: mod/settings.php:416 src/Console/NewPassword.php:83
+#: mod/settings.php:419 src/Console/NewPassword.php:104
 msgid "Password changed."
 msgstr "Passwort geändert."
 
-#: mod/settings.php:419
+#: mod/settings.php:422
 msgid "Password unchanged."
 msgstr "Passwort unverändert."
 
-#: mod/settings.php:500
+#: mod/settings.php:503
 msgid " Please use a shorter name."
 msgstr " Bitte verwende einen kürzeren Namen."
 
-#: mod/settings.php:503
+#: mod/settings.php:506
 msgid " Name too short."
 msgstr " Name ist zu kurz."
 
-#: mod/settings.php:510 src/Module/Settings/TwoFactor/Index.php:66
+#: mod/settings.php:513 src/Module/Settings/TwoFactor/Index.php:72
 msgid "Wrong Password"
 msgstr "Falsches Passwort"
 
-#: mod/settings.php:515
+#: mod/settings.php:518
 msgid "Invalid email."
 msgstr "Ungültige E-Mail-Adresse."
 
-#: mod/settings.php:521
+#: mod/settings.php:524
 msgid "Cannot change to that email."
 msgstr "Ändern der E-Mail nicht möglich. "
 
-#: mod/settings.php:571
+#: mod/settings.php:574
 msgid "Private forum has no privacy permissions. Using default privacy group."
 msgstr "Für das private Forum sind keine Zugriffsrechte eingestellt. Die voreingestellte Gruppe für neue Kontakte wird benutzt."
 
-#: mod/settings.php:574
+#: mod/settings.php:577
 msgid "Private forum has no privacy permissions and no default privacy group."
 msgstr "Für das private Forum sind keine Zugriffsrechte eingestellt, und es gibt keine voreingestellte Gruppe für neue Kontakte."
 
-#: mod/settings.php:614
+#: mod/settings.php:617
 msgid "Settings updated."
 msgstr "Einstellungen aktualisiert."
 
-#: mod/settings.php:673 mod/settings.php:699 mod/settings.php:733
+#: mod/settings.php:676 mod/settings.php:702 mod/settings.php:736
 msgid "Add application"
 msgstr "Programm hinzufügen"
 
-#: mod/settings.php:677 mod/settings.php:703
+#: mod/settings.php:680 mod/settings.php:706
 msgid "Consumer Key"
 msgstr "Consumer Key"
 
-#: mod/settings.php:678 mod/settings.php:704
+#: mod/settings.php:681 mod/settings.php:707
 msgid "Consumer Secret"
 msgstr "Consumer Secret"
 
-#: mod/settings.php:679 mod/settings.php:705
+#: mod/settings.php:682 mod/settings.php:708
 msgid "Redirect"
 msgstr "Umleiten"
 
-#: mod/settings.php:680 mod/settings.php:706
+#: mod/settings.php:683 mod/settings.php:709
 msgid "Icon url"
 msgstr "Icon URL"
 
-#: mod/settings.php:691
+#: mod/settings.php:694
 msgid "You can't edit this application."
 msgstr "Du kannst dieses Programm nicht bearbeiten."
 
-#: mod/settings.php:732
+#: mod/settings.php:735
 msgid "Connected Apps"
 msgstr "Verbundene Programme"
 
-#: mod/settings.php:734 src/Object/Post.php:167 src/Object/Post.php:169
+#: mod/settings.php:737 src/Object/Post.php:168 src/Object/Post.php:170
 msgid "Edit"
 msgstr "Bearbeiten"
 
-#: mod/settings.php:736
+#: mod/settings.php:739
 msgid "Client key starts with"
 msgstr "Anwenderschlüssel beginnt mit"
 
-#: mod/settings.php:737
+#: mod/settings.php:740
 msgid "No name"
 msgstr "Kein Name"
 
-#: mod/settings.php:738
+#: mod/settings.php:741
 msgid "Remove authorization"
 msgstr "Autorisierung entziehen"
 
-#: mod/settings.php:749
+#: mod/settings.php:752
 msgid "No Addon settings configured"
 msgstr "Keine Addon-Einstellungen konfiguriert"
 
-#: mod/settings.php:758
+#: mod/settings.php:761
 msgid "Addon Settings"
 msgstr "Addon Einstellungen"
 
-#: mod/settings.php:772 src/Module/Admin/Features.php:58
+#: mod/settings.php:775 src/Module/Admin/Features.php:58
 #: src/Module/Admin/Features.php:59
 msgid "Off"
 msgstr "Aus"
 
-#: mod/settings.php:772 src/Module/Admin/Features.php:58
+#: mod/settings.php:775 src/Module/Admin/Features.php:58
 #: src/Module/Admin/Features.php:59
 msgid "On"
 msgstr "An"
 
-#: mod/settings.php:779
+#: mod/settings.php:782
 msgid "Additional Features"
 msgstr "Zusätzliche Features"
 
-#: mod/settings.php:802 src/Content/ContactSelector.php:87
+#: mod/settings.php:806 src/Content/ContactSelector.php:87
 msgid "Diaspora"
 msgstr "Diaspora"
 
-#: mod/settings.php:802 mod/settings.php:803
+#: mod/settings.php:806 mod/settings.php:807
 msgid "enabled"
 msgstr "eingeschaltet"
 
-#: mod/settings.php:802 mod/settings.php:803
+#: mod/settings.php:806 mod/settings.php:807
 msgid "disabled"
 msgstr "ausgeschaltet"
 
-#: mod/settings.php:802 mod/settings.php:803
+#: mod/settings.php:806 mod/settings.php:807
 #, php-format
 msgid "Built-in support for %s connectivity is %s"
 msgstr "Eingebaute Unterstützung für Verbindungen zu %s ist %s"
 
-#: mod/settings.php:803
+#: mod/settings.php:807
 msgid "GNU Social (OStatus)"
 msgstr "GNU Social (OStatus)"
 
-#: mod/settings.php:834
+#: mod/settings.php:838
 msgid "Email access is disabled on this site."
 msgstr "Zugriff auf E-Mails für diese Seite deaktiviert."
 
-#: mod/settings.php:844
+#: mod/settings.php:848
 msgid "General Social Media Settings"
 msgstr "Allgemeine Einstellungen zu Sozialen Medien"
 
-#: mod/settings.php:845
+#: mod/settings.php:849
+msgid "Accept only top level posts by contacts you follow"
+msgstr "Ausschließlich Unterhaltungen von meinen Kontakten anzeigen"
+
+#: mod/settings.php:849
+msgid ""
+"The system does an auto completion of threads when a comment arrives. This "
+"has got the side effect that you can receive posts that had been started by "
+"a non-follower but had been commented by someone you follow. This setting "
+"deactivates this behaviour. When activated, you strictly only will receive "
+"posts from people you really do follow."
+msgstr "Wenn neue Kommentare empfangen werden führt das System eine Vervollständigung der Unterhaltung durch. Die hat den Nebeneffekt, dass Unterhaltungen in denen einer deiner Kontakte kommentiert haben, die aber nicht von einem deiner Kontakte begonnen wurden in deinem Netzwerk-Stream angezeigt werden können. Diese Option unterbindet dieses Verhalten. Ist sie aktiviert, wirst du ausschließlich die Unterhaltungen angezeigt bekommen, die von deinen Kontakten begonnen wurden."
+
+#: mod/settings.php:850
 msgid "Disable Content Warning"
 msgstr "Inhaltswarnung ausschalten"
 
-#: mod/settings.php:845
+#: mod/settings.php:850
 msgid ""
 "Users on networks like Mastodon or Pleroma are able to set a content warning"
 " field which collapse their post by default. This disables the automatic "
@@ -3520,352 +3497,352 @@ msgid ""
 "any other content filtering you eventually set up."
 msgstr "Benutzer in Netzwerken wie Mastodon oder Pleroma können ein Inhaltswarnfeld einstellen, das ihren Beitrag standardmäßig ausblendet. Dies deaktiviert das automatische Zusammenklappen und setzt die Inhaltswarnung als Beitragstitel. Beeinflusst keine anderen Inhaltsfilterungen, die du eventuell eingerichtet hast."
 
-#: mod/settings.php:846
+#: mod/settings.php:851
 msgid "Disable intelligent shortening"
 msgstr "Intelligentes Link-Kürzen ausschalten"
 
-#: mod/settings.php:846
+#: mod/settings.php:851
 msgid ""
 "Normally the system tries to find the best link to add to shortened posts. "
 "If this option is enabled then every shortened post will always point to the"
 " original friendica post."
 msgstr "Normalerweise versucht das System, den besten Link zu finden, um ihn zu gekürzten Postings hinzuzufügen. Wird diese Option ausgewählt, wird stets ein Link auf die originale Friendica-Nachricht beigefügt."
 
-#: mod/settings.php:847
+#: mod/settings.php:852
 msgid "Automatically follow any GNU Social (OStatus) followers/mentioners"
 msgstr "Automatisch allen GNU Social (OStatus) Followern/Erwähnern folgen"
 
-#: mod/settings.php:847
+#: mod/settings.php:852
 msgid ""
 "If you receive a message from an unknown OStatus user, this option decides "
 "what to do. If it is checked, a new contact will be created for every "
 "unknown user."
 msgstr "Wenn du eine Nachricht eines unbekannten OStatus-Nutzers bekommst, entscheidet diese Option, wie diese behandelt werden soll. Ist die Option aktiviert, wird ein neuer Kontakt für den Verfasser erstellt,."
 
-#: mod/settings.php:848
+#: mod/settings.php:853
 msgid "Default group for OStatus contacts"
 msgstr "Voreingestellte Gruppe für OStatus-Kontakte"
 
-#: mod/settings.php:849
+#: mod/settings.php:854
 msgid "Your legacy GNU Social account"
 msgstr "Dein alter GNU Social-Account"
 
-#: mod/settings.php:849
+#: mod/settings.php:854
 msgid ""
 "If you enter your old GNU Social/Statusnet account name here (in the format "
 "user@domain.tld), your contacts will be added automatically. The field will "
 "be emptied when done."
 msgstr "Wenn du deinen alten GNU Social/Statusnet-Account-Namen hier angibst (Format name@domain.tld), werden deine Kontakte automatisch hinzugefügt. Dieses Feld wird geleert, wenn die Kontakte hinzugefügt wurden."
 
-#: mod/settings.php:852
+#: mod/settings.php:857
 msgid "Repair OStatus subscriptions"
 msgstr "OStatus-Abonnements reparieren"
 
-#: mod/settings.php:856
+#: mod/settings.php:861
 msgid "Email/Mailbox Setup"
 msgstr "E-Mail/Postfach-Einstellungen"
 
-#: mod/settings.php:857
+#: mod/settings.php:862
 msgid ""
 "If you wish to communicate with email contacts using this service "
 "(optional), please specify how to connect to your mailbox."
 msgstr "Wenn du mit E-Mail-Kontakten über diesen Service kommunizieren möchtest (optional), gib bitte die Einstellungen für dein Postfach an."
 
-#: mod/settings.php:858
+#: mod/settings.php:863
 msgid "Last successful email check:"
 msgstr "Letzter erfolgreicher E-Mail-Check"
 
-#: mod/settings.php:860
+#: mod/settings.php:865
 msgid "IMAP server name:"
 msgstr "IMAP-Server-Name:"
 
-#: mod/settings.php:861
+#: mod/settings.php:866
 msgid "IMAP port:"
 msgstr "IMAP-Port:"
 
-#: mod/settings.php:862
+#: mod/settings.php:867
 msgid "Security:"
 msgstr "Sicherheit:"
 
-#: mod/settings.php:862 mod/settings.php:867
+#: mod/settings.php:867 mod/settings.php:872
 msgid "None"
 msgstr "Keine"
 
-#: mod/settings.php:863
+#: mod/settings.php:868
 msgid "Email login name:"
 msgstr "E-Mail-Login-Name:"
 
-#: mod/settings.php:864
+#: mod/settings.php:869
 msgid "Email password:"
 msgstr "E-Mail-Passwort:"
 
-#: mod/settings.php:865
+#: mod/settings.php:870
 msgid "Reply-to address:"
 msgstr "Reply-to Adresse:"
 
-#: mod/settings.php:866
+#: mod/settings.php:871
 msgid "Send public posts to all email contacts:"
 msgstr "Sende öffentliche Beiträge an alle E-Mail-Kontakte:"
 
-#: mod/settings.php:867
+#: mod/settings.php:872
 msgid "Action after import:"
 msgstr "Aktion nach Import:"
 
-#: mod/settings.php:867 src/Content/Nav.php:248
+#: mod/settings.php:872 src/Content/Nav.php:251
 msgid "Mark as seen"
 msgstr "Als gelesen markieren"
 
-#: mod/settings.php:867
+#: mod/settings.php:872
 msgid "Move to folder"
 msgstr "In einen Ordner verschieben"
 
-#: mod/settings.php:868
+#: mod/settings.php:873
 msgid "Move to folder:"
 msgstr "In diesen Ordner verschieben:"
 
-#: mod/settings.php:892 src/Module/Admin/Site.php:435
+#: mod/settings.php:897 src/Module/Admin/Site.php:434
 msgid "No special theme for mobile devices"
 msgstr "Kein spezielles Theme für mobile Geräte verwenden."
 
-#: mod/settings.php:900
+#: mod/settings.php:905
 #, php-format
 msgid "%s - (Unsupported)"
 msgstr "%s - (Nicht unterstützt)"
 
-#: mod/settings.php:902 src/Module/Admin/Site.php:452
+#: mod/settings.php:907 src/Module/Admin/Site.php:451
 #, php-format
 msgid "%s - (Experimental)"
 msgstr "%s - (Experimentell)"
 
-#: mod/settings.php:930 src/Core/L10n.php:371 src/Model/Event.php:395
+#: mod/settings.php:935 src/Core/L10n/L10n.php:370 src/Model/Event.php:395
 msgid "Sunday"
 msgstr "Sonntag"
 
-#: mod/settings.php:930 src/Core/L10n.php:371 src/Model/Event.php:396
+#: mod/settings.php:935 src/Core/L10n/L10n.php:370 src/Model/Event.php:396
 msgid "Monday"
 msgstr "Montag"
 
-#: mod/settings.php:946
+#: mod/settings.php:951
 msgid "Display Settings"
 msgstr "Anzeige-Einstellungen"
 
-#: mod/settings.php:952
+#: mod/settings.php:957
 msgid "Display Theme:"
 msgstr "Theme:"
 
-#: mod/settings.php:953
+#: mod/settings.php:958
 msgid "Mobile Theme:"
 msgstr "Mobiles Theme"
 
-#: mod/settings.php:954
+#: mod/settings.php:959
 msgid "Suppress warning of insecure networks"
 msgstr "Warnung vor unsicheren Netzwerken unterdrücken"
 
-#: mod/settings.php:954
+#: mod/settings.php:959
 msgid ""
 "Should the system suppress the warning that the current group contains "
 "members of networks that can't receive non public postings."
 msgstr "Soll das System Warnungen unterdrücken, die angezeigt werden, weil von dir eingerichtete Kontakt-Gruppen Accounts aus Netzwerken beinhalten, die keine nicht öffentlichen Beiträge empfangen können."
 
-#: mod/settings.php:955
+#: mod/settings.php:960
 msgid "Update browser every xx seconds"
 msgstr "Browser alle xx Sekunden aktualisieren"
 
-#: mod/settings.php:955
+#: mod/settings.php:960
 msgid "Minimum of 10 seconds. Enter -1 to disable it."
 msgstr "Minimum sind 10 Sekunden. Gib -1 ein, um abzuschalten."
 
-#: mod/settings.php:956
+#: mod/settings.php:961
 msgid "Number of items to display per page:"
 msgstr "Zahl der Beiträge, die pro Netzwerkseite angezeigt werden sollen: "
 
-#: mod/settings.php:956 mod/settings.php:957
+#: mod/settings.php:961 mod/settings.php:962
 msgid "Maximum of 100 items"
 msgstr "Maximal 100 Beiträge"
 
-#: mod/settings.php:957
+#: mod/settings.php:962
 msgid "Number of items to display per page when viewed from mobile device:"
 msgstr "Zahl der Beiträge, die pro Netzwerkseite auf mobilen Geräten angezeigt werden sollen:"
 
-#: mod/settings.php:958
+#: mod/settings.php:963
 msgid "Don't show emoticons"
 msgstr "Keine Smileys anzeigen"
 
-#: mod/settings.php:959
+#: mod/settings.php:964
 msgid "Calendar"
 msgstr "Kalender"
 
-#: mod/settings.php:960
+#: mod/settings.php:965
 msgid "Beginning of week:"
 msgstr "Wochenbeginn:"
 
-#: mod/settings.php:961
+#: mod/settings.php:966
 msgid "Don't show notices"
 msgstr "Info-Popups nicht anzeigen"
 
-#: mod/settings.php:962
+#: mod/settings.php:967
 msgid "Infinite scroll"
 msgstr "Endloses Scrollen"
 
-#: mod/settings.php:963
+#: mod/settings.php:968
 msgid "Automatic updates only at the top of the network page"
 msgstr "Automatische Updates nur, wenn du oben auf der Netzwerkseite bist."
 
-#: mod/settings.php:963
+#: mod/settings.php:968
 msgid ""
 "When disabled, the network page is updated all the time, which could be "
 "confusing while reading."
 msgstr "Wenn dies deaktiviert ist, wird die Netzwerk-Seite aktualisiert, wann immer neue Beiträge eintreffen, egal an welcher Stelle gerade gelesen wird."
 
-#: mod/settings.php:964
+#: mod/settings.php:969
 msgid "Bandwidth Saver Mode"
 msgstr "Bandbreiten-Spar-Modus"
 
-#: mod/settings.php:964
+#: mod/settings.php:969
 msgid ""
 "When enabled, embedded content is not displayed on automatic updates, they "
 "only show on page reload."
 msgstr "Wenn aktiviert, wird der eingebettete Inhalt nicht automatisch aktualisiert. In diesem Fall Seite bitte neu laden."
 
-#: mod/settings.php:965
+#: mod/settings.php:970
 msgid "Smart Threading"
 msgstr "Intelligentes Threading"
 
-#: mod/settings.php:965
+#: mod/settings.php:970
 msgid ""
 "When enabled, suppress extraneous thread indentation while keeping it where "
 "it matters. Only works if threading is available and enabled."
 msgstr "Ist dies aktiviert, werden Einrückungen in Unterhaltungen unterdrückt, wo sie nicht benötigt werden. Werden sie benötigt, werden die Threads weiterhin eingerückt."
 
-#: mod/settings.php:967
+#: mod/settings.php:972
 msgid "General Theme Settings"
 msgstr "Allgemeine Theme-Einstellungen"
 
-#: mod/settings.php:968
+#: mod/settings.php:973
 msgid "Custom Theme Settings"
 msgstr "Benutzerdefinierte Theme-Einstellungen"
 
-#: mod/settings.php:969
+#: mod/settings.php:974
 msgid "Content Settings"
 msgstr "Einstellungen zum Inhalt"
 
-#: mod/settings.php:970 view/theme/duepuntozero/config.php:73
-#: view/theme/frio/config.php:122 view/theme/quattro/config.php:75
+#: mod/settings.php:975 view/theme/duepuntozero/config.php:73
+#: view/theme/frio/config.php:128 view/theme/quattro/config.php:75
 #: view/theme/vier/config.php:121
 msgid "Theme settings"
 msgstr "Theme-Einstellungen"
 
-#: mod/settings.php:984
+#: mod/settings.php:989
 msgid "Unable to find your profile. Please contact your admin."
 msgstr "Konnte dein Profil nicht finden. Bitte kontaktiere den Admin."
 
-#: mod/settings.php:1023
+#: mod/settings.php:1028
 msgid "Account Types"
 msgstr "Kontenarten"
 
-#: mod/settings.php:1024
+#: mod/settings.php:1029
 msgid "Personal Page Subtypes"
 msgstr "Unterarten der persönlichen Seite"
 
-#: mod/settings.php:1025
+#: mod/settings.php:1030
 msgid "Community Forum Subtypes"
 msgstr "Unterarten des Gemeinschaftsforums"
 
-#: mod/settings.php:1032 src/Module/Admin/Users.php:229
+#: mod/settings.php:1037 src/Module/Admin/Users.php:229
 msgid "Personal Page"
 msgstr "Persönliche Seite"
 
-#: mod/settings.php:1033
+#: mod/settings.php:1038
 msgid "Account for a personal profile."
 msgstr "Konto für ein persönliches Profil."
 
-#: mod/settings.php:1036 src/Module/Admin/Users.php:230
+#: mod/settings.php:1041 src/Module/Admin/Users.php:230
 msgid "Organisation Page"
 msgstr "Organisationsseite"
 
-#: mod/settings.php:1037
+#: mod/settings.php:1042
 msgid ""
 "Account for an organisation that automatically approves contact requests as "
 "\"Followers\"."
 msgstr "Konto für eine Organisation, das Kontaktanfragen automatisch als \"Follower\" annimmt."
 
-#: mod/settings.php:1040 src/Module/Admin/Users.php:231
+#: mod/settings.php:1045 src/Module/Admin/Users.php:231
 msgid "News Page"
 msgstr "Nachrichtenseite"
 
-#: mod/settings.php:1041
+#: mod/settings.php:1046
 msgid ""
 "Account for a news reflector that automatically approves contact requests as"
 " \"Followers\"."
 msgstr "Konto für einen Feedspiegel, das Kontaktanfragen automatisch als \"Follower\" annimmt."
 
-#: mod/settings.php:1044 src/Module/Admin/Users.php:232
+#: mod/settings.php:1049 src/Module/Admin/Users.php:232
 msgid "Community Forum"
 msgstr "Gemeinschaftsforum"
 
-#: mod/settings.php:1045
+#: mod/settings.php:1050
 msgid "Account for community discussions."
 msgstr "Konto für Diskussionsforen. "
 
-#: mod/settings.php:1048 src/Module/Admin/Users.php:222
+#: mod/settings.php:1053 src/Module/Admin/Users.php:222
 msgid "Normal Account Page"
 msgstr "Normales Konto"
 
-#: mod/settings.php:1049
+#: mod/settings.php:1054
 msgid ""
 "Account for a regular personal profile that requires manual approval of "
 "\"Friends\" and \"Followers\"."
 msgstr "Konto für ein normales, persönliches Profil. Kontaktanfragen müssen manuell als \"Friend\" oder \"Follower\" bestätigt werden."
 
-#: mod/settings.php:1052 src/Module/Admin/Users.php:223
+#: mod/settings.php:1057 src/Module/Admin/Users.php:223
 msgid "Soapbox Page"
 msgstr "Marktschreier-Konto"
 
-#: mod/settings.php:1053
+#: mod/settings.php:1058
 msgid ""
 "Account for a public profile that automatically approves contact requests as"
 " \"Followers\"."
 msgstr "Konto für ein öffentliches Profil, das Kontaktanfragen automatisch als \"Follower\" annimmt."
 
-#: mod/settings.php:1056 src/Module/Admin/Users.php:224
+#: mod/settings.php:1061 src/Module/Admin/Users.php:224
 msgid "Public Forum"
 msgstr "Öffentliches Forum"
 
-#: mod/settings.php:1057
+#: mod/settings.php:1062
 msgid "Automatically approves all contact requests."
 msgstr "Bestätigt alle Kontaktanfragen automatisch."
 
-#: mod/settings.php:1060 src/Module/Admin/Users.php:225
+#: mod/settings.php:1065 src/Module/Admin/Users.php:225
 msgid "Automatic Friend Page"
 msgstr "Automatische Freunde-Seite"
 
-#: mod/settings.php:1061
+#: mod/settings.php:1066
 msgid ""
 "Account for a popular profile that automatically approves contact requests "
 "as \"Friends\"."
 msgstr "Konto für ein gefragtes Profil, das Kontaktanfragen automatisch als \"Friend\" annimmt."
 
-#: mod/settings.php:1064
+#: mod/settings.php:1069
 msgid "Private Forum [Experimental]"
 msgstr "Privates Forum [Versuchsstadium]"
 
-#: mod/settings.php:1065
+#: mod/settings.php:1070
 msgid "Requires manual approval of contact requests."
 msgstr "Kontaktanfragen müssen manuell bestätigt werden."
 
-#: mod/settings.php:1076
+#: mod/settings.php:1081
 msgid "OpenID:"
 msgstr "OpenID:"
 
-#: mod/settings.php:1076
+#: mod/settings.php:1081
 msgid "(Optional) Allow this OpenID to login to this account."
 msgstr "(Optional) Erlaube die Anmeldung für dieses Konto mit dieser OpenID."
 
-#: mod/settings.php:1084
+#: mod/settings.php:1089
 msgid "Publish your default profile in your local site directory?"
 msgstr "Darf dein Standardprofil im Verzeichnis dieses Servers veröffentlicht werden?"
 
-#: mod/settings.php:1084
+#: mod/settings.php:1089
 #, php-format
 msgid ""
 "Your profile will be published in this node's <a href=\"%s\">local "
@@ -3873,314 +3850,314 @@ msgid ""
 " system settings."
 msgstr "Dein Profil wird im <a href=\"%s\">lokalen Verzeichnis</a> dieses Knotens veröffentlicht. Je nach Systemeinstellungen kann es öffentlich auffindbar sein."
 
-#: mod/settings.php:1090
+#: mod/settings.php:1095
 msgid "Publish your default profile in the global social directory?"
 msgstr "Darf dein Standardprofil im weltweiten Verzeichnis veröffentlicht werden?"
 
-#: mod/settings.php:1090
+#: mod/settings.php:1095
 #, php-format
 msgid ""
 "Your profile will be published in the global friendica directories (e.g. <a "
 "href=\"%s\">%s</a>). Your profile will be visible in public."
 msgstr "Dein Profil wird in den globalen Friendica-Verzeichnissen (z.B. <a href=\"%s\">%s</a>) veröffentlicht. Dein Profil wird öffentlich auffindbar sein."
 
-#: mod/settings.php:1097
+#: mod/settings.php:1102
 msgid "Hide your contact/friend list from viewers of your default profile?"
 msgstr "Liste der Kontakte vor Betrachtern des Standardprofils verbergen?"
 
-#: mod/settings.php:1097
+#: mod/settings.php:1102
 msgid ""
 "Your contact list won't be shown in your default profile page. You can "
 "decide to show your contact list separately for each additional profile you "
 "create"
 msgstr "Die Liste deiner Kontakte wird nicht in deinem Standard-Profil angezeigt werden. Du kannst für jedes weitere Profil diese Entscheidung separat einstellen."
 
-#: mod/settings.php:1101
+#: mod/settings.php:1106
 msgid "Hide your profile details from anonymous viewers?"
 msgstr "Profil-Details vor unbekannten Betrachtern verbergen?"
 
-#: mod/settings.php:1101
+#: mod/settings.php:1106
 msgid ""
 "Anonymous visitors will only see your profile picture, your display name and"
 " the nickname you are using on your profile page. Your public posts and "
 "replies will still be accessible by other means."
 msgstr "Anonyme Besucher deines Profils werden ausschließlich dein Profilbild, deinen Namen sowie deinen Spitznamen sehen. Deine öffentlichen Beiträge und Kommentare werden weiterhin sichtbar sein."
 
-#: mod/settings.php:1105
+#: mod/settings.php:1110
 msgid "Allow friends to post to your profile page?"
 msgstr "Dürfen deine Kontakte auf deine Pinnwand schreiben?"
 
-#: mod/settings.php:1105
+#: mod/settings.php:1110
 msgid ""
 "Your contacts may write posts on your profile wall. These posts will be "
 "distributed to your contacts"
 msgstr "Deine Kontakte können Beiträge auf deiner Pinnwand hinterlassen. Diese werden an deine Kontakte verteilt."
 
-#: mod/settings.php:1109
+#: mod/settings.php:1114
 msgid "Allow friends to tag your posts?"
 msgstr "Dürfen deine Kontakte deine Beiträge mit Schlagwörtern versehen?"
 
-#: mod/settings.php:1109
+#: mod/settings.php:1114
 msgid "Your contacts can add additional tags to your posts."
 msgstr "Deine Kontakte dürfen deine Beiträge mit zusätzlichen Schlagworten versehen."
 
-#: mod/settings.php:1113
+#: mod/settings.php:1118
 msgid "Allow us to suggest you as a potential friend to new members?"
 msgstr "Dürfen wir dich neuen Mitgliedern als potentiellen Kontakt vorschlagen?"
 
-#: mod/settings.php:1113
+#: mod/settings.php:1118
 msgid ""
 "If you like, Friendica may suggest new members to add you as a contact."
 msgstr "Wenn du magst, kann Friendica dich neuen Mitgliedern als Kontakt vorschlagen."
 
-#: mod/settings.php:1117
+#: mod/settings.php:1122
 msgid "Permit unknown people to send you private mail?"
 msgstr "Dürfen dir Unbekannte private Nachrichten schicken?"
 
-#: mod/settings.php:1117
+#: mod/settings.php:1122
 msgid ""
 "Friendica network users may send you private messages even if they are not "
 "in your contact list."
 msgstr "Nutzer des Friendica Netzwerks können dir private Nachrichten senden, selbst wenn sie nicht in deine Kontaktliste sind."
 
-#: mod/settings.php:1121
+#: mod/settings.php:1126
 msgid "Profile is <strong>not published</strong>."
 msgstr "Profil ist <strong>nicht veröffentlicht</strong>."
 
-#: mod/settings.php:1127
+#: mod/settings.php:1132
 #, php-format
 msgid "Your Identity Address is <strong>'%s'</strong> or '%s'."
 msgstr "Die Adresse deines Profils lautet <strong>'%s'</strong> oder '%s'."
 
-#: mod/settings.php:1134
+#: mod/settings.php:1139
 msgid "Automatically expire posts after this many days:"
 msgstr "Beiträge verfallen automatisch nach dieser Anzahl von Tagen:"
 
-#: mod/settings.php:1134
+#: mod/settings.php:1139
 msgid "If empty, posts will not expire. Expired posts will be deleted"
 msgstr "Wenn leer, verfallen Beiträge nie automatisch. Verfallene Beiträge werden gelöscht."
 
-#: mod/settings.php:1135
+#: mod/settings.php:1140
 msgid "Advanced expiration settings"
 msgstr "Erweiterte Verfallseinstellungen"
 
-#: mod/settings.php:1136
+#: mod/settings.php:1141
 msgid "Advanced Expiration"
 msgstr "Erweitertes Verfallen"
 
-#: mod/settings.php:1137
+#: mod/settings.php:1142
 msgid "Expire posts:"
 msgstr "Beiträge verfallen lassen:"
 
-#: mod/settings.php:1138
+#: mod/settings.php:1143
 msgid "Expire personal notes:"
 msgstr "Persönliche Notizen verfallen lassen:"
 
-#: mod/settings.php:1139
+#: mod/settings.php:1144
 msgid "Expire starred posts:"
 msgstr "Markierte Beiträge verfallen lassen:"
 
-#: mod/settings.php:1140
+#: mod/settings.php:1145
 msgid "Expire photos:"
 msgstr "Fotos verfallen lassen:"
 
-#: mod/settings.php:1141
+#: mod/settings.php:1146
 msgid "Only expire posts by others:"
 msgstr "Nur Beiträge anderer verfallen:"
 
-#: mod/settings.php:1171
+#: mod/settings.php:1176
 msgid "Account Settings"
 msgstr "Kontoeinstellungen"
 
-#: mod/settings.php:1179
+#: mod/settings.php:1184
 msgid "Password Settings"
 msgstr "Passwort-Einstellungen"
 
-#: mod/settings.php:1180 src/Module/Register.php:130
+#: mod/settings.php:1185 src/Module/Register.php:130
 msgid "New Password:"
 msgstr "Neues Passwort:"
 
-#: mod/settings.php:1180
+#: mod/settings.php:1185
 msgid ""
 "Allowed characters are a-z, A-Z, 0-9 and special characters except white "
 "spaces, accentuated letters and colon (:)."
 msgstr "Erlaubte Zeichen sind a-z, A-Z, 0-9 und Sonderzeichen, abgesehen von Leerzeichen, Doppelpunkten (:) und akzentuierten Buchstaben."
 
-#: mod/settings.php:1181 src/Module/Register.php:131
+#: mod/settings.php:1186 src/Module/Register.php:131
 msgid "Confirm:"
 msgstr "Bestätigen:"
 
-#: mod/settings.php:1181
+#: mod/settings.php:1186
 msgid "Leave password fields blank unless changing"
 msgstr "Lass die Passwort-Felder leer, außer du willst das Passwort ändern"
 
-#: mod/settings.php:1182
+#: mod/settings.php:1187
 msgid "Current Password:"
 msgstr "Aktuelles Passwort:"
 
-#: mod/settings.php:1182 mod/settings.php:1183
+#: mod/settings.php:1187 mod/settings.php:1188
 msgid "Your current password to confirm the changes"
 msgstr "Dein aktuelles Passwort um die Änderungen zu bestätigen"
 
-#: mod/settings.php:1183
+#: mod/settings.php:1188
 msgid "Password:"
 msgstr "Passwort:"
 
-#: mod/settings.php:1187
+#: mod/settings.php:1192
 msgid "Basic Settings"
 msgstr "Grundeinstellungen"
 
-#: mod/settings.php:1188 src/Model/Profile.php:745
+#: mod/settings.php:1193 src/Model/Profile.php:756
 msgid "Full Name:"
 msgstr "Kompletter Name:"
 
-#: mod/settings.php:1189
+#: mod/settings.php:1194
 msgid "Email Address:"
 msgstr "E-Mail-Adresse:"
 
-#: mod/settings.php:1190
+#: mod/settings.php:1195
 msgid "Your Timezone:"
 msgstr "Deine Zeitzone:"
 
-#: mod/settings.php:1191
+#: mod/settings.php:1196
 msgid "Your Language:"
 msgstr "Deine Sprache:"
 
-#: mod/settings.php:1191
+#: mod/settings.php:1196
 msgid ""
 "Set the language we use to show you friendica interface and to send you "
 "emails"
 msgstr "Wähle die Sprache, in der wir dir die Friendica-Oberfläche präsentieren sollen und dir E-Mail schicken"
 
-#: mod/settings.php:1192
+#: mod/settings.php:1197
 msgid "Default Post Location:"
 msgstr "Standardstandort:"
 
-#: mod/settings.php:1193
+#: mod/settings.php:1198
 msgid "Use Browser Location:"
 msgstr "Standort des Browsers verwenden:"
 
-#: mod/settings.php:1196
+#: mod/settings.php:1201
 msgid "Security and Privacy Settings"
 msgstr "Sicherheits- und Privatsphäre-Einstellungen"
 
-#: mod/settings.php:1198
+#: mod/settings.php:1203
 msgid "Maximum Friend Requests/Day:"
 msgstr "Maximale Anzahl von Kontaktanfragen/Tag:"
 
-#: mod/settings.php:1198 mod/settings.php:1227
+#: mod/settings.php:1203 mod/settings.php:1232
 msgid "(to prevent spam abuse)"
 msgstr "(um SPAM zu vermeiden)"
 
-#: mod/settings.php:1199
+#: mod/settings.php:1204
 msgid "Default Post Permissions"
 msgstr "Standard-Zugriffsrechte für Beiträge"
 
-#: mod/settings.php:1200
+#: mod/settings.php:1205
 msgid "(click to open/close)"
 msgstr "(klicke zum Öffnen/Schließen)"
 
-#: mod/settings.php:1210
+#: mod/settings.php:1215
 msgid "Default Private Post"
 msgstr "Privater Standardbeitrag"
 
-#: mod/settings.php:1211
+#: mod/settings.php:1216
 msgid "Default Public Post"
 msgstr "Öffentlicher Standardbeitrag"
 
-#: mod/settings.php:1215
+#: mod/settings.php:1220
 msgid "Default Permissions for New Posts"
 msgstr "Standardberechtigungen für neue Beiträge"
 
-#: mod/settings.php:1227
+#: mod/settings.php:1232
 msgid "Maximum private messages per day from unknown people:"
 msgstr "Maximale Anzahl privater Nachrichten von Unbekannten pro Tag:"
 
-#: mod/settings.php:1230
+#: mod/settings.php:1235
 msgid "Notification Settings"
 msgstr "Benachrichtigungseinstellungen"
 
-#: mod/settings.php:1231
+#: mod/settings.php:1236
 msgid "Send a notification email when:"
 msgstr "Benachrichtigungs-E-Mail senden, wenn:"
 
-#: mod/settings.php:1232
+#: mod/settings.php:1237
 msgid "You receive an introduction"
 msgstr "– du eine Kontaktanfrage erhältst"
 
-#: mod/settings.php:1233
+#: mod/settings.php:1238
 msgid "Your introductions are confirmed"
 msgstr "– eine Deiner Kontaktanfragen akzeptiert wurde"
 
-#: mod/settings.php:1234
+#: mod/settings.php:1239
 msgid "Someone writes on your profile wall"
 msgstr "– jemand etwas auf Deine Pinnwand schreibt"
 
-#: mod/settings.php:1235
+#: mod/settings.php:1240
 msgid "Someone writes a followup comment"
 msgstr "– jemand auch einen Kommentar verfasst"
 
-#: mod/settings.php:1236
+#: mod/settings.php:1241
 msgid "You receive a private message"
 msgstr "– du eine private Nachricht erhältst"
 
-#: mod/settings.php:1237
+#: mod/settings.php:1242
 msgid "You receive a friend suggestion"
 msgstr "– du eine Empfehlung erhältst"
 
-#: mod/settings.php:1238
+#: mod/settings.php:1243
 msgid "You are tagged in a post"
 msgstr "– du in einem Beitrag erwähnt wirst"
 
-#: mod/settings.php:1239
+#: mod/settings.php:1244
 msgid "You are poked/prodded/etc. in a post"
 msgstr "– du von jemandem angestupst oder sonstwie behandelt wirst"
 
-#: mod/settings.php:1241
+#: mod/settings.php:1246
 msgid "Activate desktop notifications"
 msgstr "Desktop-Benachrichtigungen einschalten"
 
-#: mod/settings.php:1241
+#: mod/settings.php:1246
 msgid "Show desktop popup on new notifications"
 msgstr "Desktop-Benachrichtigungen einschalten"
 
-#: mod/settings.php:1243
+#: mod/settings.php:1248
 msgid "Text-only notification emails"
 msgstr "Benachrichtigungs-E-Mail als Rein-Text."
 
-#: mod/settings.php:1245
+#: mod/settings.php:1250
 msgid "Send text only notification emails, without the html part"
 msgstr "Sende Benachrichtigungs-E-Mail als Rein-Text - ohne HTML-Teil"
 
-#: mod/settings.php:1247
+#: mod/settings.php:1252
 msgid "Show detailled notifications"
 msgstr "Detaillierte Benachrichtigungen anzeigen"
 
-#: mod/settings.php:1249
+#: mod/settings.php:1254
 msgid ""
 "Per default, notifications are condensed to a single notification per item. "
 "When enabled every notification is displayed."
 msgstr "Normalerweise werden alle Benachrichtigungen zu einem Thema in einer einzigen Benachrichtigung zusammengefasst. Wenn diese Option aktiviert ist, wird jede Benachrichtigung einzeln angezeigt."
 
-#: mod/settings.php:1251
+#: mod/settings.php:1256
 msgid "Advanced Account/Page Type Settings"
 msgstr "Erweiterte Konto-/Seitentyp-Einstellungen"
 
-#: mod/settings.php:1252
+#: mod/settings.php:1257
 msgid "Change the behaviour of this account for special situations"
 msgstr "Verhalten dieses Kontos in bestimmten Situationen:"
 
-#: mod/settings.php:1255
+#: mod/settings.php:1260
 msgid "Relocate"
 msgstr "Umziehen"
 
-#: mod/settings.php:1256
+#: mod/settings.php:1261
 msgid ""
 "If you have moved this profile from another server, and some of your "
 "contacts don't receive your updates, try pushing this button."
 msgstr "Wenn du dein Profil von einem anderen Server umgezogen hast und einige deiner Kontakte deine Beiträge nicht erhalten, verwende diesen Button."
 
-#: mod/settings.php:1257
+#: mod/settings.php:1262
 msgid "Resend relocate message to contacts"
 msgstr "Umzugsbenachrichtigung erneut an Kontakte senden"
 
@@ -4207,1022 +4184,1151 @@ msgstr "Möchtest du wirklich diese Empfehlung löschen?"
 msgid "Ignore/Hide"
 msgstr "Ignorieren/Verbergen"
 
-#: mod/suggest.php:119 src/Content/Widget.php:66 view/theme/vier/theme.php:204
+#: mod/suggest.php:119 view/theme/vier/theme.php:204 src/Content/Widget.php:69
 msgid "Friend Suggestions"
 msgstr "Kontaktvorschläge"
 
-#: mod/tagrm.php:31
-msgid "Tag(s) removed"
-msgstr "Tag(s) entfernt"
-
-#: mod/tagrm.php:101
-msgid "Remove Item Tag"
-msgstr "Gegenstands-Tag entfernen"
-
-#: mod/tagrm.php:103
-msgid "Select a tag to remove: "
-msgstr "Wähle ein Tag zum Entfernen aus: "
-
-#: mod/uexport.php:45
+#: mod/uexport.php:52
 msgid "Export account"
 msgstr "Account exportieren"
 
-#: mod/uexport.php:45
+#: mod/uexport.php:52
 msgid ""
 "Export your account info and contacts. Use this to make a backup of your "
 "account and/or to move it to another server."
 msgstr "Exportiere Deine Account-Informationen und Kontakte. Verwende dies, um ein Backup Deines Accounts anzulegen und/oder damit auf einen anderen Server umzuziehen."
 
-#: mod/uexport.php:46
+#: mod/uexport.php:53
 msgid "Export all"
 msgstr "Alles exportieren"
 
-#: mod/uexport.php:46
+#: mod/uexport.php:53
 msgid ""
 "Export your accout info, contacts and all your items as json. Could be a "
 "very big file, and could take a lot of time. Use this to make a full backup "
 "of your account (photos are not exported)"
 msgstr "Exportiere Deine Account-Informationen, Kontakte und alle Einträge als JSON Datei. Dies könnte eine sehr große Datei werden und dementsprechend viel Zeit benötigen. Verwende dies, um ein komplettes Backup Deines Accounts anzulegen (Fotos werden nicht exportiert)."
 
-#: mod/uimport.php:30
-msgid "User imports on closed servers can only be done by an administrator."
-msgstr "Auf geschlossenen Servern können ausschließlich die Administratoren Benutzerkonten importieren."
+#: mod/videos.php:123
+msgid "No videos selected"
+msgstr "Keine Videos  ausgewählt"
 
-#: mod/uimport.php:39 src/Module/Register.php:59
-msgid ""
-"This site has exceeded the number of allowed daily account registrations. "
-"Please try again tomorrow."
-msgstr "Die maximale Anzahl täglicher Registrierungen auf dieser Seite wurde überschritten. Bitte versuche es morgen noch einmal."
+#: mod/videos.php:280 src/Model/Item.php:3468
+msgid "View Video"
+msgstr "Video ansehen"
 
-#: mod/uimport.php:54 src/Module/Register.php:141
-msgid "Import"
-msgstr "Import"
+#: mod/videos.php:295
+msgid "Recent Videos"
+msgstr "Neueste Videos"
 
-#: mod/uimport.php:56
-msgid "Move account"
-msgstr "Account umziehen"
+#: mod/videos.php:297
+msgid "Upload New Videos"
+msgstr "Neues Video hochladen"
 
-#: mod/uimport.php:57
-msgid "You can import an account from another Friendica server."
-msgstr "Du kannst einen Account von einem anderen Friendica Server importieren."
+#: view/theme/duepuntozero/config.php:55 src/Model/User.php:745
+msgid "default"
+msgstr "Standard"
 
-#: mod/uimport.php:58
+#: view/theme/duepuntozero/config.php:56
+msgid "greenzero"
+msgstr "greenzero"
+
+#: view/theme/duepuntozero/config.php:57
+msgid "purplezero"
+msgstr "purplezero"
+
+#: view/theme/duepuntozero/config.php:58
+msgid "easterbunny"
+msgstr "easterbunny"
+
+#: view/theme/duepuntozero/config.php:59
+msgid "darkzero"
+msgstr "darkzero"
+
+#: view/theme/duepuntozero/config.php:60
+msgid "comix"
+msgstr "comix"
+
+#: view/theme/duepuntozero/config.php:61
+msgid "slackr"
+msgstr "slackr"
+
+#: view/theme/duepuntozero/config.php:74
+msgid "Variations"
+msgstr "Variationen"
+
+#: view/theme/frio/php/Image.php:24
+msgid "Top Banner"
+msgstr "Top Banner"
+
+#: view/theme/frio/php/Image.php:24
 msgid ""
-"You need to export your account from the old server and upload it here. We "
-"will recreate your old account here with all your contacts. We will try also"
-" to inform your friends that you moved here."
-msgstr "Du musst deinen Account vom alten Server exportieren und hier hochladen. Wir stellen deinen alten Account mit all deinen Kontakten wieder her. Wir werden auch versuchen, deine Kontakte darüber zu informieren, dass du hierher umgezogen bist."
+"Resize image to the width of the screen and show background color below on "
+"long pages."
+msgstr "Skaliere das Hintergrundbild so, dass es die Breite der Seite einnimmt, und fülle den Rest der Seite mit der Hintergrundfarbe bei langen Seiten."
 
-#: mod/uimport.php:59
+#: view/theme/frio/php/Image.php:25
+msgid "Full screen"
+msgstr "Vollbildmodus"
+
+#: view/theme/frio/php/Image.php:25
 msgid ""
-"This feature is experimental. We can't import contacts from the OStatus "
-"network (GNU Social/Statusnet) or from Diaspora"
-msgstr "Dieses Feature ist experimentell. Wir können keine Kontakte vom OStatus-Netzwerk (GNU Social/Statusnet) oder von Diaspora importieren"
+"Resize image to fill entire screen, clipping either the right or the bottom."
+msgstr "Skaliere das Bild so, dass es den gesamten Bildschirm füllt. Hierfür wird entweder die Breite oder die Höhe des Bildes automatisch abgeschnitten."
 
-#: mod/uimport.php:60
-msgid "Account file"
-msgstr "Account-Datei"
+#: view/theme/frio/php/Image.php:26
+msgid "Single row mosaic"
+msgstr "Mosaik in einer Zeile"
 
-#: mod/uimport.php:60
+#: view/theme/frio/php/Image.php:26
 msgid ""
-"To export your account, go to \"Settings->Export your personal data\" and "
-"select \"Export account\""
-msgstr "Um Deinen Account zu exportieren, rufe \"Einstellungen -> Persönliche Daten exportieren\" auf und wähle \"Account exportieren\""
+"Resize image to repeat it on a single row, either vertical or horizontal."
+msgstr "Skaliere das Bild so, dass es in einer einzelnen Reihe, entweder horizontal oder vertikal, wiederholt wird."
 
-#: mod/unfollow.php:36 mod/unfollow.php:92
-msgid "You aren't following this contact."
-msgstr "Du folgst diesem Kontakt."
+#: view/theme/frio/php/Image.php:27
+msgid "Mosaic"
+msgstr "Mosaik"
 
-#: mod/unfollow.php:46 mod/unfollow.php:98
-msgid "Unfollowing is currently not supported by your network."
-msgstr "Bei diesem Netzwerk wird das Entfolgen derzeit nicht unterstützt."
+#: view/theme/frio/php/Image.php:27
+msgid "Repeat image to fill the screen."
+msgstr "Wiederhole das Bild, um den Bildschirm zu füllen."
 
-#: mod/unfollow.php:67
-msgid "Contact unfollowed"
-msgstr "Kontakt wird nicht mehr gefolgt"
+#: view/theme/frio/config.php:111
+msgid "Custom"
+msgstr "Benutzerdefiniert"
 
-#: mod/unfollow.php:118 src/Module/Contact.php:573
-msgid "Disconnect/Unfollow"
-msgstr "Verbindung lösen/Nicht mehr folgen"
+#: view/theme/frio/config.php:123
+msgid "Note"
+msgstr "Hinweis"
+
+#: view/theme/frio/config.php:123
+msgid "Check image permissions if all users are allowed to see the image"
+msgstr "Überprüfe, dass alle Benutzer die Berechtigung haben dieses Bild anzusehen"
+
+#: view/theme/frio/config.php:129
+msgid "Select color scheme"
+msgstr "Farbschema auswählen"
+
+#: view/theme/frio/config.php:130
+msgid "Copy or paste schemestring"
+msgstr "Farbschema kopieren oder einfügen"
+
+#: view/theme/frio/config.php:130
+msgid ""
+"You can copy this string to share your theme with others. Pasting here "
+"applies the schemestring"
+msgstr "Du kannst den String mit den Farbschema Informationen mit anderen Teilen. Wenn du einen neuen Farbschema-String hier einfügst wird er für deine Einstellungen übernommen."
+
+#: view/theme/frio/config.php:131
+msgid "Navigation bar background color"
+msgstr "Hintergrundfarbe der Navigationsleiste"
+
+#: view/theme/frio/config.php:132
+msgid "Navigation bar icon color "
+msgstr "Icon Farbe in der Navigationsleiste"
+
+#: view/theme/frio/config.php:133
+msgid "Link color"
+msgstr "Linkfarbe"
+
+#: view/theme/frio/config.php:134
+msgid "Set the background color"
+msgstr "Hintergrundfarbe festlegen"
+
+#: view/theme/frio/config.php:135
+msgid "Content background opacity"
+msgstr "Opazität des Hintergrunds von Beiträgen"
+
+#: view/theme/frio/config.php:136
+msgid "Set the background image"
+msgstr "Hintergrundbild festlegen"
+
+#: view/theme/frio/config.php:137
+msgid "Background image style"
+msgstr "Stil des Hintergrundbildes"
 
-#: mod/update_community.php:23 mod/update_contact.php:23
-#: mod/update_display.php:24 mod/update_network.php:33 mod/update_notes.php:36
-#: mod/update_profile.php:34
-msgid "[Embedded content - reload page to view]"
-msgstr "[Eingebetteter Inhalt - Seite neu laden zum Betrachten]"
+#: view/theme/frio/config.php:139
+msgid "Enable Compose page"
+msgstr "Aktiviere Composer Seite"
 
-#: mod/videos.php:123
-msgid "No videos selected"
-msgstr "Keine Videos  ausgewählt"
+#: view/theme/frio/config.php:139
+msgid ""
+"This replaces the jot modal window for writing new posts with a link to <a "
+"href=\"compose\">the new Compose page</a>."
+msgstr "Dies ersetzt das jot-modale Fenster zum Schreiben neuer Beiträge mit einem Link zu <a href=\"compose\">die neue Composer Seite</a>."
 
-#: mod/videos.php:280 src/Model/Item.php:3421
-msgid "View Video"
-msgstr "Video ansehen"
+#: view/theme/frio/config.php:143
+msgid "Login page background image"
+msgstr "Hintergrundbild der Login-Seite"
 
-#: mod/videos.php:295
-msgid "Recent Videos"
-msgstr "Neueste Videos"
+#: view/theme/frio/config.php:147
+msgid "Login page background color"
+msgstr "Hintergrundfarbe der Login-Seite"
 
-#: mod/videos.php:297
-msgid "Upload New Videos"
-msgstr "Neues Video hochladen"
+#: view/theme/frio/config.php:147
+msgid "Leave background image and color empty for theme defaults"
+msgstr "Wenn die Theme-Vorgaben verwendet werden sollen, lass bitte die Felder für die Hintergrundfarbe und das Hintergrundbild leer."
 
-#: mod/viewcontacts.php:78
-msgid "No contacts."
-msgstr "Keine Kontakte."
+#: view/theme/frio/theme.php:246
+msgid "Guest"
+msgstr "Gast"
 
-#: mod/viewcontacts.php:94 src/Module/Contact.php:606
-#: src/Module/Contact.php:1027
-#, php-format
-msgid "Visit %s's profile [%s]"
-msgstr "Besuche %ss Profil [%s]"
+#: view/theme/frio/theme.php:251
+msgid "Visitor"
+msgstr "Besucher"
 
-#: mod/viewcontacts.php:114 src/Content/Nav.php:202 src/Content/Nav.php:268
-#: src/Content/Text/HTML.php:911 src/Model/Profile.php:974
-#: src/Model/Profile.php:977 src/Module/Contact.php:814
-#: src/Module/Contact.php:884 view/theme/frio/theme.php:273
-msgid "Contacts"
-msgstr "Kontakte"
+#: view/theme/frio/theme.php:267 src/Content/Nav.php:160
+#: src/Model/Profile.php:909 src/Module/Contact.php:654
+#: src/Module/Contact.php:856 src/Module/Settings/TwoFactor/Index.php:91
+msgid "Status"
+msgstr "Status"
 
-#: mod/wallmessage.php:52 mod/wallmessage.php:115
-#, php-format
-msgid "Number of daily wall messages for %s exceeded. Message failed."
-msgstr "Maximale Anzahl der täglichen Pinnwand-Nachrichten für %s ist überschritten. Zustellung fehlgeschlagen."
+#: view/theme/frio/theme.php:267 src/Content/Nav.php:160
+#: src/Content/Nav.php:244
+msgid "Your posts and conversations"
+msgstr "Deine Beiträge und Unterhaltungen"
 
-#: mod/wallmessage.php:63
-msgid "Unable to check your home location."
-msgstr "Konnte Deinen Heimatort nicht bestimmen."
+#: view/theme/frio/theme.php:268 src/Content/Nav.php:161
+msgid "Your profile page"
+msgstr "Deine Profilseite"
 
-#: mod/wallmessage.php:89 mod/wallmessage.php:98
-msgid "No recipient."
-msgstr "Kein Empfänger."
+#: view/theme/frio/theme.php:269 src/Content/Nav.php:162
+msgid "Your photos"
+msgstr "Deine Fotos"
 
-#: 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 "Wenn du möchtest, dass %s dir antworten kann, überprüfe deine Privatsphären-Einstellungen und erlaube private Nachrichten von unbekannten Absendern."
+#: view/theme/frio/theme.php:270 src/Content/Nav.php:163
+#: src/Model/Profile.php:933 src/Model/Profile.php:936
+msgid "Videos"
+msgstr "Videos"
 
-#: 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
-msgid "Invalid request."
-msgstr "Ungültige Anfrage"
+#: view/theme/frio/theme.php:270 src/Content/Nav.php:163
+msgid "Your videos"
+msgstr "Deine Videos"
 
-#: mod/wall_attach.php:103
-msgid "Sorry, maybe your upload is bigger than the PHP configuration allows"
-msgstr "Entschuldige, die Datei scheint größer zu sein, als es die PHP-Konfiguration erlaubt."
+#: view/theme/frio/theme.php:271 src/Content/Nav.php:164
+msgid "Your events"
+msgstr "Deine Ereignisse"
 
-#: mod/wall_attach.php:103
-msgid "Or - did you try to upload an empty file?"
-msgstr "Oder - hast du versucht, eine leere Datei hochzuladen?"
+#: view/theme/frio/theme.php:274 src/Core/NotificationsManager.php:151
+#: src/Content/Nav.php:241
+msgid "Network"
+msgstr "Netzwerk"
 
-#: mod/wall_attach.php:114
-#, php-format
-msgid "File exceeds size limit of %s"
-msgstr "Die Datei ist größer als das erlaubte Limit von %s"
+#: view/theme/frio/theme.php:274 src/Content/Nav.php:241
+msgid "Conversations from your friends"
+msgstr "Unterhaltungen Deiner Kontakte"
 
-#: mod/wall_attach.php:129
-msgid "File upload failed."
-msgstr "Hochladen der Datei fehlgeschlagen."
+#: view/theme/frio/theme.php:275 src/Content/Nav.php:228
+#: src/Model/Profile.php:948 src/Model/Profile.php:959
+msgid "Events and Calendar"
+msgstr "Ereignisse und Kalender"
 
-#: mod/wall_upload.php:243
-msgid "Wall Photos"
-msgstr "Pinnwand-Bilder"
+#: view/theme/frio/theme.php:276 src/Content/Nav.php:254
+msgid "Private mail"
+msgstr "Private E-Mail"
 
-#: src/App.php:505
-msgid "Delete this item?"
-msgstr "Diesen Beitrag löschen?"
+#: view/theme/frio/theme.php:277 src/Content/Nav.php:265
+msgid "Account settings"
+msgstr "Kontoeinstellungen"
 
-#: src/App.php:547
-msgid "toggle mobile"
-msgstr "mobile Ansicht umschalten"
+#: view/theme/frio/theme.php:278 src/Content/Text/HTML.php:900
+#: src/Content/Nav.php:205 src/Content/Nav.php:271 src/Model/Profile.php:988
+#: src/Model/Profile.php:991 src/Module/Contact.php:800
+#: src/Module/Contact.php:884
+msgid "Contacts"
+msgstr "Kontakte"
 
-#: src/App.php:863
-msgid "No system theme config value set."
-msgstr "Es wurde kein Konfigurationswert für das systemweite Theme gesetzt."
+#: view/theme/frio/theme.php:278 src/Content/Nav.php:271
+msgid "Manage/edit friends and contacts"
+msgstr "Freunde und Kontakte verwalten/bearbeiten"
 
-#: src/App.php:1163
-msgid "You must be logged in to use addons. "
-msgstr "Du musst angemeldet sein, um Addons benutzen zu können."
+#: view/theme/quattro/config.php:76
+msgid "Alignment"
+msgstr "Ausrichtung"
 
-#: src/BaseModule.php:135
-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 "Das Sicherheitsmerkmal war nicht korrekt. Das passiert meistens, wenn das Formular vor dem Absenden zu lange geöffnet war (länger als 3 Stunden)."
+#: view/theme/quattro/config.php:76
+msgid "Left"
+msgstr "Links"
 
-#: src/Console/ArchiveContact.php:65
-#, php-format
-msgid "Could not find any unarchived contact entry for this URL (%s)"
-msgstr "Für die URL (%s) konnte kein nicht-archivierter Kontakt gefunden werden"
+#: view/theme/quattro/config.php:76
+msgid "Center"
+msgstr "Mitte"
 
-#: src/Console/ArchiveContact.php:68
-msgid "The contact entries have been archived"
-msgstr "Die Kontakteinträge wurden archiviert."
+#: view/theme/quattro/config.php:77
+msgid "Color scheme"
+msgstr "Farbschema"
 
-#: src/Console/GlobalCommunityBlock.php:65
-#: src/Module/Admin/Blocklist/Contact.php:29
-#, php-format
-msgid "Could not find any contact entry for this URL (%s)"
-msgstr "Für die URL (%s) konnte kein Kontakt gefunden werden"
+#: view/theme/quattro/config.php:78
+msgid "Posts font size"
+msgstr "Schriftgröße in Beiträgen"
 
-#: src/Console/GlobalCommunityBlock.php:68
-#: src/Module/Admin/Blocklist/Contact.php:27
-msgid "The contact has been blocked from the node"
-msgstr "Der Kontakt wurde von diesem Knoten geblockt"
+#: view/theme/quattro/config.php:79
+msgid "Textareas font size"
+msgstr "Schriftgröße in Eingabefeldern"
 
-#: src/Console/NewPassword.php:72
-msgid "Enter new password: "
-msgstr "Neues Passwort eingeben:"
+#: view/theme/vier/config.php:76
+msgid "Comma separated list of helper forums"
+msgstr "Komma-separierte Liste der Helfer-Foren"
 
-#: src/Console/PostUpdate.php:50
-#, php-format
-msgid "Post update version number has been set to %s."
-msgstr "Die Post-Update-Versionsnummer wurde auf %s gesetzt."
+#: view/theme/vier/config.php:116 src/Core/ACL.php:302
+msgid "don't show"
+msgstr "nicht zeigen"
 
-#: src/Console/PostUpdate.php:58
-msgid "Check for pending update actions."
-msgstr "Überprüfe ausstehende Update-Aktionen"
+#: view/theme/vier/config.php:116 src/Core/ACL.php:301
+msgid "show"
+msgstr "zeigen"
 
-#: src/Console/PostUpdate.php:60
-msgid "Done."
-msgstr "Erledigt."
+#: view/theme/vier/config.php:122
+msgid "Set style"
+msgstr "Stil auswählen"
 
-#: src/Console/PostUpdate.php:62
-msgid "Execute pending post updates."
-msgstr "Ausstehende Post-Updates ausführen"
+#: view/theme/vier/config.php:123
+msgid "Community Pages"
+msgstr "Foren"
 
-#: src/Console/PostUpdate.php:68
-msgid "All pending post updates are done."
-msgstr "Alle ausstehenden Post-Updates wurden ausgeführt."
+#: view/theme/vier/config.php:124 view/theme/vier/theme.php:151
+msgid "Community Profiles"
+msgstr "Community-Profile"
 
-#: src/Content/ContactSelector.php:58
-msgid "Frequently"
-msgstr "immer wieder"
+#: view/theme/vier/config.php:125
+msgid "Help or @NewHere ?"
+msgstr "Hilfe oder @NewHere"
 
-#: src/Content/ContactSelector.php:59
-msgid "Hourly"
-msgstr "Stündlich"
+#: view/theme/vier/config.php:126 view/theme/vier/theme.php:373
+msgid "Connect Services"
+msgstr "Verbinde Dienste"
 
-#: src/Content/ContactSelector.php:60
-msgid "Twice daily"
-msgstr "Zweimal täglich"
+#: view/theme/vier/config.php:127
+msgid "Find Friends"
+msgstr "Kontakte finden"
 
-#: src/Content/ContactSelector.php:61
-msgid "Daily"
-msgstr "Täglich"
+#: view/theme/vier/config.php:128 view/theme/vier/theme.php:181
+msgid "Last users"
+msgstr "Letzte Nutzer"
 
-#: src/Content/ContactSelector.php:62
-msgid "Weekly"
-msgstr "Wöchentlich"
+#: view/theme/vier/theme.php:199 src/Content/Widget.php:64
+msgid "Find People"
+msgstr "Leute finden"
 
-#: src/Content/ContactSelector.php:63
-msgid "Monthly"
-msgstr "Monatlich"
+#: view/theme/vier/theme.php:200 src/Content/Widget.php:65
+msgid "Enter name or interest"
+msgstr "Name oder Interessen eingeben"
 
-#: src/Content/ContactSelector.php:83
-msgid "DFRN"
-msgstr "DFRN"
+#: view/theme/vier/theme.php:202 src/Content/Widget.php:67
+msgid "Examples: Robert Morgenstein, Fishing"
+msgstr "Beispiel: Robert Morgenstein, Angeln"
 
-#: src/Content/ContactSelector.php:84
-msgid "OStatus"
-msgstr "OStatus"
+#: view/theme/vier/theme.php:203 src/Content/Widget.php:68
+#: src/Module/Contact.php:820 src/Module/Directory.php:86
+msgid "Find"
+msgstr "Finde"
 
-#: src/Content/ContactSelector.php:85
-msgid "RSS/Atom"
-msgstr "RSS/Atom"
+#: view/theme/vier/theme.php:205 src/Content/Widget.php:70
+msgid "Similar Interests"
+msgstr "Ähnliche Interessen"
 
-#: src/Content/ContactSelector.php:86 src/Module/Admin/Users.php:272
-#: src/Module/Admin/Users.php:283 src/Module/Admin/Users.php:297
-#: src/Module/Admin/Users.php:315
-msgid "Email"
-msgstr "E-Mail"
+#: view/theme/vier/theme.php:206 src/Content/Widget.php:71
+msgid "Random Profile"
+msgstr "Zufälliges Profil"
 
-#: src/Content/ContactSelector.php:88
-msgid "Zot!"
-msgstr "Zott"
+#: view/theme/vier/theme.php:207 src/Content/Widget.php:72
+msgid "Invite Friends"
+msgstr "Freunde einladen"
 
-#: src/Content/ContactSelector.php:89
-msgid "LinkedIn"
-msgstr "LinkedIn"
+#: view/theme/vier/theme.php:208 src/Content/Widget.php:73
+#: src/Module/Directory.php:78
+msgid "Global Directory"
+msgstr "Weltweites Verzeichnis"
 
-#: src/Content/ContactSelector.php:90
-msgid "XMPP/IM"
-msgstr "XMPP/Chat"
+#: view/theme/vier/theme.php:210 src/Content/Widget.php:75
+msgid "Local Directory"
+msgstr "Lokales Verzeichnis"
 
-#: src/Content/ContactSelector.php:91
-msgid "MySpace"
-msgstr "MySpace"
+#: view/theme/vier/theme.php:250 src/Content/Text/HTML.php:903
+#: src/Content/ForumManager.php:130 src/Content/Nav.php:209
+msgid "Forums"
+msgstr "Foren"
 
-#: src/Content/ContactSelector.php:92
-msgid "Google+"
-msgstr "Google+"
+#: view/theme/vier/theme.php:252 src/Content/ForumManager.php:132
+msgid "External link to forum"
+msgstr "Externer Link zum Forum"
+
+#: view/theme/vier/theme.php:255 src/Content/ForumManager.php:135
+#: src/Content/Widget.php:407 src/Content/Widget.php:507
+msgid "show more"
+msgstr "mehr anzeigen"
 
-#: src/Content/ContactSelector.php:93
-msgid "pump.io"
-msgstr "pump.io"
+#: view/theme/vier/theme.php:288
+msgid "Quick Start"
+msgstr "Schnell-Start"
 
-#: src/Content/ContactSelector.php:94
-msgid "Twitter"
-msgstr "Twitter"
+#: view/theme/vier/theme.php:294 src/Content/Nav.php:192
+#: src/Module/Help.php:50 src/Module/Settings/TwoFactor/AppSpecific.php:99
+#: src/Module/Settings/TwoFactor/Index.php:90
+#: src/Module/Settings/TwoFactor/Recovery.php:77
+#: src/Module/Settings/TwoFactor/Verify.php:117
+msgid "Help"
+msgstr "Hilfe"
 
-#: src/Content/ContactSelector.php:95
-msgid "Diaspora Connector"
-msgstr "Diaspora Connector"
+#: src/Core/ACL.php:288 src/Module/Item/Compose.php:139
+msgid "Post to Email"
+msgstr "An E-Mail senden"
 
-#: src/Content/ContactSelector.php:96
-msgid "GNU Social Connector"
-msgstr "GNU Social Connector"
+#: src/Core/ACL.php:300
+msgid "Visible to everybody"
+msgstr "Für jeden sichtbar"
 
-#: src/Content/ContactSelector.php:97
-msgid "ActivityPub"
-msgstr "ActivityPub"
+#: src/Core/ACL.php:311
+msgid "Connectors"
+msgstr "Connectoren"
 
-#: src/Content/ContactSelector.php:98
-msgid "pnut"
-msgstr "pnut"
+#: src/Core/ACL.php:313
+msgid "Hide your profile details from unknown viewers?"
+msgstr "Profil-Details vor unbekannten Betrachtern verbergen?"
 
-#: src/Content/ContactSelector.php:153 src/Content/ContactSelector.php:193
-#: src/Content/ContactSelector.php:231
-msgid "No answer"
-msgstr "Keine Antwort"
+#: src/Core/ACL.php:313
+#, php-format
+msgid "Connectors disabled, since \"%s\" is enabled."
+msgstr "Konnektoren sind nicht verfügbar, da \"%s\" aktiv ist."
 
-#: src/Content/ContactSelector.php:154
-msgid "Male"
-msgstr "Männlich"
+#: src/Core/ACL.php:315
+msgid "Close"
+msgstr "Schließen"
 
-#: src/Content/ContactSelector.php:155
-msgid "Female"
-msgstr "Weiblich"
+#: 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 "Die Datenbankkonfigurationsdatei \"config/local.config.php\" konnte nicht erstellt werden. Um eine Konfigurationsdatei in Ihrem Webserver-Verzeichnis zu erstellen, gehe wie folgt vor."
 
-#: src/Content/ContactSelector.php:156
-msgid "Currently Male"
-msgstr "Momentan männlich"
+#: src/Core/Installer.php:182
+msgid ""
+"You may need to import the file \"database.sql\" manually using phpmyadmin "
+"or mysql."
+msgstr "Möglicherweise musst du die Datei \"database.sql\" manuell mit phpmyadmin oder mysql importieren."
 
-#: src/Content/ContactSelector.php:157
-msgid "Currently Female"
-msgstr "Momentan weiblich"
+#: src/Core/Installer.php:183 src/Module/Install.php:174
+#: src/Module/Install.php:330
+msgid "Please see the file \"INSTALL.txt\"."
+msgstr "Lies bitte die \"INSTALL.txt\"."
 
-#: src/Content/ContactSelector.php:158
-msgid "Mostly Male"
-msgstr "Hauptsächlich männlich"
+#: src/Core/Installer.php:244
+msgid "Could not find a command line version of PHP in the web server PATH."
+msgstr "Konnte keine Kommandozeilenversion von PHP im PATH des Servers finden."
 
-#: src/Content/ContactSelector.php:159
-msgid "Mostly Female"
-msgstr "Hauptsächlich weiblich"
+#: 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 "
+"href='https://github.com/friendica/friendica/blob/master/doc/Install.md#set-"
+"up-the-worker'>'Setup the worker'</a>"
+msgstr "Wenn auf deinem Server keine Kommandozeilenversion von PHP installiert ist, kannst du den Hintergrundprozess nicht einrichten. Hier findest du alternative Möglichkeiten<a href='https://github.com/friendica/friendica/blob/master/doc/Install.md#set-up-the-poller'>'für das Worker-Setup'</a>"
 
-#: src/Content/ContactSelector.php:160
-msgid "Transgender"
-msgstr "Transgender"
+#: src/Core/Installer.php:250
+msgid "PHP executable path"
+msgstr "Pfad zu PHP"
 
-#: src/Content/ContactSelector.php:161
-msgid "Intersex"
-msgstr "Intersex"
+#: src/Core/Installer.php:250
+msgid ""
+"Enter full path to php executable. You can leave this blank to continue the "
+"installation."
+msgstr "Gib den kompletten Pfad zur ausführbaren Datei von PHP an. Du kannst dieses Feld auch frei lassen und mit der Installation fortfahren."
 
-#: src/Content/ContactSelector.php:162
-msgid "Transsexual"
-msgstr "Transsexuell"
+#: src/Core/Installer.php:255
+msgid "Command line PHP"
+msgstr "Kommandozeilen-PHP"
 
-#: src/Content/ContactSelector.php:163
-msgid "Hermaphrodite"
-msgstr "Hermaphrodit"
+#: src/Core/Installer.php:264
+msgid "PHP executable is not the php cli binary (could be cgi-fgci version)"
+msgstr "Die ausführbare Datei von PHP stimmt nicht mit der PHP cli Version überein (es könnte sich um die cgi-fgci Version handeln)"
 
-#: src/Content/ContactSelector.php:164
-msgid "Neuter"
-msgstr "Neuter"
+#: src/Core/Installer.php:265
+msgid "Found PHP version: "
+msgstr "Gefundene PHP Version:"
 
-#: src/Content/ContactSelector.php:165
-msgid "Non-specific"
-msgstr "Nicht spezifiziert"
+#: src/Core/Installer.php:267
+msgid "PHP cli binary"
+msgstr "PHP CLI Binary"
 
-#: src/Content/ContactSelector.php:166
-msgid "Other"
-msgstr "Andere"
+#: src/Core/Installer.php:280
+msgid ""
+"The command line version of PHP on your system does not have "
+"\"register_argc_argv\" enabled."
+msgstr "Die Kommandozeilenversion von PHP auf Deinem System hat \"register_argc_argv\" nicht aktiviert."
 
-#: src/Content/ContactSelector.php:194
-msgid "Males"
-msgstr "Männer"
+#: src/Core/Installer.php:281
+msgid "This is required for message delivery to work."
+msgstr "Dies wird für die Auslieferung von Nachrichten benötigt."
 
-#: src/Content/ContactSelector.php:195
-msgid "Females"
-msgstr "Frauen"
+#: src/Core/Installer.php:286
+msgid "PHP register_argc_argv"
+msgstr "PHP register_argc_argv"
 
-#: src/Content/ContactSelector.php:196
-msgid "Gay"
-msgstr "Schwul"
+#: src/Core/Installer.php:318
+msgid ""
+"Error: the \"openssl_pkey_new\" function on this system is not able to "
+"generate encryption keys"
+msgstr "Fehler: Die Funktion \"openssl_pkey_new\" auf diesem System ist nicht in der Lage, Verschlüsselungsschlüssel zu erzeugen"
 
-#: src/Content/ContactSelector.php:197
-msgid "Lesbian"
-msgstr "Lesbisch"
+#: src/Core/Installer.php:319
+msgid ""
+"If running under Windows, please see "
+"\"http://www.php.net/manual/en/openssl.installation.php\"."
+msgstr "Wenn der Server unter Windows läuft, schau dir bitte \"http://www.php.net/manual/en/openssl.installation.php\" an."
 
-#: src/Content/ContactSelector.php:198
-msgid "No Preference"
-msgstr "Keine Vorlieben"
+#: src/Core/Installer.php:322
+msgid "Generate encryption keys"
+msgstr "Schlüssel erzeugen"
 
-#: src/Content/ContactSelector.php:199
-msgid "Bisexual"
-msgstr "Bisexuell"
+#: src/Core/Installer.php:374
+msgid ""
+"Error: Apache webserver mod-rewrite module is required but not installed."
+msgstr "Fehler: Das Apache-Modul mod-rewrite wird benötigt, es ist allerdings nicht installiert."
 
-#: src/Content/ContactSelector.php:200
-msgid "Autosexual"
-msgstr "Autosexuell"
+#: src/Core/Installer.php:379
+msgid "Apache mod_rewrite module"
+msgstr "Apache mod_rewrite module"
 
-#: src/Content/ContactSelector.php:201
-msgid "Abstinent"
-msgstr "Abstinent"
+#: src/Core/Installer.php:385
+msgid "Error: PDO or MySQLi PHP module required but not installed."
+msgstr "Fehler: PDO oder MySQLi PHP Modul erforderlich, aber nicht installiert."
 
-#: src/Content/ContactSelector.php:202
-msgid "Virgin"
-msgstr "Jungfrauen"
+#: src/Core/Installer.php:390
+msgid "Error: The MySQL driver for PDO is not installed."
+msgstr "Fehler: der MySQL Treiber für PDO ist nicht installiert"
 
-#: src/Content/ContactSelector.php:203
-msgid "Deviant"
-msgstr "Deviant"
+#: src/Core/Installer.php:394
+msgid "PDO or MySQLi PHP module"
+msgstr "PDO oder MySQLi PHP Modul"
 
-#: src/Content/ContactSelector.php:204
-msgid "Fetish"
-msgstr "Fetish"
+#: src/Core/Installer.php:402
+msgid "Error, XML PHP module required but not installed."
+msgstr "Fehler: XML PHP Modul erforderlich aber nicht installiert."
 
-#: src/Content/ContactSelector.php:205
-msgid "Oodles"
-msgstr "Oodles"
+#: src/Core/Installer.php:406
+msgid "XML PHP module"
+msgstr "XML PHP Modul"
 
-#: src/Content/ContactSelector.php:206
-msgid "Nonsexual"
-msgstr "Nonsexual"
+#: src/Core/Installer.php:409
+msgid "libCurl PHP module"
+msgstr "PHP: libCurl-Modul"
 
-#: src/Content/ContactSelector.php:232
-msgid "Single"
-msgstr "Single"
+#: src/Core/Installer.php:410
+msgid "Error: libCURL PHP module required but not installed."
+msgstr "Fehler: Das libCURL PHP Modul wird benötigt, ist aber nicht installiert."
 
-#: src/Content/ContactSelector.php:233
-msgid "Lonely"
-msgstr "Einsam"
+#: src/Core/Installer.php:416
+msgid "GD graphics PHP module"
+msgstr "PHP: GD-Grafikmodul"
 
-#: src/Content/ContactSelector.php:234
-msgid "Available"
-msgstr "Verfügbar"
+#: src/Core/Installer.php:417
+msgid ""
+"Error: GD graphics PHP module with JPEG support required but not installed."
+msgstr "Fehler: Das GD-Graphikmodul für PHP mit JPEG-Unterstützung ist nicht installiert."
 
-#: src/Content/ContactSelector.php:235
-msgid "Unavailable"
-msgstr "Nicht verfügbar"
+#: src/Core/Installer.php:423
+msgid "OpenSSL PHP module"
+msgstr "PHP: OpenSSL-Modul"
 
-#: src/Content/ContactSelector.php:236
-msgid "Has crush"
-msgstr "verknallt"
+#: src/Core/Installer.php:424
+msgid "Error: openssl PHP module required but not installed."
+msgstr "Fehler: Das openssl-Modul von PHP ist nicht installiert."
 
-#: src/Content/ContactSelector.php:237
-msgid "Infatuated"
-msgstr "verliebt"
+#: src/Core/Installer.php:430
+msgid "mb_string PHP module"
+msgstr "PHP: mb_string-Modul"
 
-#: src/Content/ContactSelector.php:238
-msgid "Dating"
-msgstr "Dating"
+#: src/Core/Installer.php:431
+msgid "Error: mb_string PHP module required but not installed."
+msgstr "Fehler: mb_string PHP Module wird benötigt, ist aber nicht installiert."
 
-#: src/Content/ContactSelector.php:239
-msgid "Unfaithful"
-msgstr "Untreu"
+#: src/Core/Installer.php:437
+msgid "iconv PHP module"
+msgstr "PHP iconv Modul"
 
-#: src/Content/ContactSelector.php:240
-msgid "Sex Addict"
-msgstr "Sexbesessen"
+#: src/Core/Installer.php:438
+msgid "Error: iconv PHP module required but not installed."
+msgstr "Fehler: Das iconv-Modul von PHP ist nicht installiert."
 
-#: src/Content/ContactSelector.php:241 src/Model/User.php:729
-msgid "Friends"
-msgstr "Kontakte"
+#: src/Core/Installer.php:444
+msgid "POSIX PHP module"
+msgstr "PHP POSIX Modul"
 
-#: src/Content/ContactSelector.php:242
-msgid "Friends/Benefits"
-msgstr "Freunde/Zuwendungen"
+#: src/Core/Installer.php:445
+msgid "Error: POSIX PHP module required but not installed."
+msgstr "Fehler POSIX PHP Modul erforderlich, aber nicht installiert."
+
+#: src/Core/Installer.php:451
+msgid "JSON PHP module"
+msgstr "PHP JASON Modul"
 
-#: src/Content/ContactSelector.php:243
-msgid "Casual"
-msgstr "Casual"
+#: src/Core/Installer.php:452
+msgid "Error: JSON PHP module required but not installed."
+msgstr "Fehler: Das JSON PHP Modul wird benötigt, ist aber nicht installiert."
 
-#: src/Content/ContactSelector.php:244
-msgid "Engaged"
-msgstr "Verlobt"
+#: src/Core/Installer.php:458
+msgid "File Information PHP module"
+msgstr "PHP Datei Informations-Modul"
 
-#: src/Content/ContactSelector.php:245
-msgid "Married"
-msgstr "Verheiratet"
+#: src/Core/Installer.php:459
+msgid "Error: File Information PHP module required but not installed."
+msgstr "Fehler: Das Datei Informations PHP Modul ist nicht installiert."
 
-#: src/Content/ContactSelector.php:246
-msgid "Imaginarily married"
-msgstr "imaginär verheiratet"
+#: 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 "Das Installationsprogramm muss in der Lage sein, eine Datei namens \"local.config.php\" im Ordner \"config\" Ihres Webservers zu erstellen, ist aber nicht in der Lage dazu."
 
-#: src/Content/ContactSelector.php:247
-msgid "Partners"
-msgstr "Partner"
+#: 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 "In den meisten Fällen ist dies ein Problem mit den Schreibrechten. Der Webserver könnte keine Schreiberlaubnis haben, selbst wenn du sie hast."
 
-#: src/Content/ContactSelector.php:248
-msgid "Cohabiting"
-msgstr "zusammenlebend"
+#: 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 "Am Ende dieser Prozedur bekommst du einen Text, der in der local.config.php im Friendica \"config\" Ordner gespeichert werden muss."
 
-#: src/Content/ContactSelector.php:249
-msgid "Common law"
-msgstr "wilde Ehe"
+#: 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 "Alternativ kannst du diesen Schritt aber auch überspringen und die Installation manuell durchführen. Eine Anleitung dazu (Englisch) findest du in der Datei INSTALL.txt."
 
-#: src/Content/ContactSelector.php:250
-msgid "Happy"
-msgstr "Glücklich"
+#: src/Core/Installer.php:488
+msgid "config/local.config.php is writable"
+msgstr "config/local.config.php ist schreibbar"
 
-#: src/Content/ContactSelector.php:251
-msgid "Not looking"
-msgstr "Nicht auf der Suche"
+#: 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 "Friendica nutzt die Smarty3-Template-Engine, um die Webansichten zu rendern. Smarty3 kompiliert Templates zu PHP, um das Rendern zu beschleunigen."
 
-#: src/Content/ContactSelector.php:252
-msgid "Swinger"
-msgstr "Swinger"
+#: 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 "Um diese kompilierten Templates zu speichern, benötigt der Webserver Schreibrechte zum Verzeichnis view/smarty3/ im obersten Ordner von Friendica."
 
-#: src/Content/ContactSelector.php:253
-msgid "Betrayed"
-msgstr "Betrogen"
+#: 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 "Bitte stelle sicher, dass der Nutzer, unter dem der Webserver läuft (z.B. www-data), Schreibrechte zu diesem Verzeichnis hat."
 
-#: src/Content/ContactSelector.php:254
-msgid "Separated"
-msgstr "Getrennt"
+#: 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 "Hinweis: aus Sicherheitsgründen solltest du dem Webserver nur Schreibrechte für view/smarty3/ geben -- Nicht für die darin enthaltenen Template-Dateien (.tpl)."
 
-#: src/Content/ContactSelector.php:255
-msgid "Unstable"
-msgstr "Unstabil"
+#: src/Core/Installer.php:514
+msgid "view/smarty3 is writable"
+msgstr "view/smarty3 ist schreibbar"
 
-#: src/Content/ContactSelector.php:256
-msgid "Divorced"
-msgstr "Geschieden"
+#: src/Core/Installer.php:543
+msgid ""
+"Url rewrite in .htaccess is not working. Make sure you copied .htaccess-dist"
+" to .htaccess."
+msgstr "Umschreiben der URLs in der .htaccess funktioniert nicht. Vergewissere dich, dass du .htaccess-dist nach.htaccess kopiert hast."
 
-#: src/Content/ContactSelector.php:257
-msgid "Imaginarily divorced"
-msgstr "Imaginär geschieden"
+#: src/Core/Installer.php:545
+msgid "Error message from Curl when fetching"
+msgstr "Fehlermeldung von Curl während des Ladens"
 
-#: src/Content/ContactSelector.php:258
-msgid "Widowed"
-msgstr "Verwitwet"
+#: src/Core/Installer.php:550
+msgid "Url rewrite is working"
+msgstr "URL rewrite funktioniert"
 
-#: src/Content/ContactSelector.php:259
-msgid "Uncertain"
-msgstr "Unsicher"
+#: src/Core/Installer.php:579
+msgid "ImageMagick PHP extension is not installed"
+msgstr "ImageMagicx PHP Erweiterung ist nicht installiert."
 
-#: src/Content/ContactSelector.php:260
-msgid "It's complicated"
-msgstr "Ist kompliziert"
+#: src/Core/Installer.php:581
+msgid "ImageMagick PHP extension is installed"
+msgstr "ImageMagick PHP Erweiterung ist installiert"
 
-#: src/Content/ContactSelector.php:261
-msgid "Don't care"
-msgstr "Ist mir nicht wichtig"
+#: src/Core/Installer.php:583 tests/src/Core/InstallerTest.php:372
+#: tests/src/Core/InstallerTest.php:400
+msgid "ImageMagick supports GIF"
+msgstr "ImageMagick unterstützt GIF"
 
-#: src/Content/ContactSelector.php:262
-msgid "Ask me"
-msgstr "Frag mich"
+#: src/Core/Installer.php:606
+msgid "Database already in use."
+msgstr "Die Datenbank wird bereits verwendet."
 
-#: src/Content/Feature.php:82
-msgid "General Features"
-msgstr "Allgemeine Features"
+#: src/Core/Installer.php:611
+msgid "Could not connect to database."
+msgstr "Verbindung zur Datenbank gescheitert."
 
-#: src/Content/Feature.php:84
-msgid "Multiple Profiles"
-msgstr "Mehrere Profile"
+#: src/Core/L10n/L10n.php:370 src/Model/Event.php:397
+msgid "Tuesday"
+msgstr "Dienstag"
 
-#: src/Content/Feature.php:84
-msgid "Ability to create multiple profiles"
-msgstr "Möglichkeit, mehrere Profile zu erstellen"
+#: src/Core/L10n/L10n.php:370 src/Model/Event.php:398
+msgid "Wednesday"
+msgstr "Mittwoch"
 
-#: src/Content/Feature.php:85
-msgid "Photo Location"
-msgstr "Aufnahmeort"
+#: src/Core/L10n/L10n.php:370 src/Model/Event.php:399
+msgid "Thursday"
+msgstr "Donnerstag"
 
-#: 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 "Die Foto-Metadaten werden ausgelesen. Dadurch kann der Aufnahmeort (wenn vorhanden) in einer Karte angezeigt werden."
+#: src/Core/L10n/L10n.php:370 src/Model/Event.php:400
+msgid "Friday"
+msgstr "Freitag"
 
-#: src/Content/Feature.php:86
-msgid "Export Public Calendar"
-msgstr "Öffentlichen Kalender exportieren"
+#: src/Core/L10n/L10n.php:370 src/Model/Event.php:401
+msgid "Saturday"
+msgstr "Samstag"
 
-#: src/Content/Feature.php:86
-msgid "Ability for visitors to download the public calendar"
-msgstr "Möglichkeit für Besucher, den öffentlichen Kalender herunter zu laden"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:416
+msgid "January"
+msgstr "Januar"
 
-#: src/Content/Feature.php:91
-msgid "Post Composition Features"
-msgstr "Beitragserstellung-Features"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:417
+msgid "February"
+msgstr "Februar"
 
-#: src/Content/Feature.php:92
-msgid "Auto-mention Forums"
-msgstr "Foren automatisch erwähnen"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:418
+msgid "March"
+msgstr "März"
 
-#: src/Content/Feature.php:92
-msgid ""
-"Add/remove mention when a forum page is selected/deselected in ACL window."
-msgstr "Automatisch eine @-Erwähnung eines Forums einfügen/entfehrnen, wenn dieses im ACL Fenster de-/markiert  wurde."
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:419
+msgid "April"
+msgstr "April"
 
-#: src/Content/Feature.php:93
-msgid "Explicit Mentions"
-msgstr "Explizite Erwähnungen"
+#: src/Core/L10n/L10n.php:374 src/Core/L10n/L10n.php:394
+#: src/Model/Event.php:407
+msgid "May"
+msgstr "Mai"
 
-#: src/Content/Feature.php:93
-msgid ""
-"Add explicit mentions to comment box for manual control over who gets "
-"mentioned in replies."
-msgstr "Füge Erwähnungen zum Kommentarfeld hinzu, um manuell über die explizite Erwähnung von Gesprächsteilnehmern zu entscheiden."
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:420
+msgid "June"
+msgstr "Juni"
 
-#: src/Content/Feature.php:98
-msgid "Network Sidebar"
-msgstr "Netzwerk-Seitenleiste"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:421
+msgid "July"
+msgstr "Juli"
 
-#: src/Content/Feature.php:99
-msgid "Ability to select posts by date ranges"
-msgstr "Möglichkeit, die Beiträge nach Datumsbereichen zu sortieren"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:422
+msgid "August"
+msgstr "August"
 
-#: src/Content/Feature.php:100
-msgid "Protocol Filter"
-msgstr "Protokoll-Filter"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:423
+msgid "September"
+msgstr "September"
 
-#: src/Content/Feature.php:100
-msgid "Enable widget to display Network posts only from selected protocols"
-msgstr "Aktiviere Widget, um Netzwerkbeiträge nur von ausgesuchten Protokollen anzuzeigen"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:424
+msgid "October"
+msgstr "Oktober"
 
-#: src/Content/Feature.php:105
-msgid "Network Tabs"
-msgstr "Netzwerk-Reiter"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:425
+msgid "November"
+msgstr "November"
 
-#: src/Content/Feature.php:106
-msgid "Network New Tab"
-msgstr "Netzwerk-Reiter: Neue"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:426
+msgid "December"
+msgstr "Dezember"
 
-#: src/Content/Feature.php:106
-msgid "Enable tab to display only new Network posts (from the last 12 hours)"
-msgstr "Aktiviert einen Netzwerk-Reiter, in dem ausschließlich neue Beiträge (der letzten 12 Stunden) angezeigt werden"
+#: src/Core/L10n/L10n.php:390 src/Model/Event.php:388
+msgid "Mon"
+msgstr "Mo"
 
-#: src/Content/Feature.php:107
-msgid "Network Shared Links Tab"
-msgstr "Netzwerk-Reiter: Geteilte Links"
+#: src/Core/L10n/L10n.php:390 src/Model/Event.php:389
+msgid "Tue"
+msgstr "Di"
 
-#: src/Content/Feature.php:107
-msgid "Enable tab to display only Network posts with links in them"
-msgstr "Aktiviert einen Netzwerk-Reiter, der ausschließlich Nachrichten mit Links enthält"
+#: src/Core/L10n/L10n.php:390 src/Model/Event.php:390
+msgid "Wed"
+msgstr "Mi"
 
-#: src/Content/Feature.php:112
-msgid "Post/Comment Tools"
-msgstr "Werkzeuge für Beiträge und Kommentare"
+#: src/Core/L10n/L10n.php:390 src/Model/Event.php:391
+msgid "Thu"
+msgstr "Do"
 
-#: src/Content/Feature.php:113
-msgid "Post Categories"
-msgstr "Beitragskategorien"
+#: src/Core/L10n/L10n.php:390 src/Model/Event.php:392
+msgid "Fri"
+msgstr "Fr"
 
-#: src/Content/Feature.php:113
-msgid "Add categories to your posts"
-msgstr "Eigene Beiträge mit Kategorien versehen"
+#: src/Core/L10n/L10n.php:390 src/Model/Event.php:393
+msgid "Sat"
+msgstr "Sa"
 
-#: src/Content/Feature.php:118
-msgid "Advanced Profile Settings"
-msgstr "Erweiterte Profil-Einstellungen"
+#: src/Core/L10n/L10n.php:390 src/Model/Event.php:387
+msgid "Sun"
+msgstr "So"
 
-#: src/Content/Feature.php:119
-msgid "List Forums"
-msgstr "Zeige Foren"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:403
+msgid "Jan"
+msgstr "Jan"
 
-#: src/Content/Feature.php:119
-msgid "Show visitors public community forums at the Advanced Profile Page"
-msgstr "Zeige Besuchern öffentliche Gemeinschafts-Foren auf der Erweiterten Profil-Seite"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:404
+msgid "Feb"
+msgstr "Feb"
 
-#: src/Content/Feature.php:120
-msgid "Tag Cloud"
-msgstr "Schlagwortwolke"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:405
+msgid "Mar"
+msgstr "März"
 
-#: src/Content/Feature.php:120
-msgid "Provide a personal tag cloud on your profile page"
-msgstr "Wortwolke aus den von dir verwendeten Schlagwörtern im Profil anzeigen"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:406
+msgid "Apr"
+msgstr "Apr"
 
-#: src/Content/Feature.php:121
-msgid "Display Membership Date"
-msgstr "Mitgliedschaftsdatum anzeigen"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:408
+msgid "Jun"
+msgstr "Jun"
 
-#: src/Content/Feature.php:121
-msgid "Display membership date in profile"
-msgstr "Das Datum der Registrierung deines Accounts im Profil anzeigen"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:409
+msgid "Jul"
+msgstr "Juli"
 
-#: src/Content/ForumManager.php:130 src/Content/Nav.php:206
-#: src/Content/Text/HTML.php:914 view/theme/vier/theme.php:250
-msgid "Forums"
-msgstr "Foren"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:410
+msgid "Aug"
+msgstr "Aug"
 
-#: src/Content/ForumManager.php:132 view/theme/vier/theme.php:252
-msgid "External link to forum"
-msgstr "Externer Link zum Forum"
+#: src/Core/L10n/L10n.php:394
+msgid "Sep"
+msgstr "Sep"
 
-#: src/Content/Nav.php:73
-msgid "Nothing new here"
-msgstr "Keine Neuigkeiten"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:412
+msgid "Oct"
+msgstr "Okt"
 
-#: src/Content/Nav.php:77
-msgid "Clear notifications"
-msgstr "Bereinige Benachrichtigungen"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:413
+msgid "Nov"
+msgstr "Nov"
 
-#: src/Content/Nav.php:78 src/Content/Text/HTML.php:903
-msgid "@name, !forum, #tags, content"
-msgstr "@name, !forum, #tags, content"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:414
+msgid "Dec"
+msgstr "Dez"
 
-#: src/Content/Nav.php:152 src/Module/Login.php:324
-#: view/theme/frio/theme.php:259
-msgid "Logout"
-msgstr "Abmelden"
+#: src/Core/L10n/L10n.php:413
+msgid "poke"
+msgstr "anstupsen"
 
-#: src/Content/Nav.php:152 view/theme/frio/theme.php:259
-msgid "End this session"
-msgstr "Diese Sitzung beenden"
+#: src/Core/L10n/L10n.php:413
+msgid "poked"
+msgstr "stupste"
 
-#: src/Content/Nav.php:155 src/Model/Profile.php:895
-#: src/Module/Contact.php:655 src/Module/Contact.php:856
-#: src/Module/Settings/TwoFactor/Index.php:85 view/theme/frio/theme.php:262
-msgid "Status"
-msgstr "Status"
+#: src/Core/L10n/L10n.php:414
+msgid "ping"
+msgstr "anpingen"
 
-#: src/Content/Nav.php:155 src/Content/Nav.php:241
-#: view/theme/frio/theme.php:262
-msgid "Your posts and conversations"
-msgstr "Deine Beiträge und Unterhaltungen"
+#: src/Core/L10n/L10n.php:414
+msgid "pinged"
+msgstr "pingte"
 
-#: src/Content/Nav.php:156 view/theme/frio/theme.php:263
-msgid "Your profile page"
-msgstr "Deine Profilseite"
+#: src/Core/L10n/L10n.php:415
+msgid "prod"
+msgstr "knuffen"
 
-#: src/Content/Nav.php:157 view/theme/frio/theme.php:264
-msgid "Your photos"
-msgstr "Deine Fotos"
+#: src/Core/L10n/L10n.php:415
+msgid "prodded"
+msgstr "knuffte"
 
-#: src/Content/Nav.php:158 src/Model/Profile.php:919 src/Model/Profile.php:922
-#: view/theme/frio/theme.php:265
-msgid "Videos"
-msgstr "Videos"
+#: src/Core/L10n/L10n.php:416
+msgid "slap"
+msgstr "ohrfeigen"
 
-#: src/Content/Nav.php:158 view/theme/frio/theme.php:265
-msgid "Your videos"
-msgstr "Deine Videos"
+#: src/Core/L10n/L10n.php:416
+msgid "slapped"
+msgstr "ohrfeigte"
 
-#: src/Content/Nav.php:159 view/theme/frio/theme.php:266
-msgid "Your events"
-msgstr "Deine Ereignisse"
+#: src/Core/L10n/L10n.php:417
+msgid "finger"
+msgstr "befummeln"
 
-#: src/Content/Nav.php:160
-msgid "Personal notes"
-msgstr "Persönliche Notizen"
+#: src/Core/L10n/L10n.php:417
+msgid "fingered"
+msgstr "befummelte"
 
-#: src/Content/Nav.php:160
-msgid "Your personal notes"
-msgstr "Deine persönlichen Notizen"
+#: src/Core/L10n/L10n.php:418
+msgid "rebuff"
+msgstr "eine Abfuhr erteilen"
 
-#: src/Content/Nav.php:169 src/Module/Bookmarklet.php:25
-#: src/Module/Login.php:325
-msgid "Login"
-msgstr "Anmeldung"
+#: src/Core/L10n/L10n.php:418
+msgid "rebuffed"
+msgstr "abfuhrerteilte"
 
-#: src/Content/Nav.php:169
-msgid "Sign in"
-msgstr "Anmelden"
+#: src/Core/NotificationsManager.php:144
+msgid "System"
+msgstr "System"
 
-#: src/Content/Nav.php:179 src/Content/Nav.php:241
-#: src/Core/NotificationsManager.php:165
+#: src/Core/NotificationsManager.php:165 src/Content/Nav.php:182
+#: src/Content/Nav.php:244
 msgid "Home"
 msgstr "Pinnwand"
 
-#: src/Content/Nav.php:179
-msgid "Home Page"
-msgstr "Homepage"
-
-#: src/Content/Nav.php:183 src/Module/Login.php:296
-#: src/Module/Register.php:136
-msgid "Register"
-msgstr "Registrieren"
+#: src/Core/NotificationsManager.php:172 src/Content/Nav.php:248
+msgid "Introductions"
+msgstr "Kontaktanfragen"
 
-#: src/Content/Nav.php:183
-msgid "Create an account"
-msgstr "Nutzerkonto erstellen"
+#: src/Core/NotificationsManager.php:234 src/Core/NotificationsManager.php:246
+#, php-format
+msgid "%s commented on %s's post"
+msgstr "%s hat %ss Beitrag kommentiert"
 
-#: src/Content/Nav.php:189 src/Module/Help.php:50
-#: src/Module/Settings/TwoFactor/Index.php:84
-#: src/Module/Settings/TwoFactor/Recovery.php:77
-#: src/Module/Settings/TwoFactor/Verify.php:117 view/theme/vier/theme.php:294
-msgid "Help"
-msgstr "Hilfe"
+#: src/Core/NotificationsManager.php:245
+#, php-format
+msgid "%s created a new post"
+msgstr "%s hat einen neuen Beitrag erstellt"
 
-#: src/Content/Nav.php:189
-msgid "Help and documentation"
-msgstr "Hilfe und Dokumentation"
+#: src/Core/NotificationsManager.php:259
+#, php-format
+msgid "%s liked %s's post"
+msgstr "%s mag %ss Beitrag"
 
-#: src/Content/Nav.php:193
-msgid "Apps"
-msgstr "Apps"
+#: src/Core/NotificationsManager.php:272
+#, php-format
+msgid "%s disliked %s's post"
+msgstr "%s mag %ss Beitrag nicht"
 
-#: src/Content/Nav.php:193
-msgid "Addon applications, utilities, games"
-msgstr "Zusätzliche Anwendungen, Dienstprogramme, Spiele"
+#: src/Core/NotificationsManager.php:285
+#, php-format
+msgid "%s is attending %s's event"
+msgstr "%s nimmt an %s's Event teil"
 
-#: src/Content/Nav.php:197
-msgid "Search site content"
-msgstr "Inhalt der Seite durchsuchen"
+#: src/Core/NotificationsManager.php:298
+#, php-format
+msgid "%s is not attending %s's event"
+msgstr "%s nimmt nicht an %s's Event teil"
 
-#: src/Content/Nav.php:200 src/Content/Text/HTML.php:909
-msgid "Full Text"
-msgstr "Volltext"
+#: src/Core/NotificationsManager.php:311
+#, php-format
+msgid "%s may attend %s's event"
+msgstr "%s nimmt eventuell an %s's Event teil"
 
-#: src/Content/Nav.php:201 src/Content/Text/HTML.php:910
-#: src/Content/Widget/TagCloud.php:54
-msgid "Tags"
-msgstr "Tags"
+#: src/Core/NotificationsManager.php:344
+#, php-format
+msgid "%s is now friends with %s"
+msgstr "%s ist jetzt mit %s befreundet"
 
-#: src/Content/Nav.php:221
-msgid "Community"
-msgstr "Gemeinschaft"
+#: src/Core/NotificationsManager.php:622
+msgid "Friend Suggestion"
+msgstr "Kontaktvorschlag"
 
-#: src/Content/Nav.php:221
-msgid "Conversations on this and other servers"
-msgstr "Unterhaltungen auf diesem und anderen Servern"
+#: src/Core/NotificationsManager.php:656
+msgid "Friend/Connect Request"
+msgstr "Kontakt-/Freundschaftsanfrage"
 
-#: src/Content/Nav.php:225 src/Model/Profile.php:934 src/Model/Profile.php:945
-#: view/theme/frio/theme.php:270
-msgid "Events and Calendar"
-msgstr "Ereignisse und Kalender"
+#: src/Core/NotificationsManager.php:656
+msgid "New Follower"
+msgstr "Neuer Bewunderer"
 
-#: src/Content/Nav.php:228
-msgid "Directory"
-msgstr "Verzeichnis"
+#: src/Core/Session.php:188
+#, php-format
+msgid "Welcome %s"
+msgstr "Willkommen %s"
 
-#: src/Content/Nav.php:228
-msgid "People directory"
-msgstr "Nutzerverzeichnis"
+#: src/Core/Session.php:189
+msgid "Please upload a profile photo."
+msgstr "Bitte lade ein Profilbild hoch."
 
-#: src/Content/Nav.php:230 src/Module/BaseAdminModule.php:75
-msgid "Information"
-msgstr "Information"
+#: src/Core/Session.php:192
+#, php-format
+msgid "Welcome back %s"
+msgstr "Willkommen zurück %s"
 
-#: src/Content/Nav.php:230
-msgid "Information about this friendica instance"
-msgstr "Informationen zu dieser Friendica-Instanz"
+#: src/Core/Update.php:193
+#, php-format
+msgid "Update %s failed. See error logs."
+msgstr "Update %s fehlgeschlagen. Bitte Fehlerprotokoll überprüfen."
 
-#: src/Content/Nav.php:233 src/Module/Admin/Tos.php:43
-#: src/Module/BaseAdminModule.php:85 src/Module/Register.php:144
-#: src/Module/Tos.php:73
-msgid "Terms of Service"
-msgstr "Nutzungsbedingungen"
+#: src/Core/Update.php:257
+#, 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 "\nDie Friendica-Entwickler haben vor kurzem das Update %s veröffentlicht, aber bei der Installation ging etwas schrecklich schief.\n\nDas Problem sollte so schnell wie möglich gelöst werden, aber ich schaffe es nicht alleine. Bitte kontaktiere einen Friendica-Entwickler, falls du mir nicht alleine helfen kannst. Meine Datenbank könnte ungültig sein."
 
-#: src/Content/Nav.php:233
-msgid "Terms of Service of this Friendica instance"
-msgstr "Die Nutzungsbedingungen dieser Friendica-Instanz"
+#: src/Core/Update.php:263
+#, php-format
+msgid ""
+"The error message is\n"
+"[pre]%s[/pre]"
+msgstr "Die Fehlermeldung lautet\n[pre]%s[/pre]"
 
-#: src/Content/Nav.php:238 src/Core/NotificationsManager.php:151
-#: view/theme/frio/theme.php:269
-msgid "Network"
-msgstr "Netzwerk"
+#: src/Core/Update.php:269 src/Core/Update.php:308
+msgid "[Friendica Notify] Database update"
+msgstr "[Friendica-Benachrichtigung]: Datenbank Update"
 
-#: src/Content/Nav.php:238 view/theme/frio/theme.php:269
-msgid "Conversations from your friends"
-msgstr "Unterhaltungen Deiner Kontakte"
+#: src/Core/Update.php:300
+#, php-format
+msgid ""
+"\n"
+"\t\t\t\t\tThe friendica database was successfully updated from %s to %s."
+msgstr "\n \t\t\t\t\tDie Friendica Datenbank wurde erfolgreich von %s auf %s aktualisiert."
 
-#: src/Content/Nav.php:239
-msgid "Network Reset"
-msgstr "Netzwerk zurücksetzen"
+#: src/Core/UserImport.php:107
+msgid "Error decoding account file"
+msgstr "Fehler beim Verarbeiten der Account-Datei"
 
-#: src/Content/Nav.php:239
-msgid "Load Network page with no filters"
-msgstr "Netzwerk-Seite ohne Filter laden"
+#: src/Core/UserImport.php:113
+msgid "Error! No version data in file! This is not a Friendica account file?"
+msgstr "Fehler! Keine Versionsdaten in der Datei! Ist das wirklich eine Friendica-Account-Datei?"
 
-#: src/Content/Nav.php:245 src/Core/NotificationsManager.php:172
-msgid "Introductions"
-msgstr "Kontaktanfragen"
+#: src/Core/UserImport.php:121
+#, php-format
+msgid "User '%s' already exists on this server!"
+msgstr "Nutzer '%s' existiert bereits auf diesem Server!"
 
-#: src/Content/Nav.php:245
-msgid "Friend Requests"
-msgstr "Kontaktanfragen"
+#: src/Core/UserImport.php:157
+msgid "User creation error"
+msgstr "Fehler beim Anlegen des Nutzer-Accounts aufgetreten"
 
-#: src/Content/Nav.php:247
-msgid "See all notifications"
-msgstr "Alle Benachrichtigungen anzeigen"
+#: src/Core/UserImport.php:175
+msgid "User profile creation error"
+msgstr "Fehler beim Anlegen des Nutzer-Profils"
 
-#: src/Content/Nav.php:248
-msgid "Mark all system notifications seen"
-msgstr "Markiere alle Systembenachrichtigungen als gelesen"
+#: src/Core/UserImport.php:219
+#, php-format
+msgid "%d contact not imported"
+msgid_plural "%d contacts not imported"
+msgstr[0] "%d Kontakt nicht importiert"
+msgstr[1] "%d Kontakte nicht importiert"
 
-#: src/Content/Nav.php:251 view/theme/frio/theme.php:271
-msgid "Private mail"
-msgstr "Private E-Mail"
+#: src/Core/UserImport.php:284
+msgid "Done. You can now login with your username and password"
+msgstr "Erledigt. Du kannst dich jetzt mit deinem Nutzernamen und Passwort anmelden"
 
-#: src/Content/Nav.php:252
-msgid "Inbox"
-msgstr "Eingang"
+#: src/Util/Temporal.php:147 src/Model/Profile.php:776
+msgid "Birthday:"
+msgstr "Geburtstag:"
 
-#: src/Content/Nav.php:253
-msgid "Outbox"
-msgstr "Ausgang"
+#: src/Util/Temporal.php:151
+msgid "YYYY-MM-DD or MM-DD"
+msgstr "YYYY-MM-DD oder MM-DD"
 
-#: src/Content/Nav.php:257
-msgid "Manage"
-msgstr "Verwalten"
+#: src/Util/Temporal.php:298
+msgid "never"
+msgstr "nie"
 
-#: src/Content/Nav.php:257
-msgid "Manage other pages"
-msgstr "Andere Seiten verwalten"
+#: src/Util/Temporal.php:305
+msgid "less than a second ago"
+msgstr "vor weniger als einer Sekunde"
 
-#: src/Content/Nav.php:262 view/theme/frio/theme.php:272
-msgid "Account settings"
-msgstr "Kontoeinstellungen"
+#: src/Util/Temporal.php:313
+msgid "year"
+msgstr "Jahr"
 
-#: src/Content/Nav.php:265
-msgid "Manage/Edit Profiles"
-msgstr "Profile verwalten/editieren"
+#: src/Util/Temporal.php:313
+msgid "years"
+msgstr "Jahre"
 
-#: src/Content/Nav.php:268 view/theme/frio/theme.php:273
-msgid "Manage/edit friends and contacts"
-msgstr "Freunde und Kontakte verwalten/bearbeiten"
+#: src/Util/Temporal.php:314
+msgid "months"
+msgstr "Monate"
 
-#: src/Content/Nav.php:273 src/Module/BaseAdminModule.php:114
-msgid "Admin"
-msgstr "Administration"
+#: src/Util/Temporal.php:315
+msgid "weeks"
+msgstr "Wochen"
 
-#: src/Content/Nav.php:273
-msgid "Site setup and configuration"
-msgstr "Einstellungen der Seite und Konfiguration"
+#: src/Util/Temporal.php:316
+msgid "days"
+msgstr "Tage"
 
-#: src/Content/Nav.php:276
-msgid "Navigation"
-msgstr "Navigation"
+#: src/Util/Temporal.php:317
+msgid "hour"
+msgstr "Stunde"
 
-#: src/Content/Nav.php:276
-msgid "Site map"
-msgstr "Sitemap"
+#: src/Util/Temporal.php:317
+msgid "hours"
+msgstr "Stunden"
 
-#: src/Content/OEmbed.php:255
-msgid "Embedding disabled"
-msgstr "Einbettungen deaktiviert"
+#: src/Util/Temporal.php:318
+msgid "minute"
+msgstr "Minute"
 
-#: src/Content/OEmbed.php:378
-msgid "Embedded content"
-msgstr "Eingebetteter Inhalt"
+#: src/Util/Temporal.php:318
+msgid "minutes"
+msgstr "Minuten"
 
-#: src/Content/Pager.php:153
-msgid "newer"
-msgstr "neuer"
+#: src/Util/Temporal.php:319
+msgid "second"
+msgstr "Sekunde"
 
-#: src/Content/Pager.php:158
-msgid "older"
-msgstr "älter"
+#: src/Util/Temporal.php:319
+msgid "seconds"
+msgstr "Sekunden"
 
-#: src/Content/Pager.php:203
-msgid "prev"
-msgstr "vorige"
+#: src/Util/Temporal.php:329
+#, php-format
+msgid "in %1$d %2$s"
+msgstr "in %1$d %2$s"
 
-#: src/Content/Pager.php:263
-msgid "last"
-msgstr "letzte"
+#: src/Util/Temporal.php:332
+#, php-format
+msgid "%1$d %2$s ago"
+msgstr "vor %1$d %2$s"
 
-#: src/Content/Text/BBCode.php:430
+#: src/Content/Text/BBCode.php:457
 msgid "view full size"
 msgstr "Volle Größe anzeigen"
 
-#: src/Content/Text/BBCode.php:864 src/Content/Text/BBCode.php:1591
-#: src/Content/Text/BBCode.php:1592
+#: src/Content/Text/BBCode.php:891 src/Content/Text/BBCode.php:1533
+#: src/Content/Text/BBCode.php:1534
 msgid "Image/photo"
 msgstr "Bild/Foto"
 
-#: src/Content/Text/BBCode.php:972
+#: src/Content/Text/BBCode.php:1009
 #, 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/Content/Text/BBCode.php:1518 src/Content/Text/BBCode.php:1540
+#: src/Content/Text/BBCode.php:1460 src/Content/Text/BBCode.php:1482
 msgid "$1 wrote:"
 msgstr "$1 hat geschrieben:"
 
-#: src/Content/Text/BBCode.php:1602 src/Content/Text/BBCode.php:1603
+#: src/Content/Text/BBCode.php:1536 src/Content/Text/BBCode.php:1537
 msgid "Encrypted content"
 msgstr "Verschlüsselter Inhalt"
 
-#: src/Content/Text/BBCode.php:1710
+#: src/Content/Text/BBCode.php:1758
 msgid "Invalid source protocol"
 msgstr "Ungültiges Quell-Protokoll"
 
-#: src/Content/Text/BBCode.php:1721
+#: src/Content/Text/BBCode.php:1769
 msgid "Invalid link protocol"
 msgstr "Ungültiges Link-Protokoll"
 
-#: src/Content/Text/HTML.php:800
+#: src/Content/Text/HTML.php:789
 msgid "Loading more entries..."
 msgstr "lade weitere Einträge..."
 
-#: src/Content/Text/HTML.php:801
+#: src/Content/Text/HTML.php:790
 msgid "The end"
 msgstr "Das Ende"
 
-#: src/Content/Text/HTML.php:894
+#: src/Content/Text/HTML.php:883 src/Model/Profile.php:536
+#: src/Module/Contact.php:335
 msgid "Follow"
 msgstr "Folge"
 
-#: src/Content/Text/HTML.php:951 src/Model/Item.php:3471
-#: src/Model/Item.php:3482
+#: src/Content/Text/HTML.php:892 src/Content/Nav.php:79
+msgid "@name, !forum, #tags, content"
+msgstr "@name, !forum, #tags, content"
+
+#: src/Content/Text/HTML.php:898 src/Content/Nav.php:203
+msgid "Full Text"
+msgstr "Volltext"
+
+#: src/Content/Text/HTML.php:899 src/Content/Widget/TagCloud.php:54
+#: src/Content/Nav.php:204
+msgid "Tags"
+msgstr "Tags"
+
+#: src/Content/Text/HTML.php:940 src/Model/Item.php:3518
+#: src/Model/Item.php:3529
 msgid "Click to open/close"
 msgstr "Zum Öffnen/Schließen klicken"
 
@@ -5253,720 +5359,720 @@ msgstr[1] "%d Kontakte"
 msgid "View Contacts"
 msgstr "Kontakte anzeigen"
 
-#: src/Content/Widget.php:35
-msgid "Add New Contact"
-msgstr "Neuen Kontakt hinzufügen"
+#: src/Content/Widget/TrendingTags.php:34
+#, php-format
+msgid "Trending Tags (last %d hour)"
+msgid_plural "Trending Tags (last %d hours)"
+msgstr[0] "Trending Tags (%d Stunde)"
+msgstr[1] "Trending Tags (%d Stunden)"
 
-#: src/Content/Widget.php:36
-msgid "Enter address or web location"
-msgstr "Adresse oder Web-Link eingeben"
+#: src/Content/Widget/TrendingTags.php:35
+msgid "More Trending Tags"
+msgstr "mehr Trending Tags"
 
-#: src/Content/Widget.php:37
-msgid "Example: bob@example.com, http://example.com/barbara"
-msgstr "Beispiel: bob@example.com, http://example.com/barbara"
+#: src/Content/Pager.php:153
+msgid "newer"
+msgstr "neuer"
 
-#: src/Content/Widget.php:55
-#, php-format
-msgid "%d invitation available"
-msgid_plural "%d invitations available"
-msgstr[0] "%d Einladung verfügbar"
-msgstr[1] "%d Einladungen verfügbar"
+#: src/Content/Pager.php:158
+msgid "older"
+msgstr "älter"
 
-#: src/Content/Widget.php:61 view/theme/vier/theme.php:199
-msgid "Find People"
-msgstr "Leute finden"
+#: src/Content/Pager.php:203
+msgid "prev"
+msgstr "vorige"
 
-#: src/Content/Widget.php:62 view/theme/vier/theme.php:200
-msgid "Enter name or interest"
-msgstr "Name oder Interessen eingeben"
+#: src/Content/Pager.php:263
+msgid "last"
+msgstr "letzte"
 
-#: src/Content/Widget.php:64 view/theme/vier/theme.php:202
-msgid "Examples: Robert Morgenstein, Fishing"
-msgstr "Beispiel: Robert Morgenstein, Angeln"
+#: src/Content/ContactSelector.php:58
+msgid "Frequently"
+msgstr "immer wieder"
 
-#: src/Content/Widget.php:65 src/Module/Contact.php:820
-#: src/Module/Directory.php:91 view/theme/vier/theme.php:203
-msgid "Find"
-msgstr "Finde"
+#: src/Content/ContactSelector.php:59
+msgid "Hourly"
+msgstr "Stündlich"
 
-#: src/Content/Widget.php:67 view/theme/vier/theme.php:205
-msgid "Similar Interests"
-msgstr "Ähnliche Interessen"
+#: src/Content/ContactSelector.php:60
+msgid "Twice daily"
+msgstr "Zweimal täglich"
 
-#: src/Content/Widget.php:68 view/theme/vier/theme.php:206
-msgid "Random Profile"
-msgstr "Zufälliges Profil"
+#: src/Content/ContactSelector.php:61
+msgid "Daily"
+msgstr "Täglich"
 
-#: src/Content/Widget.php:69 view/theme/vier/theme.php:207
-msgid "Invite Friends"
-msgstr "Freunde einladen"
+#: src/Content/ContactSelector.php:62
+msgid "Weekly"
+msgstr "Wöchentlich"
 
-#: src/Content/Widget.php:70 src/Module/Directory.php:83
-#: view/theme/vier/theme.php:208
-msgid "Global Directory"
-msgstr "Weltweites Verzeichnis"
+#: src/Content/ContactSelector.php:63
+msgid "Monthly"
+msgstr "Monatlich"
 
-#: src/Content/Widget.php:72 view/theme/vier/theme.php:210
-msgid "Local Directory"
-msgstr "Lokales Verzeichnis"
+#: src/Content/ContactSelector.php:83
+msgid "DFRN"
+msgstr "DFRN"
 
-#: src/Content/Widget.php:158
-msgid "Protocols"
-msgstr "Protokolle"
+#: src/Content/ContactSelector.php:84
+msgid "OStatus"
+msgstr "OStatus"
 
-#: src/Content/Widget.php:161
-msgid "All Protocols"
-msgstr "Alle Protokolle"
+#: src/Content/ContactSelector.php:85
+msgid "RSS/Atom"
+msgstr "RSS/Atom"
 
-#: src/Content/Widget.php:198
-msgid "Saved Folders"
-msgstr "Gespeicherte Ordner"
+#: src/Content/ContactSelector.php:86 src/Module/Admin/Users.php:272
+#: src/Module/Admin/Users.php:283 src/Module/Admin/Users.php:297
+#: src/Module/Admin/Users.php:315
+msgid "Email"
+msgstr "E-Mail"
 
-#: src/Content/Widget.php:201 src/Content/Widget.php:243
-msgid "Everything"
-msgstr "Alles"
+#: src/Content/ContactSelector.php:88
+msgid "Zot!"
+msgstr "Zott"
 
-#: src/Content/Widget.php:240
-msgid "Categories"
-msgstr "Kategorien"
+#: src/Content/ContactSelector.php:89
+msgid "LinkedIn"
+msgstr "LinkedIn"
 
-#: src/Content/Widget.php:324
-#, php-format
-msgid "%d contact in common"
-msgid_plural "%d contacts in common"
-msgstr[0] "%d gemeinsamer Kontakt"
-msgstr[1] "%d gemeinsame Kontakte"
+#: src/Content/ContactSelector.php:90
+msgid "XMPP/IM"
+msgstr "XMPP/Chat"
+
+#: src/Content/ContactSelector.php:91
+msgid "MySpace"
+msgstr "MySpace"
+
+#: src/Content/ContactSelector.php:92
+msgid "Google+"
+msgstr "Google+"
+
+#: src/Content/ContactSelector.php:93
+msgid "pump.io"
+msgstr "pump.io"
+
+#: src/Content/ContactSelector.php:94
+msgid "Twitter"
+msgstr "Twitter"
+
+#: src/Content/ContactSelector.php:95
+msgid "Diaspora Connector"
+msgstr "Diaspora Connector"
+
+#: src/Content/ContactSelector.php:96
+msgid "GNU Social Connector"
+msgstr "GNU Social Connector"
+
+#: src/Content/ContactSelector.php:97
+msgid "ActivityPub"
+msgstr "ActivityPub"
+
+#: src/Content/ContactSelector.php:98
+msgid "pnut"
+msgstr "pnut"
+
+#: src/Content/ContactSelector.php:153 src/Content/ContactSelector.php:193
+#: src/Content/ContactSelector.php:231
+msgid "No answer"
+msgstr "Keine Antwort"
+
+#: src/Content/ContactSelector.php:154
+msgid "Male"
+msgstr "Männlich"
+
+#: src/Content/ContactSelector.php:155
+msgid "Female"
+msgstr "Weiblich"
+
+#: src/Content/ContactSelector.php:156
+msgid "Currently Male"
+msgstr "Momentan männlich"
+
+#: src/Content/ContactSelector.php:157
+msgid "Currently Female"
+msgstr "Momentan weiblich"
 
-#: src/Core/ACL.php:288
-msgid "Post to Email"
-msgstr "An E-Mail senden"
+#: src/Content/ContactSelector.php:158
+msgid "Mostly Male"
+msgstr "Hauptsächlich männlich"
 
-#: src/Core/ACL.php:300
-msgid "Visible to everybody"
-msgstr "Für jeden sichtbar"
+#: src/Content/ContactSelector.php:159
+msgid "Mostly Female"
+msgstr "Hauptsächlich weiblich"
 
-#: src/Core/ACL.php:301 view/theme/vier/config.php:116
-msgid "show"
-msgstr "zeigen"
+#: src/Content/ContactSelector.php:160
+msgid "Transgender"
+msgstr "Transgender"
 
-#: src/Core/ACL.php:302 view/theme/vier/config.php:116
-msgid "don't show"
-msgstr "nicht zeigen"
+#: src/Content/ContactSelector.php:161
+msgid "Intersex"
+msgstr "Intersex"
 
-#: src/Core/ACL.php:311
-msgid "Connectors"
-msgstr "Connectoren"
+#: src/Content/ContactSelector.php:162
+msgid "Transsexual"
+msgstr "Transsexuell"
 
-#: src/Core/ACL.php:313
-msgid "Hide your profile details from unknown viewers?"
-msgstr "Profil-Details vor unbekannten Betrachtern verbergen?"
+#: src/Content/ContactSelector.php:163
+msgid "Hermaphrodite"
+msgstr "Hermaphrodit"
 
-#: src/Core/ACL.php:313
-#, php-format
-msgid "Connectors disabled, since \"%s\" is enabled."
-msgstr "Konnektoren sind nicht verfügbar, da \"%s\" aktiv ist."
+#: src/Content/ContactSelector.php:164
+msgid "Neuter"
+msgstr "Neuter"
 
-#: src/Core/ACL.php:315
-msgid "Close"
-msgstr "Schließen"
+#: src/Content/ContactSelector.php:165
+msgid "Non-specific"
+msgstr "Nicht spezifiziert"
 
-#: 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 "Die Datenbankkonfigurationsdatei \"config/local.config.php\" konnte nicht erstellt werden. Um eine Konfigurationsdatei in Ihrem Webserver-Verzeichnis zu erstellen, gehe wie folgt vor."
+#: src/Content/ContactSelector.php:166
+msgid "Other"
+msgstr "Andere"
 
-#: src/Core/Installer.php:183
-msgid ""
-"You may need to import the file \"database.sql\" manually using phpmyadmin "
-"or mysql."
-msgstr "Möglicherweise musst du die Datei \"database.sql\" manuell mit phpmyadmin oder mysql importieren."
+#: src/Content/ContactSelector.php:194
+msgid "Males"
+msgstr "Männer"
 
-#: src/Core/Installer.php:184 src/Module/Install.php:172
-#: src/Module/Install.php:328
-msgid "Please see the file \"INSTALL.txt\"."
-msgstr "Lies bitte die \"INSTALL.txt\"."
+#: src/Content/ContactSelector.php:195
+msgid "Females"
+msgstr "Frauen"
 
-#: src/Core/Installer.php:245
-msgid "Could not find a command line version of PHP in the web server PATH."
-msgstr "Konnte keine Kommandozeilenversion von PHP im PATH des Servers finden."
+#: src/Content/ContactSelector.php:196
+msgid "Gay"
+msgstr "Schwul"
 
-#: 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://github.com/friendica/friendica/blob/master/doc/Install.md#set-"
-"up-the-worker'>'Setup the worker'</a>"
-msgstr "Wenn auf deinem Server keine Kommandozeilenversion von PHP installiert ist, kannst du den Hintergrundprozess nicht einrichten. Hier findest du alternative Möglichkeiten<a href='https://github.com/friendica/friendica/blob/master/doc/Install.md#set-up-the-poller'>'für das Worker-Setup'</a>"
+#: src/Content/ContactSelector.php:197
+msgid "Lesbian"
+msgstr "Lesbisch"
 
-#: src/Core/Installer.php:251
-msgid "PHP executable path"
-msgstr "Pfad zu PHP"
+#: src/Content/ContactSelector.php:198
+msgid "No Preference"
+msgstr "Keine Vorlieben"
 
-#: src/Core/Installer.php:251
-msgid ""
-"Enter full path to php executable. You can leave this blank to continue the "
-"installation."
-msgstr "Gib den kompletten Pfad zur ausführbaren Datei von PHP an. Du kannst dieses Feld auch frei lassen und mit der Installation fortfahren."
+#: src/Content/ContactSelector.php:199
+msgid "Bisexual"
+msgstr "Bisexuell"
 
-#: src/Core/Installer.php:256
-msgid "Command line PHP"
-msgstr "Kommandozeilen-PHP"
+#: src/Content/ContactSelector.php:200
+msgid "Autosexual"
+msgstr "Autosexuell"
 
-#: src/Core/Installer.php:265
-msgid "PHP executable is not the php cli binary (could be cgi-fgci version)"
-msgstr "Die ausführbare Datei von PHP stimmt nicht mit der PHP cli Version überein (es könnte sich um die cgi-fgci Version handeln)"
+#: src/Content/ContactSelector.php:201
+msgid "Abstinent"
+msgstr "Abstinent"
 
-#: src/Core/Installer.php:266
-msgid "Found PHP version: "
-msgstr "Gefundene PHP Version:"
+#: src/Content/ContactSelector.php:202
+msgid "Virgin"
+msgstr "Jungfrauen"
 
-#: src/Core/Installer.php:268
-msgid "PHP cli binary"
-msgstr "PHP CLI Binary"
+#: src/Content/ContactSelector.php:203
+msgid "Deviant"
+msgstr "Deviant"
 
-#: src/Core/Installer.php:281
-msgid ""
-"The command line version of PHP on your system does not have "
-"\"register_argc_argv\" enabled."
-msgstr "Die Kommandozeilenversion von PHP auf Deinem System hat \"register_argc_argv\" nicht aktiviert."
+#: src/Content/ContactSelector.php:204
+msgid "Fetish"
+msgstr "Fetish"
 
-#: src/Core/Installer.php:282
-msgid "This is required for message delivery to work."
-msgstr "Dies wird für die Auslieferung von Nachrichten benötigt."
+#: src/Content/ContactSelector.php:205
+msgid "Oodles"
+msgstr "Oodles"
 
-#: src/Core/Installer.php:287
-msgid "PHP register_argc_argv"
-msgstr "PHP register_argc_argv"
+#: src/Content/ContactSelector.php:206
+msgid "Nonsexual"
+msgstr "Nonsexual"
 
-#: src/Core/Installer.php:319
-msgid ""
-"Error: the \"openssl_pkey_new\" function on this system is not able to "
-"generate encryption keys"
-msgstr "Fehler: Die Funktion \"openssl_pkey_new\" auf diesem System ist nicht in der Lage, Verschlüsselungsschlüssel zu erzeugen"
+#: src/Content/ContactSelector.php:232
+msgid "Single"
+msgstr "Single"
 
-#: src/Core/Installer.php:320
-msgid ""
-"If running under Windows, please see "
-"\"http://www.php.net/manual/en/openssl.installation.php\"."
-msgstr "Wenn der Server unter Windows läuft, schau dir bitte \"http://www.php.net/manual/en/openssl.installation.php\" an."
+#: src/Content/ContactSelector.php:233
+msgid "Lonely"
+msgstr "Einsam"
 
-#: src/Core/Installer.php:323
-msgid "Generate encryption keys"
-msgstr "Schlüssel erzeugen"
+#: src/Content/ContactSelector.php:234
+msgid "In a relation"
+msgstr "In einer Beziehung"
 
-#: src/Core/Installer.php:375
-msgid ""
-"Error: Apache webserver mod-rewrite module is required but not installed."
-msgstr "Fehler: Das Apache-Modul mod-rewrite wird benötigt, es ist allerdings nicht installiert."
+#: src/Content/ContactSelector.php:235
+msgid "Has crush"
+msgstr "verknallt"
 
-#: src/Core/Installer.php:380
-msgid "Apache mod_rewrite module"
-msgstr "Apache mod_rewrite module"
+#: src/Content/ContactSelector.php:236
+msgid "Infatuated"
+msgstr "verliebt"
 
-#: src/Core/Installer.php:386
-msgid "Error: PDO or MySQLi PHP module required but not installed."
-msgstr "Fehler: PDO oder MySQLi PHP Modul erforderlich, aber nicht installiert."
+#: src/Content/ContactSelector.php:237
+msgid "Dating"
+msgstr "Dating"
 
-#: src/Core/Installer.php:391
-msgid "Error: The MySQL driver for PDO is not installed."
-msgstr "Fehler: der MySQL Treiber für PDO ist nicht installiert"
+#: src/Content/ContactSelector.php:238
+msgid "Unfaithful"
+msgstr "Untreu"
 
-#: src/Core/Installer.php:395
-msgid "PDO or MySQLi PHP module"
-msgstr "PDO oder MySQLi PHP Modul"
+#: src/Content/ContactSelector.php:239
+msgid "Sex Addict"
+msgstr "Sexbesessen"
 
-#: src/Core/Installer.php:403
-msgid "Error, XML PHP module required but not installed."
-msgstr "Fehler: XML PHP Modul erforderlich aber nicht installiert."
+#: src/Content/ContactSelector.php:240 src/Model/User.php:762
+msgid "Friends"
+msgstr "Kontakte"
 
-#: src/Core/Installer.php:407
-msgid "XML PHP module"
-msgstr "XML PHP Modul"
+#: src/Content/ContactSelector.php:241
+msgid "Friends/Benefits"
+msgstr "Freunde/Zuwendungen"
 
-#: src/Core/Installer.php:410
-msgid "libCurl PHP module"
-msgstr "PHP: libCurl-Modul"
+#: src/Content/ContactSelector.php:242
+msgid "Casual"
+msgstr "Casual"
 
-#: src/Core/Installer.php:411
-msgid "Error: libCURL PHP module required but not installed."
-msgstr "Fehler: Das libCURL PHP Modul wird benötigt, ist aber nicht installiert."
+#: src/Content/ContactSelector.php:243
+msgid "Engaged"
+msgstr "Verlobt"
 
-#: src/Core/Installer.php:417
-msgid "GD graphics PHP module"
-msgstr "PHP: GD-Grafikmodul"
+#: src/Content/ContactSelector.php:244
+msgid "Married"
+msgstr "Verheiratet"
 
-#: src/Core/Installer.php:418
-msgid ""
-"Error: GD graphics PHP module with JPEG support required but not installed."
-msgstr "Fehler: Das GD-Graphikmodul für PHP mit JPEG-Unterstützung ist nicht installiert."
+#: src/Content/ContactSelector.php:245
+msgid "Imaginarily married"
+msgstr "imaginär verheiratet"
 
-#: src/Core/Installer.php:424
-msgid "OpenSSL PHP module"
-msgstr "PHP: OpenSSL-Modul"
+#: src/Content/ContactSelector.php:246
+msgid "Partners"
+msgstr "Partner"
 
-#: src/Core/Installer.php:425
-msgid "Error: openssl PHP module required but not installed."
-msgstr "Fehler: Das openssl-Modul von PHP ist nicht installiert."
+#: src/Content/ContactSelector.php:247
+msgid "Cohabiting"
+msgstr "zusammenlebend"
 
-#: src/Core/Installer.php:431
-msgid "mb_string PHP module"
-msgstr "PHP: mb_string-Modul"
+#: src/Content/ContactSelector.php:248
+msgid "Common law"
+msgstr "wilde Ehe"
 
-#: src/Core/Installer.php:432
-msgid "Error: mb_string PHP module required but not installed."
-msgstr "Fehler: mb_string PHP Module wird benötigt, ist aber nicht installiert."
+#: src/Content/ContactSelector.php:249
+msgid "Happy"
+msgstr "Glücklich"
 
-#: src/Core/Installer.php:438
-msgid "iconv PHP module"
-msgstr "PHP iconv Modul"
+#: src/Content/ContactSelector.php:250
+msgid "Not looking"
+msgstr "Nicht auf der Suche"
 
-#: src/Core/Installer.php:439
-msgid "Error: iconv PHP module required but not installed."
-msgstr "Fehler: Das iconv-Modul von PHP ist nicht installiert."
+#: src/Content/ContactSelector.php:251
+msgid "Swinger"
+msgstr "Swinger"
 
-#: src/Core/Installer.php:445
-msgid "POSIX PHP module"
-msgstr "PHP POSIX Modul"
+#: src/Content/ContactSelector.php:252
+msgid "Betrayed"
+msgstr "Betrogen"
 
-#: src/Core/Installer.php:446
-msgid "Error: POSIX PHP module required but not installed."
-msgstr "Fehler POSIX PHP Modul erforderlich, aber nicht installiert."
+#: src/Content/ContactSelector.php:253
+msgid "Separated"
+msgstr "Getrennt"
+
+#: src/Content/ContactSelector.php:254
+msgid "Unstable"
+msgstr "Unstabil"
 
-#: src/Core/Installer.php:452
-msgid "JSON PHP module"
-msgstr "PHP JASON Modul"
+#: src/Content/ContactSelector.php:255
+msgid "Divorced"
+msgstr "Geschieden"
 
-#: src/Core/Installer.php:453
-msgid "Error: JSON PHP module required but not installed."
-msgstr "Fehler: Das JSON PHP Modul wird benötigt, ist aber nicht installiert."
+#: src/Content/ContactSelector.php:256
+msgid "Imaginarily divorced"
+msgstr "Imaginär geschieden"
 
-#: src/Core/Installer.php:459
-msgid "File Information PHP module"
-msgstr "PHP Datei Informations-Modul"
+#: src/Content/ContactSelector.php:257
+msgid "Widowed"
+msgstr "Verwitwet"
 
-#: src/Core/Installer.php:460
-msgid "Error: File Information PHP module required but not installed."
-msgstr "Fehler: Das Datei Informations PHP Modul ist nicht installiert."
+#: src/Content/ContactSelector.php:258
+msgid "Uncertain"
+msgstr "Unsicher"
 
-#: src/Core/Installer.php:483
-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 "Das Installationsprogramm muss in der Lage sein, eine Datei namens \"local.config.php\" im Ordner \"config\" Ihres Webservers zu erstellen, ist aber nicht in der Lage dazu."
+#: src/Content/ContactSelector.php:259
+msgid "It's complicated"
+msgstr "Ist kompliziert"
 
-#: src/Core/Installer.php:484
-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 "In den meisten Fällen ist dies ein Problem mit den Schreibrechten. Der Webserver könnte keine Schreiberlaubnis haben, selbst wenn du sie hast."
+#: src/Content/ContactSelector.php:260
+msgid "Don't care"
+msgstr "Ist mir nicht wichtig"
 
-#: src/Core/Installer.php:485
-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 "Am Ende dieser Prozedur bekommst du einen Text, der in der local.config.php im Friendica \"config\" Ordner gespeichert werden muss."
+#: src/Content/ContactSelector.php:261
+msgid "Ask me"
+msgstr "Frag mich"
 
-#: src/Core/Installer.php:486
-msgid ""
-"You can alternatively skip this procedure and perform a manual installation."
-" Please see the file \"INSTALL.txt\" for instructions."
-msgstr "Alternativ kannst du diesen Schritt aber auch überspringen und die Installation manuell durchführen. Eine Anleitung dazu (Englisch) findest du in der Datei INSTALL.txt."
+#: src/Content/Feature.php:82
+msgid "General Features"
+msgstr "Allgemeine Features"
 
-#: src/Core/Installer.php:489
-msgid "config/local.config.php is writable"
-msgstr "config/local.config.php ist schreibbar"
+#: src/Content/Feature.php:84
+msgid "Multiple Profiles"
+msgstr "Mehrere Profile"
 
-#: src/Core/Installer.php:509
-msgid ""
-"Friendica uses the Smarty3 template engine to render its web views. Smarty3 "
-"compiles templates to PHP to speed up rendering."
-msgstr "Friendica nutzt die Smarty3-Template-Engine, um die Webansichten zu rendern. Smarty3 kompiliert Templates zu PHP, um das Rendern zu beschleunigen."
+#: src/Content/Feature.php:84
+msgid "Ability to create multiple profiles"
+msgstr "Möglichkeit, mehrere Profile zu erstellen"
 
-#: src/Core/Installer.php:510
-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 "Um diese kompilierten Templates zu speichern, benötigt der Webserver Schreibrechte zum Verzeichnis view/smarty3/ im obersten Ordner von Friendica."
+#: src/Content/Feature.php:85
+msgid "Photo Location"
+msgstr "Aufnahmeort"
 
-#: src/Core/Installer.php:511
+#: src/Content/Feature.php:85
 msgid ""
-"Please ensure that the user that your web server runs as (e.g. www-data) has"
-" write access to this folder."
-msgstr "Bitte stelle sicher, dass der Nutzer, unter dem der Webserver läuft (z.B. www-data), Schreibrechte zu diesem Verzeichnis hat."
+"Photo metadata is normally stripped. This extracts the location (if present)"
+" prior to stripping metadata and links it to a map."
+msgstr "Die Foto-Metadaten werden ausgelesen. Dadurch kann der Aufnahmeort (wenn vorhanden) in einer Karte angezeigt werden."
 
-#: src/Core/Installer.php:512
-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 "Hinweis: aus Sicherheitsgründen solltest du dem Webserver nur Schreibrechte für view/smarty3/ geben -- Nicht für die darin enthaltenen Template-Dateien (.tpl)."
+#: src/Content/Feature.php:86
+msgid "Export Public Calendar"
+msgstr "Öffentlichen Kalender exportieren"
 
-#: src/Core/Installer.php:515
-msgid "view/smarty3 is writable"
-msgstr "view/smarty3 ist schreibbar"
+#: src/Content/Feature.php:86
+msgid "Ability for visitors to download the public calendar"
+msgstr "Möglichkeit für Besucher, den öffentlichen Kalender herunter zu laden"
 
-#: src/Core/Installer.php:544
-msgid ""
-"Url rewrite in .htaccess is not working. Make sure you copied .htaccess-dist"
-" to .htaccess."
-msgstr "Umschreiben der URLs in der .htaccess funktioniert nicht. Vergewissere dich, dass du .htaccess-dist nach.htaccess kopiert hast."
+#: src/Content/Feature.php:87
+msgid "Trending Tags"
+msgstr "Trending Tags"
 
-#: src/Core/Installer.php:546
-msgid "Error message from Curl when fetching"
-msgstr "Fehlermeldung von Curl während des Ladens"
+#: src/Content/Feature.php:87
+msgid ""
+"Show a community page widget with a list of the most popular tags in recent "
+"public posts."
+msgstr "Auf der Gemeinschaftsseite ein Widget mit den meist benutzten Tags in öffentlichen Beiträgen anzeigen."
 
-#: src/Core/Installer.php:551
-msgid "Url rewrite is working"
-msgstr "URL rewrite funktioniert"
+#: src/Content/Feature.php:92
+msgid "Post Composition Features"
+msgstr "Beitragserstellung-Features"
 
-#: src/Core/Installer.php:580
-msgid "ImageMagick PHP extension is not installed"
-msgstr "ImageMagicx PHP Erweiterung ist nicht installiert."
+#: src/Content/Feature.php:93
+msgid "Auto-mention Forums"
+msgstr "Foren automatisch erwähnen"
 
-#: src/Core/Installer.php:582
-msgid "ImageMagick PHP extension is installed"
-msgstr "ImageMagick PHP Erweiterung ist installiert"
+#: src/Content/Feature.php:93
+msgid ""
+"Add/remove mention when a forum page is selected/deselected in ACL window."
+msgstr "Automatisch eine @-Erwähnung eines Forums einfügen/entfehrnen, wenn dieses im ACL Fenster de-/markiert  wurde."
 
-#: src/Core/Installer.php:584 tests/src/Core/InstallerTest.php:347
-#: tests/src/Core/InstallerTest.php:373
-msgid "ImageMagick supports GIF"
-msgstr "ImageMagick unterstützt GIF"
+#: src/Content/Feature.php:94
+msgid "Explicit Mentions"
+msgstr "Explizite Erwähnungen"
 
-#: src/Core/Installer.php:609
-msgid "Could not connect to database."
-msgstr "Verbindung zur Datenbank gescheitert."
+#: src/Content/Feature.php:94
+msgid ""
+"Add explicit mentions to comment box for manual control over who gets "
+"mentioned in replies."
+msgstr "Füge Erwähnungen zum Kommentarfeld hinzu, um manuell über die explizite Erwähnung von Gesprächsteilnehmern zu entscheiden."
 
-#: src/Core/Installer.php:616
-msgid "Database already in use."
-msgstr "Die Datenbank wird bereits verwendet."
+#: src/Content/Feature.php:99
+msgid "Network Sidebar"
+msgstr "Netzwerk-Seitenleiste"
 
-#: src/Core/L10n.php:371 src/Model/Event.php:397
-msgid "Tuesday"
-msgstr "Dienstag"
+#: src/Content/Feature.php:100 src/Content/Widget.php:501
+msgid "Archives"
+msgstr "Archiv"
 
-#: src/Core/L10n.php:371 src/Model/Event.php:398
-msgid "Wednesday"
-msgstr "Mittwoch"
+#: src/Content/Feature.php:100
+msgid "Ability to select posts by date ranges"
+msgstr "Möglichkeit, die Beiträge nach Datumsbereichen zu sortieren"
 
-#: src/Core/L10n.php:371 src/Model/Event.php:399
-msgid "Thursday"
-msgstr "Donnerstag"
+#: src/Content/Feature.php:101
+msgid "Protocol Filter"
+msgstr "Protokoll-Filter"
 
-#: src/Core/L10n.php:371 src/Model/Event.php:400
-msgid "Friday"
-msgstr "Freitag"
+#: src/Content/Feature.php:101
+msgid "Enable widget to display Network posts only from selected protocols"
+msgstr "Aktiviere Widget, um Netzwerkbeiträge nur von ausgesuchten Protokollen anzuzeigen"
 
-#: src/Core/L10n.php:371 src/Model/Event.php:401
-msgid "Saturday"
-msgstr "Samstag"
+#: src/Content/Feature.php:106
+msgid "Network Tabs"
+msgstr "Netzwerk-Reiter"
 
-#: src/Core/L10n.php:375 src/Model/Event.php:416
-msgid "January"
-msgstr "Januar"
+#: src/Content/Feature.php:107
+msgid "Network New Tab"
+msgstr "Netzwerk-Reiter: Neue"
 
-#: src/Core/L10n.php:375 src/Model/Event.php:417
-msgid "February"
-msgstr "Februar"
+#: src/Content/Feature.php:107
+msgid "Enable tab to display only new Network posts (from the last 12 hours)"
+msgstr "Aktiviert einen Netzwerk-Reiter, in dem ausschließlich neue Beiträge (der letzten 12 Stunden) angezeigt werden"
 
-#: src/Core/L10n.php:375 src/Model/Event.php:418
-msgid "March"
-msgstr "März"
+#: src/Content/Feature.php:108
+msgid "Network Shared Links Tab"
+msgstr "Netzwerk-Reiter: Geteilte Links"
 
-#: src/Core/L10n.php:375 src/Model/Event.php:419
-msgid "April"
-msgstr "April"
+#: src/Content/Feature.php:108
+msgid "Enable tab to display only Network posts with links in them"
+msgstr "Aktiviert einen Netzwerk-Reiter, der ausschließlich Nachrichten mit Links enthält"
 
-#: src/Core/L10n.php:375 src/Core/L10n.php:394 src/Model/Event.php:407
-msgid "May"
-msgstr "Mai"
+#: src/Content/Feature.php:113
+msgid "Post/Comment Tools"
+msgstr "Werkzeuge für Beiträge und Kommentare"
 
-#: src/Core/L10n.php:375 src/Model/Event.php:420
-msgid "June"
-msgstr "Juni"
+#: src/Content/Feature.php:114
+msgid "Post Categories"
+msgstr "Beitragskategorien"
 
-#: src/Core/L10n.php:375 src/Model/Event.php:421
-msgid "July"
-msgstr "Juli"
+#: src/Content/Feature.php:114
+msgid "Add categories to your posts"
+msgstr "Eigene Beiträge mit Kategorien versehen"
 
-#: src/Core/L10n.php:375 src/Model/Event.php:422
-msgid "August"
-msgstr "August"
+#: src/Content/Feature.php:119
+msgid "Advanced Profile Settings"
+msgstr "Erweiterte Profil-Einstellungen"
 
-#: src/Core/L10n.php:375 src/Model/Event.php:423
-msgid "September"
-msgstr "September"
+#: src/Content/Feature.php:120
+msgid "List Forums"
+msgstr "Zeige Foren"
 
-#: src/Core/L10n.php:375 src/Model/Event.php:424
-msgid "October"
-msgstr "Oktober"
+#: src/Content/Feature.php:120
+msgid "Show visitors public community forums at the Advanced Profile Page"
+msgstr "Zeige Besuchern öffentliche Gemeinschafts-Foren auf der Erweiterten Profil-Seite"
 
-#: src/Core/L10n.php:375 src/Model/Event.php:425
-msgid "November"
-msgstr "November"
+#: src/Content/Feature.php:121
+msgid "Tag Cloud"
+msgstr "Schlagwortwolke"
 
-#: src/Core/L10n.php:375 src/Model/Event.php:426
-msgid "December"
-msgstr "Dezember"
+#: src/Content/Feature.php:121
+msgid "Provide a personal tag cloud on your profile page"
+msgstr "Wortwolke aus den von dir verwendeten Schlagwörtern im Profil anzeigen"
 
-#: src/Core/L10n.php:390 src/Model/Event.php:388
-msgid "Mon"
-msgstr "Mo"
+#: src/Content/Feature.php:122
+msgid "Display Membership Date"
+msgstr "Mitgliedschaftsdatum anzeigen"
 
-#: src/Core/L10n.php:390 src/Model/Event.php:389
-msgid "Tue"
-msgstr "Di"
+#: src/Content/Feature.php:122
+msgid "Display membership date in profile"
+msgstr "Das Datum der Registrierung deines Accounts im Profil anzeigen"
 
-#: src/Core/L10n.php:390 src/Model/Event.php:390
-msgid "Wed"
-msgstr "Mi"
+#: src/Content/Nav.php:74
+msgid "Nothing new here"
+msgstr "Keine Neuigkeiten"
 
-#: src/Core/L10n.php:390 src/Model/Event.php:391
-msgid "Thu"
-msgstr "Do"
+#: src/Content/Nav.php:78
+msgid "Clear notifications"
+msgstr "Bereinige Benachrichtigungen"
 
-#: src/Core/L10n.php:390 src/Model/Event.php:392
-msgid "Fri"
-msgstr "Fr"
+#: src/Content/Nav.php:153 src/Module/Login.php:315
+msgid "Logout"
+msgstr "Abmelden"
 
-#: src/Core/L10n.php:390 src/Model/Event.php:393
-msgid "Sat"
-msgstr "Sa"
+#: src/Content/Nav.php:153
+msgid "End this session"
+msgstr "Diese Sitzung beenden"
 
-#: src/Core/L10n.php:390 src/Model/Event.php:387
-msgid "Sun"
-msgstr "So"
+#: src/Content/Nav.php:155 src/Module/Bookmarklet.php:25
+#: src/Module/Login.php:316
+msgid "Login"
+msgstr "Anmeldung"
 
-#: src/Core/L10n.php:394 src/Model/Event.php:403
-msgid "Jan"
-msgstr "Jan"
+#: src/Content/Nav.php:155
+msgid "Sign in"
+msgstr "Anmelden"
 
-#: src/Core/L10n.php:394 src/Model/Event.php:404
-msgid "Feb"
-msgstr "Feb"
+#: src/Content/Nav.php:165
+msgid "Personal notes"
+msgstr "Persönliche Notizen"
 
-#: src/Core/L10n.php:394 src/Model/Event.php:405
-msgid "Mar"
-msgstr "März"
+#: src/Content/Nav.php:165
+msgid "Your personal notes"
+msgstr "Deine persönlichen Notizen"
 
-#: src/Core/L10n.php:394 src/Model/Event.php:406
-msgid "Apr"
-msgstr "Apr"
+#: src/Content/Nav.php:182
+msgid "Home Page"
+msgstr "Homepage"
 
-#: src/Core/L10n.php:394 src/Model/Event.php:409
-msgid "Jul"
-msgstr "Juli"
+#: src/Content/Nav.php:186 src/Module/Login.php:287
+#: src/Module/Register.php:136
+msgid "Register"
+msgstr "Registrieren"
 
-#: src/Core/L10n.php:394 src/Model/Event.php:410
-msgid "Aug"
-msgstr "Aug"
+#: src/Content/Nav.php:186
+msgid "Create an account"
+msgstr "Nutzerkonto erstellen"
 
-#: src/Core/L10n.php:394
-msgid "Sep"
-msgstr "Sep"
+#: src/Content/Nav.php:192
+msgid "Help and documentation"
+msgstr "Hilfe und Dokumentation"
 
-#: src/Core/L10n.php:394 src/Model/Event.php:412
-msgid "Oct"
-msgstr "Okt"
+#: src/Content/Nav.php:196
+msgid "Apps"
+msgstr "Apps"
 
-#: src/Core/L10n.php:394 src/Model/Event.php:413
-msgid "Nov"
-msgstr "Nov"
+#: src/Content/Nav.php:196
+msgid "Addon applications, utilities, games"
+msgstr "Zusätzliche Anwendungen, Dienstprogramme, Spiele"
 
-#: src/Core/L10n.php:394 src/Model/Event.php:414
-msgid "Dec"
-msgstr "Dez"
+#: src/Content/Nav.php:200
+msgid "Search site content"
+msgstr "Inhalt der Seite durchsuchen"
 
-#: src/Core/L10n.php:413
-msgid "poke"
-msgstr "anstupsen"
+#: src/Content/Nav.php:224
+msgid "Community"
+msgstr "Gemeinschaft"
 
-#: src/Core/L10n.php:413
-msgid "poked"
-msgstr "stupste"
+#: src/Content/Nav.php:224
+msgid "Conversations on this and other servers"
+msgstr "Unterhaltungen auf diesem und anderen Servern"
 
-#: src/Core/L10n.php:414
-msgid "ping"
-msgstr "anpingen"
+#: src/Content/Nav.php:231
+msgid "Directory"
+msgstr "Verzeichnis"
 
-#: src/Core/L10n.php:414
-msgid "pinged"
-msgstr "pingte"
+#: src/Content/Nav.php:231
+msgid "People directory"
+msgstr "Nutzerverzeichnis"
 
-#: src/Core/L10n.php:415
-msgid "prod"
-msgstr "knuffen"
+#: src/Content/Nav.php:233 src/Module/BaseAdminModule.php:75
+msgid "Information"
+msgstr "Information"
 
-#: src/Core/L10n.php:415
-msgid "prodded"
-msgstr "knuffte"
+#: src/Content/Nav.php:233
+msgid "Information about this friendica instance"
+msgstr "Informationen zu dieser Friendica-Instanz"
 
-#: src/Core/L10n.php:416
-msgid "slap"
-msgstr "ohrfeigen"
+#: src/Content/Nav.php:236 src/Module/Tos.php:73 src/Module/Admin/Tos.php:43
+#: src/Module/BaseAdminModule.php:85 src/Module/Register.php:144
+msgid "Terms of Service"
+msgstr "Nutzungsbedingungen"
 
-#: src/Core/L10n.php:416
-msgid "slapped"
-msgstr "ohrfeigte"
+#: src/Content/Nav.php:236
+msgid "Terms of Service of this Friendica instance"
+msgstr "Die Nutzungsbedingungen dieser Friendica-Instanz"
 
-#: src/Core/L10n.php:417
-msgid "finger"
-msgstr "befummeln"
+#: src/Content/Nav.php:242
+msgid "Network Reset"
+msgstr "Netzwerk zurücksetzen"
 
-#: src/Core/L10n.php:417
-msgid "fingered"
-msgstr "befummelte"
+#: src/Content/Nav.php:242
+msgid "Load Network page with no filters"
+msgstr "Netzwerk-Seite ohne Filter laden"
 
-#: src/Core/L10n.php:418
-msgid "rebuff"
-msgstr "eine Abfuhr erteilen"
+#: src/Content/Nav.php:248
+msgid "Friend Requests"
+msgstr "Kontaktanfragen"
 
-#: src/Core/L10n.php:418
-msgid "rebuffed"
-msgstr "abfuhrerteilte"
+#: src/Content/Nav.php:250
+msgid "See all notifications"
+msgstr "Alle Benachrichtigungen anzeigen"
 
-#: src/Core/NotificationsManager.php:144
-msgid "System"
-msgstr "System"
+#: src/Content/Nav.php:251
+msgid "Mark all system notifications seen"
+msgstr "Markiere alle Systembenachrichtigungen als gelesen"
 
-#: src/Core/NotificationsManager.php:234 src/Core/NotificationsManager.php:246
-#, php-format
-msgid "%s commented on %s's post"
-msgstr "%s hat %ss Beitrag kommentiert"
+#: src/Content/Nav.php:255
+msgid "Inbox"
+msgstr "Eingang"
 
-#: src/Core/NotificationsManager.php:245
-#, php-format
-msgid "%s created a new post"
-msgstr "%s hat einen neuen Beitrag erstellt"
+#: src/Content/Nav.php:256
+msgid "Outbox"
+msgstr "Ausgang"
 
-#: src/Core/NotificationsManager.php:259
-#, php-format
-msgid "%s liked %s's post"
-msgstr "%s mag %ss Beitrag"
+#: src/Content/Nav.php:260
+msgid "Manage"
+msgstr "Verwalten"
 
-#: src/Core/NotificationsManager.php:272
-#, php-format
-msgid "%s disliked %s's post"
-msgstr "%s mag %ss Beitrag nicht"
+#: src/Content/Nav.php:260
+msgid "Manage other pages"
+msgstr "Andere Seiten verwalten"
 
-#: src/Core/NotificationsManager.php:285
-#, php-format
-msgid "%s is attending %s's event"
-msgstr "%s nimmt an %s's Event teil"
+#: src/Content/Nav.php:268
+msgid "Manage/Edit Profiles"
+msgstr "Profile verwalten/editieren"
 
-#: src/Core/NotificationsManager.php:298
-#, php-format
-msgid "%s is not attending %s's event"
-msgstr "%s nimmt nicht an %s's Event teil"
+#: src/Content/Nav.php:276 src/Module/BaseAdminModule.php:114
+msgid "Admin"
+msgstr "Administration"
 
-#: src/Core/NotificationsManager.php:311
-#, php-format
-msgid "%s may attend %s's event"
-msgstr "%s nimmt eventuell an %s's Event teil"
+#: src/Content/Nav.php:276
+msgid "Site setup and configuration"
+msgstr "Einstellungen der Seite und Konfiguration"
 
-#: src/Core/NotificationsManager.php:344
-#, php-format
-msgid "%s is now friends with %s"
-msgstr "%s ist jetzt mit %s befreundet"
+#: src/Content/Nav.php:279
+msgid "Navigation"
+msgstr "Navigation"
 
-#: src/Core/NotificationsManager.php:622
-msgid "Friend Suggestion"
-msgstr "Kontaktvorschlag"
+#: src/Content/Nav.php:279
+msgid "Site map"
+msgstr "Sitemap"
 
-#: src/Core/NotificationsManager.php:656
-msgid "Friend/Connect Request"
-msgstr "Kontakt-/Freundschaftsanfrage"
+#: src/Content/OEmbed.php:254
+msgid "Embedding disabled"
+msgstr "Einbettungen deaktiviert"
 
-#: src/Core/NotificationsManager.php:656
-msgid "New Follower"
-msgstr "Neuer Bewunderer"
+#: src/Content/OEmbed.php:377
+msgid "Embedded content"
+msgstr "Eingebetteter Inhalt"
 
-#: src/Core/Session.php:194
-#, php-format
-msgid "Welcome %s"
-msgstr "Willkommen %s"
+#: src/Content/Widget.php:38
+msgid "Add New Contact"
+msgstr "Neuen Kontakt hinzufügen"
 
-#: src/Core/Session.php:195
-msgid "Please upload a profile photo."
-msgstr "Bitte lade ein Profilbild hoch."
+#: src/Content/Widget.php:39
+msgid "Enter address or web location"
+msgstr "Adresse oder Web-Link eingeben"
 
-#: src/Core/Session.php:198
-#, php-format
-msgid "Welcome back %s"
-msgstr "Willkommen zurück %s"
+#: src/Content/Widget.php:40
+msgid "Example: bob@example.com, http://example.com/barbara"
+msgstr "Beispiel: bob@example.com, http://example.com/barbara"
 
-#: src/Core/Update.php:193
+#: src/Content/Widget.php:58
 #, php-format
-msgid "Update %s failed. See error logs."
-msgstr "Update %s fehlgeschlagen. Bitte Fehlerprotokoll überprüfen."
+msgid "%d invitation available"
+msgid_plural "%d invitations available"
+msgstr[0] "%d Einladung verfügbar"
+msgstr[1] "%d Einladungen verfügbar"
 
-#: src/Core/Update.php:257
-#, 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 "\nDie Friendica-Entwickler haben vor kurzem das Update %s veröffentlicht, aber bei der Installation ging etwas schrecklich schief.\n\nDas Problem sollte so schnell wie möglich gelöst werden, aber ich schaffe es nicht alleine. Bitte kontaktiere einen Friendica-Entwickler, falls du mir nicht alleine helfen kannst. Meine Datenbank könnte ungültig sein."
+#: src/Content/Widget.php:193 src/Module/Contact.php:798
+#: src/Module/Profile/Contacts.php:127
+msgid "Following"
+msgstr "Gefolgte"
 
-#: src/Core/Update.php:263
-#, php-format
-msgid ""
-"The error message is\n"
-"[pre]%s[/pre]"
-msgstr "Die Fehlermeldung lautet\n[pre]%s[/pre]"
+#: src/Content/Widget.php:194 src/Module/Contact.php:799
+#: src/Module/Profile/Contacts.php:128
+msgid "Mutual friends"
+msgstr "Beidseitige Freundschaft"
 
-#: src/Core/Update.php:269 src/Core/Update.php:308
-msgid "[Friendica Notify] Database update"
-msgstr "[Friendica-Benachrichtigung]: Datenbank Update"
+#: src/Content/Widget.php:199
+msgid "Relationships"
+msgstr "Beziehungen"
 
-#: src/Core/Update.php:300
-#, php-format
-msgid ""
-"\n"
-"\t\t\t\t\tThe friendica database was successfully updated from %s to %s."
-msgstr "\n \t\t\t\t\tDie Friendica Datenbank wurde erfolgreich von %s auf %s aktualisiert."
+#: src/Content/Widget.php:201 src/Module/Contact.php:694
+#: src/Module/Group.php:287
+msgid "All Contacts"
+msgstr "Alle Kontakte"
 
-#: src/Core/UserImport.php:99
-msgid "Error decoding account file"
-msgstr "Fehler beim Verarbeiten der Account-Datei"
+#: src/Content/Widget.php:244
+msgid "Protocols"
+msgstr "Protokolle"
 
-#: src/Core/UserImport.php:105
-msgid "Error! No version data in file! This is not a Friendica account file?"
-msgstr "Fehler! Keine Versionsdaten in der Datei! Ist das wirklich eine Friendica-Account-Datei?"
+#: src/Content/Widget.php:246
+msgid "All Protocols"
+msgstr "Alle Protokolle"
 
-#: src/Core/UserImport.php:113
-#, php-format
-msgid "User '%s' already exists on this server!"
-msgstr "Nutzer '%s' existiert bereits auf diesem Server!"
+#: src/Content/Widget.php:279
+msgid "Saved Folders"
+msgstr "Gespeicherte Ordner"
 
-#: src/Core/UserImport.php:149
-msgid "User creation error"
-msgstr "Fehler beim Anlegen des Nutzer-Accounts aufgetreten"
+#: src/Content/Widget.php:281 src/Content/Widget.php:320
+msgid "Everything"
+msgstr "Alles"
 
-#: src/Core/UserImport.php:167
-msgid "User profile creation error"
-msgstr "Fehler beim Anlegen des Nutzer-Profils"
+#: src/Content/Widget.php:318
+msgid "Categories"
+msgstr "Kategorien"
 
-#: src/Core/UserImport.php:211
+#: src/Content/Widget.php:402
 #, php-format
-msgid "%d contact not imported"
-msgid_plural "%d contacts not imported"
-msgstr[0] "%d Kontakt nicht importiert"
-msgstr[1] "%d Kontakte nicht importiert"
-
-#: src/Core/UserImport.php:276
-msgid "Done. You can now login with your username and password"
-msgstr "Erledigt. Du kannst dich jetzt mit deinem Nutzernamen und Passwort anmelden"
+msgid "%d contact in common"
+msgid_plural "%d contacts in common"
+msgstr[0] "%d gemeinsamer Kontakt"
+msgstr[1] "%d gemeinsame Kontakte"
 
-#: src/Database/DBStructure.php:47
+#: src/Database/DBStructure.php:50
 msgid "There are no tables on MyISAM."
 msgstr "Es gibt keine MyISAM-Tabellen."
 
-#: src/Database/DBStructure.php:71
+#: src/Database/DBStructure.php:74
 #, php-format
 msgid ""
 "\n"
@@ -5974,99 +6080,130 @@ msgid ""
 "%s\n"
 msgstr "\nFehler %d beim Update der Datenbank aufgetreten\n%s\n"
 
-#: src/Database/DBStructure.php:74
+#: src/Database/DBStructure.php:77
 msgid "Errors encountered performing database changes: "
 msgstr "Fehler beim Ändern der Datenbank aufgetreten"
 
-#: src/Database/DBStructure.php:263
+#: src/Database/DBStructure.php:266
 #, php-format
 msgid "%s: Database update"
 msgstr "%s: Datenbank Aktualisierung"
 
-#: src/Database/DBStructure.php:524
+#: src/Database/DBStructure.php:527
 #, php-format
 msgid "%s: updating %s table."
 msgstr "%s: aktualisiere Tabelle %s"
 
-#: src/LegacyModule.php:30
+#: src/Model/Storage/Filesystem.php:63
+#, php-format
+msgid "Filesystem storage failed to create \"%s\". Check you write permissions."
+msgstr "Dateisystemspeicher konnte nicht erstellt werden \"%s\". Überprüfe, ob du Schreibberechtigungen hast."
+
+#: src/Model/Storage/Filesystem.php:105
+#, php-format
+msgid ""
+"Filesystem storage failed to save data to \"%s\". Check your write "
+"permissions"
+msgstr "Der Dateisystemspeicher konnte die Daten nicht in \"%s\" speichern. Überprüfe Deine Schreibberechtigungen"
+
+#: src/Model/Storage/Filesystem.php:126
+msgid "Storage base path"
+msgstr "Dateipfad zum Speicher"
+
+#: 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 "Verzeichnis, in das Dateien hochgeladen werden. Für maximale Sicherheit sollte dies ein Pfad außerhalb der Webserver-Verzeichnisstruktur sein"
+
+#: src/Model/Storage/Filesystem.php:138
+msgid "Enter a valid existing folder"
+msgstr "Gib einen gültigen, existierenden Ordner ein"
+
+#: src/Model/Storage/Database.php:36
 #, php-format
-msgid "Legacy module file not found: %s"
-msgstr "Legacy-Moduldatei nicht gefunden: %s"
+msgid "Database storage failed to update %s"
+msgstr "Datenbankspeicher konnte nicht aktualisiert werden %s"
+
+#: src/Model/Storage/Database.php:43
+msgid "Database storage failed to insert data"
+msgstr "Der Datenbankspeicher konnte keine Daten einfügen"
 
-#: src/Model/Contact.php:1116
+#: src/Model/Contact.php:1203
 msgid "Drop Contact"
 msgstr "Kontakt löschen"
 
-#: src/Model/Contact.php:1651
+#: src/Model/Contact.php:1705
 msgid "Organisation"
 msgstr "Organisation"
 
-#: src/Model/Contact.php:1655
+#: src/Model/Contact.php:1709
 msgid "News"
 msgstr "Nachrichten"
 
-#: src/Model/Contact.php:1659
+#: src/Model/Contact.php:1713
 msgid "Forum"
 msgstr "Forum"
 
-#: src/Model/Contact.php:1888
+#: src/Model/Contact.php:2109
 msgid "Connect URL missing."
 msgstr "Connect-URL fehlt"
 
-#: src/Model/Contact.php:1897
+#: src/Model/Contact.php:2118
 msgid ""
 "The contact could not be added. Please check the relevant network "
 "credentials in your Settings -> Social Networks page."
 msgstr "Der Kontakt konnte nicht hinzugefügt werden. Bitte überprüfe die Einstellungen unter Einstellungen -> Soziale Netzwerke"
 
-#: src/Model/Contact.php:1938
+#: src/Model/Contact.php:2159
 msgid ""
 "This site is not configured to allow communications with other networks."
 msgstr "Diese Seite ist so konfiguriert, dass keine Kommunikation mit anderen Netzwerken erfolgen kann."
 
-#: src/Model/Contact.php:1939 src/Model/Contact.php:1952
+#: src/Model/Contact.php:2160 src/Model/Contact.php:2173
 msgid "No compatible communication protocols or feeds were discovered."
 msgstr "Es wurden keine kompatiblen Kommunikationsprotokolle oder Feeds gefunden."
 
-#: src/Model/Contact.php:1950
+#: src/Model/Contact.php:2171
 msgid "The profile address specified does not provide adequate information."
 msgstr "Die angegebene Profiladresse liefert unzureichende Informationen."
 
-#: src/Model/Contact.php:1955
+#: src/Model/Contact.php:2176
 msgid "An author or name was not found."
 msgstr "Es wurde kein Autor oder Name gefunden."
 
-#: src/Model/Contact.php:1958
+#: src/Model/Contact.php:2179
 msgid "No browser URL could be matched to this address."
 msgstr "Zu dieser Adresse konnte keine passende Browser-URL gefunden werden."
 
-#: src/Model/Contact.php:1961
+#: src/Model/Contact.php:2182
 msgid ""
 "Unable to match @-style Identity Address with a known protocol or email "
 "contact."
 msgstr "Konnte die @-Adresse mit keinem der bekannten Protokolle oder Email-Kontakte abgleichen."
 
-#: src/Model/Contact.php:1962
+#: src/Model/Contact.php:2183
 msgid "Use mailto: in front of address to force email check."
 msgstr "Verwende mailto: vor der E-Mail-Adresse, um eine Überprüfung der E-Mail-Adresse zu erzwingen."
 
-#: src/Model/Contact.php:1968
+#: src/Model/Contact.php:2189
 msgid ""
 "The profile address specified belongs to a network which has been disabled "
 "on this site."
 msgstr "Die Adresse dieses Profils gehört zu einem Netzwerk, mit dem die Kommunikation auf dieser Seite ausgeschaltet wurde."
 
-#: src/Model/Contact.php:1973
+#: src/Model/Contact.php:2194
 msgid ""
 "Limited profile. This person will be unable to receive direct/personal "
 "notifications from you."
 msgstr "Eingeschränktes Profil. Diese Person wird keine direkten/privaten Nachrichten von dir erhalten können."
 
-#: src/Model/Contact.php:2027
+#: src/Model/Contact.php:2249
 msgid "Unable to retrieve contact information."
 msgstr "Konnte die Kontaktinformationen nicht empfangen."
 
-#: src/Model/Event.php:34 src/Model/Event.php:847 src/Module/Localtime.php:17
+#: src/Model/Event.php:34 src/Model/Event.php:847
+#: src/Module/Debug/Localtime.php:17
 msgid "l F d, Y \\@ g:i A"
 msgstr "l, d. F Y\\, H:i"
 
@@ -6084,10 +6221,6 @@ msgstr "Endet:"
 msgid "all-day"
 msgstr "ganztägig"
 
-#: src/Model/Event.php:408
-msgid "Jun"
-msgstr "Jun"
-
 #: src/Model/Event.php:411
 msgid "Sept"
 msgstr "Sep"
@@ -6112,7 +6245,7 @@ msgstr "Veranstaltung kopieren"
 msgid "Delete event"
 msgstr "Veranstaltung löschen"
 
-#: src/Model/Event.php:626 src/Model/Item.php:3522 src/Model/Item.php:3529
+#: src/Model/Event.php:626 src/Model/Item.php:3569 src/Model/Item.php:3576
 msgid "link to source"
 msgstr "Link zum Originalbeitrag"
 
@@ -6142,397 +6275,363 @@ msgstr "%ss Geburtstag"
 msgid "Happy Birthday %s"
 msgstr "Herzlichen Glückwunsch, %s"
 
-#: src/Model/FileTag.php:256
+#: src/Model/FileTag.php:265
 msgid "Item filed"
 msgstr "Beitrag abgelegt"
 
-#: src/Model/Group.php:63
+#: src/Model/Group.php:77
 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 "Eine gelöschte Gruppe mit diesem Namen wurde wiederbelebt. Bestehende Berechtigungseinstellungen <strong>könnten</strong> auf diese Gruppe oder zukünftige Mitglieder angewandt werden. Falls du dies nicht möchtest, erstelle bitte eine andere Gruppe mit einem anderen Namen."
 
-#: src/Model/Group.php:358
+#: src/Model/Group.php:407
 msgid "Default privacy group for new contacts"
 msgstr "Voreingestellte Gruppe für neue Kontakte"
 
-#: src/Model/Group.php:390
+#: src/Model/Group.php:439
 msgid "Everybody"
 msgstr "Alle Kontakte"
 
-#: src/Model/Group.php:410
+#: src/Model/Group.php:458
 msgid "edit"
 msgstr "bearbeiten"
 
-#: src/Model/Group.php:439
+#: src/Model/Group.php:484 src/Module/Contact.php:734
+#: src/Module/Welcome.php:57
+msgid "Groups"
+msgstr "Gruppen"
+
+#: src/Model/Group.php:488
 msgid "Edit group"
 msgstr "Gruppe bearbeiten"
 
-#: src/Model/Group.php:440 src/Module/Group.php:186
+#: src/Model/Group.php:489 src/Module/Group.php:186
 msgid "Contacts not in any group"
 msgstr "Kontakte in keiner Gruppe"
 
-#: src/Model/Group.php:442
+#: src/Model/Group.php:491
 msgid "Create a new group"
 msgstr "Neue Gruppe erstellen"
 
-#: src/Model/Group.php:443 src/Module/Group.php:171 src/Module/Group.php:194
+#: src/Model/Group.php:492 src/Module/Group.php:171 src/Module/Group.php:194
 #: src/Module/Group.php:271
 msgid "Group Name: "
 msgstr "Gruppenname:"
 
-#: src/Model/Group.php:444
+#: src/Model/Group.php:493
 msgid "Edit groups"
 msgstr "Gruppen bearbeiten"
 
-#: src/Model/Item.php:3257
+#: src/Model/Item.php:3304
 msgid "activity"
 msgstr "Aktivität"
 
-#: src/Model/Item.php:3259 src/Object/Post.php:472
+#: src/Model/Item.php:3306 src/Object/Post.php:473
 msgid "comment"
 msgid_plural "comments"
 msgstr[0] "Kommentar"
 msgstr[1] "Kommentare"
 
-#: src/Model/Item.php:3262
+#: src/Model/Item.php:3309
 msgid "post"
 msgstr "Beitrag"
 
-#: src/Model/Item.php:3361
+#: src/Model/Item.php:3408
 #, php-format
 msgid "Content warning: %s"
 msgstr "Inhaltswarnung: %s"
 
-#: src/Model/Item.php:3438
+#: src/Model/Item.php:3485
 msgid "bytes"
 msgstr "Byte"
 
-#: src/Model/Item.php:3516
+#: src/Model/Item.php:3563
 msgid "View on separate page"
 msgstr "Auf separater Seite ansehen"
 
-#: src/Model/Item.php:3517
+#: src/Model/Item.php:3564
 msgid "view on separate page"
 msgstr "auf separater Seite ansehen"
 
-#: src/Model/Mail.php:109 src/Model/Mail.php:244
+#: src/Model/Mail.php:112 src/Model/Mail.php:247
 msgid "[no subject]"
 msgstr "[kein Betreff]"
 
-#: src/Model/Profile.php:177 src/Model/Profile.php:421
-#: src/Model/Profile.php:866
+#: src/Model/Profile.php:212 src/Model/Profile.php:428
+#: src/Model/Profile.php:877
 msgid "Edit profile"
 msgstr "Profil bearbeiten"
 
-#: src/Model/Profile.php:355
-msgid "Atom feed"
-msgstr "Atom-Feed"
-
-#: src/Model/Profile.php:394
+#: src/Model/Profile.php:402
 msgid "Manage/edit profiles"
 msgstr "Profile verwalten/editieren"
 
-#: src/Model/Profile.php:443 src/Model/Profile.php:776
-#: src/Module/Directory.php:148
+#: src/Model/Profile.php:451 src/Model/Profile.php:787
+#: src/Module/Directory.php:143
 msgid "Status:"
 msgstr "Status:"
 
-#: src/Model/Profile.php:444 src/Model/Profile.php:793
-#: src/Module/Directory.php:149
+#: src/Model/Profile.php:452 src/Model/Profile.php:804
+#: src/Module/Directory.php:144
 msgid "Homepage:"
 msgstr "Homepage:"
 
-#: src/Model/Profile.php:446 src/Module/Contact.php:648
+#: src/Model/Profile.php:454 src/Module/Contact.php:647
 msgid "XMPP:"
 msgstr "XMPP:"
 
-#: src/Model/Profile.php:569 src/Model/Profile.php:666
+#: src/Model/Profile.php:538 src/Module/Contact.php:337
+msgid "Unfollow"
+msgstr "Nicht mehr folgen"
+
+#: src/Model/Profile.php:540
+msgid "Atom feed"
+msgstr "Atom-Feed"
+
+#: src/Model/Profile.php:580 src/Model/Profile.php:677
 msgid "g A l F d"
 msgstr "l, d. F G \\U\\h\\r"
 
-#: src/Model/Profile.php:570
+#: src/Model/Profile.php:581
 msgid "F d"
 msgstr "d. F"
 
-#: src/Model/Profile.php:632 src/Model/Profile.php:717
+#: src/Model/Profile.php:643 src/Model/Profile.php:728
 msgid "[today]"
 msgstr "[heute]"
 
-#: src/Model/Profile.php:642
+#: src/Model/Profile.php:653
 msgid "Birthday Reminders"
 msgstr "Geburtstagserinnerungen"
 
-#: src/Model/Profile.php:643
+#: src/Model/Profile.php:654
 msgid "Birthdays this week:"
 msgstr "Geburtstage diese Woche:"
 
-#: src/Model/Profile.php:704
+#: src/Model/Profile.php:715
 msgid "[No description]"
 msgstr "[keine Beschreibung]"
 
-#: src/Model/Profile.php:730
+#: src/Model/Profile.php:741
 msgid "Event Reminders"
 msgstr "Veranstaltungserinnerungen"
 
-#: src/Model/Profile.php:731
+#: src/Model/Profile.php:742
 msgid "Upcoming events the next 7 days:"
 msgstr "Veranstaltungen der nächsten 7 Tage:"
 
-#: src/Model/Profile.php:748
+#: src/Model/Profile.php:759
 msgid "Member since:"
 msgstr "Mitglied seit:"
 
-#: src/Model/Profile.php:756
+#: src/Model/Profile.php:767
 msgid "j F, Y"
 msgstr "j F, Y"
 
-#: src/Model/Profile.php:757
+#: src/Model/Profile.php:768
 msgid "j F"
 msgstr "j F"
 
-#: src/Model/Profile.php:765 src/Util/Temporal.php:147
-msgid "Birthday:"
-msgstr "Geburtstag:"
-
-#: src/Model/Profile.php:772
+#: src/Model/Profile.php:783
 msgid "Age:"
 msgstr "Alter:"
 
-#: src/Model/Profile.php:785
+#: src/Model/Profile.php:796
 #, php-format
 msgid "for %1$d %2$s"
 msgstr "für %1$d %2$s"
 
-#: src/Model/Profile.php:809
+#: src/Model/Profile.php:820
 msgid "Religion:"
 msgstr "Religion:"
 
-#: src/Model/Profile.php:817
+#: src/Model/Profile.php:828
 msgid "Hobbies/Interests:"
 msgstr "Hobbies/Interessen:"
 
-#: src/Model/Profile.php:829
+#: src/Model/Profile.php:840
 msgid "Contact information and Social Networks:"
 msgstr "Kontaktinformationen und Soziale Netzwerke:"
 
-#: src/Model/Profile.php:833
+#: src/Model/Profile.php:844
 msgid "Musical interests:"
 msgstr "Musikalische Interessen:"
 
-#: src/Model/Profile.php:837
+#: src/Model/Profile.php:848
 msgid "Books, literature:"
 msgstr "Literatur/Bücher:"
 
-#: src/Model/Profile.php:841
+#: src/Model/Profile.php:852
 msgid "Television:"
 msgstr "Fernsehen:"
 
-#: src/Model/Profile.php:845
+#: src/Model/Profile.php:856
 msgid "Film/dance/culture/entertainment:"
 msgstr "Filme/Tänze/Kultur/Unterhaltung:"
 
-#: src/Model/Profile.php:849
+#: src/Model/Profile.php:860
 msgid "Love/Romance:"
 msgstr "Liebesleben:"
 
-#: src/Model/Profile.php:853
+#: src/Model/Profile.php:864
 msgid "Work/employment:"
 msgstr "Arbeit/Beschäftigung:"
 
-#: src/Model/Profile.php:857
+#: src/Model/Profile.php:868
 msgid "School/education:"
 msgstr "Schule/Ausbildung:"
 
-#: src/Model/Profile.php:862
+#: src/Model/Profile.php:873
 msgid "Forums:"
 msgstr "Foren:"
 
-#: src/Model/Profile.php:906 src/Module/Contact.php:875
+#: src/Model/Profile.php:920 src/Module/Contact.php:875
 msgid "Profile Details"
 msgstr "Profildetails"
 
-#: src/Model/Profile.php:956
+#: src/Model/Profile.php:970
 msgid "Only You Can See This"
 msgstr "Nur du kannst das sehen"
 
-#: src/Model/Profile.php:964 src/Model/Profile.php:967
+#: src/Model/Profile.php:978 src/Model/Profile.php:981
 msgid "Tips for New Members"
 msgstr "Tipps für neue Nutzer"
 
-#: src/Model/Profile.php:1167
+#: src/Model/Profile.php:1178
 #, php-format
 msgid "OpenWebAuth: %1$s welcomes %2$s"
 msgstr "OpenWebAuth: %1$s heißt %2$s herzlich willkommen"
 
-#: src/Model/Storage/Database.php:36
-#, php-format
-msgid "Database storage failed to update %s"
-msgstr "Datenbankspeicher konnte nicht aktualisiert werden %s"
-
-#: src/Model/Storage/Database.php:43
-msgid "Database storage failed to insert data"
-msgstr "Der Datenbankspeicher konnte keine Daten einfügen"
-
-#: src/Model/Storage/Filesystem.php:63
-#, php-format
-msgid "Filesystem storage failed to create \"%s\". Check you write permissions."
-msgstr "Dateisystemspeicher konnte nicht erstellt werden \"%s\". Überprüfe, ob du Schreibberechtigungen hast."
-
-#: src/Model/Storage/Filesystem.php:105
-#, php-format
-msgid ""
-"Filesystem storage failed to save data to \"%s\". Check your write "
-"permissions"
-msgstr "Der Dateisystemspeicher konnte die Daten nicht in \"%s\" speichern. Überprüfe Deine Schreibberechtigungen"
-
-#: src/Model/Storage/Filesystem.php:126
-msgid "Storage base path"
-msgstr "Dateipfad zum Speicher"
-
-#: 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 "Verzeichnis, in das Dateien hochgeladen werden. Für maximale Sicherheit sollte dies ein Pfad außerhalb der Webserver-Verzeichnisstruktur sein"
-
-#: src/Model/Storage/Filesystem.php:138
-msgid "Enter a valid existing folder"
-msgstr "Gib einen gültigen, existierenden Ordner ein"
-
-#: src/Model/User.php:298
+#: src/Model/User.php:331
 msgid "Login failed"
 msgstr "Anmeldung fehlgeschlagen"
 
-#: src/Model/User.php:329
+#: src/Model/User.php:362
 msgid "Not enough information to authenticate"
 msgstr "Nicht genügend Informationen für die Authentifizierung"
 
-#: src/Model/User.php:407
+#: src/Model/User.php:440
 msgid "Password can't be empty"
 msgstr "Das Passwort kann nicht leer sein"
 
-#: src/Model/User.php:426
+#: src/Model/User.php:459
 msgid "Empty passwords are not allowed."
 msgstr "Leere Passwörter sind nicht erlaubt."
 
-#: src/Model/User.php:430
+#: src/Model/User.php:463
 msgid ""
 "The new password has been exposed in a public data dump, please choose "
 "another."
 msgstr "Das neue Passwort wurde in einem öffentlichen Daten-Dump veröffentlicht. Bitte verwende ein anderes Passwort."
 
-#: src/Model/User.php:436
+#: src/Model/User.php:469
 msgid ""
 "The password can't contain accentuated letters, white spaces or colons (:)"
 msgstr "Das Passwort darf keine akzentuierten Buchstaben, Leerzeichen oder Doppelpunkte (:) beinhalten"
 
-#: src/Model/User.php:536
+#: src/Model/User.php:569
 msgid "Passwords do not match. Password unchanged."
 msgstr "Die Passwörter stimmen nicht überein. Das Passwort bleibt unverändert."
 
-#: src/Model/User.php:543
+#: src/Model/User.php:576
 msgid "An invitation is required."
 msgstr "Du benötigst eine Einladung."
 
-#: src/Model/User.php:547
+#: src/Model/User.php:580
 msgid "Invitation could not be verified."
 msgstr "Die Einladung konnte nicht überprüft werden."
 
-#: src/Model/User.php:554
+#: src/Model/User.php:587
 msgid "Invalid OpenID url"
 msgstr "Ungültige OpenID URL"
 
-#: src/Model/User.php:567 src/Module/Login.php:107
+#: src/Model/User.php:600 src/Module/Login.php:102
 msgid ""
 "We encountered a problem while logging in with the OpenID you provided. "
 "Please check the correct spelling of the ID."
 msgstr "Beim Versuch, dich mit der von dir angegebenen OpenID anzumelden, trat ein Problem auf. Bitte überprüfe, dass du die OpenID richtig geschrieben hast."
 
-#: src/Model/User.php:567 src/Module/Login.php:107
+#: src/Model/User.php:600 src/Module/Login.php:102
 msgid "The error message was:"
 msgstr "Die Fehlermeldung lautete:"
 
-#: src/Model/User.php:573
+#: src/Model/User.php:606
 msgid "Please enter the required information."
 msgstr "Bitte trage die erforderlichen Informationen ein."
 
-#: src/Model/User.php:587
+#: src/Model/User.php:620
 #, 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) and system.username_max_length (%s) schließen sich gegenseitig aus, tausche Werte aus."
 
-#: src/Model/User.php:594
+#: src/Model/User.php:627
 #, php-format
 msgid "Username should be at least %s character."
 msgid_plural "Username should be at least %s characters."
 msgstr[0] "Der Benutzername sollte aus mindestens %s Zeichen bestehen."
 msgstr[1] "Der Benutzername sollte aus mindestens %s Zeichen bestehen."
 
-#: src/Model/User.php:598
+#: src/Model/User.php:631
 #, php-format
 msgid "Username should be at most %s character."
 msgid_plural "Username should be at most %s characters."
 msgstr[0] "Der Benutzername sollte aus maximal %s Zeichen bestehen."
 msgstr[1] "Der Benutzername sollte aus maximal %s Zeichen bestehen."
 
-#: src/Model/User.php:606
+#: src/Model/User.php:639
 msgid "That doesn't appear to be your full (First Last) name."
 msgstr "Das scheint nicht dein kompletter Name (Vor- und Nachname) zu sein."
 
-#: src/Model/User.php:611
+#: src/Model/User.php:644
 msgid "Your email domain is not among those allowed on this site."
 msgstr "Die Domain Deiner E-Mail-Adresse ist auf dieser Seite nicht erlaubt."
 
-#: src/Model/User.php:615
+#: src/Model/User.php:648
 msgid "Not a valid email address."
 msgstr "Keine gültige E-Mail-Adresse."
 
-#: src/Model/User.php:618
+#: src/Model/User.php:651
 msgid "The nickname was blocked from registration by the nodes admin."
 msgstr "Der Admin des Knotens hat den Spitznamen für die Registrierung gesperrt."
 
-#: src/Model/User.php:622 src/Model/User.php:630
+#: src/Model/User.php:655 src/Model/User.php:663
 msgid "Cannot use that email."
 msgstr "Konnte diese E-Mail-Adresse nicht verwenden."
 
-#: src/Model/User.php:637
+#: src/Model/User.php:670
 msgid "Your nickname can only contain a-z, 0-9 and _."
 msgstr "Dein Spitzname darf nur aus Buchstaben und Zahlen (\"a-z\",\"0-9\" und \"_\") bestehen."
 
-#: src/Model/User.php:644 src/Model/User.php:701
+#: src/Model/User.php:677 src/Model/User.php:734
 msgid "Nickname is already registered. Please choose another."
 msgstr "Dieser Spitzname ist bereits vergeben. Bitte wähle einen anderen."
 
-#: src/Model/User.php:654
+#: src/Model/User.php:687
 msgid "SERIOUS ERROR: Generation of security keys failed."
 msgstr "FATALER FEHLER: Sicherheitsschlüssel konnten nicht erzeugt werden."
 
-#: src/Model/User.php:688 src/Model/User.php:692
+#: src/Model/User.php:721 src/Model/User.php:725
 msgid "An error occurred during registration. Please try again."
 msgstr "Während der Anmeldung ist ein Fehler aufgetreten. Bitte versuche es noch einmal."
 
-#: src/Model/User.php:712 view/theme/duepuntozero/config.php:55
-msgid "default"
-msgstr "Standard"
-
-#: src/Model/User.php:717
+#: src/Model/User.php:750
 msgid "An error occurred creating your default profile. Please try again."
 msgstr "Bei der Erstellung des Standardprofils ist ein Fehler aufgetreten. Bitte versuche es noch einmal."
 
-#: src/Model/User.php:724
+#: src/Model/User.php:757
 msgid "An error occurred creating your self contact. Please try again."
 msgstr "Bei der Erstellung deines self-Kontakts ist ein Fehler aufgetreten. Bitte versuche es erneut."
 
-#: src/Model/User.php:733
+#: src/Model/User.php:766
 msgid ""
 "An error occurred creating your default contact group. Please try again."
 msgstr "Bei der Erstellung deiner Standardgruppe für Kontakte ist ein Fehler aufgetreten. Bitte versuche es erneut."
 
-#: src/Model/User.php:809
+#: src/Model/User.php:842
 #, php-format
 msgid ""
 "\n"
@@ -6547,12 +6646,12 @@ msgid ""
 "\t\t"
 msgstr "\n\t\t\tHallo %1$s,\n\t\t\t\tdanke für deine Registrierung auf %2$s. Dein Account muss noch vom Admin des Knotens freigeschaltet werden.\n\n\t\t\tDeine Zugangsdaten lauten wie folgt:\n\n\t\t\tSeitenadresse:\t%3$s\n\t\t\tAnmeldename:\t\t%4$s\n\t\t\tPasswort:\t\t%5$s\n\t\t"
 
-#: src/Model/User.php:826
+#: src/Model/User.php:859
 #, php-format
 msgid "Registration at %s"
 msgstr "Registrierung als %s"
 
-#: src/Model/User.php:845
+#: src/Model/User.php:878
 #, php-format
 msgid ""
 "\n"
@@ -6561,7 +6660,7 @@ msgid ""
 "\t\t"
 msgstr "\nHallo %1$s,\n\ndanke für deine Registrierung auf %2$s. Dein Account wurde eingerichtet."
 
-#: src/Model/User.php:851
+#: src/Model/User.php:884
 #, php-format
 msgid ""
 "\n"
@@ -6593,11 +6692,111 @@ msgid ""
 "\t\t\tThank you and welcome to %2$s."
 msgstr "\nDie Anmelde-Details sind die folgenden:\n\tAdresse der Seite:\t%3$s\n\tBenutzernamename:\t%1$s\n\tPasswort:\t%5$s\n\nDu kannst dein Passwort unter \"Einstellungen\" ändern, sobald du dich\nangemeldet hast.\n\nBitte nimm dir ein paar Minuten, um die anderen Einstellungen auf dieser\nSeite zu kontrollieren.\n\nEventuell magst du ja auch einige Informationen über dich in deinem\nProfil veröffentlichen, damit andere Leute dich einfacher finden können.\nBearbeite hierfür einfach dein Standard-Profil (über die Profil-Seite).\n\nWir empfehlen dir, deinen kompletten Namen anzugeben und ein zu dir\npassendes Profilbild zu wählen, damit dich alte Bekannte wiederfinden.\nAußerdem ist es nützlich, wenn du auf deinem Profil Schlüsselwörter\nangibst. Das erleichtert es, Leute zu finden, die deine Interessen teilen.\n\nWir respektieren deine Privatsphäre - keine dieser Angaben ist nötig.\nWenn du neu im Netzwerk bist und noch niemanden kennst, dann können sie\nallerdings dabei helfen, neue und interessante Kontakte zu knüpfen.\n\nSolltest du dein Nutzerkonto löschen wollen, kannst du dies unter %3$s/removeme jederzeit tun.\n\nDanke für deine Aufmerksamkeit und willkommen auf %2$s."
 
-#: src/Model/User.php:886 src/Module/Admin/Users.php:88
+#: src/Model/User.php:919 src/Module/Admin/Users.php:88
 #, php-format
 msgid "Registration details for %s"
 msgstr "Details der Registration von %s"
 
+#: src/Protocol/Diaspora.php:2495
+msgid "Sharing notification from Diaspora network"
+msgstr "Freigabe-Benachrichtigung von Diaspora"
+
+#: src/Protocol/Diaspora.php:3640
+msgid "Attachments:"
+msgstr "Anhänge:"
+
+#: src/Protocol/OStatus.php:1300 src/Module/Profile.php:111
+#: src/Module/Profile.php:114
+#, php-format
+msgid "%s's timeline"
+msgstr "Timeline von %s"
+
+#: src/Protocol/OStatus.php:1304 src/Module/Profile.php:112
+#, php-format
+msgid "%s's posts"
+msgstr "Beiträge von %s"
+
+#: src/Protocol/OStatus.php:1307 src/Module/Profile.php:113
+#, php-format
+msgid "%s's comments"
+msgstr "Kommentare von %s"
+
+#: src/Protocol/OStatus.php:1861
+#, php-format
+msgid "%s is now following %s."
+msgstr "%s folgt nun %s"
+
+#: src/Protocol/OStatus.php:1862
+msgid "following"
+msgstr "folgen"
+
+#: src/Protocol/OStatus.php:1865
+#, php-format
+msgid "%s stopped following %s."
+msgstr "%s hat aufgehört %s, zu folgen"
+
+#: src/Protocol/OStatus.php:1866
+msgid "stopped following"
+msgstr "wird nicht mehr gefolgt"
+
+#: src/Worker/Delivery.php:461
+msgid "(no subject)"
+msgstr "(kein Betreff)"
+
+#: 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 "Zum Zwecke der Registrierung und um die Kommunikation zwischen dem Nutzer und seinen Kontakten zu gewährleisten, muß der Nutzer einen Namen (auch Pseudonym) und einen Nutzernamen (Spitzname) sowie eine funktionierende E-Mail-Adresse angeben. Der Name ist auf der Profilseite für alle Nutzer sichtbar, auch wenn die Profildetails nicht angezeigt werden.\nDie E-Mail-Adresse wird nur zur Benachrichtigung des Nutzers verwendet, sie wird nirgends angezeigt. Die Anzeige des Nutzerkontos im Server-Verzeichnis bzw. dem weltweiten Verzeichnis erfolgt gemäß den Einstellungen des Nutzers, sie ist zur Kommunikation nicht zwingend notwendig."
+
+#: 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 "Diese Daten sind für die Kommunikation notwendig und werden an die Knoten der Kommunikationspartner übermittelt und dort gespeichert. Nutzer können weitere, private Angaben machen, die ebenfalls an die verwendeten Server der Kommunikationspartner übermittelt werden können."
+
+#: 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 "Angemeldete Nutzer können ihre Nutzerdaten jederzeit von den <a href=\"%1$s/settings/uexport\">Kontoeinstellungen</a> aus exportieren. Wenn ein Nutzer wünscht das Nutzerkonto zu löschen, so ist dies jederzeit unter <a href=\"%1$s/removeme\">%1$s/removeme</a> möglich. Die Löschung des Nutzerkontos ist permanent. Die Löschung der Daten wird auch von den Knoten der Kommunikationspartner angefordert."
+
+#: src/Module/Tos.php:40 src/Module/Tos.php:76
+msgid "Privacy Statement"
+msgstr "Datenschutzerklärung"
+
+#: src/Module/Apps.php:29
+msgid "No installed applications."
+msgstr "Keine Applikationen installiert."
+
+#: src/Module/Apps.php:34
+msgid "Applications"
+msgstr "Anwendungen"
+
+#: src/Module/Credits.php:25
+msgid "Credits"
+msgstr "Credits"
+
+#: src/Module/Credits.php:26
+msgid ""
+"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!"
+msgstr "Friendica ist ein Gemeinschaftsprojekt, das nicht ohne die Hilfe vieler Personen möglich wäre. Hier ist eine Aufzählung der Personen, die zum Code oder der Übersetzung beigetragen haben. Dank an alle !"
+
 #: src/Module/Admin/Addons/Details.php:51
 msgid "Addon not found."
 msgstr "Addon nicht gefunden."
@@ -6623,12 +6822,12 @@ msgid "Enable"
 msgstr "Einschalten"
 
 #: src/Module/Admin/Addons/Details.php:99 src/Module/Admin/Addons/Index.php:50
-#: src/Module/Admin/Blocklist/Contact.php:60
+#: src/Module/Admin/Blocklist/Contact.php:61
 #: src/Module/Admin/Blocklist/Server.php:73
-#: src/Module/Admin/Federation.php:185 src/Module/Admin/Item/Delete.php:46
-#: src/Module/Admin/Logs/Settings.php:57 src/Module/Admin/Logs/View.php:46
-#: src/Module/Admin/Queue.php:56 src/Module/Admin/Site.php:568
-#: src/Module/Admin/Summary.php:160 src/Module/Admin/Themes/Details.php:104
+#: src/Module/Admin/Federation.php:187 src/Module/Admin/Item/Delete.php:46
+#: src/Module/Admin/Logs/Settings.php:63 src/Module/Admin/Logs/View.php:46
+#: src/Module/Admin/Queue.php:56 src/Module/Admin/Site.php:567
+#: src/Module/Admin/Summary.php:175 src/Module/Admin/Themes/Details.php:104
 #: src/Module/Admin/Themes/Index.php:93 src/Module/Admin/Tos.php:42
 #: src/Module/Admin/Users.php:277
 msgid "Administration"
@@ -6666,152 +6865,180 @@ msgid ""
 " the open addon registry at %2$s"
 msgstr "Es sind derzeit keine Addons auf diesem Knoten verfügbar. Du findest das offizielle Addon-Repository unter %1$s und weitere eventuell interessante Addons im offenen Addon-Verzeichnis auf %2$s."
 
-#: src/Module/Admin/Blocklist/Contact.php:37
+#: src/Module/Admin/Blocklist/Contact.php:28
+#: src/Console/GlobalCommunityBlock.php:87
+msgid "The contact has been blocked from the node"
+msgstr "Der Kontakt wurde von diesem Knoten geblockt"
+
+#: src/Module/Admin/Blocklist/Contact.php:30
+#: src/Console/GlobalCommunityBlock.php:82
+#, php-format
+msgid "Could not find any contact entry for this URL (%s)"
+msgstr "Für die URL (%s) konnte kein Kontakt gefunden werden"
+
+#: src/Module/Admin/Blocklist/Contact.php:38
 #, php-format
 msgid "%s contact unblocked"
 msgid_plural "%s contacts unblocked"
 msgstr[0] "%sKontakt wieder freigegeben"
 msgstr[1] "%sKontakte wieder freigegeben"
 
-#: src/Module/Admin/Blocklist/Contact.php:61
+#: src/Module/Admin/Blocklist/Contact.php:62
 msgid "Remote Contact Blocklist"
-msgstr "Sperrliste entfernter Kontakte"
+msgstr "Blockliste entfernter Kontakte"
 
-#: src/Module/Admin/Blocklist/Contact.php:62
+#: src/Module/Admin/Blocklist/Contact.php:63
 msgid ""
 "This page allows you to prevent any message from a remote contact to reach "
 "your node."
 msgstr "Auf dieser Seite kannst du Accounts von anderen Knoten blockieren und damit verhindern, dass ihre Beiträge von deinem Knoten angenommen werden."
 
-#: src/Module/Admin/Blocklist/Contact.php:63
+#: src/Module/Admin/Blocklist/Contact.php:64
 msgid "Block Remote Contact"
 msgstr "Blockiere entfernten Kontakt"
 
-#: src/Module/Admin/Blocklist/Contact.php:64 src/Module/Admin/Users.php:280
+#: src/Module/Admin/Blocklist/Contact.php:65 src/Module/Admin/Users.php:280
 msgid "select all"
 msgstr "Alle auswählen"
 
-#: src/Module/Admin/Blocklist/Contact.php:65
+#: src/Module/Admin/Blocklist/Contact.php:66
 msgid "select none"
 msgstr "Auswahl aufheben"
 
-#: src/Module/Admin/Blocklist/Contact.php:67 src/Module/Admin/Users.php:291
-#: src/Module/Contact.php:624 src/Module/Contact.php:827
-#: src/Module/Contact.php:1080
+#: src/Module/Admin/Blocklist/Contact.php:68 src/Module/Admin/Users.php:291
+#: src/Module/Contact.php:623 src/Module/Contact.php:827
+#: src/Module/Contact.php:1076
 msgid "Unblock"
 msgstr "Entsperren"
 
-#: src/Module/Admin/Blocklist/Contact.php:68
+#: src/Module/Admin/Blocklist/Contact.php:69
 msgid "No remote contact is blocked from this node."
 msgstr "Derzeit werden keine Kontakte auf diesem Knoten blockiert."
 
-#: src/Module/Admin/Blocklist/Contact.php:70
+#: src/Module/Admin/Blocklist/Contact.php:71
 msgid "Blocked Remote Contacts"
 msgstr "Blockierte Kontakte von anderen Knoten"
 
-#: src/Module/Admin/Blocklist/Contact.php:71
+#: src/Module/Admin/Blocklist/Contact.php:72
 msgid "Block New Remote Contact"
 msgstr "Blockieren von weiteren Kontakten"
 
-#: src/Module/Admin/Blocklist/Contact.php:72
+#: src/Module/Admin/Blocklist/Contact.php:73
 msgid "Photo"
 msgstr "Foto:"
 
-#: src/Module/Admin/Blocklist/Contact.php:80
+#: src/Module/Admin/Blocklist/Contact.php:73
+msgid "Reason"
+msgstr "Grund"
+
+#: src/Module/Admin/Blocklist/Contact.php:81
 #, php-format
 msgid "%s total blocked contact"
 msgid_plural "%s total blocked contacts"
 msgstr[0] "Insgesamt %s blockierter Kontakt"
 msgstr[1] "Insgesamt %s blockierte Kontakte"
 
-#: src/Module/Admin/Blocklist/Contact.php:82
+#: src/Module/Admin/Blocklist/Contact.php:83
 msgid "URL of the remote contact to block."
 msgstr "Die URL des entfernten Kontakts, der blockiert werden soll."
 
+#: src/Module/Admin/Blocklist/Contact.php:84
+msgid "Block Reason"
+msgstr "Sperrgrund"
+
 #: src/Module/Admin/Blocklist/Server.php:31
-msgid "Server added to blocklist."
-msgstr "Server zur Blockliste hinzugefügt."
+msgid "Server domain pattern added to blocklist."
+msgstr "Server Domain Muster zur Blockliste hinzugefügt"
 
 #: src/Module/Admin/Blocklist/Server.php:47
 msgid "Site blocklist updated."
 msgstr "Blockliste aktualisiert."
 
 #: src/Module/Admin/Blocklist/Server.php:64
-msgid "The blocked domain"
-msgstr "Die blockierte Domain"
+#: src/Module/Admin/Blocklist/Server.php:89
+msgid "Blocked server domain pattern"
+msgstr "Blockierte Server Domain Muster"
 
 #: src/Module/Admin/Blocklist/Server.php:65
-#: src/Module/Admin/Blocklist/Server.php:84 src/Module/Friendica.php:60
+#: src/Module/Admin/Blocklist/Server.php:90 src/Module/Friendica.php:60
 msgid "Reason for the block"
 msgstr "Begründung für die Blockierung"
 
-#: src/Module/Admin/Blocklist/Server.php:65
-#: src/Module/Admin/Blocklist/Server.php:79
-msgid "The reason why you blocked this domain."
-msgstr "Die Begründung, warum du diese Domain blockiert hast."
-
 #: src/Module/Admin/Blocklist/Server.php:66
-msgid "Delete domain"
-msgstr "Domain löschen"
+msgid "Delete server domain pattern"
+msgstr "Server Domain Muster löschen"
 
 #: src/Module/Admin/Blocklist/Server.php:66
 msgid "Check to delete this entry from the blocklist"
 msgstr "Markieren, um diesen Eintrag von der Blocklist zu entfernen"
 
-#: src/Module/Admin/Blocklist/Server.php:74 src/Module/BaseAdminModule.php:94
-msgid "Server Blocklist"
-msgstr "Server Blockliste"
+#: src/Module/Admin/Blocklist/Server.php:74
+msgid "Server Domain Pattern Blocklist"
+msgstr "Server Domain Muster Blockliste"
 
 #: src/Module/Admin/Blocklist/Server.php:75
 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 "
-"domains you should also give a reason why you have blocked the remote "
-"server."
-msgstr "Auf dieser Seite kannst du die Liste der blockierten Domains aus dem föderalen Netzwerk verwalten, denen es untersagt ist, mit deinem Knoten zu interagieren. Für jede der blockierten Domains musst du außerdem einen Grund für die Sperrung angeben."
+"This page can be used to define a blacklist of server domain patterns from "
+"the federated network that are not allowed to interact with your node. For "
+"each domain pattern you should also provide the reason why you block it."
+msgstr "Auf dieser Seite kannst du Muster definieren mit denen Server Domains aus dem föderierten Netzwerk daran gehindert werden mit deiner Instanz zu interagieren. Es ist ratsam für jedes Muster anzugeben, warum du es zur Blockliste hinzugefügt hast."
 
 #: src/Module/Admin/Blocklist/Server.php:76
 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 "Die Liste der blockierten Domains wird auf der /friendica Seite öffentlich einsehbar gemacht, damit deine Nutzer und Personen, die Kommunikationsprobleme erkunden, die Ursachen einfach finden können."
+"The list of blocked server domain patterns will be made publically available"
+" on the <a href=\"/friendica\">/friendica</a> page so that your users and "
+"people investigating communication problems can find the reason easily."
+msgstr "Die Liste der blockierten Domain Muster wird auf der Seite <a href=\"/friendica\">/friendica</a> öffentlich einsehbar gemacht, damit deine Nutzer und Personen, die Kommunikationsprobleme erkunden, die Ursachen einfach finden können."
 
 #: src/Module/Admin/Blocklist/Server.php:77
+msgid ""
+"<p>The server domain pattern syntax is case-insensitive shell wildcard, comprising the following special characters:</p>\n"
+"<ul>\n"
+"\t<li><code>*</code>: Any number of characters</li>\n"
+"\t<li><code>?</code>: Any single character</li>\n"
+"\t<li><code>[&lt;char1&gt;&lt;char2&gt;...]</code>: char1 or char2</li>\n"
+"</ul>"
+msgstr "<p>Die Server Domain Muster sind Groß-/Kleinschreibung unabhängig mit Shell-Jokerzeichen, die die folgenden Sonderzeichen umfassen:</p>\n<ul>\n\t<li><code>*</code>: Beliebige Anzahl von Zeichen</li>\n\t<li><code>?</code>: Ein einzelnes beliebiges Zeichen</li>\n\t<li><code>[&lt;Zeichen1&gt;&lt;Zeichen2&gt;...]</code>:Zeichen1 oder Zeichen2</li>\n</ul>"
+
+#: src/Module/Admin/Blocklist/Server.php:83
 msgid "Add new entry to block list"
 msgstr "Neuen Eintrag in die Blockliste"
 
-#: src/Module/Admin/Blocklist/Server.php:78
-msgid "Server Domain"
-msgstr "Domain des Servers"
+#: src/Module/Admin/Blocklist/Server.php:84
+msgid "Server Domain Pattern"
+msgstr "Server Domain Muster"
 
-#: src/Module/Admin/Blocklist/Server.php:78
+#: src/Module/Admin/Blocklist/Server.php:84
 msgid ""
-"The domain of the new server to add to the block list. Do not include the "
-"protocol."
-msgstr "Der Domain-Name des Servers, der geblockt werden soll. Gib das Protokoll nicht mit an!"
+"The domain pattern of the new server to add to the block list. Do not "
+"include the protocol."
+msgstr "Das Muster für Server Domains die geblockt werden sollen. Gib das Protokoll nicht mit an!"
 
-#: src/Module/Admin/Blocklist/Server.php:79
+#: src/Module/Admin/Blocklist/Server.php:85
 msgid "Block reason"
 msgstr "Begründung der Blockierung"
 
-#: src/Module/Admin/Blocklist/Server.php:80
+#: src/Module/Admin/Blocklist/Server.php:85
+msgid "The reason why you blocked this server domain pattern."
+msgstr "Die Begründung, warum du dieses Domain Muster blockiert hast."
+
+#: src/Module/Admin/Blocklist/Server.php:86
 msgid "Add Entry"
 msgstr "Eintrag hinzufügen"
 
-#: src/Module/Admin/Blocklist/Server.php:81
+#: src/Module/Admin/Blocklist/Server.php:87
 msgid "Save changes to the blocklist"
 msgstr "Änderungen der Blockliste speichern"
 
-#: src/Module/Admin/Blocklist/Server.php:82
+#: src/Module/Admin/Blocklist/Server.php:88
 msgid "Current Entries in the Blocklist"
 msgstr "Aktuelle Einträge der Blockliste"
 
-#: src/Module/Admin/Blocklist/Server.php:85
+#: src/Module/Admin/Blocklist/Server.php:91
 msgid "Delete entry from blocklist"
 msgstr "Eintrag von der Blockliste entfernen"
 
-#: src/Module/Admin/Blocklist/Server.php:88
+#: src/Module/Admin/Blocklist/Server.php:94
 msgid "Delete entry from blocklist?"
 msgstr "Eintrag von der Blockliste entfernen?"
 
@@ -6887,24 +7114,24 @@ msgstr "Zusätzliche Features Verwalten"
 msgid "unknown"
 msgstr "Unbekannt"
 
-#: src/Module/Admin/Federation.php:179
+#: src/Module/Admin/Federation.php:181
 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 "Diese Seite präsentiert einige Zahlen zu dem bekannten Teil des föderalen sozialen Netzwerks, von dem deine Friendica Installation ein Teil ist. Diese Zahlen sind nicht absolut und reflektieren nur den Teil des Netzwerks, den dein Knoten kennt."
 
-#: src/Module/Admin/Federation.php:180
+#: src/Module/Admin/Federation.php:182
 msgid ""
 "The <em>Auto Discovered Contact Directory</em> feature is not enabled, it "
 "will improve the data displayed here."
 msgstr "Die Funktion <em>\"Regelmäßig globale Kontakte überprüfen\"</em> ist nicht aktiv. Sie wird die hier angezeigten Daten verbessern."
 
-#: src/Module/Admin/Federation.php:186 src/Module/BaseAdminModule.php:77
+#: src/Module/Admin/Federation.php:188 src/Module/BaseAdminModule.php:77
 msgid "Federation Statistics"
 msgstr "Föderation Statistik"
 
-#: src/Module/Admin/Federation.php:192
+#: src/Module/Admin/Federation.php:194
 #, php-format
 msgid ""
 "Currently this node is aware of %d nodes with %d registered users from the "
@@ -6944,54 +7171,60 @@ msgstr "GUID"
 msgid "The GUID of the item you want to delete."
 msgstr "Die GUID des zu löschenden Eintrags"
 
-#: src/Module/Admin/Item/Source.php:46 src/Module/Itemsource.php:46
+#: src/Module/Admin/Item/Source.php:46
 msgid "Item Guid"
 msgstr "Beitrags-Guid"
 
-#: src/Module/Admin/Logs/Settings.php:30
+#: src/Module/Admin/Logs/Settings.php:27 src/Module/Admin/Summary.php:83
+#: src/Module/Admin/Summary.php:90
+#, php-format
+msgid "The logfile '%s' is not writable. No logging possible"
+msgstr "Die Logdatei '%s' ist nicht beschreibbar. Derzeit ist keine Aufzeichnung möglich."
+
+#: src/Module/Admin/Logs/Settings.php:36
 msgid "Log settings updated."
 msgstr "Protokolleinstellungen aktualisiert."
 
-#: src/Module/Admin/Logs/Settings.php:49
+#: src/Module/Admin/Logs/Settings.php:55
 msgid "PHP log currently enabled."
 msgstr "PHP Protokollierung ist derzeit aktiviert."
 
-#: src/Module/Admin/Logs/Settings.php:51
+#: src/Module/Admin/Logs/Settings.php:57
 msgid "PHP log currently disabled."
 msgstr "PHP Protokollierung ist derzeit nicht aktiviert."
 
-#: src/Module/Admin/Logs/Settings.php:58 src/Module/BaseAdminModule.php:97
+#: src/Module/Admin/Logs/Settings.php:64 src/Module/BaseAdminModule.php:97
 #: src/Module/BaseAdminModule.php:98
 msgid "Logs"
 msgstr "Protokolle"
 
-#: src/Module/Admin/Logs/Settings.php:60
+#: src/Module/Admin/Logs/Settings.php:66
 msgid "Clear"
 msgstr "löschen"
 
-#: src/Module/Admin/Logs/Settings.php:64
+#: src/Module/Admin/Logs/Settings.php:70
 msgid "Enable Debugging"
 msgstr "Protokoll führen"
 
-#: src/Module/Admin/Logs/Settings.php:65
+#: src/Module/Admin/Logs/Settings.php:71
 msgid "Log file"
 msgstr "Protokolldatei"
 
-#: src/Module/Admin/Logs/Settings.php:65
+#: src/Module/Admin/Logs/Settings.php:71
 msgid ""
 "Must be writable by web server. Relative to your Friendica top-level "
 "directory."
 msgstr "Webserver muss Schreibrechte besitzen. Abhängig vom Friendica-Installationsverzeichnis."
 
-#: src/Module/Admin/Logs/Settings.php:66
+#: src/Module/Admin/Logs/Settings.php:72
 msgid "Log level"
 msgstr "Protokoll-Level"
 
-#: src/Module/Admin/Logs/Settings.php:68
+#: src/Module/Admin/Logs/Settings.php:74
 msgid "PHP logging"
 msgstr "PHP Protokollieren"
 
-#: src/Module/Admin/Logs/Settings.php:69
+#: src/Module/Admin/Logs/Settings.php:75
 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 "
@@ -7054,7 +7287,7 @@ msgstr "Erstellt"
 msgid "Priority"
 msgstr "Priorität"
 
-#: src/Module/Admin/Site.php:49
+#: src/Module/Admin/Site.php:50
 msgid "Can not parse base url. Must have at least <scheme>://<domain>"
 msgstr "Die Basis-URL konnte nicht analysiert werden. Sie muss mindestens aus <protokoll>://<domain> bestehen"
 
@@ -7062,260 +7295,260 @@ msgstr "Die Basis-URL konnte nicht analysiert werden. Sie muss mindestens aus <p
 msgid "Invalid storage backend setting value."
 msgstr "Ungültige Einstellung für das Datenspeicher-Backend"
 
-#: src/Module/Admin/Site.php:412
+#: src/Module/Admin/Site.php:411
 msgid "Site settings updated."
 msgstr "Seiteneinstellungen aktualisiert."
 
-#: src/Module/Admin/Site.php:464
+#: src/Module/Admin/Site.php:463
 msgid "No community page for local users"
 msgstr "Keine Gemeinschaftsseite für lokale Nutzer"
 
-#: src/Module/Admin/Site.php:465
+#: src/Module/Admin/Site.php:464
 msgid "No community page"
 msgstr "Keine Gemeinschaftsseite"
 
-#: src/Module/Admin/Site.php:466
+#: src/Module/Admin/Site.php:465
 msgid "Public postings from users of this site"
 msgstr "Öffentliche Beiträge von NutzerInnen dieser Seite"
 
-#: src/Module/Admin/Site.php:467
+#: src/Module/Admin/Site.php:466
 msgid "Public postings from the federated network"
 msgstr "Öffentliche Beiträge aus dem föderalen Netzwerk"
 
-#: src/Module/Admin/Site.php:468
+#: src/Module/Admin/Site.php:467
 msgid "Public postings from local users and the federated network"
 msgstr "Öffentliche Beiträge von lokalen Nutzern und aus dem föderalen Netzwerk"
 
-#: src/Module/Admin/Site.php:472 src/Module/Admin/Site.php:668
-#: src/Module/Admin/Site.php:678 src/Module/Contact.php:549
-#: src/Module/Settings/TwoFactor/Index.php:91
+#: src/Module/Admin/Site.php:471 src/Module/Admin/Site.php:666
+#: src/Module/Admin/Site.php:676 src/Module/Contact.php:563
+#: src/Module/Settings/TwoFactor/Index.php:97
 msgid "Disabled"
 msgstr "Deaktiviert"
 
-#: src/Module/Admin/Site.php:473 src/Module/Admin/Users.php:278
+#: src/Module/Admin/Site.php:472 src/Module/Admin/Users.php:278
 #: src/Module/Admin/Users.php:295 src/Module/BaseAdminModule.php:81
 msgid "Users"
 msgstr "Nutzer"
 
-#: src/Module/Admin/Site.php:474
+#: src/Module/Admin/Site.php:473
 msgid "Users, Global Contacts"
 msgstr "Nutzer, globale Kontakte"
 
-#: src/Module/Admin/Site.php:475
+#: src/Module/Admin/Site.php:474
 msgid "Users, Global Contacts/fallback"
 msgstr "Nutzer, globale Kontakte / Fallback"
 
-#: src/Module/Admin/Site.php:479
+#: src/Module/Admin/Site.php:478
 msgid "One month"
 msgstr "ein Monat"
 
-#: src/Module/Admin/Site.php:480
+#: src/Module/Admin/Site.php:479
 msgid "Three months"
 msgstr "drei Monate"
 
-#: src/Module/Admin/Site.php:481
+#: src/Module/Admin/Site.php:480
 msgid "Half a year"
 msgstr "ein halbes Jahr"
 
-#: src/Module/Admin/Site.php:482
+#: src/Module/Admin/Site.php:481
 msgid "One year"
 msgstr "ein Jahr"
 
-#: src/Module/Admin/Site.php:488
+#: src/Module/Admin/Site.php:487
 msgid "Multi user instance"
 msgstr "Mehrbenutzer-Instanz"
 
-#: src/Module/Admin/Site.php:510
+#: src/Module/Admin/Site.php:509
 msgid "Closed"
 msgstr "Geschlossen"
 
-#: src/Module/Admin/Site.php:511
+#: src/Module/Admin/Site.php:510
 msgid "Requires approval"
 msgstr "Bedarf der Zustimmung"
 
-#: src/Module/Admin/Site.php:512
+#: src/Module/Admin/Site.php:511
 msgid "Open"
 msgstr "Offen"
 
-#: src/Module/Admin/Site.php:516 src/Module/Install.php:181
+#: src/Module/Admin/Site.php:515 src/Module/Install.php:183
 msgid "No SSL policy, links will track page SSL state"
 msgstr "Keine SSL-Richtlinie, Links werden das verwendete Protokoll beibehalten"
 
-#: src/Module/Admin/Site.php:517 src/Module/Install.php:182
+#: src/Module/Admin/Site.php:516 src/Module/Install.php:184
 msgid "Force all links to use SSL"
 msgstr "SSL für alle Links erzwingen"
 
-#: src/Module/Admin/Site.php:518 src/Module/Install.php:183
+#: src/Module/Admin/Site.php:517 src/Module/Install.php:185
 msgid "Self-signed certificate, use SSL for local links only (discouraged)"
 msgstr "Selbst-unterzeichnetes Zertifikat, SSL nur für lokale Links verwenden (nicht empfohlen)"
 
-#: src/Module/Admin/Site.php:522
+#: src/Module/Admin/Site.php:521
 msgid "Don't check"
 msgstr "Nicht überprüfen"
 
-#: src/Module/Admin/Site.php:523
+#: src/Module/Admin/Site.php:522
 msgid "check the stable version"
 msgstr "überprüfe die stabile Version"
 
-#: src/Module/Admin/Site.php:524
+#: src/Module/Admin/Site.php:523
 msgid "check the development version"
 msgstr "überprüfe die Entwicklungsversion"
 
-#: src/Module/Admin/Site.php:544
+#: src/Module/Admin/Site.php:543
 msgid "Database (legacy)"
 msgstr "Datenbank (legacy)"
 
-#: src/Module/Admin/Site.php:569 src/Module/BaseAdminModule.php:80
+#: src/Module/Admin/Site.php:568 src/Module/BaseAdminModule.php:80
 msgid "Site"
 msgstr "Seite"
 
-#: src/Module/Admin/Site.php:571
+#: src/Module/Admin/Site.php:570
 msgid "Republish users to directory"
 msgstr "Nutzer erneut im globalen Verzeichnis veröffentlichen."
 
-#: src/Module/Admin/Site.php:572 src/Module/Register.php:121
+#: src/Module/Admin/Site.php:571 src/Module/Register.php:121
 msgid "Registration"
 msgstr "Registrierung"
 
-#: src/Module/Admin/Site.php:573
+#: src/Module/Admin/Site.php:572
 msgid "File upload"
 msgstr "Datei hochladen"
 
-#: src/Module/Admin/Site.php:574
+#: src/Module/Admin/Site.php:573
 msgid "Policies"
 msgstr "Regeln"
 
-#: src/Module/Admin/Site.php:576
+#: src/Module/Admin/Site.php:575
 msgid "Auto Discovered Contact Directory"
 msgstr "Automatisch ein Kontaktverzeichnis erstellen"
 
-#: src/Module/Admin/Site.php:577
+#: src/Module/Admin/Site.php:576
 msgid "Performance"
 msgstr "Performance"
 
-#: src/Module/Admin/Site.php:578
+#: src/Module/Admin/Site.php:577
 msgid "Worker"
 msgstr "Worker"
 
-#: src/Module/Admin/Site.php:579
+#: src/Module/Admin/Site.php:578
 msgid "Message Relay"
 msgstr "Nachrichten-Relais"
 
-#: src/Module/Admin/Site.php:580
+#: src/Module/Admin/Site.php:579
 msgid "Relocate Instance"
 msgstr "Instanz Umziehen"
 
-#: src/Module/Admin/Site.php:581
+#: src/Module/Admin/Site.php:580
 msgid "Warning! Advanced function. Could make this server unreachable."
 msgstr "WARNUNG: Funktion für Fortgeschrittene. Könnte diesen Server unerreichbar machen."
 
-#: src/Module/Admin/Site.php:585
+#: src/Module/Admin/Site.php:584
 msgid "Site name"
 msgstr "Seitenname"
 
-#: src/Module/Admin/Site.php:586
+#: src/Module/Admin/Site.php:585
 msgid "Sender Email"
 msgstr "Absender für Emails"
 
-#: src/Module/Admin/Site.php:586
+#: src/Module/Admin/Site.php:585
 msgid ""
 "The email address your server shall use to send notification emails from."
 msgstr "Die E-Mail Adresse, die dein Server zum Versenden von Benachrichtigungen verwenden soll."
 
-#: src/Module/Admin/Site.php:587
+#: src/Module/Admin/Site.php:586
 msgid "Banner/Logo"
 msgstr "Banner/Logo"
 
-#: src/Module/Admin/Site.php:588
+#: src/Module/Admin/Site.php:587
 msgid "Shortcut icon"
 msgstr "Shortcut Icon"
 
-#: src/Module/Admin/Site.php:588
+#: src/Module/Admin/Site.php:587
 msgid "Link to an icon that will be used for browsers."
 msgstr "Link zu einem Icon, das Browser verwenden werden."
 
-#: src/Module/Admin/Site.php:589
+#: src/Module/Admin/Site.php:588
 msgid "Touch icon"
 msgstr "Touch Icon"
 
-#: src/Module/Admin/Site.php:589
+#: src/Module/Admin/Site.php:588
 msgid "Link to an icon that will be used for tablets and mobiles."
 msgstr "Link zu einem Icon, das Tablets und Mobiltelefone verwenden sollen."
 
-#: src/Module/Admin/Site.php:590
+#: src/Module/Admin/Site.php:589
 msgid "Additional Info"
 msgstr "Zusätzliche Informationen"
 
-#: src/Module/Admin/Site.php:590
+#: src/Module/Admin/Site.php:589
 #, php-format
 msgid ""
 "For public servers: you can add additional information here that will be "
 "listed at %s/servers."
 msgstr "Für öffentliche Server kannst du hier zusätzliche Informationen angeben, die dann auf %s/servers angezeigt werden."
 
-#: src/Module/Admin/Site.php:591
+#: src/Module/Admin/Site.php:590
 msgid "System language"
 msgstr "Systemsprache"
 
-#: src/Module/Admin/Site.php:592
+#: src/Module/Admin/Site.php:591
 msgid "System theme"
 msgstr "Systemweites Theme"
 
-#: src/Module/Admin/Site.php:592
+#: src/Module/Admin/Site.php:591
 msgid ""
 "Default system theme - may be over-ridden by user profiles - <a "
 "href=\"/admin/themes\" id=\"cnftheme\">Change default theme settings</a>"
 msgstr "Standard-Theme des Systems - kann von Benutzerprofilen überschrieben werden - <a href=\"/admin/themes\" id=\"cnftheme\">Ändere Einstellung des Standard-Themes</a>"
 
-#: src/Module/Admin/Site.php:593
+#: src/Module/Admin/Site.php:592
 msgid "Mobile system theme"
 msgstr "Systemweites mobiles Theme"
 
-#: src/Module/Admin/Site.php:593
+#: src/Module/Admin/Site.php:592
 msgid "Theme for mobile devices"
 msgstr "Theme für mobile Geräte"
 
-#: src/Module/Admin/Site.php:594 src/Module/Install.php:191
+#: src/Module/Admin/Site.php:593 src/Module/Install.php:193
 msgid "SSL link policy"
 msgstr "Regeln für SSL Links"
 
-#: src/Module/Admin/Site.php:594 src/Module/Install.php:193
+#: src/Module/Admin/Site.php:593 src/Module/Install.php:195
 msgid "Determines whether generated links should be forced to use SSL"
 msgstr "Bestimmt, ob generierte Links SSL verwenden müssen"
 
-#: src/Module/Admin/Site.php:595
+#: src/Module/Admin/Site.php:594
 msgid "Force SSL"
 msgstr "Erzwinge SSL"
 
-#: src/Module/Admin/Site.php:595
+#: src/Module/Admin/Site.php:594
 msgid ""
 "Force all Non-SSL requests to SSL - Attention: on some systems it could lead"
 " to endless loops."
 msgstr "Erzwinge SSL für alle Nicht-SSL-Anfragen - Achtung: auf manchen Systemen verursacht dies eine Endlosschleife."
 
-#: src/Module/Admin/Site.php:596
+#: src/Module/Admin/Site.php:595
 msgid "Hide help entry from navigation menu"
 msgstr "Verberge den Hilfe-Eintrag im Navigationsmenü"
 
-#: src/Module/Admin/Site.php:596
+#: src/Module/Admin/Site.php:595
 msgid ""
 "Hides the menu entry for the Help pages from the navigation menu. You can "
 "still access it calling /help directly."
 msgstr "Verbirgt den Menüeintrag für die Hilfe-Seiten im Navigationsmenü. Die Seiten können weiterhin über /help aufgerufen werden."
 
-#: src/Module/Admin/Site.php:597
+#: src/Module/Admin/Site.php:596
 msgid "Single user instance"
 msgstr "Ein-Nutzer Instanz"
 
-#: src/Module/Admin/Site.php:597
+#: src/Module/Admin/Site.php:596
 msgid "Make this instance multi-user or single-user for the named user"
 msgstr "Bestimmt, ob es sich bei dieser Instanz um eine Installation mit nur einen Nutzer oder mit mehreren Nutzern handelt."
 
-#: src/Module/Admin/Site.php:599
+#: src/Module/Admin/Site.php:598
 msgid "File storage backend"
 msgstr "Datenspeicher-Backend"
 
-#: src/Module/Admin/Site.php:599
+#: src/Module/Admin/Site.php:598
 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 "
@@ -7324,190 +7557,190 @@ msgid ""
 " for more information about the choices and the moving procedure."
 msgstr "Das zu verwendende Datenspeicher-Backend, wenn Dateien hochgeladen werden. Wenn du das Datenspeicher-Backend änderst, kannst du die bestehenden Dateien zum neuen Backend verschieben. Machst du dies nicht, verbleiben sie im alten Backend und werden weiterhin von dort geladen. Für weitere Informationen zu den verfügbaren Alternativen und der Prozedur zum Verschieben der Daten schaue bitte in <a href=\"/help/Settings#1_2_3_1\">die Dokumentation zu den Einstellungen</a>."
 
-#: src/Module/Admin/Site.php:601
+#: src/Module/Admin/Site.php:600
 msgid "Maximum image size"
 msgstr "Maximale Bildgröße"
 
-#: src/Module/Admin/Site.php:601
+#: src/Module/Admin/Site.php:600
 msgid ""
 "Maximum size in bytes of uploaded images. Default is 0, which means no "
 "limits."
 msgstr "Maximale Uploadgröße von Bildern in Bytes. Standard ist 0, d.h. ohne Limit."
 
-#: src/Module/Admin/Site.php:602
+#: src/Module/Admin/Site.php:601
 msgid "Maximum image length"
 msgstr "Maximale Bildlänge"
 
-#: src/Module/Admin/Site.php:602
+#: src/Module/Admin/Site.php:601
 msgid ""
 "Maximum length in pixels of the longest side of uploaded images. Default is "
 "-1, which means no limits."
 msgstr "Maximale Länge in Pixeln der längsten Seite eines hochgeladenen Bildes. Grundeinstellung ist -1, was keine Einschränkung bedeutet."
 
-#: src/Module/Admin/Site.php:603
+#: src/Module/Admin/Site.php:602
 msgid "JPEG image quality"
 msgstr "Qualität des JPEG Bildes"
 
-#: src/Module/Admin/Site.php:603
+#: src/Module/Admin/Site.php:602
 msgid ""
 "Uploaded JPEGS will be saved at this quality setting [0-100]. Default is "
 "100, which is full quality."
 msgstr "Hochgeladene JPEG-Bilder werden mit dieser Qualität [0-100] gespeichert. Grundeinstellung ist 100, kein Qualitätsverlust."
 
-#: src/Module/Admin/Site.php:605
+#: src/Module/Admin/Site.php:604
 msgid "Register policy"
 msgstr "Registrierungsmethode"
 
-#: src/Module/Admin/Site.php:606
+#: src/Module/Admin/Site.php:605
 msgid "Maximum Daily Registrations"
 msgstr "Maximum täglicher Registrierungen"
 
-#: src/Module/Admin/Site.php:606
+#: src/Module/Admin/Site.php:605
 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 "Wenn die Registrierung weiter oben erlaubt ist, regelt dies die maximale Anzahl von Neuanmeldungen pro Tag. Wenn die Registrierung geschlossen ist, hat diese Einstellung keinen Effekt."
 
-#: src/Module/Admin/Site.php:607
+#: src/Module/Admin/Site.php:606
 msgid "Register text"
 msgstr "Registrierungstext"
 
-#: src/Module/Admin/Site.php:607
+#: src/Module/Admin/Site.php:606
 msgid ""
 "Will be displayed prominently on the registration page. You can use BBCode "
 "here."
 msgstr "Wird gut sichtbar auf der Registrierungsseite angezeigt. BBCode kann verwendet werden."
 
-#: src/Module/Admin/Site.php:608
+#: src/Module/Admin/Site.php:607
 msgid "Forbidden Nicknames"
 msgstr "Verbotene Spitznamen"
 
-#: src/Module/Admin/Site.php:608
+#: src/Module/Admin/Site.php:607
 msgid ""
 "Comma separated list of nicknames that are forbidden from registration. "
 "Preset is a list of role names according RFC 2142."
 msgstr "Durch Kommas getrennte Liste von Spitznamen, die von der Registrierung ausgeschlossen sind. Die Vorgabe ist eine Liste von Rollennamen nach RFC 2142."
 
-#: src/Module/Admin/Site.php:609
+#: src/Module/Admin/Site.php:608
 msgid "Accounts abandoned after x days"
 msgstr "Nutzerkonten gelten nach x Tagen als unbenutzt"
 
-#: src/Module/Admin/Site.php:609
+#: src/Module/Admin/Site.php:608
 msgid ""
 "Will not waste system resources polling external sites for abandonded "
 "accounts. Enter 0 for no time limit."
 msgstr "Verschwende keine System-Ressourcen auf das Pollen externer Seiten, wenn Konten nicht mehr benutzt werden. 0 eingeben für kein Limit."
 
-#: src/Module/Admin/Site.php:610
+#: src/Module/Admin/Site.php:609
 msgid "Allowed friend domains"
 msgstr "Erlaubte Domains für Kontakte"
 
-#: src/Module/Admin/Site.php:610
+#: src/Module/Admin/Site.php:609
 msgid ""
 "Comma separated list of domains which are allowed to establish friendships "
 "with this site. Wildcards are accepted. Empty to allow any domains"
 msgstr "Liste der Domains, die für Kontakte erlaubt sind, durch Kommas getrennt. Platzhalter werden akzeptiert. Leer lassen, um alle Domains zu erlauben."
 
-#: src/Module/Admin/Site.php:611
+#: src/Module/Admin/Site.php:610
 msgid "Allowed email domains"
 msgstr "Erlaubte Domains für E-Mails"
 
-#: src/Module/Admin/Site.php:611
+#: src/Module/Admin/Site.php:610
 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 "Liste der Domains, die für E-Mail-Adressen bei der Registrierung erlaubt sind, durch Kommas getrennt. Platzhalter werden akzeptiert. Leer lassen, um alle Domains zu erlauben."
 
-#: src/Module/Admin/Site.php:612
+#: src/Module/Admin/Site.php:611
 msgid "No OEmbed rich content"
 msgstr "OEmbed nicht verwenden"
 
-#: src/Module/Admin/Site.php:612
+#: src/Module/Admin/Site.php:611
 msgid ""
 "Don't show the rich content (e.g. embedded PDF), except from the domains "
 "listed below."
 msgstr "Verhindert das Einbetten von reichhaltigen Inhalten (z.B. eingebettete PDF Dateien). Ausgenommen von dieser Regel werden Domänen, die unten aufgeführt werden."
 
-#: src/Module/Admin/Site.php:613
+#: src/Module/Admin/Site.php:612
 msgid "Allowed OEmbed domains"
 msgstr "Erlaubte OEmbed-Domänen"
 
-#: src/Module/Admin/Site.php:613
+#: src/Module/Admin/Site.php:612
 msgid ""
 "Comma separated list of domains which oembed content is allowed to be "
 "displayed. Wildcards are accepted."
 msgstr "Durch Kommas getrennte Liste von Domänen, für die das Einbetten reichhaltiger Inhalte erlaubt ist. Platzhalter können verwendet werden."
 
-#: src/Module/Admin/Site.php:614
+#: src/Module/Admin/Site.php:613
 msgid "Block public"
 msgstr "Öffentlichen Zugriff blockieren"
 
-#: src/Module/Admin/Site.php:614
+#: src/Module/Admin/Site.php:613
 msgid ""
 "Check to block public access to all otherwise public personal pages on this "
 "site unless you are currently logged in."
 msgstr "Klicken, um öffentlichen Zugriff auf sonst öffentliche Profile zu blockieren, wenn man nicht eingeloggt ist."
 
-#: src/Module/Admin/Site.php:615
+#: src/Module/Admin/Site.php:614
 msgid "Force publish"
 msgstr "Erzwinge Veröffentlichung"
 
-#: src/Module/Admin/Site.php:615
+#: src/Module/Admin/Site.php:614
 msgid ""
 "Check to force all profiles on this site to be listed in the site directory."
 msgstr "Klicken, um Anzeige aller Profile dieses Servers im Verzeichnis zu erzwingen."
 
-#: src/Module/Admin/Site.php:615
+#: src/Module/Admin/Site.php:614
 msgid "Enabling this may violate privacy laws like the GDPR"
 msgstr "Wenn du diese Option aktivierst, verstößt das unter Umständen gegen Gesetze wie die EU-DSGVO."
 
-#: src/Module/Admin/Site.php:616
+#: src/Module/Admin/Site.php:615
 msgid "Global directory URL"
 msgstr "URL des weltweiten Verzeichnisses"
 
-#: src/Module/Admin/Site.php:616
+#: src/Module/Admin/Site.php:615
 msgid ""
 "URL to the global directory. If this is not set, the global directory is "
 "completely unavailable to the application."
 msgstr "URL des weltweiten Verzeichnisses. Wenn diese nicht gesetzt ist, ist das Verzeichnis für die Applikation nicht erreichbar."
 
-#: src/Module/Admin/Site.php:617
+#: src/Module/Admin/Site.php:616
 msgid "Private posts by default for new users"
 msgstr "Private Beiträge als Standard für neue Nutzer"
 
-#: src/Module/Admin/Site.php:617
+#: src/Module/Admin/Site.php:616
 msgid ""
 "Set default post permissions for all new members to the default privacy "
 "group rather than public."
 msgstr "Die Standard-Zugriffsrechte für neue Nutzer werden so gesetzt, dass als Voreinstellung in die private Gruppe gepostet wird anstelle von öffentlichen Beiträgen."
 
-#: src/Module/Admin/Site.php:618
+#: src/Module/Admin/Site.php:617
 msgid "Don't include post content in email notifications"
 msgstr "Inhalte von Beiträgen nicht in E-Mail-Benachrichtigungen versenden"
 
-#: src/Module/Admin/Site.php:618
+#: src/Module/Admin/Site.php:617
 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 "Inhalte von Beiträgen/Kommentaren/privaten Nachrichten/usw. zum Datenschutz nicht in E-Mail-Benachrichtigungen einbinden."
 
-#: src/Module/Admin/Site.php:619
+#: src/Module/Admin/Site.php:618
 msgid "Disallow public access to addons listed in the apps menu."
 msgstr "Öffentlichen Zugriff auf Addons im Apps Menü verbieten."
 
-#: src/Module/Admin/Site.php:619
+#: src/Module/Admin/Site.php:618
 msgid ""
 "Checking this box will restrict addons listed in the apps menu to members "
 "only."
 msgstr "Wenn ausgewählt, werden die im Apps Menü aufgeführten Addons nur angemeldeten Nutzern der Seite zur Verfügung gestellt."
 
-#: src/Module/Admin/Site.php:620
+#: src/Module/Admin/Site.php:619
 msgid "Don't embed private images in posts"
 msgstr "Private Bilder nicht in Beiträgen einbetten."
 
-#: src/Module/Admin/Site.php:620
+#: src/Module/Admin/Site.php:619
 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 "
@@ -7515,11 +7748,11 @@ msgid ""
 "while."
 msgstr "Ersetze lokal gehostete, private Fotos in Beiträgen nicht mit einer eingebetteten Kopie des Bildes. Dies bedeutet, dass Kontakte, die Beiträge mit privaten Fotos erhalten, sich zunächst auf den jeweiligen Servern authentifizieren müssen, bevor die Bilder geladen und angezeigt werden, was eine gewisse Zeit dauert."
 
-#: src/Module/Admin/Site.php:621
+#: src/Module/Admin/Site.php:620
 msgid "Explicit Content"
 msgstr "Sensibler Inhalt"
 
-#: src/Module/Admin/Site.php:621
+#: src/Module/Admin/Site.php:620
 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 "
@@ -7528,211 +7761,200 @@ msgid ""
 "will be shown at the user registration page."
 msgstr "Wähle dies, um anzuzeigen, dass dein Knoten hauptsächlich für explizite Inhalte verwendet wird, die möglicherweise nicht für Minderjährige geeignet sind. Diese Info wird in der Knoteninformation veröffentlicht und kann durch das Globale Verzeichnis genutzt werden, um deinen Knoten von den Auflistungen auszuschließen. Zusätzlich wird auf der Registrierungsseite ein Hinweis darüber angezeigt."
 
-#: src/Module/Admin/Site.php:622
+#: src/Module/Admin/Site.php:621
 msgid "Allow Users to set remote_self"
 msgstr "Nutzern erlauben, das remote_self Flag zu setzen"
 
-#: src/Module/Admin/Site.php:622
+#: src/Module/Admin/Site.php:621
 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 "Ist dies ausgewählt, kann jeder Nutzer jeden seiner Kontakte als remote_self (entferntes Konto) im \"Erweitert\"-Reiter der Kontaktansicht markieren. Nach dem Setzen dieses Flags werden alle Top-Level-Beiträge dieser Kontakte automatisch in den Stream dieses Nutzers gepostet (gespiegelt)."
 
-#: src/Module/Admin/Site.php:623
+#: src/Module/Admin/Site.php:622
 msgid "Block multiple registrations"
 msgstr "Unterbinde Mehrfachregistrierung"
 
-#: src/Module/Admin/Site.php:623
+#: src/Module/Admin/Site.php:622
 msgid "Disallow users to register additional accounts for use as pages."
 msgstr "Benutzern nicht erlauben, weitere Konten für Organisationsseiten o. ä. mit der gleichen E-Mail-Adresse anzulegen."
 
-#: src/Module/Admin/Site.php:624
+#: src/Module/Admin/Site.php:623
 msgid "Disable OpenID"
 msgstr "OpenID deaktivieren"
 
-#: src/Module/Admin/Site.php:624
+#: src/Module/Admin/Site.php:623
 msgid "Disable OpenID support for registration and logins."
 msgstr "OpenID-Unterstützung für Registrierung und Login."
 
-#: src/Module/Admin/Site.php:625
+#: src/Module/Admin/Site.php:624
 msgid "No Fullname check"
 msgstr "Namen nicht auf Vollständigkeit überprüfen"
 
-#: src/Module/Admin/Site.php:625
+#: src/Module/Admin/Site.php:624
 msgid ""
 "Allow users to register without a space between the first name and the last "
 "name in their full name."
 msgstr "Erlaubt Nutzern, Konten zu registrieren, bei denen im Namensfeld kein Leerzeichen zur Trennung von Vor- und Nachnamen verwendet wird."
 
-#: src/Module/Admin/Site.php:626
+#: src/Module/Admin/Site.php:625
 msgid "Community pages for visitors"
 msgstr "Für Besucher verfügbare Gemeinschaftsseite"
 
-#: src/Module/Admin/Site.php:626
+#: src/Module/Admin/Site.php:625
 msgid ""
 "Which community pages should be available for visitors. Local users always "
 "see both pages."
 msgstr "Welche Gemeinschaftsseiten sollen für Besucher dieses Knotens verfügbar sein? Lokale Nutzer können grundsätzlich beide Seiten verwenden."
 
-#: src/Module/Admin/Site.php:627
+#: src/Module/Admin/Site.php:626
 msgid "Posts per user on community page"
 msgstr "Anzahl der Beiträge pro Benutzer auf der Gemeinschaftsseite"
 
-#: src/Module/Admin/Site.php:627
+#: src/Module/Admin/Site.php:626
 msgid ""
 "The maximum number of posts per user on the community page. (Not valid for "
 "\"Global Community\")"
 msgstr "Maximale Anzahl der Beiträge, die von jedem Nutzer auf der Gemeinschaftsseite angezeigt werden. (Gilt nicht für die 'Globale Gemeinschaftsseite')"
 
-#: src/Module/Admin/Site.php:628
+#: src/Module/Admin/Site.php:627
 msgid "Disable OStatus support"
 msgstr "OStatus-Unterstützung deaktivieren"
 
-#: src/Module/Admin/Site.php:628
+#: src/Module/Admin/Site.php:627
 msgid ""
 "Disable built-in OStatus (StatusNet, GNU Social etc.) compatibility. All "
 "communications in OStatus are public, so privacy warnings will be "
 "occasionally displayed."
 msgstr "Die eingebaute OStatus-Unterstützung (StatusNet, GNU Social, etc.) deaktivieren. Jede Kommunikation in OStatus ist öffentlich, Privatsphäre-Warnungen werden nur bei Bedarf angezeigt."
 
-#: src/Module/Admin/Site.php:629
-msgid "Only import OStatus/ActivityPub threads from our contacts"
-msgstr "Nur OStatus/ActivityPub-Konversationen unserer Kontakte importieren"
-
-#: src/Module/Admin/Site.php:629
-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 "Normalerweise werden alle Inhalte von OStatus- und ActivityPub-Kontakten importiert. Mit dieser Option werden nur solche Konversationen gespeichert, die von Kontakten der Nutzer dieses Knotens gestartet wurden."
-
-#: src/Module/Admin/Site.php:630
+#: src/Module/Admin/Site.php:628
 msgid "OStatus support can only be enabled if threading is enabled."
 msgstr "OStatus Unterstützung kann nur aktiviert werden, wenn \"Threading\" aktiviert ist. "
 
-#: src/Module/Admin/Site.php:632
+#: src/Module/Admin/Site.php:630
 msgid ""
 "Diaspora support can't be enabled because Friendica was installed into a sub"
 " directory."
 msgstr "Diaspora Unterstützung kann nicht aktiviert werden, da Friendica in ein Unterverzeichnis installiert ist."
 
-#: src/Module/Admin/Site.php:633
+#: src/Module/Admin/Site.php:631
 msgid "Enable Diaspora support"
 msgstr "Diaspora-Unterstützung aktivieren"
 
-#: src/Module/Admin/Site.php:633
+#: src/Module/Admin/Site.php:631
 msgid "Provide built-in Diaspora network compatibility."
 msgstr "Verwende die eingebaute Diaspora-Verknüpfung."
 
-#: src/Module/Admin/Site.php:634
+#: src/Module/Admin/Site.php:632
 msgid "Only allow Friendica contacts"
 msgstr "Nur Friendica-Kontakte erlauben"
 
-#: src/Module/Admin/Site.php:634
+#: src/Module/Admin/Site.php:632
 msgid ""
 "All contacts must use Friendica protocols. All other built-in communication "
 "protocols disabled."
 msgstr "Alle Kontakte müssen das Friendica-Protokoll nutzen. Alle anderen Kommunikationsprotokolle werden deaktiviert."
 
-#: src/Module/Admin/Site.php:635
+#: src/Module/Admin/Site.php:633
 msgid "Verify SSL"
 msgstr "SSL Überprüfen"
 
-#: src/Module/Admin/Site.php:635
+#: src/Module/Admin/Site.php:633
 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 "Wenn gewollt, kann man hier eine strenge Zertifikatskontrolle einstellen. Das bedeutet, dass man zu keinen Seiten mit selbst unterzeichnetem SSL-Zertifikat eine Verbindung herstellen kann."
 
-#: src/Module/Admin/Site.php:636
+#: src/Module/Admin/Site.php:634
 msgid "Proxy user"
 msgstr "Proxy-Nutzer"
 
-#: src/Module/Admin/Site.php:637
+#: src/Module/Admin/Site.php:635
 msgid "Proxy URL"
 msgstr "Proxy-URL"
 
-#: src/Module/Admin/Site.php:638
+#: src/Module/Admin/Site.php:636
 msgid "Network timeout"
 msgstr "Netzwerk-Wartezeit"
 
-#: src/Module/Admin/Site.php:638
+#: src/Module/Admin/Site.php:636
 msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
 msgstr "Der Wert ist in Sekunden. Setze 0 für unbegrenzt (nicht empfohlen)."
 
-#: src/Module/Admin/Site.php:639
+#: src/Module/Admin/Site.php:637
 msgid "Maximum Load Average"
 msgstr "Maximum Load Average"
 
-#: src/Module/Admin/Site.php:639
+#: src/Module/Admin/Site.php:637
 #, php-format
 msgid ""
 "Maximum system load before delivery and poll processes are deferred - "
 "default %d."
 msgstr "Maximale System-LOAD bevor Verteil- und Empfangsprozesse verschoben werden - Standard %d"
 
-#: src/Module/Admin/Site.php:640
+#: src/Module/Admin/Site.php:638
 msgid "Maximum Load Average (Frontend)"
 msgstr "Maximum Load Average (Frontend)"
 
-#: src/Module/Admin/Site.php:640
+#: src/Module/Admin/Site.php:638
 msgid "Maximum system load before the frontend quits service - default 50."
 msgstr "Maximale Systemlast, bevor Vordergrundprozesse pausiert werden - Standard 50."
 
-#: src/Module/Admin/Site.php:641
+#: src/Module/Admin/Site.php:639
 msgid "Minimal Memory"
 msgstr "Minimaler Speicher"
 
-#: src/Module/Admin/Site.php:641
+#: src/Module/Admin/Site.php:639
 msgid ""
 "Minimal free memory in MB for the worker. Needs access to /proc/meminfo - "
 "default 0 (deactivated)."
 msgstr "Minimal freier Speicher in MB für den Worker Prozess. Benötigt Zugriff auf /proc/meminfo - Standardwert ist 0 (deaktiviert)"
 
-#: src/Module/Admin/Site.php:642
+#: src/Module/Admin/Site.php:640
 msgid "Maximum table size for optimization"
 msgstr "Maximale Tabellengröße zur Optimierung"
 
-#: src/Module/Admin/Site.php:642
+#: src/Module/Admin/Site.php:640
 msgid ""
 "Maximum table size (in MB) for the automatic optimization. Enter -1 to "
 "disable it."
 msgstr "Maximale Tabellengröße (in MB) für die automatische Optimierung - Gib -1 für Deaktivierung ein."
 
-#: src/Module/Admin/Site.php:643
+#: src/Module/Admin/Site.php:641
 msgid "Minimum level of fragmentation"
 msgstr "Minimaler Fragmentationsgrad"
 
-#: src/Module/Admin/Site.php:643
+#: src/Module/Admin/Site.php:641
 msgid ""
 "Minimum fragmenation level to start the automatic optimization - default "
 "value is 30%."
 msgstr "Minimaler Fragmentationsgrad von Datenbanktabellen, um die automatische Optimierung einzuleiten - Standardwert ist 30%"
 
-#: src/Module/Admin/Site.php:645
+#: src/Module/Admin/Site.php:643
 msgid "Periodical check of global contacts"
 msgstr "Regelmäßig globale Kontakte überprüfen"
 
-#: src/Module/Admin/Site.php:645
+#: src/Module/Admin/Site.php:643
 msgid ""
 "If enabled, the global contacts are checked periodically for missing or "
 "outdated data and the vitality of the contacts and servers."
 msgstr "Wenn diese Option aktiviert ist, werden die globalen Kontakte regelmäßig auf fehlende oder veraltete Daten sowie auf Erreichbarkeit des Kontakts und des Servers überprüft."
 
-#: src/Module/Admin/Site.php:646
+#: src/Module/Admin/Site.php:644
 msgid "Days between requery"
 msgstr "Tage zwischen erneuten Abfragen"
 
-#: src/Module/Admin/Site.php:646
+#: src/Module/Admin/Site.php:644
 msgid "Number of days after which a server is requeried for his contacts."
 msgstr "Legt das Abfrageintervall fest, nach dem ein Server erneut nach Kontakten abgefragt werden soll."
 
-#: src/Module/Admin/Site.php:647
+#: src/Module/Admin/Site.php:645
 msgid "Discover contacts from other servers"
 msgstr "Neue Kontakte auf anderen Servern entdecken"
 
-#: src/Module/Admin/Site.php:647
+#: src/Module/Admin/Site.php:645
 msgid ""
 "Periodically query other servers for contacts. You can choose between "
 "\"Users\": the users on the remote system, \"Global Contacts\": active "
@@ -7742,32 +7964,32 @@ msgid ""
 "setting is \"Users, Global Contacts\"."
 msgstr "Regelmäßig andere Server nach potentiellen Kontakten absuchen. Du kannst zwischen 'Nutzern', also den tatsächlichen Nutzern des anderen Systems, und 'globalen Kontakten', also aktiven Kontakten, die auf dem System bekannt sind, wählen. Der Fallback-Mechanismus ist für ältere Friendica- und Redmatrix-Server gedacht, bei denen globale Kontakte noch nicht verfügbar sind. Durch den Fallback-Modus entsteht auf deinem Server eine wesentlich höhere Last, empfohlen wird der Modus 'Nutzer, globale Kontakte'."
 
-#: src/Module/Admin/Site.php:648
+#: src/Module/Admin/Site.php:646
 msgid "Timeframe for fetching global contacts"
 msgstr "Zeitfenster für globale Kontakte"
 
-#: src/Module/Admin/Site.php:648
+#: src/Module/Admin/Site.php:646
 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 "Wenn die Entdeckung neuer Kontakte aktiv ist, definiert dieses Zeitfenster den Zeitraum, in dem globale Kontakte als aktiv gelten und von anderen Servern importiert werden."
 
-#: src/Module/Admin/Site.php:649
+#: src/Module/Admin/Site.php:647
 msgid "Search the local directory"
 msgstr "Lokales Verzeichnis durchsuchen"
 
-#: src/Module/Admin/Site.php:649
+#: src/Module/Admin/Site.php:647
 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 "Suche im lokalen Verzeichnis anstelle des globalen Verzeichnisses durchführen. Jede Suche wird im Hintergrund auch im globalen Verzeichnis durchgeführt, um die Suchresultate zu verbessern, wenn die Suche wiederholt wird."
 
-#: src/Module/Admin/Site.php:651
+#: src/Module/Admin/Site.php:649
 msgid "Publish server information"
 msgstr "Server-Informationen veröffentlichen"
 
-#: src/Module/Admin/Site.php:651
+#: src/Module/Admin/Site.php:649
 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 "
@@ -7775,50 +7997,50 @@ msgid ""
 " href=\"http://the-federation.info/\">the-federation.info</a> for details."
 msgstr "Wenn aktiviert, werden allgemeine Informationen über den Server und Nutzungsdaten veröffentlicht. Die Daten beinhalten den Namen sowie die Version des Servers, die Anzahl der Personen mit öffentlichen Profilen, die Anzahl der Beiträge sowie aktivierte Protokolle und Konnektoren. Für Details bitte <a href=\"http://the-federation.info/\">the-federation.info</a> aufrufen."
 
-#: src/Module/Admin/Site.php:653
+#: src/Module/Admin/Site.php:651
 msgid "Check upstream version"
 msgstr "Suche nach Updates"
 
-#: src/Module/Admin/Site.php:653
+#: src/Module/Admin/Site.php:651
 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 "Wenn diese Option aktiviert ist, wird regelmäßig nach neuen Friendica-Versionen auf github gesucht. Wenn es eine neue Version gibt, wird dies auf der Übersichtsseite im Admin-Panel angezeigt."
 
-#: src/Module/Admin/Site.php:654
+#: src/Module/Admin/Site.php:652
 msgid "Suppress Tags"
 msgstr "Tags unterdrücken"
 
-#: src/Module/Admin/Site.php:654
+#: src/Module/Admin/Site.php:652
 msgid "Suppress showing a list of hashtags at the end of the posting."
 msgstr "Unterdrückt die Anzeige von Tags am Ende eines Beitrags."
 
-#: src/Module/Admin/Site.php:655
+#: src/Module/Admin/Site.php:653
 msgid "Clean database"
 msgstr "Datenbank aufräumen"
 
-#: src/Module/Admin/Site.php:655
+#: src/Module/Admin/Site.php:653
 msgid ""
 "Remove old remote items, orphaned database records and old content from some"
 " other helper tables."
 msgstr "Entferne alte Beiträge von anderen Knoten, verwaiste Einträge und alten Inhalt einiger Hilfstabellen."
 
-#: src/Module/Admin/Site.php:656
+#: src/Module/Admin/Site.php:654
 msgid "Lifespan of remote items"
 msgstr "Lebensdauer von Beiträgen anderer Knoten"
 
-#: src/Module/Admin/Site.php:656
+#: src/Module/Admin/Site.php:654
 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 "Wenn das Aufräumen der Datenbank aktiviert ist, definiert dies die Anzahl in Tagen, nach der Beiträge, die auf anderen Knoten des Netzwerks verfasst wurden, gelöscht werden sollen. Eigene Beiträge sowie markierte oder abgespeicherte Beiträge werden nicht gelöscht. Ein Wert von 0 deaktiviert das automatische Löschen von Beiträgen."
 
-#: src/Module/Admin/Site.php:657
+#: src/Module/Admin/Site.php:655
 msgid "Lifespan of unclaimed items"
 msgstr "Lebensdauer nicht angeforderter Beiträge"
 
-#: src/Module/Admin/Site.php:657
+#: src/Module/Admin/Site.php:655
 msgid ""
 "When the database cleanup is enabled, this defines the days after which "
 "unclaimed remote items (mostly content from the relay) will be deleted. "
@@ -7826,130 +8048,130 @@ msgid ""
 "items if set to 0."
 msgstr "Wenn das Aufräumen der Datenbank aktiviert ist, definiert dies die Anzahl von Tagen, nach denen nicht angeforderte Beiträge (hauptsächlich solche, die über das Relais eintreffen) gelöscht werden. Der Standardwert beträgt 90 Tage. Wird dieser Wert auf 0 gesetzt, wird die Lebensdauer von Beiträgen anderer Knoten verwendet."
 
-#: src/Module/Admin/Site.php:658
+#: src/Module/Admin/Site.php:656
 msgid "Lifespan of raw conversation data"
 msgstr "Lebensdauer der Beiträge"
 
-#: src/Module/Admin/Site.php:658
+#: src/Module/Admin/Site.php:656
 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 "Die Konversationsdaten werden für ActivityPub und OStatus sowie für Debug-Zwecke verwendet. Sie sollten gefahrlos nach 14 Tagen entfernt werden können, der Standardwert beträgt 90 Tage."
 
-#: src/Module/Admin/Site.php:659
+#: src/Module/Admin/Site.php:657
 msgid "Path to item cache"
 msgstr "Pfad zum Item-Cache"
 
-#: src/Module/Admin/Site.php:659
+#: src/Module/Admin/Site.php:657
 msgid "The item caches buffers generated bbcode and external images."
 msgstr "Im Item-Cache werden externe Bilder und geparster BBCode zwischen gespeichert."
 
-#: src/Module/Admin/Site.php:660
+#: src/Module/Admin/Site.php:658
 msgid "Cache duration in seconds"
 msgstr "Cache-Dauer in Sekunden"
 
-#: src/Module/Admin/Site.php:660
+#: src/Module/Admin/Site.php:658
 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 "Wie lange sollen die zwischengespeicherten Dateien vorgehalten werden? Grundeinstellung sind 86400 Sekunden (ein Tag). Um den Item-Cache zu deaktivieren, setze diesen Wert auf -1."
 
-#: src/Module/Admin/Site.php:661
+#: src/Module/Admin/Site.php:659
 msgid "Maximum numbers of comments per post"
 msgstr "Maximale Anzahl von Kommentaren pro Beitrag"
 
-#: src/Module/Admin/Site.php:661
+#: src/Module/Admin/Site.php:659
 msgid "How much comments should be shown for each post? Default value is 100."
 msgstr "Wie viele Kommentare sollen pro Beitrag angezeigt werden? Standardwert sind 100."
 
-#: src/Module/Admin/Site.php:662
+#: src/Module/Admin/Site.php:660
 msgid "Temp path"
 msgstr "Temp-Pfad"
 
-#: src/Module/Admin/Site.php:662
+#: src/Module/Admin/Site.php:660
 msgid ""
 "If you have a restricted system where the webserver can't access the system "
 "temp path, enter another path here."
 msgstr "Solltest du ein eingeschränktes System haben, auf dem der Webserver nicht auf das temp-Verzeichnis des Systems zugreifen kann, setze hier einen anderen Pfad."
 
-#: src/Module/Admin/Site.php:663
+#: src/Module/Admin/Site.php:661
 msgid "Disable picture proxy"
 msgstr "Bilder-Proxy deaktivieren"
 
-#: src/Module/Admin/Site.php:663
+#: src/Module/Admin/Site.php:661
 msgid ""
 "The picture proxy increases performance and privacy. It shouldn't be used on"
 " systems with very low bandwidth."
 msgstr "Der Proxy für Bilder verbessert die Leistung und Privatsphäre der Nutzer. Er sollte nicht auf Systemen verwendet werden, die nur über begrenzte Bandbreite verfügen."
 
-#: src/Module/Admin/Site.php:664
+#: src/Module/Admin/Site.php:662
 msgid "Only search in tags"
 msgstr "Nur in Tags suchen"
 
-#: src/Module/Admin/Site.php:664
+#: src/Module/Admin/Site.php:662
 msgid "On large systems the text search can slow down the system extremely."
 msgstr "Auf großen Knoten kann die Volltext-Suche das System ausbremsen."
 
-#: src/Module/Admin/Site.php:666
+#: src/Module/Admin/Site.php:664
 msgid "New base url"
 msgstr "Neue Basis-URL"
 
-#: src/Module/Admin/Site.php:666
+#: src/Module/Admin/Site.php:664
 msgid ""
 "Change base url for this server. Sends relocate message to all Friendica and"
 " Diaspora* contacts of all users."
 msgstr "Ändert die Basis-URL dieses Servers und sendet eine Umzugsmitteilung an alle Friendica- und Diaspora*-Kontakte deiner NutzerInnen."
 
-#: src/Module/Admin/Site.php:668
+#: src/Module/Admin/Site.php:666
 msgid "RINO Encryption"
 msgstr "RINO-Verschlüsselung"
 
-#: src/Module/Admin/Site.php:668
+#: src/Module/Admin/Site.php:666
 msgid "Encryption layer between nodes."
 msgstr "Verschlüsselung zwischen Friendica-Instanzen"
 
-#: src/Module/Admin/Site.php:668
+#: src/Module/Admin/Site.php:666
 msgid "Enabled"
 msgstr "Aktiv"
 
-#: src/Module/Admin/Site.php:670
+#: src/Module/Admin/Site.php:668
 msgid "Maximum number of parallel workers"
 msgstr "Maximale Anzahl parallel laufender Worker"
 
-#: src/Module/Admin/Site.php:670
+#: src/Module/Admin/Site.php:668
 #, php-format
 msgid ""
 "On shared hosters set this to %d. On larger systems, values of %d are great."
 " Default value is %d."
 msgstr "Wenn dein Knoten bei einem Shared Hoster ist, setze diesen Wert auf %d. Auf größeren Systemen funktioniert ein Wert von %d recht gut. Standardeinstellung sind %d."
 
-#: src/Module/Admin/Site.php:671
+#: src/Module/Admin/Site.php:669
 msgid "Don't use \"proc_open\" with the worker"
 msgstr "\"proc_open\" nicht für die Worker verwenden"
 
-#: src/Module/Admin/Site.php:671
+#: src/Module/Admin/Site.php:669
 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 "Aktiviere diese Option, wenn dein System die Verwendung von 'proc_open' verhindert. Dies könnte auf Shared Hostern der Fall sein. Wenn du diese Option aktivierst, solltest du die Frequenz der worker-Aufrufe in deiner crontab erhöhen."
 
-#: src/Module/Admin/Site.php:672
+#: src/Module/Admin/Site.php:670
 msgid "Enable fastlane"
 msgstr "Aktiviere Fastlane"
 
-#: src/Module/Admin/Site.php:672
+#: src/Module/Admin/Site.php:670
 msgid ""
 "When enabed, the fastlane mechanism starts an additional worker if processes"
 " with higher priority are blocked by processes of lower priority."
 msgstr "Wenn aktiviert, wird der Fastlane-Mechanismus einen weiteren Worker-Prozeß starten, wenn Prozesse mit höherer Priorität von Prozessen mit niedrigerer Priorität blockiert werden."
 
-#: src/Module/Admin/Site.php:673
+#: src/Module/Admin/Site.php:671
 msgid "Enable frontend worker"
 msgstr "Aktiviere den Frontend-Worker"
 
-#: src/Module/Admin/Site.php:673
+#: src/Module/Admin/Site.php:671
 #, php-format
 msgid ""
 "When enabled the Worker process is triggered when backend access is "
@@ -7959,73 +8181,73 @@ msgid ""
 "server."
 msgstr "Ist diese Option aktiv, wird der Worker Prozess durch Aktionen am Frontend gestartet (z.B. wenn Nachrichten zugestellt werden). Auf kleineren Seiten sollte %s/worker regelmäßig, beispielsweise durch einen externen Cron Anbieter, aufgerufen werden. Du solltest diese Option nur dann aktivieren, wenn du keinen Cron Job auf deinem eigenen Server starten kannst."
 
-#: src/Module/Admin/Site.php:675
+#: src/Module/Admin/Site.php:673
 msgid "Subscribe to relay"
 msgstr "Relais abonnieren"
 
-#: src/Module/Admin/Site.php:675
+#: src/Module/Admin/Site.php:673
 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 "Aktiviert den Empfang von öffentlichen Beiträgen vom Relais-Server. Diese Beiträge werden in der Suche, den abonnierten Hashtags sowie der globalen Gemeinschaftsseite verfügbar sein."
 
-#: src/Module/Admin/Site.php:676
+#: src/Module/Admin/Site.php:674
 msgid "Relay server"
 msgstr "Relais-Server"
 
-#: src/Module/Admin/Site.php:676
+#: src/Module/Admin/Site.php:674
 msgid ""
 "Address of the relay server where public posts should be send to. For "
 "example https://relay.diasp.org"
 msgstr "Adresse des Relais-Servers, an den die öffentlichen Beiträge gesendet werden sollen. Zum Beispiel https://relay.diasp.org"
 
-#: src/Module/Admin/Site.php:677
+#: src/Module/Admin/Site.php:675
 msgid "Direct relay transfer"
 msgstr "Direkte Relais-Übertragung"
 
-#: src/Module/Admin/Site.php:677
+#: src/Module/Admin/Site.php:675
 msgid ""
 "Enables the direct transfer to other servers without using the relay servers"
 msgstr "Aktiviert das direkte Verteilen an andere Server, ohne dass ein Relais-Server verwendet wird."
 
-#: src/Module/Admin/Site.php:678
+#: src/Module/Admin/Site.php:676
 msgid "Relay scope"
 msgstr "Geltungsbereich des Relais"
 
-#: src/Module/Admin/Site.php:678
+#: src/Module/Admin/Site.php:676
 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 "Der Wert kann entweder 'Alle' oder 'Schlagwörter' sein. 'Alle' bedeutet, dass alle öffentliche Beiträge empfangen werden sollen. 'Schlagwörter' schränkt dem Empfang auf Beiträge ein, die bestimmte Schlagwörter beinhalten."
 
-#: src/Module/Admin/Site.php:678
+#: src/Module/Admin/Site.php:676
 msgid "all"
 msgstr "Alle"
 
-#: src/Module/Admin/Site.php:678
+#: src/Module/Admin/Site.php:676
 msgid "tags"
 msgstr "Schlagwörter"
 
-#: src/Module/Admin/Site.php:679
+#: src/Module/Admin/Site.php:677
 msgid "Server tags"
 msgstr "Server-Schlagworte"
 
-#: src/Module/Admin/Site.php:679
+#: src/Module/Admin/Site.php:677
 msgid "Comma separated list of tags for the \"tags\" subscription."
 msgstr "Liste von Schlagworten, die abonniert werden sollen, mit Komma getrennt."
 
-#: src/Module/Admin/Site.php:680
+#: src/Module/Admin/Site.php:678
 msgid "Allow user tags"
 msgstr "Verwende Schlagworte der Nutzer"
 
-#: src/Module/Admin/Site.php:680
+#: src/Module/Admin/Site.php:678
 msgid ""
 "If enabled, the tags from the saved searches will used for the \"tags\" "
 "subscription in addition to the \"relay_server_tags\"."
 msgstr "Ist dies aktiviert, werden die Schlagwörter der gespeicherten Suchen zusätzlich zu den oben definierten Server-Schlagworten abonniert."
 
-#: src/Module/Admin/Site.php:683
+#: src/Module/Admin/Site.php:681
 msgid "Start Relocation"
 msgstr "Umsiedlung starten"
 
@@ -8098,76 +8320,76 @@ msgid ""
 "href=\"%s\">the installation page</a> for help."
 msgstr "<a href=\"%s\">%s</a> konnte von deinem System nicht aufgerufen werden. Dies deutet auf ein schwerwiegendes Problem deiner Konfiguration hin. Bitte konsultiere <a href=\"%s\">die Installations-Dokumentation</a> zum Beheben des Problems."
 
-#: src/Module/Admin/Summary.php:89
+#: src/Module/Admin/Summary.php:106
 #, php-format
 msgid ""
 "Friendica's system.basepath was updated from '%s' to '%s'. Please remove the"
 " system.basepath from your db to avoid differences."
 msgstr "Friendica's system.basepath würde aktualisiert '%s' von '%s'. Bitte entfernen Sie system.basepath aus der Datenbank um Unterschiede zu vermeiden."
 
-#: src/Module/Admin/Summary.php:97
+#: src/Module/Admin/Summary.php:114
 #, php-format
 msgid ""
 "Friendica's current system.basepath '%s' is wrong and the config file '%s' "
 "isn't used."
 msgstr "Friendica's aktueller system.basepath '%s' ist verkehrt und die config file '%s' wird nicht benutzt."
 
-#: src/Module/Admin/Summary.php:105
+#: src/Module/Admin/Summary.php:122
 #, php-format
 msgid ""
 "Friendica's current system.basepath '%s' is not equal to the config file "
 "'%s'. Please fix your configuration."
 msgstr "Friendica's aktueller system.basepath '%s' ist nicht gleich wie die config file '%s'. Bitte korrigieren Sie Ihre Konfiguration."
 
-#: src/Module/Admin/Summary.php:112
+#: src/Module/Admin/Summary.php:129
 msgid "Normal Account"
 msgstr "Normales Konto"
 
-#: src/Module/Admin/Summary.php:113
+#: src/Module/Admin/Summary.php:130
 msgid "Automatic Follower Account"
 msgstr "Automatisch folgendes Konto (Marktschreier)"
 
-#: src/Module/Admin/Summary.php:114
+#: src/Module/Admin/Summary.php:131
 msgid "Public Forum Account"
 msgstr "Öffentliches Forum-Konto"
 
-#: src/Module/Admin/Summary.php:115
+#: src/Module/Admin/Summary.php:132
 msgid "Automatic Friend Account"
 msgstr "Automatische Freunde-Seite"
 
-#: src/Module/Admin/Summary.php:116
+#: src/Module/Admin/Summary.php:133
 msgid "Blog Account"
 msgstr "Blog-Konto"
 
-#: src/Module/Admin/Summary.php:117
+#: src/Module/Admin/Summary.php:134
 msgid "Private Forum Account"
 msgstr "Privates Forum-Konto"
 
-#: src/Module/Admin/Summary.php:141
+#: src/Module/Admin/Summary.php:156
 msgid "Message queues"
 msgstr "Nachrichten-Warteschlangen"
 
-#: src/Module/Admin/Summary.php:147
+#: src/Module/Admin/Summary.php:162
 msgid "Server Settings"
 msgstr "Servereinstellungen"
 
-#: src/Module/Admin/Summary.php:161
+#: src/Module/Admin/Summary.php:176
 msgid "Summary"
 msgstr "Zusammenfassung"
 
-#: src/Module/Admin/Summary.php:163
+#: src/Module/Admin/Summary.php:178
 msgid "Registered users"
 msgstr "Registrierte Personen"
 
-#: src/Module/Admin/Summary.php:165
+#: src/Module/Admin/Summary.php:180
 msgid "Pending registrations"
 msgstr "Anstehende Anmeldungen"
 
-#: src/Module/Admin/Summary.php:166
+#: src/Module/Admin/Summary.php:181
 msgid "Version"
 msgstr "Version"
 
-#: src/Module/Admin/Summary.php:170
+#: src/Module/Admin/Summary.php:185
 msgid "Active addons"
 msgstr "Aktivierte Addons"
 
@@ -8443,121 +8665,15 @@ msgstr "Email Adresse des neuen Nutzers"
 msgid "No friends to display."
 msgstr "Keine Kontakte zum Anzeigen."
 
-#: src/Module/Apps.php:29
-msgid "No installed applications."
-msgstr "Keine Applikationen installiert."
-
-#: src/Module/Apps.php:34
-msgid "Applications"
-msgstr "Anwendungen"
-
 #: src/Module/Attach.php:36 src/Module/Attach.php:48
 msgid "Item was not found."
 msgstr "Beitrag konnte nicht gefunden werden."
 
-#: src/Module/Babel.php:31
-msgid "Source input"
-msgstr "Originaltext:"
-
-#: src/Module/Babel.php:37
-msgid "BBCode::toPlaintext"
-msgstr "BBCode::toPlaintext"
-
-#: src/Module/Babel.php:43
-msgid "BBCode::convert (raw HTML)"
-msgstr "BBCode::convert (pures HTML)"
-
-#: src/Module/Babel.php:48
-msgid "BBCode::convert"
-msgstr "BBCode::convert"
-
-#: src/Module/Babel.php:54
-msgid "BBCode::convert => HTML::toBBCode"
-msgstr "BBCode::convert => HTML::toBBCode"
-
-#: src/Module/Babel.php:60
-msgid "BBCode::toMarkdown"
-msgstr "BBCode::toMarkdown"
-
-#: src/Module/Babel.php:66
-msgid "BBCode::toMarkdown => Markdown::convert"
-msgstr "BBCode::toMarkdown => Markdown::convert"
-
-#: src/Module/Babel.php:72
-msgid "BBCode::toMarkdown => Markdown::toBBCode"
-msgstr "BBCode::toMarkdown => Markdown::toBBCode"
-
-#: src/Module/Babel.php:78
-msgid "BBCode::toMarkdown =>  Markdown::convert => HTML::toBBCode"
-msgstr "BBCode::toMarkdown =>  Markdown::convert => HTML::toBBCode"
-
-#: src/Module/Babel.php:89
-msgid "Item Body"
-msgstr "Beitragskörper"
-
-#: src/Module/Babel.php:93
-msgid "Item Tags"
-msgstr "Tags des Beitrags"
-
-#: src/Module/Babel.php:100
-msgid "Source input (Diaspora format)"
-msgstr "Originaltext (Diaspora Format): "
-
-#: src/Module/Babel.php:106
-msgid "Markdown::convert (raw HTML)"
-msgstr "Markdown::convert (pures HTML)"
-
-#: src/Module/Babel.php:111
-msgid "Markdown::convert"
-msgstr "Markdown::convert"
-
-#: src/Module/Babel.php:117
-msgid "Markdown::toBBCode"
-msgstr "Markdown::toBBCode"
-
-#: src/Module/Babel.php:124
-msgid "Raw HTML input"
-msgstr "Reine  HTML  Eingabe"
-
-#: src/Module/Babel.php:129
-msgid "HTML Input"
-msgstr "HTML Eingabe"
-
-#: src/Module/Babel.php:135
-msgid "HTML::toBBCode"
-msgstr "HTML::toBBCode"
-
-#: src/Module/Babel.php:141
-msgid "HTML::toBBCode => BBCode::convert"
-msgstr "HTML::toBBCode => BBCode::convert"
-
-#: src/Module/Babel.php:146
-msgid "HTML::toBBCode => BBCode::convert (raw HTML)"
-msgstr "HTML::toBBCode => BBCode::convert (pures HTML)"
-
-#: src/Module/Babel.php:152
-msgid "HTML::toMarkdown"
-msgstr "HTML::toMarkdown"
-
-#: src/Module/Babel.php:158
-msgid "HTML::toPlaintext"
-msgstr "HTML::toPlaintext"
-
-#: src/Module/Babel.php:166
-msgid "Source text"
-msgstr "Quelltext"
-
-#: src/Module/Babel.php:167
-msgid "BBCode"
-msgstr "BBCode"
-
-#: src/Module/Babel.php:168
-msgid "Markdown"
-msgstr "Markdown"
-
-#: src/Module/Babel.php:169
-msgid "HTML"
-msgstr "HTML"
+#: src/Module/BaseAdminModule.php:62
+msgid ""
+"Submanaged account can't access the administation pages. Please log back in "
+"as the master account."
+msgstr "Verwaltete Benutzerkonten haben keinen Zugriff auf die Administrationsseiten. Bitte wechsle wieder zurück auf das Administrator Konto."
 
 #: src/Module/BaseAdminModule.php:76
 msgid "Overview"
@@ -8589,7 +8705,11 @@ msgstr "Werkzeuge"
 
 #: src/Module/BaseAdminModule.php:93
 msgid "Contact Blocklist"
-msgstr "Kontakt Sperrliste"
+msgstr "Kontakt Blockliste"
+
+#: src/Module/BaseAdminModule.php:94
+msgid "Server Blocklist"
+msgstr "Server Blockliste"
 
 #: src/Module/BaseAdminModule.php:101
 msgid "Diagnostics"
@@ -8623,6 +8743,16 @@ msgstr "Addon Features"
 msgid "User registrations waiting for confirmation"
 msgstr "Nutzeranmeldungen, die auf Bestätigung warten"
 
+#: src/Module/BaseSearchModule.php:52
+#, php-format
+msgid "People Search - %s"
+msgstr "Personensuche - %s"
+
+#: src/Module/BaseSearchModule.php:62
+#, php-format
+msgid "Forum Search - %s"
+msgstr "Forensuche - %s"
+
 #: src/Module/Bookmarklet.php:35
 msgid "This page is missing a url parameter."
 msgstr "Der Seite fehlt ein URL Parameter."
@@ -8631,292 +8761,282 @@ msgstr "Der Seite fehlt ein URL Parameter."
 msgid "The post was created"
 msgstr "Der Beitrag wurde angelegt"
 
-#: src/Module/Contact.php:166
+#: src/Module/Contact.php:72
 #, php-format
 msgid "%d contact edited."
 msgid_plural "%d contacts edited."
 msgstr[0] "%d Kontakt bearbeitet."
 msgstr[1] "%d Kontakte bearbeitet."
 
-#: src/Module/Contact.php:193 src/Module/Contact.php:377
+#: src/Module/Contact.php:99
 msgid "Could not access contact record."
 msgstr "Konnte nicht auf die Kontaktdaten zugreifen."
 
-#: src/Module/Contact.php:203
+#: src/Module/Contact.php:109
 msgid "Could not locate selected profile."
 msgstr "Konnte das ausgewählte Profil nicht finden."
 
-#: src/Module/Contact.php:235
+#: src/Module/Contact.php:141
 msgid "Contact updated."
 msgstr "Kontakt aktualisiert."
 
-#: src/Module/Contact.php:398
+#: src/Module/Contact.php:393
+msgid "Contact not found"
+msgstr "Kontakt nicht gefunden"
+
+#: src/Module/Contact.php:412
 msgid "Contact has been blocked"
 msgstr "Kontakt wurde blockiert"
 
-#: src/Module/Contact.php:398
+#: src/Module/Contact.php:412
 msgid "Contact has been unblocked"
 msgstr "Kontakt wurde wieder freigegeben"
 
-#: src/Module/Contact.php:408
+#: src/Module/Contact.php:422
 msgid "Contact has been ignored"
 msgstr "Kontakt wurde ignoriert"
 
-#: src/Module/Contact.php:408
+#: src/Module/Contact.php:422
 msgid "Contact has been unignored"
 msgstr "Kontakt wird nicht mehr ignoriert"
 
-#: src/Module/Contact.php:418
+#: src/Module/Contact.php:432
 msgid "Contact has been archived"
 msgstr "Kontakt wurde archiviert"
 
-#: src/Module/Contact.php:418
+#: src/Module/Contact.php:432
 msgid "Contact has been unarchived"
 msgstr "Kontakt wurde aus dem Archiv geholt"
 
-#: src/Module/Contact.php:442
+#: src/Module/Contact.php:456
 msgid "Drop contact"
 msgstr "Kontakt löschen"
 
-#: src/Module/Contact.php:445 src/Module/Contact.php:823
+#: src/Module/Contact.php:459 src/Module/Contact.php:823
 msgid "Do you really want to delete this contact?"
 msgstr "Möchtest Du wirklich diesen Kontakt löschen?"
 
-#: src/Module/Contact.php:459
+#: src/Module/Contact.php:473
 msgid "Contact has been removed."
 msgstr "Kontakt wurde entfernt."
 
-#: src/Module/Contact.php:489
+#: src/Module/Contact.php:503
 #, php-format
 msgid "You are mutual friends with %s"
 msgstr "Du hast mit %s eine beidseitige Freundschaft"
 
-#: src/Module/Contact.php:494
+#: src/Module/Contact.php:508
 #, php-format
 msgid "You are sharing with %s"
 msgstr "Du teilst mit %s"
 
-#: src/Module/Contact.php:499
+#: src/Module/Contact.php:513
 #, php-format
 msgid "%s is sharing with you"
 msgstr "%s teilt mit dir"
 
-#: src/Module/Contact.php:523
+#: src/Module/Contact.php:537
 msgid "Private communications are not available for this contact."
 msgstr "Private Kommunikation ist für diesen Kontakt nicht verfügbar."
 
-#: src/Module/Contact.php:525
+#: src/Module/Contact.php:539
 msgid "Never"
 msgstr "Niemals"
 
-#: src/Module/Contact.php:528
+#: src/Module/Contact.php:542
 msgid "(Update was successful)"
 msgstr "(Aktualisierung war erfolgreich)"
 
-#: src/Module/Contact.php:528
+#: src/Module/Contact.php:542
 msgid "(Update was not successful)"
 msgstr "(Aktualisierung war nicht erfolgreich)"
 
-#: src/Module/Contact.php:530 src/Module/Contact.php:1061
+#: src/Module/Contact.php:544 src/Module/Contact.php:1057
 msgid "Suggest friends"
 msgstr "Kontakte vorschlagen"
 
-#: src/Module/Contact.php:534
+#: src/Module/Contact.php:548
 #, php-format
 msgid "Network type: %s"
 msgstr "Netzwerktyp: %s"
 
-#: src/Module/Contact.php:539
+#: src/Module/Contact.php:553
 msgid "Communications lost with this contact!"
 msgstr "Verbindungen mit diesem Kontakt verloren!"
 
-#: src/Module/Contact.php:545
+#: src/Module/Contact.php:559
 msgid "Fetch further information for feeds"
 msgstr "Weitere Informationen zu Feeds holen"
 
-#: src/Module/Contact.php:547
+#: src/Module/Contact.php:561
 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 "Zusätzliche Informationen wie Vorschaubilder, Titel und Zusammenfassungen vom Feed-Eintrag laden. Du kannst diese Option aktivieren, wenn der Feed nicht allzu viel Text beinhaltet. Schlagwörter werden aus den Meta-Informationen des Feed-Headers bezogen und als Hash-Tags verwendet."
 
-#: src/Module/Contact.php:550
+#: src/Module/Contact.php:564
 msgid "Fetch information"
 msgstr "Beziehe Information"
 
-#: src/Module/Contact.php:551
+#: src/Module/Contact.php:565
 msgid "Fetch keywords"
 msgstr "Schlüsselwörter abrufen"
 
-#: src/Module/Contact.php:552
+#: src/Module/Contact.php:566
 msgid "Fetch information and keywords"
 msgstr "Beziehe Information und Schlüsselworte"
 
-#: src/Module/Contact.php:584
+#: src/Module/Contact.php:585
 msgid "Profile Visibility"
 msgstr "Profil-Sichtbarkeit"
 
-#: src/Module/Contact.php:585
+#: src/Module/Contact.php:586
 msgid "Contact Information / Notes"
 msgstr "Kontakt-Informationen / -Notizen"
 
-#: src/Module/Contact.php:586
+#: src/Module/Contact.php:587
 msgid "Contact Settings"
 msgstr "Kontakteinstellungen"
 
-#: src/Module/Contact.php:595
+#: src/Module/Contact.php:596
 msgid "Contact"
 msgstr "Kontakt"
 
-#: src/Module/Contact.php:599
+#: src/Module/Contact.php:600
 #, php-format
 msgid ""
 "Please choose the profile you would like to display to %s when viewing your "
 "profile securely."
 msgstr "Bitte wähle eines deiner Profile das angezeigt werden soll, wenn %s dein Profil aufruft."
 
-#: src/Module/Contact.php:601
+#: src/Module/Contact.php:602
 msgid "Their personal note"
 msgstr "Die persönliche Mitteilung"
 
-#: src/Module/Contact.php:603
+#: src/Module/Contact.php:604
 msgid "Edit contact notes"
 msgstr "Notizen zum Kontakt bearbeiten"
 
-#: src/Module/Contact.php:607
+#: src/Module/Contact.php:607 src/Module/Contact.php:1023
+#: src/Module/Profile/Contacts.php:93
+#, php-format
+msgid "Visit %s's profile [%s]"
+msgstr "Besuche %ss Profil [%s]"
+
+#: src/Module/Contact.php:608
 msgid "Block/Unblock contact"
 msgstr "Kontakt blockieren/freischalten"
 
-#: src/Module/Contact.php:608
+#: src/Module/Contact.php:609
 msgid "Ignore contact"
 msgstr "Ignoriere den Kontakt"
 
-#: src/Module/Contact.php:609
+#: src/Module/Contact.php:610
 msgid "Repair URL settings"
 msgstr "URL-Einstellungen reparieren"
 
-#: src/Module/Contact.php:610
+#: src/Module/Contact.php:611
 msgid "View conversations"
 msgstr "Unterhaltungen anzeigen"
 
-#: src/Module/Contact.php:615
+#: src/Module/Contact.php:616
 msgid "Last update:"
 msgstr "Letzte Aktualisierung: "
 
-#: src/Module/Contact.php:617
+#: src/Module/Contact.php:618
 msgid "Update public posts"
 msgstr "Öffentliche Beiträge aktualisieren"
 
-#: src/Module/Contact.php:619 src/Module/Contact.php:1071
+#: src/Module/Contact.php:620 src/Module/Contact.php:1067
 msgid "Update now"
 msgstr "Jetzt aktualisieren"
 
-#: src/Module/Contact.php:625 src/Module/Contact.php:828
-#: src/Module/Contact.php:1088
+#: src/Module/Contact.php:624 src/Module/Contact.php:828
+#: src/Module/Contact.php:1084
 msgid "Unignore"
 msgstr "Ignorieren aufheben"
 
-#: src/Module/Contact.php:629
+#: src/Module/Contact.php:628
 msgid "Currently blocked"
 msgstr "Derzeit geblockt"
 
-#: src/Module/Contact.php:630
+#: src/Module/Contact.php:629
 msgid "Currently ignored"
 msgstr "Derzeit ignoriert"
 
-#: src/Module/Contact.php:631
+#: src/Module/Contact.php:630
 msgid "Currently archived"
 msgstr "Momentan archiviert"
 
-#: src/Module/Contact.php:632
+#: src/Module/Contact.php:631
 msgid "Awaiting connection acknowledge"
 msgstr "Bedarf der Bestätigung des Kontakts"
 
-#: src/Module/Contact.php:633
+#: src/Module/Contact.php:632
 msgid ""
 "Replies/likes to your public posts <strong>may</strong> still be visible"
 msgstr "Antworten/Likes auf deine öffentlichen Beiträge <strong>könnten</strong> weiterhin sichtbar sein"
 
-#: src/Module/Contact.php:634
+#: src/Module/Contact.php:633
 msgid "Notification for new posts"
 msgstr "Benachrichtigung bei neuen Beiträgen"
 
-#: src/Module/Contact.php:634
+#: src/Module/Contact.php:633
 msgid "Send a notification of every new post of this contact"
 msgstr "Sende eine Benachrichtigung, wann immer dieser Kontakt einen neuen Beitrag schreibt."
 
-#: src/Module/Contact.php:636
+#: src/Module/Contact.php:635
 msgid "Blacklisted keywords"
 msgstr "Unterdrückte Schlüsselworte "
 
-#: src/Module/Contact.php:636
+#: src/Module/Contact.php:635
 msgid ""
 "Comma separated list of keywords that should not be converted to hashtags, "
 "when \"Fetch information and keywords\" is selected"
 msgstr "Komma-Separierte Liste mit Schlüsselworten, die nicht in Hashtags konvertiert werden, wenn \"Beziehe Information und Schlüsselworte\" aktiviert wurde"
 
-#: src/Module/Contact.php:653 src/Module/Settings/TwoFactor/Index.php:100
+#: src/Module/Contact.php:652 src/Module/Settings/TwoFactor/Index.php:111
 msgid "Actions"
 msgstr "Aktionen"
 
-#: src/Module/Contact.php:700
-msgid "Suggestions"
-msgstr "Kontaktvorschläge"
-
-#: src/Module/Contact.php:703
-msgid "Suggest potential friends"
-msgstr "Kontakte vorschlagen"
-
-#: src/Module/Contact.php:708 src/Module/Group.php:287
-msgid "All Contacts"
-msgstr "Alle Kontakte"
-
-#: src/Module/Contact.php:711
+#: src/Module/Contact.php:697
 msgid "Show all contacts"
 msgstr "Alle Kontakte anzeigen"
 
-#: src/Module/Contact.php:716
-msgid "Unblocked"
-msgstr "Ungeblockt"
-
-#: src/Module/Contact.php:719
-msgid "Only show unblocked contacts"
-msgstr "Nur nicht-blockierte Kontakte anzeigen"
-
-#: src/Module/Contact.php:724
+#: src/Module/Contact.php:702 src/Module/Contact.php:804
 msgid "Blocked"
 msgstr "Geblockt"
 
-#: src/Module/Contact.php:727
+#: src/Module/Contact.php:705
 msgid "Only show blocked contacts"
 msgstr "Nur blockierte Kontakte anzeigen"
 
-#: src/Module/Contact.php:732
+#: src/Module/Contact.php:710 src/Module/Contact.php:806
 msgid "Ignored"
 msgstr "Ignoriert"
 
-#: src/Module/Contact.php:735
+#: src/Module/Contact.php:713
 msgid "Only show ignored contacts"
 msgstr "Nur ignorierte Kontakte anzeigen"
 
-#: src/Module/Contact.php:740
+#: src/Module/Contact.php:718 src/Module/Contact.php:807
 msgid "Archived"
 msgstr "Archiviert"
 
-#: src/Module/Contact.php:743
+#: src/Module/Contact.php:721
 msgid "Only show archived contacts"
 msgstr "Nur archivierte Kontakte anzeigen"
 
-#: src/Module/Contact.php:748
+#: src/Module/Contact.php:726 src/Module/Contact.php:805
 msgid "Hidden"
 msgstr "Verborgen"
 
-#: src/Module/Contact.php:751
+#: src/Module/Contact.php:729
 msgid "Only show hidden contacts"
 msgstr "Nur verborgene Kontakte anzeigen"
 
-#: src/Module/Contact.php:759
+#: src/Module/Contact.php:737
 msgid "Organize your contact groups"
 msgstr "Verwalte deine Kontaktgruppen"
 
@@ -8924,11 +9044,11 @@ msgstr "Verwalte deine Kontaktgruppen"
 msgid "Search your contacts"
 msgstr "Suche in deinen Kontakten"
 
-#: src/Module/Contact.php:829 src/Module/Contact.php:1097
+#: src/Module/Contact.php:829 src/Module/Contact.php:1093
 msgid "Archive"
 msgstr "Archivieren"
 
-#: src/Module/Contact.php:829 src/Module/Contact.php:1097
+#: src/Module/Contact.php:829 src/Module/Contact.php:1093
 msgid "Unarchive"
 msgstr "Aus Archiv zurückholen"
 
@@ -8956,79 +9076,217 @@ msgstr "Alle Kontakte anzeigen"
 msgid "Advanced Contact Settings"
 msgstr "Fortgeschrittene Kontakteinstellungen"
 
-#: src/Module/Contact.php:994
+#: src/Module/Contact.php:990
 msgid "Mutual Friendship"
 msgstr "Beidseitige Freundschaft"
 
-#: src/Module/Contact.php:999
+#: src/Module/Contact.php:995
 msgid "is a fan of yours"
 msgstr "ist ein Fan von dir"
 
-#: src/Module/Contact.php:1004
+#: src/Module/Contact.php:1000
 msgid "you are a fan of"
 msgstr "Du bist Fan von"
 
-#: src/Module/Contact.php:1028
+#: src/Module/Contact.php:1024
 msgid "Edit contact"
 msgstr "Kontakt bearbeiten"
 
-#: src/Module/Contact.php:1082
+#: src/Module/Contact.php:1078
 msgid "Toggle Blocked status"
 msgstr "Geblockt-Status ein-/ausschalten"
 
-#: src/Module/Contact.php:1090
+#: src/Module/Contact.php:1086
 msgid "Toggle Ignored status"
 msgstr "Ignoriert-Status ein-/ausschalten"
 
-#: src/Module/Contact.php:1099
+#: src/Module/Contact.php:1095
 msgid "Toggle Archive status"
 msgstr "Archiviert-Status ein-/ausschalten"
 
-#: src/Module/Contact.php:1107
+#: src/Module/Contact.php:1103
 msgid "Delete contact"
 msgstr "Lösche den Kontakt"
 
-#: src/Module/Credits.php:25
-msgid "Credits"
-msgstr "Credits"
+#: src/Module/Debug/Babel.php:32
+msgid "Source input"
+msgstr "Originaltext:"
+
+#: src/Module/Debug/Babel.php:38
+msgid "BBCode::toPlaintext"
+msgstr "BBCode::toPlaintext"
+
+#: src/Module/Debug/Babel.php:44
+msgid "BBCode::convert (raw HTML)"
+msgstr "BBCode::convert (pures HTML)"
+
+#: src/Module/Debug/Babel.php:49
+msgid "BBCode::convert"
+msgstr "BBCode::convert"
+
+#: src/Module/Debug/Babel.php:55
+msgid "BBCode::convert => HTML::toBBCode"
+msgstr "BBCode::convert => HTML::toBBCode"
+
+#: src/Module/Debug/Babel.php:61
+msgid "BBCode::toMarkdown"
+msgstr "BBCode::toMarkdown"
+
+#: src/Module/Debug/Babel.php:67
+msgid "BBCode::toMarkdown => Markdown::convert"
+msgstr "BBCode::toMarkdown => Markdown::convert"
+
+#: src/Module/Debug/Babel.php:73
+msgid "BBCode::toMarkdown => Markdown::toBBCode"
+msgstr "BBCode::toMarkdown => Markdown::toBBCode"
+
+#: src/Module/Debug/Babel.php:79
+msgid "BBCode::toMarkdown =>  Markdown::convert => HTML::toBBCode"
+msgstr "BBCode::toMarkdown =>  Markdown::convert => HTML::toBBCode"
+
+#: src/Module/Debug/Babel.php:90
+msgid "Item Body"
+msgstr "Beitragskörper"
+
+#: src/Module/Debug/Babel.php:94
+msgid "Item Tags"
+msgstr "Tags des Beitrags"
+
+#: src/Module/Debug/Babel.php:101
+msgid "Source input (Diaspora format)"
+msgstr "Originaltext (Diaspora Format): "
+
+#: src/Module/Debug/Babel.php:107
+msgid "Markdown::convert (raw HTML)"
+msgstr "Markdown::convert (pures HTML)"
+
+#: src/Module/Debug/Babel.php:112
+msgid "Markdown::convert"
+msgstr "Markdown::convert"
+
+#: src/Module/Debug/Babel.php:118
+msgid "Markdown::toBBCode"
+msgstr "Markdown::toBBCode"
+
+#: src/Module/Debug/Babel.php:125
+msgid "Raw HTML input"
+msgstr "Reine  HTML  Eingabe"
+
+#: src/Module/Debug/Babel.php:130
+msgid "HTML Input"
+msgstr "HTML Eingabe"
+
+#: src/Module/Debug/Babel.php:136
+msgid "HTML::toBBCode"
+msgstr "HTML::toBBCode"
+
+#: src/Module/Debug/Babel.php:142
+msgid "HTML::toBBCode => BBCode::convert"
+msgstr "HTML::toBBCode => BBCode::convert"
+
+#: src/Module/Debug/Babel.php:147
+msgid "HTML::toBBCode => BBCode::convert (raw HTML)"
+msgstr "HTML::toBBCode => BBCode::convert (pures HTML)"
+
+#: src/Module/Debug/Babel.php:153
+msgid "HTML::toBBCode => BBCode::toPlaintext"
+msgstr "HTML::toBBCode => BBCode::toPlaintext"
+
+#: src/Module/Debug/Babel.php:159
+msgid "HTML::toMarkdown"
+msgstr "HTML::toMarkdown"
+
+#: src/Module/Debug/Babel.php:165
+msgid "HTML::toPlaintext"
+msgstr "HTML::toPlaintext"
+
+#: src/Module/Debug/Babel.php:171
+msgid "HTML::toPlaintext (compact)"
+msgstr "HTML::toPlaintext (kompakt)"
+
+#: src/Module/Debug/Babel.php:179
+msgid "Source text"
+msgstr "Quelltext"
+
+#: src/Module/Debug/Babel.php:180
+msgid "BBCode"
+msgstr "BBCode"
+
+#: src/Module/Debug/Babel.php:181
+msgid "Markdown"
+msgstr "Markdown"
+
+#: src/Module/Debug/Babel.php:182
+msgid "HTML"
+msgstr "HTML"
+
+#: src/Module/Debug/Feed.php:20 src/Module/Filer/SaveTag.php:20
+msgid "You must be logged in to use this module"
+msgstr "Du musst eingeloggt sein, um dieses Modul benutzen zu können."
+
+#: src/Module/Debug/Feed.php:49
+msgid "Source URL"
+msgstr "URL der Quelle"
+
+#: src/Module/Debug/Localtime.php:30
+msgid "Time Conversion"
+msgstr "Zeitumrechnung"
+
+#: src/Module/Debug/Localtime.php:31
+msgid ""
+"Friendica provides this service for sharing events with other networks and "
+"friends in unknown timezones."
+msgstr "Friendica bietet diese Funktion an, um das Teilen von Events mit Kontakten zu vereinfachen, deren Zeitzone nicht ermittelt werden kann."
+
+#: src/Module/Debug/Localtime.php:32
+#, php-format
+msgid "UTC time: %s"
+msgstr "UTC Zeit: %s"
+
+#: src/Module/Debug/Localtime.php:35
+#, php-format
+msgid "Current timezone: %s"
+msgstr "Aktuelle Zeitzone: %s"
+
+#: src/Module/Debug/Localtime.php:39
+#, php-format
+msgid "Converted localtime: %s"
+msgstr "Umgerechnete lokale Zeit: %s"
+
+#: src/Module/Debug/Localtime.php:43
+msgid "Please select your timezone:"
+msgstr "Bitte wähle Deine Zeitzone:"
+
+#: src/Module/Debug/Probe.php:19 src/Module/Debug/WebFinger.php:18
+msgid "Only logged in users are permitted to perform a probing."
+msgstr "Nur eingeloggten Benutzern ist das Untersuchen von Adressen gestattet."
 
-#: src/Module/Credits.php:26
-msgid ""
-"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!"
-msgstr "Friendica ist ein Gemeinschaftsprojekt, das nicht ohne die Hilfe vieler Personen möglich wäre. Hier ist eine Aufzählung der Personen, die zum Code oder der Übersetzung beigetragen haben. Dank an alle !"
+#: src/Module/Debug/Probe.php:35
+msgid "Lookup address"
+msgstr "Adresse nachschlagen"
 
-#: src/Module/Directory.php:66
+#: src/Module/Directory.php:61
 msgid "No entries (some entries may be hidden)."
 msgstr "Keine Einträge (einige Einträge könnten versteckt sein)."
 
-#: src/Module/Directory.php:85
+#: src/Module/Directory.php:80
 msgid "Find on this site"
 msgstr "Auf diesem Server suchen"
 
-#: src/Module/Directory.php:87
+#: src/Module/Directory.php:82
 msgid "Results for:"
 msgstr "Ergebnisse für:"
 
-#: src/Module/Directory.php:89
+#: src/Module/Directory.php:84
 msgid "Site Directory"
 msgstr "Verzeichnis"
 
-#: src/Module/Feedtest.php:20 src/Module/Filer/SaveTag.php:20
-msgid "You must be logged in to use this module"
-msgstr "Du musst eingeloggt sein, um dieses Modul benutzen zu können."
-
-#: src/Module/Feedtest.php:49
-msgid "Source URL"
-msgstr "URL der Quelle"
-
 #: src/Module/Filer/SaveTag.php:39
 #, php-format
 msgid "Filetag %s saved to item"
 msgstr "Tag %s für den Eintrag gespeichert"
 
-#: src/Module/Filer/SaveTag.php:49
+#: src/Module/Filer/SaveTag.php:48
 msgid "- select -"
 msgstr "- auswählen -"
 
@@ -9183,143 +9441,143 @@ msgstr "Hilfe:"
 msgid "Welcome to %s"
 msgstr "Willkommen zu %s"
 
-#: src/Module/Install.php:158
+#: src/Module/Install.php:160
 msgid "Friendica Communications Server - Setup"
 msgstr "Friendica Komunikationsserver - Installation"
 
-#: src/Module/Install.php:169
+#: src/Module/Install.php:171
 msgid "System check"
 msgstr "Systemtest"
 
-#: src/Module/Install.php:174
+#: src/Module/Install.php:176
 msgid "Check again"
 msgstr "Noch einmal testen"
 
-#: src/Module/Install.php:189
+#: src/Module/Install.php:191
 msgid "Base settings"
 msgstr "Grundeinstellungen"
 
-#: src/Module/Install.php:196
+#: src/Module/Install.php:198
 msgid "Host name"
 msgstr "Host Name"
 
-#: src/Module/Install.php:198
+#: src/Module/Install.php:200
 msgid ""
 "Overwrite this field in case the determinated hostname isn't right, "
 "otherweise leave it as is."
 msgstr "Sollte der ermittelte Hostname nicht stimmen, korrigiere bitte den Eintrag."
 
-#: src/Module/Install.php:201
+#: src/Module/Install.php:203
 msgid "Base path to installation"
 msgstr "Basis-Pfad zur Installation"
 
-#: src/Module/Install.php:203
+#: src/Module/Install.php:205
 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 "Falls das System nicht den korrekten Pfad zu deiner Installation gefunden hat, gib den richtigen Pfad bitte hier ein. Du solltest hier den Pfad nur auf einem eingeschränkten System angeben müssen, bei dem du mit symbolischen Links auf dein Webverzeichnis verweist."
 
-#: src/Module/Install.php:206
+#: src/Module/Install.php:208
 msgid "Sub path of the URL"
 msgstr "Unterverzeichnis (Pfad) der URL"
 
-#: src/Module/Install.php:208
+#: src/Module/Install.php:210
 msgid ""
 "Overwrite this field in case the sub path determination isn't right, "
 "otherwise leave it as is. Leaving this field blank means the installation is"
 " at the base URL without sub path."
 msgstr "Sollte das ermittelte Unterverzeichnis der Friendica Installation nicht stimmen, korrigiere es bitte. Wenn dieses Feld leer ist, bedeutet dies, dass die Installation direkt unter der Basis-URL installiert wird."
 
-#: src/Module/Install.php:219
+#: src/Module/Install.php:221
 msgid "Database connection"
 msgstr "Datenbankverbindung"
 
-#: src/Module/Install.php:220
+#: src/Module/Install.php:222
 msgid ""
 "In order to install Friendica we need to know how to connect to your "
 "database."
 msgstr "Um Friendica installieren zu können, müssen wir wissen, wie wir mit Deiner Datenbank Kontakt aufnehmen können."
 
-#: src/Module/Install.php:221
+#: src/Module/Install.php:223
 msgid ""
 "Please contact your hosting provider or site administrator if you have "
 "questions about these settings."
 msgstr "Bitte kontaktiere den Hosting-Provider oder den Administrator der Seite, falls du Fragen zu diesen Einstellungen haben solltest."
 
-#: src/Module/Install.php:222
+#: src/Module/Install.php:224
 msgid ""
 "The database you specify below should already exist. If it does not, please "
 "create it before continuing."
 msgstr "Die Datenbank, die du unten angibst, sollte bereits existieren. Ist dies noch nicht der Fall, erzeuge sie bitte, bevor du mit der Installation fortfährst."
 
-#: src/Module/Install.php:229
+#: src/Module/Install.php:231
 msgid "Database Server Name"
 msgstr "Datenbank-Server"
 
-#: src/Module/Install.php:234
+#: src/Module/Install.php:236
 msgid "Database Login Name"
 msgstr "Datenbank-Nutzer"
 
-#: src/Module/Install.php:240
+#: src/Module/Install.php:242
 msgid "Database Login Password"
 msgstr "Datenbank-Passwort"
 
-#: src/Module/Install.php:242
+#: src/Module/Install.php:244
 msgid "For security reasons the password must not be empty"
 msgstr "Aus Sicherheitsgründen darf das Passwort nicht leer sein."
 
-#: src/Module/Install.php:245
+#: src/Module/Install.php:247
 msgid "Database Name"
 msgstr "Datenbank-Name"
 
-#: src/Module/Install.php:249 src/Module/Install.php:278
+#: src/Module/Install.php:251 src/Module/Install.php:280
 msgid "Please select a default timezone for your website"
 msgstr "Bitte wähle die Standardzeitzone Deiner Webseite"
 
-#: src/Module/Install.php:263
+#: src/Module/Install.php:265
 msgid "Site settings"
 msgstr "Server-Einstellungen"
 
-#: src/Module/Install.php:273
+#: src/Module/Install.php:275
 msgid "Site administrator email address"
 msgstr "E-Mail-Adresse des Administrators"
 
-#: src/Module/Install.php:275
+#: src/Module/Install.php:277
 msgid ""
 "Your account email address must match this in order to use the web admin "
 "panel."
 msgstr "Die E-Mail-Adresse, die in Deinem Friendica-Account eingetragen ist, muss mit dieser Adresse übereinstimmen, damit du das Admin-Panel benutzen kannst."
 
-#: src/Module/Install.php:282
+#: src/Module/Install.php:284
 msgid "System Language:"
 msgstr "Systemsprache:"
 
-#: src/Module/Install.php:284
+#: src/Module/Install.php:286
 msgid ""
 "Set the default language for your Friendica installation interface and to "
 "send emails."
 msgstr "Wähle die Standardsprache für deine Friendica-Installations-Oberfläche und den E-Mail-Versand"
 
-#: src/Module/Install.php:296
+#: src/Module/Install.php:298
 msgid "Your Friendica site database has been installed."
 msgstr "Die Datenbank Deiner Friendica-Seite wurde installiert."
 
-#: src/Module/Install.php:304
+#: src/Module/Install.php:306
 msgid "Installation finished"
 msgstr "Installation abgeschlossen"
 
-#: src/Module/Install.php:326
+#: src/Module/Install.php:328
 msgid "<h1>What next</h1>"
 msgstr "<h1>Wie geht es weiter?</h1>"
 
-#: src/Module/Install.php:327
+#: src/Module/Install.php:329
 msgid ""
 "IMPORTANT: You will need to [manually] setup a scheduled task for the "
 "worker."
 msgstr "Wichtig: du musst [manuell] einen Cronjob (o.ä.) für den Worker einrichten."
 
-#: src/Module/Install.php:330
+#: src/Module/Install.php:332
 #, php-format
 msgid ""
 "Go to your new Friendica node <a href=\"%s/register\">registration page</a> "
@@ -9431,72 +9689,93 @@ msgid ""
 "important, please visit http://friendi.ca"
 msgstr "Für weitere Informationen über das Friendica-Projekt und warum wir es für ein wichtiges Projekt halten, besuche bitte http://friendi.ca."
 
-#: src/Module/Localtime.php:30
-msgid "Time Conversion"
-msgstr "Zeitumrechnung"
+#: src/Module/Item/Compose.php:30
+msgid "Please enter a post body."
+msgstr "Bitte gibt den Text des Beitrags an"
+
+#: src/Module/Item/Compose.php:43
+msgid "This feature is only available with the frio theme."
+msgstr "Diese Seite kann ausschließlich mit dem Frio Theme verwendet werden."
+
+#: src/Module/Item/Compose.php:63
+msgid "Compose new personal note"
+msgstr "Neue persönliche Notiz verfassen"
+
+#: src/Module/Item/Compose.php:70
+msgid "Compose new post"
+msgstr "Neuen Beitrag verfassen"
 
-#: src/Module/Localtime.php:31
+#: src/Module/Item/Compose.php:190
+msgid "Clear the location"
+msgstr "Ort löschen"
+
+#: src/Module/Item/Compose.php:191
+msgid "Location services are unavailable on your device"
+msgstr "Ortungsdienste sind auf Ihrem Gerät nicht verfügbar"
+
+#: src/Module/Item/Compose.php:192
 msgid ""
-"Friendica provides this service for sharing events with other networks and "
-"friends in unknown timezones."
-msgstr "Friendica bietet diese Funktion an, um das Teilen von Events mit Kontakten zu vereinfachen, deren Zeitzone nicht ermittelt werden kann."
+"Location services are disabled. Please check the website's permissions on "
+"your device"
+msgstr "Ortungsdienste sind deaktiviert. Bitte überprüfen Sie die Berechtigungen der Website auf Ihrem Gerät"
 
-#: src/Module/Localtime.php:32
-#, php-format
-msgid "UTC time: %s"
-msgstr "UTC Zeit: %s"
+#: src/Module/Item/Compose.php:196
+msgid "Public"
+msgstr "Öffentlich"
 
-#: src/Module/Localtime.php:35
-#, php-format
-msgid "Current timezone: %s"
-msgstr "Aktuelle Zeitzone: %s"
+#: src/Module/Item/Compose.php:197
+msgid ""
+"This post will be sent to all your followers and can be seen in the "
+"community pages and by anyone with its link."
+msgstr "Der Beitrag wird an alle gesendet die dir folgen und wird auf der Gemeinschaftsseite zu sehen sein. Jeder der den Link des Beitrags kennt kann ihn einsehen."
 
-#: src/Module/Localtime.php:39
-#, php-format
-msgid "Converted localtime: %s"
-msgstr "Umgerechnete lokale Zeit: %s"
+#: src/Module/Item/Compose.php:198
+msgid "Limited/Private"
+msgstr "Begrenzt/Privat"
 
-#: src/Module/Localtime.php:43
-msgid "Please select your timezone:"
-msgstr "Bitte wähle Deine Zeitzone:"
+#: src/Module/Item/Compose.php:199
+msgid ""
+"This post will be sent only to the people in the first box, to the exception"
+" of the people mentioned in the second box. It won't appear anywhere public."
+msgstr "Der Beitrag wird nur an Kontakte gesendet, die im ersten Kasten aufgelistet sind, mit der Ausnahme derer, die im zweiten Kasten aufgelistet werden. Der Beitrag wird nicht öffentlich einsehbar sein."
 
-#: src/Module/Login.php:295
+#: src/Module/Login.php:286
 msgid "Create a New Account"
 msgstr "Neues Konto erstellen"
 
-#: src/Module/Login.php:328
+#: src/Module/Login.php:319
 msgid "Password: "
 msgstr "Passwort: "
 
-#: src/Module/Login.php:329
+#: src/Module/Login.php:320
 msgid "Remember me"
 msgstr "Anmeldedaten merken"
 
-#: src/Module/Login.php:332
+#: src/Module/Login.php:323
 msgid "Or login using OpenID: "
 msgstr "Oder melde dich mit deiner OpenID an: "
 
-#: src/Module/Login.php:338
+#: src/Module/Login.php:329
 msgid "Forgot your password?"
 msgstr "Passwort vergessen?"
 
-#: src/Module/Login.php:341
+#: src/Module/Login.php:332
 msgid "Website Terms of Service"
 msgstr "Website-Nutzungsbedingungen"
 
-#: src/Module/Login.php:342
+#: src/Module/Login.php:333
 msgid "terms of service"
 msgstr "Nutzungsbedingungen"
 
-#: src/Module/Login.php:344
+#: src/Module/Login.php:335
 msgid "Website Privacy Policy"
 msgstr "Website-Datenschutzerklärung"
 
-#: src/Module/Login.php:345
+#: src/Module/Login.php:336
 msgid "privacy policy"
 msgstr "Datenschutzerklärung"
 
-#: src/Module/Logout.php:27
+#: src/Module/Logout.php:38
 msgid "Logged out."
 msgstr "Abgemeldet."
 
@@ -9513,21 +9792,45 @@ msgstr "Seite nicht gefunden."
 msgid "Invalid photo with id %s."
 msgstr "Fehlerhaftes Foto mit der ID %s."
 
-#: src/Module/Profile.php:110 src/Module/Profile.php:113
-#: src/Protocol/OStatus.php:1302
+#: src/Module/Profile/Contacts.php:23 src/Module/Profile/Contacts.php:36
+msgid "User not found."
+msgstr "Benutzer nicht gefunden."
+
+#: src/Module/Profile/Contacts.php:78
+msgid "No contacts."
+msgstr "Keine Kontakte."
+
+#: src/Module/Profile/Contacts.php:112
 #, php-format
-msgid "%s's timeline"
-msgstr "Timeline von %s"
+msgid "Follower (%s)"
+msgid_plural "Followers (%s)"
+msgstr[0] "Folgende (%s)"
+msgstr[1] "Folgende (%s)"
 
-#: src/Module/Profile.php:111 src/Protocol/OStatus.php:1306
+#: src/Module/Profile/Contacts.php:113
 #, php-format
-msgid "%s's posts"
-msgstr "Beiträge von %s"
+msgid "Following (%s)"
+msgid_plural "Following (%s)"
+msgstr[0] "Gefolgte (%s)"
+msgstr[1] "Gefolgte (%s)"
 
-#: src/Module/Profile.php:112 src/Protocol/OStatus.php:1309
+#: src/Module/Profile/Contacts.php:114
 #, php-format
-msgid "%s's comments"
-msgstr "Kommentare von %s"
+msgid "Mutual friend (%s)"
+msgid_plural "Mutual friends (%s)"
+msgstr[0] "Beidseitige Freundschafte (%s)"
+msgstr[1] "Beidseitige Freundschaften (%s)"
+
+#: src/Module/Profile/Contacts.php:116
+#, php-format
+msgid "Contact (%s)"
+msgid_plural "Contacts (%s)"
+msgstr[0] "Kontakt (%s)"
+msgstr[1] "Kontakte (%s)"
+
+#: src/Module/Profile/Contacts.php:125
+msgid "All contacts"
+msgstr "Alle Kontakte"
 
 #: src/Module/Register.php:83
 msgid ""
@@ -9622,81 +9925,172 @@ msgstr "Deine Registrierung konnte nicht verarbeitet werden."
 msgid "Your registration is pending approval by the site owner."
 msgstr "Deine Registrierung muss noch vom Betreiber der Seite freigegeben werden."
 
-#: src/Module/Settings/TwoFactor/Index.php:50
+#: src/Module/Settings/TwoFactor/AppSpecific.php:36
+#: src/Module/Settings/TwoFactor/Recovery.php:34
+#: src/Module/Settings/TwoFactor/Verify.php:41
+msgid "Please enter your password to access this page."
+msgstr "Bitte geben Sie Ihr Passwort ein, um auf diese Seite zuzugreifen."
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:54
+msgid "App-specific password generation failed: The description is empty."
+msgstr "Die Erzeugung des App spezifischen Passworts ist fehlgeschlagen. Die Beschreibung ist leer."
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:57
+msgid ""
+"App-specific password generation failed: This description already exists."
+msgstr "Die Erzeugung des App spezifischen Passworts ist fehlgeschlagen. Die Beschreibung existiert bereits."
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:61
+msgid "New app-specific password generated."
+msgstr "Neues App spezifisches Passwort erzeugt."
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:67
+msgid "App-specific passwords successfully revoked."
+msgstr "App spezifische Passwörter erfolgreich widerrufen."
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:77
+msgid "App-specific password successfully revoked."
+msgstr "App spezifisches Passwort erfolgreich widerrufen."
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:98
+msgid "Two-factor app-specific passwords"
+msgstr "Zwei-Faktor App spezifische Passwörter."
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:100
+msgid ""
+"<p>App-specific passwords are randomly generated passwords used instead your"
+" regular password to authenticate your account on third-party applications "
+"that don't support two-factor authentication.</p>"
+msgstr "<p>App spezifische Passwörter sind zufällig generierte Passwörter die anstelle des regulären Passworts zur Anmeldung mit Client Anwendungen verwendet werden, wenn diese Anwendungen die Zwei-Faktor-Authentifizierung nicht unterstützen.</p>"
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:101
+msgid ""
+"Make sure to copy your new app-specific password now. You won’t be able to "
+"see it again!"
+msgstr "Das neue App spezifische Passwort muss jetzt übertragen werden. Später wirst du es nicht mehr einsehen können!"
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:104
+msgid "Description"
+msgstr "Beschreibung"
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:105
+msgid "Last Used"
+msgstr "Zuletzt verwendet"
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:106
+msgid "Revoke"
+msgstr "Widerrufen"
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:107
+msgid "Revoke All"
+msgstr "Alle widerrufen"
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:110
+msgid ""
+"When you generate a new app-specific password, you must use it right away, "
+"it will be shown to you once after you generate it."
+msgstr "Wenn du eine neues App spezifisches Passwort erstellst, musst du es sofort verwenden. Es wird dir nur ein einziges Mal nach der Erstellung angezeigt."
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:111
+msgid "Generate new app-specific password"
+msgstr "Neues App spezifisches Passwort erstellen"
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:112
+msgid "Friendiqa on my Fairphone 2..."
+msgstr "Friendiqa auf meinem Fairphone 2"
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:113
+msgid "Generate"
+msgstr "Erstellen"
+
+#: src/Module/Settings/TwoFactor/Index.php:51
 msgid "Two-factor authentication successfully disabled."
 msgstr "Zwei-Faktor Authentifizierung erfolgreich deaktiviert."
 
-#: src/Module/Settings/TwoFactor/Index.php:86
+#: src/Module/Settings/TwoFactor/Index.php:92
 msgid ""
 "<p>Use an application on a mobile device to get two-factor authentication "
 "codes when prompted on login.</p>"
 msgstr "<p>Benutze eine App auf dein Smartphone um einen Zwei-Faktor identifikations Code zu bekommen wenn beim Loggin das verlagt wird.</p>"
 
-#: src/Module/Settings/TwoFactor/Index.php:90
+#: src/Module/Settings/TwoFactor/Index.php:96
 msgid "Authenticator app"
 msgstr "Zwei-Faktor Authentifizierungsapp"
 
-#: src/Module/Settings/TwoFactor/Index.php:91
+#: src/Module/Settings/TwoFactor/Index.php:97
 msgid "Configured"
 msgstr "Konfiguriert"
 
-#: src/Module/Settings/TwoFactor/Index.php:91
+#: src/Module/Settings/TwoFactor/Index.php:97
 msgid "Not Configured"
 msgstr "Nicht konfiguriert"
 
-#: src/Module/Settings/TwoFactor/Index.php:92
+#: src/Module/Settings/TwoFactor/Index.php:98
 msgid "<p>You haven't finished configuring your authenticator app.</p>"
 msgstr "<p>Die Konfiguration deiner Zwei-Faktor Authentifizierungsapp ist nicht abgeschlossen.</p>"
 
-#: src/Module/Settings/TwoFactor/Index.php:93
+#: src/Module/Settings/TwoFactor/Index.php:99
 msgid "<p>Your authenticator app is correctly configured.</p>"
 msgstr "<p>Deine Zwei-Faktor Authentifizierungsapp ist nicht korrekt konfiguriert.</p>"
 
-#: src/Module/Settings/TwoFactor/Index.php:95
+#: src/Module/Settings/TwoFactor/Index.php:101
 msgid "Recovery codes"
 msgstr "Wiederherstellungsschlüssel"
 
-#: src/Module/Settings/TwoFactor/Index.php:96
+#: src/Module/Settings/TwoFactor/Index.php:102
 msgid "Remaining valid codes"
 msgstr "Verbleibende Wiederherstellungsschlüssel"
 
-#: src/Module/Settings/TwoFactor/Index.php:98
+#: src/Module/Settings/TwoFactor/Index.php:104
 msgid ""
 "<p>These one-use codes can replace an authenticator app code in case you "
 "have lost access to it.</p>"
 msgstr "<p>Diese Einmalcodes können einen Authentifikator-App-Code ersetzen, falls Sie den Zugriff darauf verloren haben.</p>"
 
-#: src/Module/Settings/TwoFactor/Index.php:101
+#: src/Module/Settings/TwoFactor/Index.php:106
+msgid "App-specific passwords"
+msgstr "App spezifische Passwörter"
+
+#: src/Module/Settings/TwoFactor/Index.php:107
+msgid "Generated app-specific passwords"
+msgstr "App spezifische Passwörter erstellen"
+
+#: src/Module/Settings/TwoFactor/Index.php:109
+msgid ""
+"<p>These randomly generated passwords allow you to authenticate on apps not "
+"supporting two-factor authentication.</p>"
+msgstr "<p>Diese zufällig erzeugten Passwörter erlauben es dir dich mit Apps anzumelden, die keine Zwei-Faktor-Authentifizierung unterstützen.</p>"
+
+#: src/Module/Settings/TwoFactor/Index.php:112
 msgid "Current password:"
 msgstr "Aktuelles Passwort:"
 
-#: src/Module/Settings/TwoFactor/Index.php:101
+#: src/Module/Settings/TwoFactor/Index.php:112
 msgid ""
 "You need to provide your current password to change two-factor "
 "authentication settings."
 msgstr "Du musst dein aktuelles Passwort eingeben um die Einstellungen der Zwei-Faktor-Authentifizierung zu ändern"
 
-#: src/Module/Settings/TwoFactor/Index.php:102
+#: src/Module/Settings/TwoFactor/Index.php:113
 msgid "Enable two-factor authentication"
 msgstr "Aktiviere die Zwei-Faktor-Authentifizierung"
 
-#: src/Module/Settings/TwoFactor/Index.php:103
+#: src/Module/Settings/TwoFactor/Index.php:114
 msgid "Disable two-factor authentication"
 msgstr "Deaktiviere die Zwei-Faktor-Authentifizierung"
 
-#: src/Module/Settings/TwoFactor/Index.php:104
+#: src/Module/Settings/TwoFactor/Index.php:115
 msgid "Show recovery codes"
 msgstr "Wiederherstellungscodes anzeigen"
 
-#: src/Module/Settings/TwoFactor/Index.php:105
+#: src/Module/Settings/TwoFactor/Index.php:116
+msgid "Manage app-specific passwords"
+msgstr "App spezifische Passwörter verwalten"
+
+#: src/Module/Settings/TwoFactor/Index.php:117
 msgid "Finish app configuration"
 msgstr "Beenden Sie die App-Konfiguration"
 
-#: src/Module/Settings/TwoFactor/Recovery.php:34
-#: src/Module/Settings/TwoFactor/Verify.php:41
-msgid "Please enter your password to access this page."
-msgstr "Bitte geben Sie Ihr Passwort ein, um auf diese Seite zuzugreifen."
-
 #: src/Module/Settings/TwoFactor/Recovery.php:50
 msgid "New recovery codes successfully generated."
 msgstr "Neue Wiederherstellungscodes erfolgreich generiert."
@@ -9733,7 +10127,7 @@ msgid "Two-factor authentication successfully activated."
 msgstr "Zwei-Faktor-Authentifizierung erfolgreich aktiviert."
 
 #: src/Module/Settings/TwoFactor/Verify.php:67
-#: src/Module/TwoFactor/Recovery.php:46 src/Module/TwoFactor/Verify.php:41
+#: src/Module/TwoFactor/Recovery.php:46 src/Module/TwoFactor/Verify.php:43
 msgid "Invalid code, please retry."
 msgstr "Ungültiger Code, bitte erneut versuchen."
 
@@ -9775,7 +10169,7 @@ msgid ""
 msgstr "<p>Oder Sie können die folgende URL in Ihrem Mobilgerät öffnen:</p><p><a href=\"%s\">%s</a></p>"
 
 #: src/Module/Settings/TwoFactor/Verify.php:126
-#: src/Module/TwoFactor/Verify.php:63
+#: src/Module/TwoFactor/Verify.php:67
 msgid "Please enter a code from your authentication app"
 msgstr "Bitte geben Sie einen Code aus Ihrer Authentifizierungs-App ein"
 
@@ -9846,519 +10240,416 @@ msgstr "Der Server ist derzeit nicht verfügbar (wegen Überlastung oder Wartung
 msgid "Go back"
 msgstr "Geh zurück"
 
-#: 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 "Zum Zwecke der Registrierung und um die Kommunikation zwischen dem Nutzer und seinen Kontakten zu gewährleisten, muß der Nutzer einen Namen (auch Pseudonym) und einen Nutzernamen (Spitzname) sowie eine funktionierende E-Mail-Adresse angeben. Der Name ist auf der Profilseite für alle Nutzer sichtbar, auch wenn die Profildetails nicht angezeigt werden.\nDie E-Mail-Adresse wird nur zur Benachrichtigung des Nutzers verwendet, sie wird nirgends angezeigt. Die Anzeige des Nutzerkontos im Server-Verzeichnis bzw. dem weltweiten Verzeichnis erfolgt gemäß den Einstellungen des Nutzers, sie ist zur Kommunikation nicht zwingend notwendig."
-
-#: 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 "Diese Daten sind für die Kommunikation notwendig und werden an die Knoten der Kommunikationspartner übermittelt und dort gespeichert. Nutzer können weitere, private Angaben machen, die ebenfalls an die verwendeten Server der Kommunikationspartner übermittelt werden können."
-
-#: 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 "Angemeldete Nutzer können ihre Nutzerdaten jederzeit von den <a href=\"%1$s/settings/uexport\">Kontoeinstellungen</a> aus exportieren. Wenn ein Nutzer wünscht das Nutzerkonto zu löschen, so ist dies jederzeit unter <a href=\"%1$s/removeme\">%1$s/removeme</a> möglich. Die Löschung des Nutzerkontos ist permanent. Die Löschung der Daten wird auch von den Knoten der Kommunikationspartner angefordert."
-
-#: src/Module/Tos.php:40 src/Module/Tos.php:76
-msgid "Privacy Statement"
-msgstr "Datenschutzerklärung"
-
 #: src/Module/TwoFactor/Recovery.php:41
 #, php-format
 msgid "Remaining recovery codes: %d"
 msgstr "Verbleibende Wiederherstellungscodes: %d"
 
-#: src/Module/TwoFactor/Recovery.php:65
-msgid "Two-factor recovery"
-msgstr "Zwei-Faktor-Wiederherstellung"
-
-#: src/Module/TwoFactor/Recovery.php:66
-msgid ""
-"<p>You can enter one of your one-time recovery codes in case you lost access"
-" to your mobile device.</p>"
-msgstr "<p>Sie können einen Ihrer einmaligen Wiederherstellungscodes eingeben, falls Sie den Zugriff auf Ihr Mobilgerät verloren haben.</p>"
-
-#: src/Module/TwoFactor/Recovery.php:67 src/Module/TwoFactor/Verify.php:62
-#, php-format
-msgid "Don’t have your phone? <a href=\"%s\">Enter a two-factor recovery code</a>"
-msgstr "Hast du dein Handy nicht? <a href=\"%s\">Geben Sie einen Zwei-Faktor-Wiederherstellungscode ein</a>"
-
-#: src/Module/TwoFactor/Recovery.php:68
-msgid "Please enter a recovery code"
-msgstr "Bitte geben Sie einen Wiederherstellungscode ein"
-
-#: src/Module/TwoFactor/Recovery.php:69
-msgid "Submit recovery code and complete login"
-msgstr "Senden Sie den Wiederherstellungscode und schließen Sie die Anmeldung ab"
-
-#: src/Module/TwoFactor/Verify.php:61
-msgid ""
-"<p>Open the two-factor authentication app on your device to get an "
-"authentication code and verify your identity.</p>"
-msgstr "<p>Öffnen Sie die Zwei-Faktor-Authentifizierungs-App auf Ihrem Gerät, um einen Authentifizierungscode abzurufen und Ihre Identität zu überprüfen.</p>"
-
-#: src/Module/TwoFactor/Verify.php:64
-msgid "Verify code and complete login"
-msgstr "Code überprüfen und Anmeldung abschließen"
-
-#: src/Object/Post.php:137
-msgid "This entry was edited"
-msgstr "Dieser Beitrag wurde bearbeitet."
-
-#: src/Object/Post.php:157
-msgid "Private Message"
-msgstr "Private Nachricht"
-
-#: src/Object/Post.php:199
-msgid "Delete locally"
-msgstr "Lokal löschen"
-
-#: src/Object/Post.php:202
-msgid "Delete globally"
-msgstr "Global löschen"
-
-#: src/Object/Post.php:202
-msgid "Remove locally"
-msgstr "Lokal entfernen"
-
-#: src/Object/Post.php:216
-msgid "save to folder"
-msgstr "In Ordner speichern"
-
-#: src/Object/Post.php:251
-msgid "I will attend"
-msgstr "Ich werde teilnehmen"
-
-#: src/Object/Post.php:251
-msgid "I will not attend"
-msgstr "Ich werde nicht teilnehmen"
-
-#: src/Object/Post.php:251
-msgid "I might attend"
-msgstr "Ich werde eventuell teilnehmen"
-
-#: src/Object/Post.php:279
-msgid "ignore thread"
-msgstr "Thread ignorieren"
-
-#: src/Object/Post.php:280
-msgid "unignore thread"
-msgstr "Thread nicht mehr ignorieren"
-
-#: src/Object/Post.php:281
-msgid "toggle ignore status"
-msgstr "Ignoriert-Status ein-/ausschalten"
-
-#: src/Object/Post.php:292
-msgid "add star"
-msgstr "markieren"
-
-#: src/Object/Post.php:293
-msgid "remove star"
-msgstr "Markierung entfernen"
-
-#: src/Object/Post.php:294
-msgid "toggle star status"
-msgstr "Markierung umschalten"
-
-#: src/Object/Post.php:297
-msgid "starred"
-msgstr "markiert"
-
-#: src/Object/Post.php:301
-msgid "add tag"
-msgstr "Tag hinzufügen"
-
-#: src/Object/Post.php:312
-msgid "like"
-msgstr "mag ich"
-
-#: src/Object/Post.php:313
-msgid "dislike"
-msgstr "mag ich nicht"
-
-#: src/Object/Post.php:316
-msgid "Share this"
-msgstr "Weitersagen"
-
-#: src/Object/Post.php:316
-msgid "share"
-msgstr "Teilen"
+#: src/Module/TwoFactor/Recovery.php:65
+msgid "Two-factor recovery"
+msgstr "Zwei-Faktor-Wiederherstellung"
 
-#: src/Object/Post.php:384
-msgid "to"
-msgstr "zu"
+#: src/Module/TwoFactor/Recovery.php:66
+msgid ""
+"<p>You can enter one of your one-time recovery codes in case you lost access"
+" to your mobile device.</p>"
+msgstr "<p>Sie können einen Ihrer einmaligen Wiederherstellungscodes eingeben, falls Sie den Zugriff auf Ihr Mobilgerät verloren haben.</p>"
 
-#: src/Object/Post.php:385
-msgid "via"
-msgstr "via"
+#: src/Module/TwoFactor/Recovery.php:67 src/Module/TwoFactor/Verify.php:66
+#, php-format
+msgid "Don’t have your phone? <a href=\"%s\">Enter a two-factor recovery code</a>"
+msgstr "Hast du dein Handy nicht? <a href=\"%s\">Geben Sie einen Zwei-Faktor-Wiederherstellungscode ein</a>"
 
-#: src/Object/Post.php:386
-msgid "Wall-to-Wall"
-msgstr "Wall-to-Wall"
+#: src/Module/TwoFactor/Recovery.php:68
+msgid "Please enter a recovery code"
+msgstr "Bitte geben Sie einen Wiederherstellungscode ein"
 
-#: src/Object/Post.php:387
-msgid "via Wall-To-Wall:"
-msgstr "via Wall-To-Wall:"
+#: src/Module/TwoFactor/Recovery.php:69
+msgid "Submit recovery code and complete login"
+msgstr "Senden Sie den Wiederherstellungscode und schließen Sie die Anmeldung ab"
 
-#: src/Object/Post.php:420
-#, php-format
-msgid "Reply to %s"
-msgstr "Antworte %s"
+#: src/Module/TwoFactor/Verify.php:63
+msgid ""
+"<p>Open the two-factor authentication app on your device to get an "
+"authentication code and verify your identity.</p>"
+msgstr "<p>Öffnen Sie die Zwei-Faktor-Authentifizierungs-App auf Ihrem Gerät, um einen Authentifizierungscode abzurufen und Ihre Identität zu überprüfen.</p>"
 
-#: src/Object/Post.php:435
-msgid "Notifier task is pending"
-msgstr "Die Benachrichtigungsaufgabe ist ausstehend"
+#: src/Module/TwoFactor/Verify.php:68
+msgid "Verify code and complete login"
+msgstr "Code überprüfen und Anmeldung abschließen"
 
-#: src/Object/Post.php:436
-msgid "Delivery to remote servers is pending"
-msgstr "Die Auslieferung an Remote-Server steht noch aus"
+#: src/Module/Welcome.php:25
+msgid "Welcome to Friendica"
+msgstr "Willkommen bei Friendica"
 
-#: src/Object/Post.php:437
-msgid "Delivery to remote servers is underway"
-msgstr "Die Auslieferung an Remote-Server ist unterwegs"
+#: src/Module/Welcome.php:26
+msgid "New Member Checklist"
+msgstr "Checkliste für neue Mitglieder"
 
-#: src/Object/Post.php:438
-msgid "Delivery to remote servers is mostly done"
-msgstr "Die Zustellung an Remote-Server ist fast erledigt"
+#: src/Module/Welcome.php:27
+msgid ""
+"We would like to offer some tips and links to help make your experience "
+"enjoyable. Click any item to visit the relevant page. A link to this page "
+"will be visible from your home page for two weeks after your initial "
+"registration and then will quietly disappear."
+msgstr "Wir möchten dir einige Tipps und Links anbieten, die dir helfen könnten, den Einstieg angenehmer zu machen. Klicke auf ein Element, um die entsprechende Seite zu besuchen. Ein Link zu dieser Seite hier bleibt für dich an deiner Pinnwand für zwei Wochen nach dem Registrierungsdatum sichtbar und wird dann verschwinden."
 
-#: src/Object/Post.php:439
-msgid "Delivery to remote servers is done"
-msgstr "Die Zustellung an die Remote-Server ist erledigt"
+#: src/Module/Welcome.php:29
+msgid "Getting Started"
+msgstr "Einstieg"
 
-#: src/Object/Post.php:459
-#, php-format
-msgid "%d comment"
-msgid_plural "%d comments"
-msgstr[0] "%d Kommentar"
-msgstr[1] "%d Kommentare"
+#: src/Module/Welcome.php:30
+msgid "Friendica Walk-Through"
+msgstr "Friendica Rundgang"
 
-#: src/Object/Post.php:460
-msgid "Show more"
-msgstr "Zeige mehr"
+#: src/Module/Welcome.php:31
+msgid ""
+"On your <em>Quick Start</em> page - find a brief introduction to your "
+"profile and network tabs, make some new connections, and find some groups to"
+" join."
+msgstr "Auf der <em>Quick Start</em>-Seite findest du eine kurze Einleitung in die einzelnen Funktionen deines Profils und die Netzwerk-Reiter, wo du interessante Foren findest und neue Kontakte knüpfst."
 
-#: src/Object/Post.php:461
-msgid "Show fewer"
-msgstr "Zeige weniger"
+#: src/Module/Welcome.php:34
+msgid "Go to Your Settings"
+msgstr "Gehe zu deinen Einstellungen"
 
-#: src/Protocol/Diaspora.php:2438
-msgid "Sharing notification from Diaspora network"
-msgstr "Freigabe-Benachrichtigung von Diaspora"
+#: src/Module/Welcome.php:35
+msgid ""
+"On your <em>Settings</em> page -  change your initial password. Also make a "
+"note of your Identity Address. This looks just like an email address - and "
+"will be useful in making friends on the free social web."
+msgstr "Ändere bitte unter <em>Einstellungen</em> dein Passwort. Außerdem merke dir deine Identifikationsadresse. Diese sieht aus wie eine E-Mail-Adresse und wird benötigt, um Kontakte mit anderen im Friendica Netzwerk zu knüpfen.."
 
-#: src/Protocol/Diaspora.php:3598
-msgid "Attachments:"
-msgstr "Anhänge:"
+#: src/Module/Welcome.php:36
+msgid ""
+"Review the other settings, particularly the privacy settings. An unpublished"
+" directory listing is like having an unlisted phone number. In general, you "
+"should probably publish your listing - unless all of your friends and "
+"potential friends know exactly how to find you."
+msgstr "Überprüfe die restlichen Einstellungen, insbesondere die Einstellungen zur Privatsphäre. Wenn du dein Profil nicht veröffentlichst, ist das, als wenn du deine Telefonnummer nicht ins Telefonbuch einträgst. Im Allgemeinen solltest du es veröffentlichen - außer all deine Kontakte und potentiellen Kontakte wissen genau, wie sie dich finden können."
 
-#: src/Protocol/OStatus.php:1863
-#, php-format
-msgid "%s is now following %s."
-msgstr "%s folgt nun %s"
+#: src/Module/Welcome.php:40
+msgid ""
+"Upload a profile photo if you have not done so already. Studies have shown "
+"that people with real photos of themselves are ten times more likely to make"
+" friends than people who do not."
+msgstr "Lade ein Profilbild hoch, falls du es noch nicht getan hast. Studien haben gezeigt, dass es zehnmal wahrscheinlicher ist, neue Kontakte zu finden, wenn du ein Bild von dir selbst verwendest, als wenn du dies nicht tust."
 
-#: src/Protocol/OStatus.php:1864
-msgid "following"
-msgstr "folgen"
+#: src/Module/Welcome.php:41
+msgid "Edit Your Profile"
+msgstr "Editiere dein Profil"
 
-#: src/Protocol/OStatus.php:1867
-#, php-format
-msgid "%s stopped following %s."
-msgstr "%s hat aufgehört %s, zu folgen"
+#: src/Module/Welcome.php:42
+msgid ""
+"Edit your <strong>default</strong> profile to your liking. Review the "
+"settings for hiding your list of friends and hiding the profile from unknown"
+" visitors."
+msgstr "Editiere dein <strong>Standard</strong>-Profil nach deinen Vorlieben. Überprüfe die Einstellungen zum Verbergen deiner Kontaktliste vor unbekannten Betrachtern des Profils."
 
-#: src/Protocol/OStatus.php:1868
-msgid "stopped following"
-msgstr "wird nicht mehr gefolgt"
+#: src/Module/Welcome.php:43
+msgid "Profile Keywords"
+msgstr "Profil-Schlüsselbegriffe"
 
-#: src/Util/Temporal.php:151
-msgid "YYYY-MM-DD or MM-DD"
-msgstr "YYYY-MM-DD oder MM-DD"
+#: src/Module/Welcome.php:44
+msgid ""
+"Set some public keywords for your default profile which describe your "
+"interests. We may be able to find other people with similar interests and "
+"suggest friendships."
+msgstr "Trage ein paar öffentliche Stichwörter in dein Standardprofil ein, die deine Interessen beschreiben. Eventuell sind wir in der Lage, Leute zu finden, die deine Interessen teilen, und können dir dann Kontakte vorschlagen."
 
-#: src/Util/Temporal.php:298
-msgid "never"
-msgstr "nie"
+#: src/Module/Welcome.php:46
+msgid "Connecting"
+msgstr "Verbindungen knüpfen"
 
-#: src/Util/Temporal.php:305
-msgid "less than a second ago"
-msgstr "vor weniger als einer Sekunde"
+#: src/Module/Welcome.php:48
+msgid "Importing Emails"
+msgstr "Emails Importieren"
 
-#: src/Util/Temporal.php:313
-msgid "year"
-msgstr "Jahr"
+#: src/Module/Welcome.php:49
+msgid ""
+"Enter your email access information on your Connector Settings page if you "
+"wish to import and interact with friends or mailing lists from your email "
+"INBOX"
+msgstr "Gib deine E-Mail-Zugangsinformationen auf der Connector-Einstellungsseite ein, falls du E-Mails aus Deinem Posteingang importieren und mit Kontakten und Mailinglisten interagieren willst."
 
-#: src/Util/Temporal.php:313
-msgid "years"
-msgstr "Jahre"
+#: src/Module/Welcome.php:50
+msgid "Go to Your Contacts Page"
+msgstr "Gehe zu deiner Kontakt-Seite"
 
-#: src/Util/Temporal.php:314
-msgid "months"
-msgstr "Monate"
+#: src/Module/Welcome.php:51
+msgid ""
+"Your Contacts page is your gateway to managing friendships and connecting "
+"with friends on other networks. Typically you enter their address or site "
+"URL in the <em>Add New Contact</em> dialog."
+msgstr "Die Kontakte-Seite ist die Einstiegsseite, von der aus du Kontakte verwalten und dich mit Personen in anderen Netzwerken verbinden kannst. Normalerweise gibst du dazu einfach ihre Adresse oder die URL der Seite im Kasten <em>Neuen Kontakt hinzufügen</em> ein."
 
-#: src/Util/Temporal.php:315
-msgid "weeks"
-msgstr "Wochen"
+#: src/Module/Welcome.php:52
+msgid "Go to Your Site's Directory"
+msgstr "Gehe zum Verzeichnis Deiner Friendica-Instanz"
 
-#: src/Util/Temporal.php:316
-msgid "days"
-msgstr "Tage"
+#: src/Module/Welcome.php:53
+msgid ""
+"The Directory page lets you find other people in this network or other "
+"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
+"their profile page. Provide your own Identity Address if requested."
+msgstr "Über die Verzeichnisseite kannst du andere Personen auf diesem Server oder anderen, verknüpften Seiten finden. Halte nach einem <em>Verbinden</em>- oder <em>Folgen</em>-Link auf deren Profilseiten Ausschau und gib deine eigene Profiladresse an, falls du danach gefragt wirst."
 
-#: src/Util/Temporal.php:317
-msgid "hour"
-msgstr "Stunde"
+#: src/Module/Welcome.php:54
+msgid "Finding New People"
+msgstr "Neue Leute kennenlernen"
 
-#: src/Util/Temporal.php:317
-msgid "hours"
-msgstr "Stunden"
+#: src/Module/Welcome.php:55
+msgid ""
+"On the side panel of the Contacts page are several tools to find new "
+"friends. We can match people by interest, look up people by name or "
+"interest, and provide suggestions based on network relationships. On a brand"
+" new site, friend suggestions will usually begin to be populated within 24 "
+"hours."
+msgstr "Im seitlichen Bedienfeld der Kontakteseite gibt es diverse Werkzeuge, um neue Personen zu finden. Wir können Menschen mit den gleichen Interessen finden, anhand von Namen oder Interessen suchen oder aber aufgrund vorhandener Kontakte neue Leute vorschlagen.\nAuf einer brandneuen - soeben erstellten - Seite starten die Kontaktvorschläge innerhalb von 24 Stunden."
 
-#: src/Util/Temporal.php:318
-msgid "minute"
-msgstr "Minute"
+#: src/Module/Welcome.php:58
+msgid "Group Your Contacts"
+msgstr "Gruppiere deine Kontakte"
 
-#: src/Util/Temporal.php:318
-msgid "minutes"
-msgstr "Minuten"
+#: src/Module/Welcome.php:59
+msgid ""
+"Once you have made some friends, organize them into private conversation "
+"groups from the sidebar of your Contacts page and then you can interact with"
+" each group privately on your Network page."
+msgstr "Sobald du einige Kontakte gefunden hast, organisiere sie in Gruppen zur privaten Kommunikation im Seitenmenü der Kontakte-Seite. Du kannst dann mit jeder dieser Gruppen von der Netzwerkseite aus privat interagieren."
 
-#: src/Util/Temporal.php:319
-msgid "second"
-msgstr "Sekunde"
+#: src/Module/Welcome.php:61
+msgid "Why Aren't My Posts Public?"
+msgstr "Warum sind meine Beiträge nicht öffentlich?"
 
-#: src/Util/Temporal.php:319
-msgid "seconds"
-msgstr "Sekunden"
+#: src/Module/Welcome.php:62
+msgid ""
+"Friendica respects your privacy. By default, your posts will only show up to"
+" people you've added as friends. For more information, see the help section "
+"from the link above."
+msgstr "Friendica respektiert Deine Privatsphäre. Mit der Grundeinstellung werden Deine Beiträge ausschließlich Deinen Kontakten angezeigt. Für weitere Informationen diesbezüglich lies dir bitte den entsprechenden Abschnitt in der Hilfe unter dem obigen Link durch."
 
-#: src/Util/Temporal.php:329
-#, php-format
-msgid "in %1$d %2$s"
-msgstr "in %1$d %2$s"
+#: src/Module/Welcome.php:64
+msgid "Getting Help"
+msgstr "Hilfe bekommen"
 
-#: src/Util/Temporal.php:332
-#, php-format
-msgid "%1$d %2$s ago"
-msgstr "vor %1$d %2$s"
+#: src/Module/Welcome.php:65
+msgid "Go to the Help Section"
+msgstr "Zum Hilfe Abschnitt gehen"
 
-#: src/Worker/Delivery.php:450
-msgid "(no subject)"
-msgstr "(kein Betreff)"
+#: src/Module/Welcome.php:66
+msgid ""
+"Our <strong>help</strong> pages may be consulted for detail on other program"
+" features and resources."
+msgstr "Unsere <strong>Hilfe</strong>-Seiten können herangezogen werden, um weitere Einzelheiten zu anderen Programm-Features zu erhalten."
 
-#: update.php:218
-#, php-format
-msgid "%s: Updating author-id and owner-id in item and thread table. "
-msgstr "%s: Aktualisiere die author-id und owner-id in der Thread Tabelle"
+#: src/Object/Post.php:138
+msgid "This entry was edited"
+msgstr "Dieser Beitrag wurde bearbeitet."
 
-#: update.php:273
-#, php-format
-msgid "%s: Updating post-type."
-msgstr "%s: Aktualisiere Beitrags-Typ"
+#: src/Object/Post.php:158
+msgid "Private Message"
+msgstr "Private Nachricht"
 
-#: view/theme/duepuntozero/config.php:56
-msgid "greenzero"
-msgstr "greenzero"
+#: src/Object/Post.php:200
+msgid "Delete locally"
+msgstr "Lokal löschen"
 
-#: view/theme/duepuntozero/config.php:57
-msgid "purplezero"
-msgstr "purplezero"
+#: src/Object/Post.php:203
+msgid "Delete globally"
+msgstr "Global löschen"
 
-#: view/theme/duepuntozero/config.php:58
-msgid "easterbunny"
-msgstr "easterbunny"
+#: src/Object/Post.php:203
+msgid "Remove locally"
+msgstr "Lokal entfernen"
 
-#: view/theme/duepuntozero/config.php:59
-msgid "darkzero"
-msgstr "darkzero"
+#: src/Object/Post.php:217
+msgid "save to folder"
+msgstr "In Ordner speichern"
 
-#: view/theme/duepuntozero/config.php:60
-msgid "comix"
-msgstr "comix"
+#: src/Object/Post.php:252
+msgid "I will attend"
+msgstr "Ich werde teilnehmen"
 
-#: view/theme/duepuntozero/config.php:61
-msgid "slackr"
-msgstr "slackr"
+#: src/Object/Post.php:252
+msgid "I will not attend"
+msgstr "Ich werde nicht teilnehmen"
 
-#: view/theme/duepuntozero/config.php:74
-msgid "Variations"
-msgstr "Variationen"
+#: src/Object/Post.php:252
+msgid "I might attend"
+msgstr "Ich werde eventuell teilnehmen"
 
-#: view/theme/frio/config.php:105
-msgid "Custom"
-msgstr "Benutzerdefiniert"
+#: src/Object/Post.php:280
+msgid "ignore thread"
+msgstr "Thread ignorieren"
 
-#: view/theme/frio/config.php:117
-msgid "Note"
-msgstr "Hinweis"
+#: src/Object/Post.php:281
+msgid "unignore thread"
+msgstr "Thread nicht mehr ignorieren"
 
-#: view/theme/frio/config.php:117
-msgid "Check image permissions if all users are allowed to see the image"
-msgstr "Überprüfe, dass alle Benutzer die Berechtigung haben dieses Bild anzusehen"
+#: src/Object/Post.php:282
+msgid "toggle ignore status"
+msgstr "Ignoriert-Status ein-/ausschalten"
 
-#: view/theme/frio/config.php:123
-msgid "Select color scheme"
-msgstr "Farbschema auswählen"
+#: src/Object/Post.php:293
+msgid "add star"
+msgstr "markieren"
 
-#: view/theme/frio/config.php:124
-msgid "Copy or paste schemestring"
-msgstr "Farbschema kopieren oder einfügen"
+#: src/Object/Post.php:294
+msgid "remove star"
+msgstr "Markierung entfernen"
 
-#: view/theme/frio/config.php:124
-msgid ""
-"You can copy this string to share your theme with others. Pasting here "
-"applies the schemestring"
-msgstr "Du kannst den String mit den Farbschema Informationen mit anderen Teilen. Wenn du einen neuen Farbschema-String hier einfügst wird er für deine Einstellungen übernommen."
+#: src/Object/Post.php:295
+msgid "toggle star status"
+msgstr "Markierung umschalten"
 
-#: view/theme/frio/config.php:125
-msgid "Navigation bar background color"
-msgstr "Hintergrundfarbe der Navigationsleiste"
+#: src/Object/Post.php:298
+msgid "starred"
+msgstr "markiert"
 
-#: view/theme/frio/config.php:126
-msgid "Navigation bar icon color "
-msgstr "Icon Farbe in der Navigationsleiste"
+#: src/Object/Post.php:302
+msgid "add tag"
+msgstr "Tag hinzufügen"
 
-#: view/theme/frio/config.php:127
-msgid "Link color"
-msgstr "Linkfarbe"
+#: src/Object/Post.php:313
+msgid "like"
+msgstr "mag ich"
 
-#: view/theme/frio/config.php:128
-msgid "Set the background color"
-msgstr "Hintergrundfarbe festlegen"
+#: src/Object/Post.php:314
+msgid "dislike"
+msgstr "mag ich nicht"
 
-#: view/theme/frio/config.php:129
-msgid "Content background opacity"
-msgstr "Opazität des Hintergrunds von Beiträgen"
+#: src/Object/Post.php:317
+msgid "Share this"
+msgstr "Weitersagen"
 
-#: view/theme/frio/config.php:130
-msgid "Set the background image"
-msgstr "Hintergrundbild festlegen"
+#: src/Object/Post.php:317
+msgid "share"
+msgstr "Teilen"
 
-#: view/theme/frio/config.php:131
-msgid "Background image style"
-msgstr "Stil des Hintergrundbildes"
+#: src/Object/Post.php:385
+msgid "to"
+msgstr "zu"
 
-#: view/theme/frio/config.php:136
-msgid "Login page background image"
-msgstr "Hintergrundbild der Login-Seite"
+#: src/Object/Post.php:386
+msgid "via"
+msgstr "via"
 
-#: view/theme/frio/config.php:140
-msgid "Login page background color"
-msgstr "Hintergrundfarbe der Login-Seite"
+#: src/Object/Post.php:387
+msgid "Wall-to-Wall"
+msgstr "Wall-to-Wall"
 
-#: view/theme/frio/config.php:140
-msgid "Leave background image and color empty for theme defaults"
-msgstr "Wenn die Theme-Vorgaben verwendet werden sollen, lass bitte die Felder für die Hintergrundfarbe und das Hintergrundbild leer."
+#: src/Object/Post.php:388
+msgid "via Wall-To-Wall:"
+msgstr "via Wall-To-Wall:"
 
-#: view/theme/frio/php/Image.php:24
-msgid "Top Banner"
-msgstr "Top Banner"
+#: src/Object/Post.php:421
+#, php-format
+msgid "Reply to %s"
+msgstr "Antworte %s"
 
-#: 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 "Skaliere das Hintergrundbild so, dass es die Breite der Seite einnimmt, und fülle den Rest der Seite mit der Hintergrundfarbe bei langen Seiten."
+#: src/Object/Post.php:436
+msgid "Notifier task is pending"
+msgstr "Die Benachrichtigungsaufgabe ist ausstehend"
 
-#: view/theme/frio/php/Image.php:25
-msgid "Full screen"
-msgstr "Vollbildmodus"
+#: src/Object/Post.php:437
+msgid "Delivery to remote servers is pending"
+msgstr "Die Auslieferung an Remote-Server steht noch aus"
 
-#: view/theme/frio/php/Image.php:25
-msgid ""
-"Resize image to fill entire screen, clipping either the right or the bottom."
-msgstr "Skaliere das Bild so, dass es den gesamten Bildschirm füllt. Hierfür wird entweder die Breite oder die Höhe des Bildes automatisch abgeschnitten."
+#: src/Object/Post.php:438
+msgid "Delivery to remote servers is underway"
+msgstr "Die Auslieferung an Remote-Server ist unterwegs"
 
-#: view/theme/frio/php/Image.php:26
-msgid "Single row mosaic"
-msgstr "Mosaik in einer Zeile"
+#: src/Object/Post.php:439
+msgid "Delivery to remote servers is mostly done"
+msgstr "Die Zustellung an Remote-Server ist fast erledigt"
 
-#: view/theme/frio/php/Image.php:26
-msgid ""
-"Resize image to repeat it on a single row, either vertical or horizontal."
-msgstr "Skaliere das Bild so, dass es in einer einzelnen Reihe, entweder horizontal oder vertikal, wiederholt wird."
+#: src/Object/Post.php:440
+msgid "Delivery to remote servers is done"
+msgstr "Die Zustellung an die Remote-Server ist erledigt"
 
-#: view/theme/frio/php/Image.php:27
-msgid "Mosaic"
-msgstr "Mosaik"
+#: src/Object/Post.php:460
+#, php-format
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] "%d Kommentar"
+msgstr[1] "%d Kommentare"
 
-#: view/theme/frio/php/Image.php:27
-msgid "Repeat image to fill the screen."
-msgstr "Wiederhole das Bild, um den Bildschirm zu füllen."
+#: src/Object/Post.php:461
+msgid "Show more"
+msgstr "Zeige mehr"
 
-#: view/theme/frio/theme.php:239
-msgid "Guest"
-msgstr "Gast"
+#: src/Object/Post.php:462
+msgid "Show fewer"
+msgstr "Zeige weniger"
 
-#: view/theme/frio/theme.php:244
-msgid "Visitor"
-msgstr "Besucher"
+#: src/LegacyModule.php:30
+#, php-format
+msgid "Legacy module file not found: %s"
+msgstr "Legacy-Moduldatei nicht gefunden: %s"
 
-#: view/theme/quattro/config.php:76
-msgid "Alignment"
-msgstr "Ausrichtung"
+#: src/App.php:505
+msgid "Delete this item?"
+msgstr "Diesen Beitrag löschen?"
 
-#: view/theme/quattro/config.php:76
-msgid "Left"
-msgstr "Links"
+#: src/App.php:547
+msgid "toggle mobile"
+msgstr "mobile Ansicht umschalten"
 
-#: view/theme/quattro/config.php:76
-msgid "Center"
-msgstr "Mitte"
+#: src/App.php:863
+msgid "No system theme config value set."
+msgstr "Es wurde kein Konfigurationswert für das systemweite Theme gesetzt."
 
-#: view/theme/quattro/config.php:77
-msgid "Color scheme"
-msgstr "Farbschema"
+#: src/App.php:1151
+msgid "You must be logged in to use addons. "
+msgstr "Du musst angemeldet sein, um Addons benutzen zu können."
 
-#: view/theme/quattro/config.php:78
-msgid "Posts font size"
-msgstr "Schriftgröße in Beiträgen"
+#: src/BaseModule.php:135
+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 "Das Sicherheitsmerkmal war nicht korrekt. Das passiert meistens, wenn das Formular vor dem Absenden zu lange geöffnet war (länger als 3 Stunden)."
 
-#: view/theme/quattro/config.php:79
-msgid "Textareas font size"
-msgstr "Schriftgröße in Eingabefeldern"
+#: src/Console/ArchiveContact.php:86
+#, php-format
+msgid "Could not find any unarchived contact entry for this URL (%s)"
+msgstr "Für die URL (%s) konnte kein nicht-archivierter Kontakt gefunden werden"
 
-#: view/theme/vier/config.php:76
-msgid "Comma separated list of helper forums"
-msgstr "Komma-separierte Liste der Helfer-Foren"
+#: src/Console/ArchiveContact.php:89
+msgid "The contact entries have been archived"
+msgstr "Die Kontakteinträge wurden archiviert."
 
-#: view/theme/vier/config.php:122
-msgid "Set style"
-msgstr "Stil auswählen"
+#: src/Console/NewPassword.php:93
+msgid "Enter new password: "
+msgstr "Neues Passwort eingeben:"
 
-#: view/theme/vier/config.php:123
-msgid "Community Pages"
-msgstr "Foren"
+#: src/Console/PostUpdate.php:73
+#, php-format
+msgid "Post update version number has been set to %s."
+msgstr "Die Post-Update-Versionsnummer wurde auf %s gesetzt."
 
-#: view/theme/vier/config.php:124 view/theme/vier/theme.php:151
-msgid "Community Profiles"
-msgstr "Community-Profile"
+#: src/Console/PostUpdate.php:81
+msgid "Check for pending update actions."
+msgstr "Überprüfe ausstehende Update-Aktionen"
 
-#: view/theme/vier/config.php:125
-msgid "Help or @NewHere ?"
-msgstr "Hilfe oder @NewHere"
+#: src/Console/PostUpdate.php:83
+msgid "Done."
+msgstr "Erledigt."
 
-#: view/theme/vier/config.php:126 view/theme/vier/theme.php:373
-msgid "Connect Services"
-msgstr "Verbinde Dienste"
+#: src/Console/PostUpdate.php:85
+msgid "Execute pending post updates."
+msgstr "Ausstehende Post-Updates ausführen"
 
-#: view/theme/vier/config.php:127
-msgid "Find Friends"
-msgstr "Kontakte finden"
+#: src/Console/PostUpdate.php:91
+msgid "All pending post updates are done."
+msgstr "Alle ausstehenden Post-Updates wurden ausgeführt."
 
-#: view/theme/vier/config.php:128 view/theme/vier/theme.php:181
-msgid "Last users"
-msgstr "Letzte Nutzer"
+#: update.php:218
+#, php-format
+msgid "%s: Updating author-id and owner-id in item and thread table. "
+msgstr "%s: Aktualisiere die author-id und owner-id in der Thread Tabelle"
 
-#: view/theme/vier/theme.php:288
-msgid "Quick Start"
-msgstr "Schnell-Start"
+#: update.php:273
+#, php-format
+msgid "%s: Updating post-type."
+msgstr "%s: Aktualisiere Beitrags-Typ"
index 29d2b2c2b6a4334bf9ca4b1d3480b0d1334f604c..fe8c424643b34ca47ca37678ed3ec1e52cdbde3b 100644 (file)
@@ -6,6 +6,69 @@ function string_plural_select_de($n){
        return ($n != 1);;
 }}
 ;
+$a->strings["Friendica Notification"] = "Friendica-Benachrichtigung";
+$a->strings["Thank You,"] = "Danke,";
+$a->strings["%1\$s, %2\$s Administrator"] = "%1\$s, %2\$s Administrator";
+$a->strings["%s Administrator"] = "der Administrator von %s";
+$a->strings["[Friendica:Notify] New mail received at %s"] = "[Friendica-Meldung] Neue Email erhalten um %s";
+$a->strings["%1\$s sent you a new private message at %2\$s."] = "%1\$s hat dir eine neue, private Nachricht um %2\$s geschickt.";
+$a->strings["a private message"] = "eine private Nachricht";
+$a->strings["%1\$s sent you %2\$s."] = "%1\$s schickte dir %2\$s.";
+$a->strings["Please visit %s to view and/or reply to your private messages."] = "Bitte besuche %s, um Deine privaten Nachrichten anzusehen und/oder zu beantworten.";
+$a->strings["%1\$s tagged you on [url=%2\$s]a %3\$s[/url]"] = "%1\$s erwähnte dich in [url=%2\$s] einem %3\$s[/url]";
+$a->strings["%1\$s commented on [url=%2\$s]a %3\$s[/url]"] = "%1\$s kommentierte [url=%2\$s]a %3\$s[/url]";
+$a->strings["%1\$s tagged you on [url=%2\$s]%3\$s's %4\$s[/url]"] = "%1\$s erwähnte dich auf  [url=%2\$s]%3\$s's %4\$s[/url]";
+$a->strings["%1\$s commented on [url=%2\$s]%3\$s's %4\$s[/url]"] = "%1\$s kommentierte [url=%2\$s]%3\$ss %4\$s[/url]";
+$a->strings["%1\$s tagged you on [url=%2\$s]your %3\$s[/url]"] = "%1\$s erwähnte dich auf [url=%2\$s]deinem %3\$s[/url]";
+$a->strings["%1\$s commented on [url=%2\$s]your %3\$s[/url]"] = "%1\$s kommentierte [url=%2\$s]deinen %3\$s[/url]";
+$a->strings["%1\$s tagged you on [url=%2\$s]their %3\$s[/url]"] = "%1\$s erwähnte dich im [url=%2\$s]eigenen %3\$s[/url]";
+$a->strings["%1\$s commented on [url=%2\$s]their %3\$s[/url]"] = "%1\$s kommentierte den [url=%2\$s]eigenen %3\$s[/url]";
+$a->strings["[Friendica:Notify] %s tagged you"] = "[Friendica-Meldung] %s hat dich erwähnt";
+$a->strings["%1\$s tagged you at %2\$s"] = "%1\$s erwähnte dich auf %2\$s";
+$a->strings["[Friendica:Notify] Comment to conversation #%1\$d by %2\$s"] = "[Friendica-Meldung] Kommentar zum Beitrag #%1\$d von %2\$s";
+$a->strings["%s commented on an item/conversation you have been following."] = "%s hat einen Beitrag kommentiert, dem du folgst.";
+$a->strings["Please visit %s to view and/or reply to the conversation."] = "Bitte besuche %s, um die Konversation anzusehen und/oder zu kommentieren.";
+$a->strings["[Friendica:Notify] %s posted to your profile wall"] = "[Friendica-Meldung] %s hat auf Deine Pinnwand geschrieben";
+$a->strings["%1\$s posted to your profile wall at %2\$s"] = "%1\$s schrieb um %2\$s auf Deine Pinnwand";
+$a->strings["%1\$s posted to [url=%2\$s]your wall[/url]"] = "%1\$s hat etwas auf [url=%2\$s]Deiner Pinnwand[/url] gepostet";
+$a->strings["[Friendica:Notify] %s shared a new post"] = "[Friendica Benachrichtigung] %s hat einen Beitrag geteilt";
+$a->strings["%1\$s shared a new post at %2\$s"] = "%1\$s hat einen neuen Beitrag auf %2\$s geteilt";
+$a->strings["%1\$s [url=%2\$s]shared a post[/url]."] = "%1\$s [url=%2\$s]hat einen Beitrag geteilt[/url].";
+$a->strings["[Friendica:Notify] %1\$s poked you"] = "[Friendica-Meldung] %1\$s hat dich angestupst";
+$a->strings["%1\$s poked you at %2\$s"] = "%1\$s hat dich auf %2\$s angestupst";
+$a->strings["%1\$s [url=%2\$s]poked you[/url]."] = "%1\$s [url=%2\$s]hat dich angestupst[/url].";
+$a->strings["[Friendica:Notify] %s tagged your post"] = "[Friendica-Meldung] %s hat Deinen Beitrag getaggt";
+$a->strings["%1\$s tagged your post at %2\$s"] = "%1\$s erwähnte Deinen Beitrag auf %2\$s";
+$a->strings["%1\$s tagged [url=%2\$s]your post[/url]"] = "%1\$s erwähnte [url=%2\$s]Deinen Beitrag[/url]";
+$a->strings["[Friendica:Notify] Introduction received"] = "[Friendica-Meldung] Kontaktanfrage erhalten";
+$a->strings["You've received an introduction from '%1\$s' at %2\$s"] = "Du hast eine Kontaktanfrage von '%1\$s' auf %2\$s erhalten";
+$a->strings["You've received [url=%1\$s]an introduction[/url] from %2\$s."] = "Du hast eine [url=%1\$s]Kontaktanfrage[/url] von %2\$s erhalten.";
+$a->strings["You may visit their profile at %s"] = "Hier kannst du das Profil betrachten: %s";
+$a->strings["Please visit %s to approve or reject the introduction."] = "Bitte besuche %s, um die Kontaktanfrage anzunehmen oder abzulehnen.";
+$a->strings["[Friendica:Notify] A new person is sharing with you"] = "[Friendica Benachrichtigung] Eine neue Person teilt mit dir";
+$a->strings["%1\$s is sharing with you at %2\$s"] = "%1\$s teilt mit dir auf %2\$s";
+$a->strings["[Friendica:Notify] You have a new follower"] = "[Friendica-Benachrichtigung] Du hast einen neuen Kontakt";
+$a->strings["You have a new follower at %2\$s : %1\$s"] = "Du hast einen neuen Kontakt auf %2\$s: %1\$s";
+$a->strings["[Friendica:Notify] Friend suggestion received"] = "[Friendica-Meldung] Kontaktvorschlag erhalten";
+$a->strings["You've received a friend suggestion from '%1\$s' at %2\$s"] = "Du hast einen Kontakt-Vorschlag von '%1\$s' auf %2\$s erhalten";
+$a->strings["You've received [url=%1\$s]a friend suggestion[/url] for %2\$s from %3\$s."] = "Du hast einen [url=%1\$s]Kontakt-Vorschlag[/url] %2\$s von %3\$s erhalten.";
+$a->strings["Name:"] = "Name:";
+$a->strings["Photo:"] = "Foto:";
+$a->strings["Please visit %s to approve or reject the suggestion."] = "Bitte besuche %s, um den Vorschlag zu akzeptieren oder abzulehnen.";
+$a->strings["[Friendica:Notify] Connection accepted"] = "[Friendica-Benachrichtigung] Kontaktanfrage bestätigt";
+$a->strings["'%1\$s' has accepted your connection request at %2\$s"] = "'%1\$s' hat Deine Kontaktanfrage auf  %2\$s bestätigt";
+$a->strings["%2\$s has accepted your [url=%1\$s]connection request[/url]."] = "%2\$s hat Deine [url=%1\$s]Kontaktanfrage[/url] akzeptiert.";
+$a->strings["You are now mutual friends and may exchange status updates, photos, and email without restriction."] = "Ihr seid nun beidseitige Kontakte und könnt Statusmitteilungen, Bilder und E-Mails ohne Einschränkungen austauschen.";
+$a->strings["Please visit %s if you wish to make any changes to this relationship."] = "Bitte besuche %s, wenn du Änderungen an eurer Beziehung vornehmen willst.";
+$a->strings["'%1\$s' has chosen to accept you a fan, which restricts some forms of communication - such as private messaging and some profile interactions. If this is a celebrity or community page, these settings were applied automatically."] = "'%1\$s' hat sich entschieden dich als Fan zu akzeptieren, dies schränkt einige Kommunikationswege - wie private Nachrichten und einige Interaktionsmöglichkeiten auf der Profilseite - ein. Wenn dies eine Berühmtheiten- oder Gemeinschaftsseite ist, werden diese Einstellungen automatisch vorgenommen.";
+$a->strings["'%1\$s' may choose to extend this into a two-way or more permissive relationship in the future."] = "'%1\$s' kann den Kontaktstatus zu einem späteren Zeitpunkt erweitern und diese Einschränkungen aufheben. ";
+$a->strings["Please visit %s  if you wish to make any changes to this relationship."] = "Bitte besuche %s, wenn du Änderungen an eurer Beziehung vornehmen willst.";
+$a->strings["[Friendica System Notify]"] = "[Friendica-Systembenachrichtigung]";
+$a->strings["registration request"] = "Registrierungsanfrage";
+$a->strings["You've received a registration request from '%1\$s' at %2\$s"] = "Du hast eine Registrierungsanfrage von %2\$s auf '%1\$s' erhalten";
+$a->strings["You've received a [url=%1\$s]registration request[/url] from %2\$s."] = "Du hast eine [url=%1\$s]Registrierungsanfrage[/url] von %2\$s erhalten.";
+$a->strings["Full Name:\t%s\nSite Location:\t%s\nLogin Name:\t%s (%s)"] = "Kompletter Name: %s\nURL der Seite: %s\nLogin Name: %s(%s)";
+$a->strings["Please visit %s to approve or reject the request."] = "Bitte besuche %s, um die Anfrage zu bearbeiten.";
 $a->strings["Daily posting limit of %d post reached. The post was rejected."] = [
        0 => "Das tägliche Limit von %d Beitrag wurde erreicht. Die Nachricht wurde verworfen.",
        1 => "Das tägliche Limit von %d Beiträgen wurde erreicht. Der Beitrag wurde verworfen.",
@@ -131,130 +194,15 @@ $a->strings["Undecided"] = [
        0 => "Unentschieden",
        1 => "Unentschieden",
 ];
-$a->strings["Friendica Notification"] = "Friendica-Benachrichtigung";
-$a->strings["Thank You,"] = "Danke,";
-$a->strings["%1\$s, %2\$s Administrator"] = "%1\$s, %2\$s Administrator";
-$a->strings["%s Administrator"] = "der Administrator von %s";
-$a->strings["[Friendica:Notify] New mail received at %s"] = "[Friendica-Meldung] Neue Email erhalten um %s";
-$a->strings["%1\$s sent you a new private message at %2\$s."] = "%1\$s hat dir eine neue, private Nachricht um %2\$s geschickt.";
-$a->strings["a private message"] = "eine private Nachricht";
-$a->strings["%1\$s sent you %2\$s."] = "%1\$s schickte dir %2\$s.";
-$a->strings["Please visit %s to view and/or reply to your private messages."] = "Bitte besuche %s, um Deine privaten Nachrichten anzusehen und/oder zu beantworten.";
-$a->strings["%1\$s tagged you on [url=%2\$s]a %3\$s[/url]"] = "%1\$s erwähnte dich in [url=%2\$s] einem %3\$s[/url]";
-$a->strings["%1\$s commented on [url=%2\$s]a %3\$s[/url]"] = "%1\$s kommentierte [url=%2\$s]a %3\$s[/url]";
-$a->strings["%1\$s tagged you on [url=%2\$s]%3\$s's %4\$s[/url]"] = "%1\$s erwähnte dich auf  [url=%2\$s]%3\$s's %4\$s[/url]";
-$a->strings["%1\$s commented on [url=%2\$s]%3\$s's %4\$s[/url]"] = "%1\$s kommentierte [url=%2\$s]%3\$ss %4\$s[/url]";
-$a->strings["%1\$s tagged you on [url=%2\$s]your %3\$s[/url]"] = "%1\$s erwähnte dich auf [url=%2\$s]deinem %3\$s[/url]";
-$a->strings["%1\$s commented on [url=%2\$s]your %3\$s[/url]"] = "%1\$s kommentierte [url=%2\$s]deinen %3\$s[/url]";
-$a->strings["%1\$s tagged you on [url=%2\$s]their %3\$s[/url]"] = "%1\$s erwähnte dich im [url=%2\$s]eigenen %3\$s[/url]";
-$a->strings["%1\$s commented on [url=%2\$s]their %3\$s[/url]"] = "%1\$s kommentierte den [url=%2\$s]eigenen %3\$s[/url]";
-$a->strings["[Friendica:Notify] %s tagged you"] = "[Friendica-Meldung] %s hat dich erwähnt";
-$a->strings["%1\$s tagged you at %2\$s"] = "%1\$s erwähnte dich auf %2\$s";
-$a->strings["[Friendica:Notify] Comment to conversation #%1\$d by %2\$s"] = "[Friendica-Meldung] Kommentar zum Beitrag #%1\$d von %2\$s";
-$a->strings["%s commented on an item/conversation you have been following."] = "%s hat einen Beitrag kommentiert, dem du folgst.";
-$a->strings["Please visit %s to view and/or reply to the conversation."] = "Bitte besuche %s, um die Konversation anzusehen und/oder zu kommentieren.";
-$a->strings["[Friendica:Notify] %s posted to your profile wall"] = "[Friendica-Meldung] %s hat auf Deine Pinnwand geschrieben";
-$a->strings["%1\$s posted to your profile wall at %2\$s"] = "%1\$s schrieb um %2\$s auf Deine Pinnwand";
-$a->strings["%1\$s posted to [url=%2\$s]your wall[/url]"] = "%1\$s hat etwas auf [url=%2\$s]Deiner Pinnwand[/url] gepostet";
-$a->strings["[Friendica:Notify] %s shared a new post"] = "[Friendica Benachrichtigung] %s hat einen Beitrag geteilt";
-$a->strings["%1\$s shared a new post at %2\$s"] = "%1\$s hat einen neuen Beitrag auf %2\$s geteilt";
-$a->strings["%1\$s [url=%2\$s]shared a post[/url]."] = "%1\$s [url=%2\$s]hat einen Beitrag geteilt[/url].";
-$a->strings["[Friendica:Notify] %1\$s poked you"] = "[Friendica-Meldung] %1\$s hat dich angestupst";
-$a->strings["%1\$s poked you at %2\$s"] = "%1\$s hat dich auf %2\$s angestupst";
-$a->strings["%1\$s [url=%2\$s]poked you[/url]."] = "%1\$s [url=%2\$s]hat dich angestupst[/url].";
-$a->strings["[Friendica:Notify] %s tagged your post"] = "[Friendica-Meldung] %s hat Deinen Beitrag getaggt";
-$a->strings["%1\$s tagged your post at %2\$s"] = "%1\$s erwähnte Deinen Beitrag auf %2\$s";
-$a->strings["%1\$s tagged [url=%2\$s]your post[/url]"] = "%1\$s erwähnte [url=%2\$s]Deinen Beitrag[/url]";
-$a->strings["[Friendica:Notify] Introduction received"] = "[Friendica-Meldung] Kontaktanfrage erhalten";
-$a->strings["You've received an introduction from '%1\$s' at %2\$s"] = "Du hast eine Kontaktanfrage von '%1\$s' auf %2\$s erhalten";
-$a->strings["You've received [url=%1\$s]an introduction[/url] from %2\$s."] = "Du hast eine [url=%1\$s]Kontaktanfrage[/url] von %2\$s erhalten.";
-$a->strings["You may visit their profile at %s"] = "Hier kannst du das Profil betrachten: %s";
-$a->strings["Please visit %s to approve or reject the introduction."] = "Bitte besuche %s, um die Kontaktanfrage anzunehmen oder abzulehnen.";
-$a->strings["[Friendica:Notify] A new person is sharing with you"] = "[Friendica Benachrichtigung] Eine neue Person teilt mit dir";
-$a->strings["%1\$s is sharing with you at %2\$s"] = "%1\$s teilt mit dir auf %2\$s";
-$a->strings["[Friendica:Notify] You have a new follower"] = "[Friendica-Benachrichtigung] Du hast einen neuen Kontakt";
-$a->strings["You have a new follower at %2\$s : %1\$s"] = "Du hast einen neuen Kontakt auf %2\$s: %1\$s";
-$a->strings["[Friendica:Notify] Friend suggestion received"] = "[Friendica-Meldung] Kontaktvorschlag erhalten";
-$a->strings["You've received a friend suggestion from '%1\$s' at %2\$s"] = "Du hast einen Kontakt-Vorschlag von '%1\$s' auf %2\$s erhalten";
-$a->strings["You've received [url=%1\$s]a friend suggestion[/url] for %2\$s from %3\$s."] = "Du hast einen [url=%1\$s]Kontakt-Vorschlag[/url] %2\$s von %3\$s erhalten.";
-$a->strings["Name:"] = "Name:";
-$a->strings["Photo:"] = "Foto:";
-$a->strings["Please visit %s to approve or reject the suggestion."] = "Bitte besuche %s, um den Vorschlag zu akzeptieren oder abzulehnen.";
-$a->strings["[Friendica:Notify] Connection accepted"] = "[Friendica-Benachrichtigung] Kontaktanfrage bestätigt";
-$a->strings["'%1\$s' has accepted your connection request at %2\$s"] = "'%1\$s' hat Deine Kontaktanfrage auf  %2\$s bestätigt";
-$a->strings["%2\$s has accepted your [url=%1\$s]connection request[/url]."] = "%2\$s hat Deine [url=%1\$s]Kontaktanfrage[/url] akzeptiert.";
-$a->strings["You are now mutual friends and may exchange status updates, photos, and email without restriction."] = "Ihr seid nun beidseitige Kontakte und könnt Statusmitteilungen, Bilder und E-Mails ohne Einschränkungen austauschen.";
-$a->strings["Please visit %s if you wish to make any changes to this relationship."] = "Bitte besuche %s, wenn du Änderungen an eurer Beziehung vornehmen willst.";
-$a->strings["'%1\$s' has chosen to accept you a fan, which restricts some forms of communication - such as private messaging and some profile interactions. If this is a celebrity or community page, these settings were applied automatically."] = "'%1\$s' hat sich entschieden dich als Fan zu akzeptieren, dies schränkt einige Kommunikationswege - wie private Nachrichten und einige Interaktionsmöglichkeiten auf der Profilseite - ein. Wenn dies eine Berühmtheiten- oder Gemeinschaftsseite ist, werden diese Einstellungen automatisch vorgenommen.";
-$a->strings["'%1\$s' may choose to extend this into a two-way or more permissive relationship in the future."] = "'%1\$s' kann den Kontaktstatus zu einem späteren Zeitpunkt erweitern und diese Einschränkungen aufheben. ";
-$a->strings["Please visit %s  if you wish to make any changes to this relationship."] = "Bitte besuche %s, wenn du Änderungen an eurer Beziehung vornehmen willst.";
-$a->strings["[Friendica System Notify]"] = "[Friendica-Systembenachrichtigung]";
-$a->strings["registration request"] = "Registrierungsanfrage";
-$a->strings["You've received a registration request from '%1\$s' at %2\$s"] = "Du hast eine Registrierungsanfrage von %2\$s auf '%1\$s' erhalten";
-$a->strings["You've received a [url=%1\$s]registration request[/url] from %2\$s."] = "Du hast eine [url=%1\$s]Registrierungsanfrage[/url] von %2\$s erhalten.";
-$a->strings["Full Name:\t%s\nSite Location:\t%s\nLogin Name:\t%s (%s)"] = "Kompletter Name: %s\nURL der Seite: %s\nLogin Name: %s(%s)";
-$a->strings["Please visit %s to approve or reject the request."] = "Bitte besuche %s, um die Anfrage zu bearbeiten.";
 $a->strings["Item not found."] = "Beitrag nicht gefunden.";
 $a->strings["Do you really want to delete this item?"] = "Möchtest du wirklich dieses Item löschen?";
 $a->strings["Yes"] = "Ja";
 $a->strings["Permission denied."] = "Zugriff verweigert.";
-$a->strings["Archives"] = "Archiv";
-$a->strings["show more"] = "mehr anzeigen";
 $a->strings["Authorize application connection"] = "Verbindung der Applikation autorisieren";
 $a->strings["Return to your app and insert this Securty Code:"] = "Gehe zu Deiner Anwendung zurück und trage dort folgenden Sicherheitscode ein:";
 $a->strings["Please login to continue."] = "Bitte melde dich an, um fortzufahren.";
 $a->strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Möchtest du dieser Anwendung den Zugriff auf Deine Beiträge und Kontakte sowie das Erstellen neuer Beiträge in Deinem Namen gestatten?";
 $a->strings["No"] = "Nein";
-$a->strings["Access denied."] = "Zugriff verweigert.";
-$a->strings["Access to this profile has been restricted."] = "Der Zugriff zu diesem Profil wurde eingeschränkt.";
-$a->strings["Events"] = "Veranstaltungen";
-$a->strings["View"] = "Ansehen";
-$a->strings["Previous"] = "Vorherige";
-$a->strings["Next"] = "Nächste";
-$a->strings["today"] = "Heute";
-$a->strings["month"] = "Monat";
-$a->strings["week"] = "Woche";
-$a->strings["day"] = "Tag";
-$a->strings["list"] = "Liste";
-$a->strings["User not found"] = "Nutzer nicht gefunden";
-$a->strings["This calendar format is not supported"] = "Dieses Kalenderformat wird nicht unterstützt.";
-$a->strings["No exportable data found"] = "Keine exportierbaren Daten gefunden";
-$a->strings["calendar"] = "Kalender";
-$a->strings["No contacts in common."] = "Keine gemeinsamen Kontakte.";
-$a->strings["Common Friends"] = "Gemeinsame Kontakte";
-$a->strings["Public access denied."] = "Öffentlicher Zugriff verweigert.";
-$a->strings["Community option not available."] = "Optionen für die Gemeinschaftsseite nicht verfügbar.";
-$a->strings["Not available."] = "Nicht verfügbar.";
-$a->strings["Local Community"] = "Lokale Gemeinschaft";
-$a->strings["Posts from local users on this server"] = "Beiträge von Nutzern dieses Servers";
-$a->strings["Global Community"] = "Globale Gemeinschaft";
-$a->strings["Posts from users of the whole federated network"] = "Beiträge von Nutzern des gesamten  föderalen Netzwerks";
-$a->strings["No results."] = "Keine Ergebnisse.";
-$a->strings["This community stream shows all public posts received by this node. They may not reflect the opinions of this node’s users."] = "Diese Gemeinschaftsseite zeigt alle öffentlichen Beiträge, die auf diesem Knoten eingegangen sind. Der Inhalt entspricht nicht zwingend der Meinung der Nutzer dieses Servers.";
-$a->strings["Contact settings applied."] = "Einstellungen zum Kontakt angewandt.";
-$a->strings["Contact update failed."] = "Konnte den Kontakt nicht aktualisieren.";
-$a->strings["Contact not found."] = "Kontakt nicht gefunden.";
-$a->strings["<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact may stop working."] = "<strong>ACHTUNG: Das sind Experten-Einstellungen!</strong> Wenn du etwas Falsches eingibst, funktioniert die Kommunikation mit diesem Kontakt evtl. nicht mehr.";
-$a->strings["Please use your browser 'Back' button <strong>now</strong> if you are uncertain what to do on this page."] = "Bitte nutze den Zurück-Button Deines Browsers <strong>jetzt</strong>, wenn du dir unsicher bist, was du tun willst.";
-$a->strings["No mirroring"] = "Kein Spiegeln";
-$a->strings["Mirror as forwarded posting"] = "Spiegeln als weitergeleitete Beiträge";
-$a->strings["Mirror as my own posting"] = "Spiegeln als meine eigenen Beiträge";
-$a->strings["Return to contact editor"] = "Zurück zum Kontakteditor";
-$a->strings["Refetch contact data"] = "Kontaktdaten neu laden";
-$a->strings["Submit"] = "Senden";
-$a->strings["Remote Self"] = "Entfernte Konten";
-$a->strings["Mirror postings from this contact"] = "Spiegle Beiträge dieses Kontakts";
-$a->strings["Mark this contact as remote_self, this will cause friendica to repost new entries from this contact."] = "Markiere diesen Kontakt als remote_self (entferntes Konto), dies veranlasst Friendica, alle Top-Level Beiträge dieses Kontakts an all Deine Kontakte zu senden (spiegeln).";
-$a->strings["Name"] = "Name";
-$a->strings["Account Nickname"] = "Konto-Spitzname";
-$a->strings["@Tagname - overrides Name/Nickname"] = "@Tagname - überschreibt Name/Spitzname";
-$a->strings["Account URL"] = "Konto-URL";
-$a->strings["Account URL Alias"] = "Konto URL Alias";
-$a->strings["Friend Request URL"] = "URL für Kontaktschaftsanfragen";
-$a->strings["Friend Confirm URL"] = "URL für Bestätigungen von Kontaktanfragen";
-$a->strings["Notification Endpoint URL"] = "URL-Endpunkt für Benachrichtigungen";
-$a->strings["Poll/Feed URL"] = "Pull/Feed-URL";
-$a->strings["New photo from this URL"] = "Neues Foto von dieser URL";
 $a->strings["Parent user not found."] = "Verwalter nicht gefunden.";
 $a->strings["No parent user"] = "Kein Verwalter";
 $a->strings["Parent Password:"] = "Passwort des Verwalters";
@@ -270,76 +218,284 @@ $a->strings["Potential Delegates"] = "Potentielle Bevollmächtigte";
 $a->strings["Remove"] = "Entfernen";
 $a->strings["Add"] = "Hinzufügen";
 $a->strings["No entries."] = "Keine Einträge.";
-$a->strings["Profile not found."] = "Profil nicht gefunden.";
-$a->strings["This may occasionally happen if contact was requested by both persons and it has already been approved."] = "Das kann passieren, wenn sich zwei Kontakte gegenseitig eingeladen haben und bereits einer angenommen wurde.";
-$a->strings["Response from remote site was not understood."] = "Antwort der Gegenstelle unverständlich.";
-$a->strings["Unexpected response from remote site: "] = "Unerwartete Antwort der Gegenstelle: ";
-$a->strings["Confirmation completed successfully."] = "Bestätigung erfolgreich abgeschlossen.";
-$a->strings["Temporary failure. Please wait and try again."] = "Zeitweiser Fehler. Bitte warte einige Momente und versuche es dann noch einmal.";
-$a->strings["Introduction failed or was revoked."] = "Kontaktanfrage schlug fehl oder wurde zurückgezogen.";
-$a->strings["Remote site reported: "] = "Gegenstelle meldet: ";
-$a->strings["No user record found for '%s' "] = "Für '%s' wurde kein Nutzer gefunden";
-$a->strings["Our site encryption key is apparently messed up."] = "Der Verschlüsselungsschlüssel unserer Seite ist anscheinend nicht in Ordnung.";
-$a->strings["Empty site URL was provided or URL could not be decrypted by us."] = "Leere URL für die Seite erhalten oder die URL konnte nicht entschlüsselt werden.";
-$a->strings["Contact record was not found for you on our site."] = "Für diesen Kontakt wurde auf unserer Seite kein Eintrag gefunden.";
-$a->strings["Site public key not available in contact record for URL %s."] = "Die Kontaktdaten für URL %s enthalten keinen Public Key für den Server.";
-$a->strings["The ID provided by your system is a duplicate on our system. It should work if you try again."] = "Die ID, die uns dein System angeboten hat, ist hier bereits vergeben. Bitte versuche es noch einmal.";
-$a->strings["Unable to set your contact credentials on our system."] = "Deine Kontaktreferenzen konnten nicht in unserem System gespeichert werden.";
-$a->strings["Unable to update your contact profile details on our system"] = "Die Updates für dein Profil konnten nicht gespeichert werden";
-$a->strings["[Name Withheld]"] = "[Name unterdrückt]";
-$a->strings["%1\$s welcomes %2\$s"] = "%1\$s heißt %2\$s herzlich willkommen";
-$a->strings["This introduction has already been accepted."] = "Diese Kontaktanfrage wurde bereits akzeptiert.";
-$a->strings["Profile location is not valid or does not contain profile information."] = "Profiladresse ist ungültig oder stellt keine Profildaten zur Verfügung.";
-$a->strings["Warning: profile location has no identifiable owner name."] = "Warnung: Es konnte kein Name des Besitzers an der angegebenen Profiladresse gefunden werden.";
-$a->strings["Warning: profile location has no profile photo."] = "Warnung: Es gibt kein Profilbild an der angegebenen Profiladresse.";
-$a->strings["%d required parameter was not found at the given location"] = [
-       0 => "%d benötigter Parameter wurde an der angegebenen Stelle nicht gefunden",
-       1 => "%d benötigte Parameter wurden an der angegebenen Stelle nicht gefunden",
+$a->strings["Post successful."] = "Beitrag erfolgreich veröffentlicht.";
+$a->strings["Subscribing to OStatus contacts"] = "OStatus-Kontakten folgen";
+$a->strings["No contact provided."] = "Keine Kontakte gefunden.";
+$a->strings["Couldn't fetch information for contact."] = "Konnte die Kontaktinformationen nicht einholen.";
+$a->strings["Couldn't fetch friends for contact."] = "Konnte die Kontaktliste des Kontakts nicht abfragen.";
+$a->strings["Done"] = "Erledigt";
+$a->strings["success"] = "Erfolg";
+$a->strings["failed"] = "Fehlgeschlagen";
+$a->strings["ignored"] = "Ignoriert";
+$a->strings["Keep this window open until done."] = "Lasse dieses Fenster offen, bis der Vorgang abgeschlossen ist.";
+$a->strings["Permission denied"] = "Zugriff verweigert";
+$a->strings["Invalid profile identifier."] = "Ungültiger Profil-Bezeichner.";
+$a->strings["Profile Visibility Editor"] = "Editor für die Profil-Sichtbarkeit";
+$a->strings["Profile"] = "Profil";
+$a->strings["Click on a contact to add or remove."] = "Klicke einen Kontakt an, um ihn hinzuzufügen oder zu entfernen";
+$a->strings["Visible To"] = "Sichtbar für";
+$a->strings["All Contacts (with secure profile access)"] = "Alle Kontakte (mit gesichertem Profilzugriff)";
+$a->strings["Account approved."] = "Konto freigegeben.";
+$a->strings["Registration revoked for %s"] = "Registrierung für %s wurde zurückgezogen";
+$a->strings["Please login."] = "Bitte melde dich an.";
+$a->strings["User deleted their account"] = "Gelöschter Nutzeraccount";
+$a->strings["On your Friendica node an user deleted their account. Please ensure that their data is removed from the backups."] = "Ein Nutzer deiner Friendica-Instanz hat seinen Account gelöscht. Bitte stelle sicher, dass dessen Daten aus deinen Backups entfernt werden.";
+$a->strings["The user id is %d"] = "Die ID des Users lautet %d";
+$a->strings["Remove My Account"] = "Konto löschen";
+$a->strings["This will completely remove your account. Once this has been done it is not recoverable."] = "Dein Konto wird endgültig gelöscht. Es gibt keine Möglichkeit, es wiederherzustellen.";
+$a->strings["Please enter your password for verification:"] = "Bitte gib dein Passwort zur Verifikation ein:";
+$a->strings["Resubscribing to OStatus contacts"] = "Erneuern der OStatus-Abonements";
+$a->strings["Error"] = [
+       0 => "Fehler",
+       1 => "Fehler",
 ];
-$a->strings["Introduction complete."] = "Kontaktanfrage abgeschlossen.";
-$a->strings["Unrecoverable protocol error."] = "Nicht behebbarer Protokollfehler.";
-$a->strings["Profile unavailable."] = "Profil nicht verfügbar.";
-$a->strings["%s has received too many connection requests today."] = "%s hat heute zu viele Kontaktanfragen erhalten.";
-$a->strings["Spam protection measures have been invoked."] = "Maßnahmen zum Spamschutz wurden ergriffen.";
-$a->strings["Friends are advised to please try again in 24 hours."] = "Freunde sind angehalten, es in 24 Stunden erneut zu versuchen.";
-$a->strings["Invalid locator"] = "Ungültiger Locator";
-$a->strings["You have already introduced yourself here."] = "Du hast dich hier bereits vorgestellt.";
-$a->strings["Apparently you are already friends with %s."] = "Es scheint so, als ob du bereits mit %s in Kontakt stehst.";
-$a->strings["Invalid profile URL."] = "Ungültige Profil-URL.";
-$a->strings["Disallowed profile URL."] = "Nicht erlaubte Profil-URL.";
-$a->strings["Blocked domain"] = "Blockierte Domain";
-$a->strings["Failed to update contact record."] = "Aktualisierung der Kontaktdaten fehlgeschlagen.";
-$a->strings["Your introduction has been sent."] = "Deine Kontaktanfrage wurde gesendet.";
-$a->strings["Remote subscription can't be done for your network. Please subscribe directly on your system."] = "Entferntes Abon­nie­ren kann für dein Netzwerk nicht durchgeführt werden. Bitte nutze direkt die Abonnieren-Funktion deines Systems.   ";
-$a->strings["Please login to confirm introduction."] = "Bitte melde dich an, um die Kontaktanfrage zu bestätigen.";
-$a->strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "Momentan bist du mit einer anderen Identität angemeldet. Bitte melde dich mit <strong>diesem</strong> Profil an.";
-$a->strings["Confirm"] = "Bestätigen";
-$a->strings["Hide this contact"] = "Verberge diesen Kontakt";
-$a->strings["Welcome home %s."] = "Willkommen zurück %s.";
-$a->strings["Please confirm your introduction/connection request to %s."] = "Bitte bestätige Deine Kontaktanfrage bei %s.";
-$a->strings["Please enter your 'Identity Address' from one of the following supported communications networks:"] = "Bitte gib die Adresse Deines Profils in einem der unterstützten sozialen Netzwerke an:";
-$a->strings["If you are not yet a member of the free social web, <a href=\"%s\">follow this link to find a public Friendica site and join us today</a>."] = "Wenn du noch kein Mitglied dieses freien sozialen Netzwerks bist, <a href=\"%s\">folge diesem Link</a> um einen öffentlichen Friendica-Server zu finden und beizutreten.";
-$a->strings["Friend/Connection Request"] = "Kontaktanfrage";
-$a->strings["Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@gnusocial.de"] = "Beispiele: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@gnusocial.de";
-$a->strings["Please answer the following:"] = "Bitte beantworte folgendes:";
+$a->strings["Tag(s) removed"] = "Tag(s) entfernt";
+$a->strings["Remove Item Tag"] = "Gegenstands-Tag entfernen";
+$a->strings["Select a tag to remove: "] = "Wähle ein Tag zum Entfernen aus: ";
+$a->strings["User imports on closed servers can only be done by an administrator."] = "Auf geschlossenen Servern können ausschließlich die Administratoren Benutzerkonten importieren.";
+$a->strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Die maximale Anzahl täglicher Registrierungen auf dieser Seite wurde überschritten. Bitte versuche es morgen noch einmal.";
+$a->strings["Import"] = "Import";
+$a->strings["Move account"] = "Account umziehen";
+$a->strings["You can import an account from another Friendica server."] = "Du kannst einen Account von einem anderen Friendica Server importieren.";
+$a->strings["You need to export your account from the old server and upload it here. We will recreate your old account here with all your contacts. We will try also to inform your friends that you moved here."] = "Du musst deinen Account vom alten Server exportieren und hier hochladen. Wir stellen deinen alten Account mit all deinen Kontakten wieder her. Wir werden auch versuchen, deine Kontakte darüber zu informieren, dass du hierher umgezogen bist.";
+$a->strings["This feature is experimental. We can't import contacts from the OStatus network (GNU Social/Statusnet) or from Diaspora"] = "Dieses Feature ist experimentell. Wir können keine Kontakte vom OStatus-Netzwerk (GNU Social/Statusnet) oder von Diaspora importieren";
+$a->strings["Account file"] = "Account-Datei";
+$a->strings["To export your account, go to \"Settings->Export your personal data\" and select \"Export account\""] = "Um Deinen Account zu exportieren, rufe \"Einstellungen -> Persönliche Daten exportieren\" auf und wähle \"Account exportieren\"";
+$a->strings["You aren't following this contact."] = "Du folgst diesem Kontakt.";
+$a->strings["Unfollowing is currently not supported by your network."] = "Bei diesem Netzwerk wird das Entfolgen derzeit nicht unterstützt.";
+$a->strings["Contact unfollowed"] = "Kontakt wird nicht mehr gefolgt";
+$a->strings["Disconnect/Unfollow"] = "Verbindung lösen/Nicht mehr folgen";
+$a->strings["Your Identity Address:"] = "Adresse Deines Profils:";
+$a->strings["Submit Request"] = "Anfrage abschicken";
+$a->strings["Profile URL"] = "Profil URL";
+$a->strings["Status Messages and Posts"] = "Statusnachrichten und Beiträge";
+$a->strings["[Embedded content - reload page to view]"] = "[Eingebetteter Inhalt - Seite neu laden zum Betrachten]";
+$a->strings["Invalid request."] = "Ungültige Anfrage";
+$a->strings["Sorry, maybe your upload is bigger than the PHP configuration allows"] = "Entschuldige, die Datei scheint größer zu sein, als es die PHP-Konfiguration erlaubt.";
+$a->strings["Or - did you try to upload an empty file?"] = "Oder - hast du versucht, eine leere Datei hochzuladen?";
+$a->strings["File exceeds size limit of %s"] = "Die Datei ist größer als das erlaubte Limit von %s";
+$a->strings["File upload failed."] = "Hochladen der Datei fehlgeschlagen.";
+$a->strings["Image exceeds size limit of %s"] = "Bildgröße überschreitet das Limit von %s";
+$a->strings["Unable to process image."] = "Konnte das Bild nicht bearbeiten.";
+$a->strings["Wall Photos"] = "Pinnwand-Bilder";
+$a->strings["Image upload failed."] = "Hochladen des Bildes gescheitert.";
+$a->strings["Number of daily wall messages for %s exceeded. Message failed."] = "Maximale Anzahl der täglichen Pinnwand-Nachrichten für %s ist überschritten. Zustellung fehlgeschlagen.";
+$a->strings["No recipient selected."] = "Kein Empfänger gewählt.";
+$a->strings["Unable to check your home location."] = "Konnte Deinen Heimatort nicht bestimmen.";
+$a->strings["Message could not be sent."] = "Nachricht konnte nicht gesendet werden.";
+$a->strings["Message collection failure."] = "Konnte Nachrichten nicht abrufen.";
+$a->strings["Message sent."] = "Nachricht gesendet.";
+$a->strings["No recipient."] = "Kein Empfänger.";
+$a->strings["Please enter a link URL:"] = "Bitte gib die URL des Links ein:";
+$a->strings["Send Private Message"] = "Private Nachricht senden";
+$a->strings["If you wish for %s to respond, please check that the privacy settings on your site allow private mail from unknown senders."] = "Wenn du möchtest, dass %s dir antworten kann, überprüfe deine Privatsphären-Einstellungen und erlaube private Nachrichten von unbekannten Absendern.";
+$a->strings["To:"] = "An:";
+$a->strings["Subject:"] = "Betreff:";
+$a->strings["Your message:"] = "Deine Nachricht:";
+$a->strings["Insert web link"] = "Einen Link einfügen";
+$a->strings["No keywords to match. Please add keywords to your default profile."] = "Keine Schlüsselwörter zum Abgleichen gefunden. Bitte füge einige Schlüsselwörter zu Deinem Standardprofil hinzu.";
+$a->strings["Connect"] = "Verbinden";
+$a->strings["first"] = "erste";
+$a->strings["next"] = "nächste";
+$a->strings["No matches"] = "Keine Übereinstimmungen";
+$a->strings["Profile Match"] = "Profilübereinstimmungen";
+$a->strings["Profile not found."] = "Profil nicht gefunden.";
+$a->strings["Profile deleted."] = "Profil gelöscht.";
+$a->strings["Profile-"] = "Profil-";
+$a->strings["New profile created."] = "Neues Profil angelegt.";
+$a->strings["Profile unavailable to clone."] = "Profil nicht zum Duplizieren verfügbar.";
+$a->strings["Profile Name is required."] = "Profilname ist erforderlich.";
+$a->strings["Marital Status"] = "Familienstand";
+$a->strings["Romantic Partner"] = "Romanze";
+$a->strings["Work/Employment"] = "Arbeit / Beschäftigung";
+$a->strings["Religion"] = "Religion";
+$a->strings["Political Views"] = "Politische Ansichten";
+$a->strings["Gender"] = "Geschlecht";
+$a->strings["Sexual Preference"] = "Sexuelle Vorlieben";
+$a->strings["XMPP"] = "XMPP";
+$a->strings["Homepage"] = "Webseite";
+$a->strings["Interests"] = "Interessen";
+$a->strings["Address"] = "Adresse";
+$a->strings["Location"] = "Wohnort";
+$a->strings["Profile updated."] = "Profil aktualisiert.";
+$a->strings["Hide contacts and friends:"] = "Kontakte und Freunde verbergen";
+$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Liste der Kontakte vor Betrachtern dieses Profils verbergen?";
+$a->strings["Show more profile fields:"] = "Zeige mehr Profil-Felder:";
+$a->strings["Profile Actions"] = "Profilaktionen";
+$a->strings["Edit Profile Details"] = "Profil bearbeiten";
+$a->strings["Submit"] = "Senden";
+$a->strings["Change Profile Photo"] = "Profilbild ändern";
+$a->strings["View this profile"] = "Dieses Profil anzeigen";
+$a->strings["View all profiles"] = "Alle Profile anzeigen";
+$a->strings["Edit visibility"] = "Sichtbarkeit bearbeiten";
+$a->strings["Create a new profile using these settings"] = "Neues Profil anlegen und diese Einstellungen verwenden";
+$a->strings["Clone this profile"] = "Dieses Profil duplizieren";
+$a->strings["Delete this profile"] = "Dieses Profil löschen";
+$a->strings["Basic information"] = "Grundinformationen";
+$a->strings["Profile picture"] = "Profilbild";
+$a->strings["Preferences"] = "Vorlieben";
+$a->strings["Status information"] = "Status-Informationen";
+$a->strings["Additional information"] = "Zusätzliche Informationen";
+$a->strings["Personal"] = "Persönlich";
+$a->strings["Relation"] = "Beziehung";
+$a->strings["Miscellaneous"] = "Verschiedenes";
+$a->strings["Upload Profile Photo"] = "Profilbild hochladen";
+$a->strings["Your Gender:"] = "Dein Geschlecht:";
+$a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "<span class=\"heart\">&hearts;</span> Beziehungsstatus:";
+$a->strings["Sexual Preference:"] = "Sexuelle Vorlieben:";
+$a->strings["Example: fishing photography software"] = "Beispiel: Fischen Fotografie Software";
+$a->strings["Profile Name:"] = "Profilname:";
+$a->strings["Required"] = "Benötigt";
+$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "Dies ist dein <strong>öffentliches</strong> Profil.<br />Es <strong>könnte</strong> für jeden Nutzer des Internets sichtbar sein.";
+$a->strings["Your Full Name:"] = "Dein kompletter Name:";
+$a->strings["Title/Description:"] = "Titel/Beschreibung:";
+$a->strings["Street Address:"] = "Adresse:";
+$a->strings["Locality/City:"] = "Wohnort:";
+$a->strings["Region/State:"] = "Region/Bundesstaat:";
+$a->strings["Postal/Zip Code:"] = "Postleitzahl:";
+$a->strings["Country:"] = "Land:";
+$a->strings["Age: "] = "Alter: ";
+$a->strings["Who: (if applicable)"] = "Wer: (falls anwendbar)";
+$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Beispiele: cathy123, Cathy Williams, cathy@example.com";
+$a->strings["Since [date]:"] = "Seit [Datum]:";
+$a->strings["Tell us about yourself..."] = "Erzähle uns ein bisschen von dir …";
+$a->strings["XMPP (Jabber) address:"] = "XMPP (Jabber) Adresse";
+$a->strings["The XMPP address will be propagated to your contacts so that they can follow you."] = "Die XMPP Adresse wird an deine Kontakte verteilt werden, so dass sie auch über XMPP mit dir in Kontakt treten können.";
+$a->strings["Homepage URL:"] = "Adresse der Homepage:";
+$a->strings["Hometown:"] = "Heimatort:";
+$a->strings["Political Views:"] = "Politische Ansichten:";
+$a->strings["Religious Views:"] = "Religiöse Ansichten:";
+$a->strings["Public Keywords:"] = "Öffentliche Schlüsselwörter:";
+$a->strings["(Used for suggesting potential friends, can be seen by others)"] = "(Wird verwendet, um potentielle Kontakte zu finden, kann von Kontakten eingesehen werden)";
+$a->strings["Private Keywords:"] = "Private Schlüsselwörter:";
+$a->strings["(Used for searching profiles, never shown to others)"] = "(Wird für die Suche nach Profilen verwendet und niemals veröffentlicht)";
+$a->strings["Likes:"] = "Likes:";
+$a->strings["Dislikes:"] = "Dislikes:";
+$a->strings["Musical interests"] = "Musikalische Interessen";
+$a->strings["Books, literature"] = "Bücher, Literatur";
+$a->strings["Television"] = "Fernsehen";
+$a->strings["Film/dance/culture/entertainment"] = "Filme/Tänze/Kultur/Unterhaltung";
+$a->strings["Hobbies/Interests"] = "Hobbies/Interessen";
+$a->strings["Love/romance"] = "Liebe/Romantik";
+$a->strings["Work/employment"] = "Arbeit/Anstellung";
+$a->strings["School/education"] = "Schule/Ausbildung";
+$a->strings["Contact information and Social Networks"] = "Kontaktinformationen und Soziale Netzwerke";
+$a->strings["Profile Image"] = "Profilbild";
+$a->strings["visible to everybody"] = "sichtbar für jeden";
+$a->strings["Edit/Manage Profiles"] = "Bearbeite/Verwalte Profile";
+$a->strings["Change profile photo"] = "Profilbild ändern";
+$a->strings["Create New Profile"] = "Neues Profil anlegen";
+$a->strings["Access denied."] = "Zugriff verweigert.";
+$a->strings["Access to this profile has been restricted."] = "Der Zugriff zu diesem Profil wurde eingeschränkt.";
+$a->strings["Events"] = "Veranstaltungen";
+$a->strings["View"] = "Ansehen";
+$a->strings["Previous"] = "Vorherige";
+$a->strings["Next"] = "Nächste";
+$a->strings["today"] = "Heute";
+$a->strings["month"] = "Monat";
+$a->strings["week"] = "Woche";
+$a->strings["day"] = "Tag";
+$a->strings["list"] = "Liste";
+$a->strings["User not found"] = "Nutzer nicht gefunden";
+$a->strings["This calendar format is not supported"] = "Dieses Kalenderformat wird nicht unterstützt.";
+$a->strings["No exportable data found"] = "Keine exportierbaren Daten gefunden";
+$a->strings["calendar"] = "Kalender";
+$a->strings["No contacts in common."] = "Keine gemeinsamen Kontakte.";
+$a->strings["Common Friends"] = "Gemeinsame Kontakte";
+$a->strings["Public access denied."] = "Öffentlicher Zugriff verweigert.";
+$a->strings["Community option not available."] = "Optionen für die Gemeinschaftsseite nicht verfügbar.";
+$a->strings["Not available."] = "Nicht verfügbar.";
+$a->strings["Local Community"] = "Lokale Gemeinschaft";
+$a->strings["Posts from local users on this server"] = "Beiträge von Nutzern dieses Servers";
+$a->strings["Global Community"] = "Globale Gemeinschaft";
+$a->strings["Posts from users of the whole federated network"] = "Beiträge von Nutzern des gesamten  föderalen Netzwerks";
+$a->strings["No results."] = "Keine Ergebnisse.";
+$a->strings["This community stream shows all public posts received by this node. They may not reflect the opinions of this node’s users."] = "Diese Gemeinschaftsseite zeigt alle öffentlichen Beiträge, die auf diesem Knoten eingegangen sind. Der Inhalt entspricht nicht zwingend der Meinung der Nutzer dieses Servers.";
+$a->strings["Contact settings applied."] = "Einstellungen zum Kontakt angewandt.";
+$a->strings["Contact update failed."] = "Konnte den Kontakt nicht aktualisieren.";
+$a->strings["Contact not found."] = "Kontakt nicht gefunden.";
+$a->strings["<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact may stop working."] = "<strong>ACHTUNG: Das sind Experten-Einstellungen!</strong> Wenn du etwas Falsches eingibst, funktioniert die Kommunikation mit diesem Kontakt evtl. nicht mehr.";
+$a->strings["Please use your browser 'Back' button <strong>now</strong> if you are uncertain what to do on this page."] = "Bitte nutze den Zurück-Button Deines Browsers <strong>jetzt</strong>, wenn du dir unsicher bist, was du tun willst.";
+$a->strings["No mirroring"] = "Kein Spiegeln";
+$a->strings["Mirror as forwarded posting"] = "Spiegeln als weitergeleitete Beiträge";
+$a->strings["Mirror as my own posting"] = "Spiegeln als meine eigenen Beiträge";
+$a->strings["Return to contact editor"] = "Zurück zum Kontakteditor";
+$a->strings["Refetch contact data"] = "Kontaktdaten neu laden";
+$a->strings["Remote Self"] = "Entfernte Konten";
+$a->strings["Mirror postings from this contact"] = "Spiegle Beiträge dieses Kontakts";
+$a->strings["Mark this contact as remote_self, this will cause friendica to repost new entries from this contact."] = "Markiere diesen Kontakt als remote_self (entferntes Konto), dies veranlasst Friendica, alle Top-Level Beiträge dieses Kontakts an all Deine Kontakte zu senden (spiegeln).";
+$a->strings["Name"] = "Name";
+$a->strings["Account Nickname"] = "Konto-Spitzname";
+$a->strings["@Tagname - overrides Name/Nickname"] = "@Tagname - überschreibt Name/Spitzname";
+$a->strings["Account URL"] = "Konto-URL";
+$a->strings["Account URL Alias"] = "Konto URL Alias";
+$a->strings["Friend Request URL"] = "URL für Kontaktschaftsanfragen";
+$a->strings["Friend Confirm URL"] = "URL für Bestätigungen von Kontaktanfragen";
+$a->strings["Notification Endpoint URL"] = "URL-Endpunkt für Benachrichtigungen";
+$a->strings["Poll/Feed URL"] = "Pull/Feed-URL";
+$a->strings["New photo from this URL"] = "Neues Foto von dieser URL";
+$a->strings["This may occasionally happen if contact was requested by both persons and it has already been approved."] = "Das kann passieren, wenn sich zwei Kontakte gegenseitig eingeladen haben und bereits einer angenommen wurde.";
+$a->strings["Response from remote site was not understood."] = "Antwort der Gegenstelle unverständlich.";
+$a->strings["Unexpected response from remote site: "] = "Unerwartete Antwort der Gegenstelle: ";
+$a->strings["Confirmation completed successfully."] = "Bestätigung erfolgreich abgeschlossen.";
+$a->strings["Temporary failure. Please wait and try again."] = "Zeitweiser Fehler. Bitte warte einige Momente und versuche es dann noch einmal.";
+$a->strings["Introduction failed or was revoked."] = "Kontaktanfrage schlug fehl oder wurde zurückgezogen.";
+$a->strings["Remote site reported: "] = "Gegenstelle meldet: ";
+$a->strings["No user record found for '%s' "] = "Für '%s' wurde kein Nutzer gefunden";
+$a->strings["Our site encryption key is apparently messed up."] = "Der Verschlüsselungsschlüssel unserer Seite ist anscheinend nicht in Ordnung.";
+$a->strings["Empty site URL was provided or URL could not be decrypted by us."] = "Leere URL für die Seite erhalten oder die URL konnte nicht entschlüsselt werden.";
+$a->strings["Contact record was not found for you on our site."] = "Für diesen Kontakt wurde auf unserer Seite kein Eintrag gefunden.";
+$a->strings["Site public key not available in contact record for URL %s."] = "Die Kontaktdaten für URL %s enthalten keinen Public Key für den Server.";
+$a->strings["The ID provided by your system is a duplicate on our system. It should work if you try again."] = "Die ID, die uns dein System angeboten hat, ist hier bereits vergeben. Bitte versuche es noch einmal.";
+$a->strings["Unable to set your contact credentials on our system."] = "Deine Kontaktreferenzen konnten nicht in unserem System gespeichert werden.";
+$a->strings["Unable to update your contact profile details on our system"] = "Die Updates für dein Profil konnten nicht gespeichert werden";
+$a->strings["[Name Withheld]"] = "[Name unterdrückt]";
+$a->strings["%1\$s welcomes %2\$s"] = "%1\$s heißt %2\$s herzlich willkommen";
+$a->strings["This introduction has already been accepted."] = "Diese Kontaktanfrage wurde bereits akzeptiert.";
+$a->strings["Profile location is not valid or does not contain profile information."] = "Profiladresse ist ungültig oder stellt keine Profildaten zur Verfügung.";
+$a->strings["Warning: profile location has no identifiable owner name."] = "Warnung: Es konnte kein Name des Besitzers an der angegebenen Profiladresse gefunden werden.";
+$a->strings["Warning: profile location has no profile photo."] = "Warnung: Es gibt kein Profilbild an der angegebenen Profiladresse.";
+$a->strings["%d required parameter was not found at the given location"] = [
+       0 => "%d benötigter Parameter wurde an der angegebenen Stelle nicht gefunden",
+       1 => "%d benötigte Parameter wurden an der angegebenen Stelle nicht gefunden",
+];
+$a->strings["Introduction complete."] = "Kontaktanfrage abgeschlossen.";
+$a->strings["Unrecoverable protocol error."] = "Nicht behebbarer Protokollfehler.";
+$a->strings["Profile unavailable."] = "Profil nicht verfügbar.";
+$a->strings["%s has received too many connection requests today."] = "%s hat heute zu viele Kontaktanfragen erhalten.";
+$a->strings["Spam protection measures have been invoked."] = "Maßnahmen zum Spamschutz wurden ergriffen.";
+$a->strings["Friends are advised to please try again in 24 hours."] = "Freunde sind angehalten, es in 24 Stunden erneut zu versuchen.";
+$a->strings["Invalid locator"] = "Ungültiger Locator";
+$a->strings["You have already introduced yourself here."] = "Du hast dich hier bereits vorgestellt.";
+$a->strings["Apparently you are already friends with %s."] = "Es scheint so, als ob du bereits mit %s in Kontakt stehst.";
+$a->strings["Invalid profile URL."] = "Ungültige Profil-URL.";
+$a->strings["Disallowed profile URL."] = "Nicht erlaubte Profil-URL.";
+$a->strings["Blocked domain"] = "Blockierte Domain";
+$a->strings["Failed to update contact record."] = "Aktualisierung der Kontaktdaten fehlgeschlagen.";
+$a->strings["Your introduction has been sent."] = "Deine Kontaktanfrage wurde gesendet.";
+$a->strings["Remote subscription can't be done for your network. Please subscribe directly on your system."] = "Entferntes Abon­nie­ren kann für dein Netzwerk nicht durchgeführt werden. Bitte nutze direkt die Abonnieren-Funktion deines Systems.   ";
+$a->strings["Please login to confirm introduction."] = "Bitte melde dich an, um die Kontaktanfrage zu bestätigen.";
+$a->strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "Momentan bist du mit einer anderen Identität angemeldet. Bitte melde dich mit <strong>diesem</strong> Profil an.";
+$a->strings["Confirm"] = "Bestätigen";
+$a->strings["Hide this contact"] = "Verberge diesen Kontakt";
+$a->strings["Welcome home %s."] = "Willkommen zurück %s.";
+$a->strings["Please confirm your introduction/connection request to %s."] = "Bitte bestätige Deine Kontaktanfrage bei %s.";
+$a->strings["Please enter your 'Identity Address' from one of the following supported communications networks:"] = "Bitte gib die Adresse Deines Profils in einem der unterstützten sozialen Netzwerke an:";
+$a->strings["If you are not yet a member of the free social web, <a href=\"%s\">follow this link to find a public Friendica site and join us today</a>."] = "Wenn du noch kein Mitglied dieses freien sozialen Netzwerks bist, <a href=\"%s\">folge diesem Link</a> um einen öffentlichen Friendica-Server zu finden und beizutreten.";
+$a->strings["Friend/Connection Request"] = "Kontaktanfrage";
+$a->strings["Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@gnusocial.de"] = "Beispiele: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@gnusocial.de";
+$a->strings["Please answer the following:"] = "Bitte beantworte folgendes:";
 $a->strings["Does %s know you?"] = "Kennt %s dich?";
 $a->strings["Add a personal note:"] = "Eine persönliche Notiz beifügen:";
 $a->strings["Friendica"] = "Friendica";
 $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."] = " - bitte verwende dieses Formular nicht. Stattdessen suche nach %s in Deiner Diaspora-Suchleiste.";
-$a->strings["Your Identity Address:"] = "Adresse Deines Profils:";
-$a->strings["Submit Request"] = "Anfrage abschicken";
-$a->strings["People Search - %s"] = "Personensuche - %s";
-$a->strings["Forum Search - %s"] = "Forensuche - %s";
-$a->strings["Connect"] = "Verbinden";
-$a->strings["No matches"] = "Keine Übereinstimmungen";
 $a->strings["The requested item doesn't exist or has been deleted."] = "Der angeforderte Beitrag existiert nicht oder wurde gelöscht.";
 $a->strings["The feed for this item is unavailable."] = "Der Feed für diesen Beitrag ist nicht verfügbar.";
 $a->strings["Item not found"] = "Beitrag nicht gefunden";
 $a->strings["Edit post"] = "Beitrag bearbeiten";
 $a->strings["Save"] = "Speichern";
-$a->strings["Insert web link"] = "Einen Link einfügen";
 $a->strings["web link"] = "Weblink";
 $a->strings["Insert video link"] = "Video-Adresse einfügen";
 $a->strings["video link"] = "Video-Link";
@@ -353,7 +509,6 @@ $a->strings["Create New Event"] = "Neue Veranstaltung erstellen";
 $a->strings["Event details"] = "Veranstaltungsdetails";
 $a->strings["Starting date and Title are required."] = "Anfangszeitpunkt und Titel werden benötigt";
 $a->strings["Event Starts:"] = "Veranstaltungsbeginn:";
-$a->strings["Required"] = "Benötigt";
 $a->strings["Finish date/time is not known or not relevant"] = "Enddatum/-zeit ist nicht bekannt oder nicht relevant";
 $a->strings["Event Finishes:"] = "Veranstaltungsende:";
 $a->strings["Adjust for viewer timezone"] = "An Zeitzone des Betrachters anpassen";
@@ -375,9 +530,8 @@ $a->strings["You already added this contact."] = "Du hast den Kontakt bereits hi
 $a->strings["Diaspora support isn't enabled. Contact can't be added."] = "Diaspora-Unterstützung ist nicht aktiviert. Der Kontakt kann nicht zugefügt werden.";
 $a->strings["OStatus support is disabled. Contact can't be added."] = "OStatus-Unterstützung ist nicht aktiviert. Der Kontakt kann nicht zugefügt werden.";
 $a->strings["The network type couldn't be detected. Contact can't be added."] = "Der Netzwerktyp wurde nicht erkannt. Der Kontakt kann nicht hinzugefügt werden.";
-$a->strings["Profile URL"] = "Profil URL";
 $a->strings["Tags:"] = "Tags:";
-$a->strings["Status Messages and Posts"] = "Statusnachrichten und Beiträge";
+$a->strings["Suggested contact not found."] = "Vorgeschlagener Kontakt wurde nicht gefunden.";
 $a->strings["Friend suggestion sent."] = "Kontaktvorschlag gesendet.";
 $a->strings["Suggest Friends"] = "Kontakte vorschlagen";
 $a->strings["Suggest a friend for %s"] = "Schlage %s einen Kontakt vor";
@@ -390,6 +544,8 @@ $a->strings["Please contact the sender by replying to this post if you do not wi
 $a->strings["%s posted an update."] = "%s hat ein Update veröffentlicht.";
 $a->strings["Remote privacy information not available."] = "Entfernte Privatsphäreneinstellungen nicht verfügbar.";
 $a->strings["Visible to:"] = "Sichtbar für:";
+$a->strings["Followers"] = "Folgende";
+$a->strings["Mutuals"] = "Beidseitige Freundschaft";
 $a->strings["No valid account found."] = "Kein gültiges Konto gefunden.";
 $a->strings["Password reset request issued. Check your email."] = "Zurücksetzen des Passworts eingeleitet. Bitte überprüfe Deine E-Mail.";
 $a->strings["\n\t\tDear %1\$s,\n\t\t\tA request was recently received at \"%2\$s\" to reset your account\n\t\tpassword. In order to confirm this request, please select the verification link\n\t\tbelow or paste it into your web browser address bar.\n\n\t\tIf you did NOT request this change, please DO NOT follow the link\n\t\tprovided and ignore and/or delete this email, the request will expire shortly.\n\n\t\tYour password will not be changed unless we can verify that you\n\t\tissued this request."] = "\nHallo %1\$s,\n\nAuf \"%2\$s\" ist eine Anfrage auf das Zurücksetzen deines Passworts gestellt\nworden. Um diese Anfrage zu verifizieren, folge bitte dem unten stehenden\nLink oder kopiere und füge ihn in die Adressleiste deines Browsers ein.\n\nSolltest du die Anfrage NICHT gestellt haben, ignoriere und/oder lösche diese\nE-Mail bitte.\n\nDein Passwort wird nicht geändert, solange wir nicht verifiziert haben, dass\ndu diese Änderung angefragt hast.";
@@ -413,27 +569,14 @@ $a->strings["Your password has been changed at %s"] = "Auf %s wurde dein Passwor
 $a->strings["Manage Identities and/or Pages"] = "Verwalte Identitäten und/oder Seiten";
 $a->strings["Toggle between different identities or community/group pages which share your account details or which you have been granted \"manage\" permissions"] = "Zwischen verschiedenen Identitäten oder Gemeinschafts-/Gruppenseiten wechseln, die deine Kontoinformationen teilen oder zu denen du „Verwalten“-Befugnisse bekommen hast.";
 $a->strings["Select an identity to manage: "] = "Wähle eine Identität zum Verwalten aus: ";
-$a->strings["No keywords to match. Please add keywords to your default profile."] = "Keine Schlüsselwörter zum Abgleichen gefunden. Bitte füge einige Schlüsselwörter zu Deinem Standardprofil hinzu.";
-$a->strings["first"] = "erste";
-$a->strings["next"] = "nächste";
-$a->strings["Profile Match"] = "Profilübereinstimmungen";
 $a->strings["New Message"] = "Neue Nachricht";
-$a->strings["No recipient selected."] = "Kein Empfänger gewählt.";
 $a->strings["Unable to locate contact information."] = "Konnte die Kontaktinformationen nicht finden.";
-$a->strings["Message could not be sent."] = "Nachricht konnte nicht gesendet werden.";
-$a->strings["Message collection failure."] = "Konnte Nachrichten nicht abrufen.";
-$a->strings["Message sent."] = "Nachricht gesendet.";
 $a->strings["Discard"] = "Verwerfen";
 $a->strings["Messages"] = "Nachrichten";
 $a->strings["Do you really want to delete this message?"] = "Möchtest du diese Nachricht wirklich löschen?";
 $a->strings["Conversation not found."] = "Unterhaltung nicht gefunden.";
 $a->strings["Message deleted."] = "Nachricht gelöscht.";
 $a->strings["Conversation removed."] = "Unterhaltung gelöscht.";
-$a->strings["Please enter a link URL:"] = "Bitte gib die URL des Links ein:";
-$a->strings["Send Private Message"] = "Private Nachricht senden";
-$a->strings["To:"] = "An:";
-$a->strings["Subject:"] = "Betreff:";
-$a->strings["Your message:"] = "Deine Nachricht:";
 $a->strings["No messages."] = "Keine Nachrichten.";
 $a->strings["Message not available."] = "Nachricht nicht verfügbar.";
 $a->strings["Delete message"] = "Nachricht löschen";
@@ -465,7 +608,6 @@ $a->strings["Commented Order"] = "Neueste Kommentare";
 $a->strings["Sort by Comment Date"] = "Nach Kommentardatum sortieren";
 $a->strings["Posted Order"] = "Neueste Beiträge";
 $a->strings["Sort by Post Date"] = "Nach Beitragsdatum sortieren";
-$a->strings["Personal"] = "Persönlich";
 $a->strings["Posts that mention or involve you"] = "Beiträge, in denen es um dich geht";
 $a->strings["New"] = "Neue";
 $a->strings["Activity Stream - by date"] = "Aktivitäten-Stream - nach Datum";
@@ -473,40 +615,6 @@ $a->strings["Shared Links"] = "Geteilte Links";
 $a->strings["Interesting Links"] = "Interessante Links";
 $a->strings["Starred"] = "Markierte";
 $a->strings["Favourite Posts"] = "Favorisierte Beiträge";
-$a->strings["Welcome to Friendica"] = "Willkommen bei Friendica";
-$a->strings["New Member Checklist"] = "Checkliste für neue Mitglieder";
-$a->strings["We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page. A link to this page will be visible from your home page for two weeks after your initial registration and then will quietly disappear."] = "Wir möchten dir einige Tipps und Links anbieten, die dir helfen könnten, den Einstieg angenehmer zu machen. Klicke auf ein Element, um die entsprechende Seite zu besuchen. Ein Link zu dieser Seite hier bleibt für dich an deiner Pinnwand für zwei Wochen nach dem Registrierungsdatum sichtbar und wird dann verschwinden.";
-$a->strings["Getting Started"] = "Einstieg";
-$a->strings["Friendica Walk-Through"] = "Friendica Rundgang";
-$a->strings["On your <em>Quick Start</em> page - find a brief introduction to your profile and network tabs, make some new connections, and find some groups to join."] = "Auf der <em>Quick Start</em>-Seite findest du eine kurze Einleitung in die einzelnen Funktionen deines Profils und die Netzwerk-Reiter, wo du interessante Foren findest und neue Kontakte knüpfst.";
-$a->strings["Settings"] = "Einstellungen";
-$a->strings["Go to Your Settings"] = "Gehe zu deinen Einstellungen";
-$a->strings["On your <em>Settings</em> page -  change your initial password. Also make a note of your Identity Address. This looks just like an email address - and will be useful in making friends on the free social web."] = "Ändere bitte unter <em>Einstellungen</em> dein Passwort. Außerdem merke dir deine Identifikationsadresse. Diese sieht aus wie eine E-Mail-Adresse und wird benötigt, um Kontakte mit anderen im Friendica Netzwerk zu knüpfen..";
-$a->strings["Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you."] = "Überprüfe die restlichen Einstellungen, insbesondere die Einstellungen zur Privatsphäre. Wenn du dein Profil nicht veröffentlichst, ist das, als wenn du deine Telefonnummer nicht ins Telefonbuch einträgst. Im Allgemeinen solltest du es veröffentlichen - außer all deine Kontakte und potentiellen Kontakte wissen genau, wie sie dich finden können.";
-$a->strings["Profile"] = "Profil";
-$a->strings["Upload Profile Photo"] = "Profilbild hochladen";
-$a->strings["Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not."] = "Lade ein Profilbild hoch, falls du es noch nicht getan hast. Studien haben gezeigt, dass es zehnmal wahrscheinlicher ist, neue Kontakte zu finden, wenn du ein Bild von dir selbst verwendest, als wenn du dies nicht tust.";
-$a->strings["Edit Your Profile"] = "Editiere dein Profil";
-$a->strings["Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors."] = "Editiere dein <strong>Standard</strong>-Profil nach deinen Vorlieben. Überprüfe die Einstellungen zum Verbergen deiner Kontaktliste vor unbekannten Betrachtern des Profils.";
-$a->strings["Profile Keywords"] = "Profil-Schlüsselbegriffe";
-$a->strings["Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships."] = "Trage ein paar öffentliche Stichwörter in dein Standardprofil ein, die deine Interessen beschreiben. Eventuell sind wir in der Lage, Leute zu finden, die deine Interessen teilen, und können dir dann Kontakte vorschlagen.";
-$a->strings["Connecting"] = "Verbindungen knüpfen";
-$a->strings["Importing Emails"] = "Emails Importieren";
-$a->strings["Enter your email access information on your Connector Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = "Gib deine E-Mail-Zugangsinformationen auf der Connector-Einstellungsseite ein, falls du E-Mails aus Deinem Posteingang importieren und mit Kontakten und Mailinglisten interagieren willst.";
-$a->strings["Go to Your Contacts Page"] = "Gehe zu deiner Kontakt-Seite";
-$a->strings["Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Add New Contact</em> dialog."] = "Die Kontakte-Seite ist die Einstiegsseite, von der aus du Kontakte verwalten und dich mit Personen in anderen Netzwerken verbinden kannst. Normalerweise gibst du dazu einfach ihre Adresse oder die URL der Seite im Kasten <em>Neuen Kontakt hinzufügen</em> ein.";
-$a->strings["Go to Your Site's Directory"] = "Gehe zum Verzeichnis Deiner Friendica-Instanz";
-$a->strings["The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested."] = "Über die Verzeichnisseite kannst du andere Personen auf diesem Server oder anderen, verknüpften Seiten finden. Halte nach einem <em>Verbinden</em>- oder <em>Folgen</em>-Link auf deren Profilseiten Ausschau und gib deine eigene Profiladresse an, falls du danach gefragt wirst.";
-$a->strings["Finding New People"] = "Neue Leute kennenlernen";
-$a->strings["On the side panel of the Contacts page are several tools to find new friends. We can match people by interest, look up people by name or interest, and provide suggestions based on network relationships. On a brand new site, friend suggestions will usually begin to be populated within 24 hours."] = "Im seitlichen Bedienfeld der Kontakteseite gibt es diverse Werkzeuge, um neue Personen zu finden. Wir können Menschen mit den gleichen Interessen finden, anhand von Namen oder Interessen suchen oder aber aufgrund vorhandener Kontakte neue Leute vorschlagen.\nAuf einer brandneuen - soeben erstellten - Seite starten die Kontaktvorschläge innerhalb von 24 Stunden.";
-$a->strings["Groups"] = "Gruppen";
-$a->strings["Group Your Contacts"] = "Gruppiere deine Kontakte";
-$a->strings["Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page."] = "Sobald du einige Kontakte gefunden hast, organisiere sie in Gruppen zur privaten Kommunikation im Seitenmenü der Kontakte-Seite. Du kannst dann mit jeder dieser Gruppen von der Netzwerkseite aus privat interagieren.";
-$a->strings["Why Aren't My Posts Public?"] = "Warum sind meine Beiträge nicht öffentlich?";
-$a->strings["Friendica respects your privacy. By default, your posts will only show up to people you've added as friends. For more information, see the help section from the link above."] = "Friendica respektiert Deine Privatsphäre. Mit der Grundeinstellung werden Deine Beiträge ausschließlich Deinen Kontakten angezeigt. Für weitere Informationen diesbezüglich lies dir bitte den entsprechenden Abschnitt in der Hilfe unter dem obigen Link durch.";
-$a->strings["Getting Help"] = "Hilfe bekommen";
-$a->strings["Go to the Help Section"] = "Zum Hilfe Abschnitt gehen";
-$a->strings["Our <strong>help</strong> pages may be consulted for detail on other program features and resources."] = "Unsere <strong>Hilfe</strong>-Seiten können herangezogen werden, um weitere Einzelheiten zu anderen Programm-Features zu erhalten.";
 $a->strings["Personal Notes"] = "Persönliche Notizen";
 $a->strings["Invalid request identifier."] = "Invalid request identifier.";
 $a->strings["Notifications"] = "Benachrichtigungen";
@@ -537,20 +645,9 @@ $a->strings["Gender:"] = "Geschlecht:";
 $a->strings["Network:"] = "Netzwerk:";
 $a->strings["No introductions."] = "Keine Kontaktanfragen.";
 $a->strings["No more %s notifications."] = "Keine weiteren %s-Benachrichtigungen";
-$a->strings["No more system notifications."] = "Keine weiteren Systembenachrichtigungen.";
-$a->strings["Post successful."] = "Beitrag erfolgreich veröffentlicht.";
 $a->strings["OpenID protocol error. No ID returned."] = "OpenID Protokollfehler. Keine ID zurückgegeben.";
 $a->strings["Account not found and OpenID registration is not permitted on this site."] = "Nutzerkonto wurde nicht gefunden und OpenID-Registrierung ist auf diesem Server nicht gestattet.";
 $a->strings["Login failed."] = "Anmeldung fehlgeschlagen.";
-$a->strings["Subscribing to OStatus contacts"] = "OStatus-Kontakten folgen";
-$a->strings["No contact provided."] = "Keine Kontakte gefunden.";
-$a->strings["Couldn't fetch information for contact."] = "Konnte die Kontaktinformationen nicht einholen.";
-$a->strings["Couldn't fetch friends for contact."] = "Konnte die Kontaktliste des Kontakts nicht abfragen.";
-$a->strings["Done"] = "Erledigt";
-$a->strings["success"] = "Erfolg";
-$a->strings["failed"] = "Fehlgeschlagen";
-$a->strings["ignored"] = "Ignoriert";
-$a->strings["Keep this window open until done."] = "Lasse dieses Fenster offen, bis der Vorgang abgeschlossen ist.";
 $a->strings["Photo Albums"] = "Fotoalben";
 $a->strings["Recent Photos"] = "Neueste Fotos";
 $a->strings["Upload New Photos"] = "Neue Fotos hochladen";
@@ -561,13 +658,10 @@ $a->strings["Album successfully deleted"] = "Album wurde erfolgreich gelöscht."
 $a->strings["Album was empty."] = "Album ist leer.";
 $a->strings["a photo"] = "einem Foto";
 $a->strings["%1\$s was tagged in %2\$s by %3\$s"] = "%1\$s wurde von %3\$s in %2\$s getaggt";
-$a->strings["Image exceeds size limit of %s"] = "Bildgröße überschreitet das Limit von %s";
 $a->strings["Image upload didn't complete, please try again"] = "Der Upload des Bildes war nicht vollständig. Bitte versuche es erneut.";
 $a->strings["Image file is missing"] = "Bilddatei konnte nicht gefunden werden.";
 $a->strings["Server can't accept new file upload at this time, please contact your administrator"] = "Der Server kann derzeit keine neuen Datei-Uploads akzeptieren. Bitte kontaktiere deinen Administrator.";
 $a->strings["Image file is empty."] = "Bilddatei ist leer.";
-$a->strings["Unable to process image."] = "Konnte das Bild nicht bearbeiten.";
-$a->strings["Image upload failed."] = "Hochladen des Bildes gescheitert.";
 $a->strings["No photos selected"] = "Keine Bilder ausgewählt";
 $a->strings["Access to this item is restricted."] = "Zugriff zu diesem Eintrag wurde eingeschränkt.";
 $a->strings["Upload Photos"] = "Bilder hochladen";
@@ -615,88 +709,6 @@ $a->strings["poke, prod or do other things to somebody"] = "Stupse Leute an oder
 $a->strings["Recipient"] = "Empfänger";
 $a->strings["Choose what you wish to do to recipient"] = "Was willst du mit dem Empfänger machen:";
 $a->strings["Make this post private"] = "Diesen Beitrag privat machen";
-$a->strings["Only logged in users are permitted to perform a probing."] = "Nur eingeloggten Benutzern ist das Untersuchen von Adressen gestattet.";
-$a->strings["Profile deleted."] = "Profil gelöscht.";
-$a->strings["Profile-"] = "Profil-";
-$a->strings["New profile created."] = "Neues Profil angelegt.";
-$a->strings["Profile unavailable to clone."] = "Profil nicht zum Duplizieren verfügbar.";
-$a->strings["Profile Name is required."] = "Profilname ist erforderlich.";
-$a->strings["Marital Status"] = "Familienstand";
-$a->strings["Romantic Partner"] = "Romanze";
-$a->strings["Work/Employment"] = "Arbeit / Beschäftigung";
-$a->strings["Religion"] = "Religion";
-$a->strings["Political Views"] = "Politische Ansichten";
-$a->strings["Gender"] = "Geschlecht";
-$a->strings["Sexual Preference"] = "Sexuelle Vorlieben";
-$a->strings["XMPP"] = "XMPP";
-$a->strings["Homepage"] = "Webseite";
-$a->strings["Interests"] = "Interessen";
-$a->strings["Address"] = "Adresse";
-$a->strings["Location"] = "Wohnort";
-$a->strings["Profile updated."] = "Profil aktualisiert.";
-$a->strings["Hide contacts and friends:"] = "Kontakte und Freunde verbergen";
-$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Liste der Kontakte vor Betrachtern dieses Profils verbergen?";
-$a->strings["Show more profile fields:"] = "Zeige mehr Profil-Felder:";
-$a->strings["Profile Actions"] = "Profilaktionen";
-$a->strings["Edit Profile Details"] = "Profil bearbeiten";
-$a->strings["Change Profile Photo"] = "Profilbild ändern";
-$a->strings["View this profile"] = "Dieses Profil anzeigen";
-$a->strings["View all profiles"] = "Alle Profile anzeigen";
-$a->strings["Edit visibility"] = "Sichtbarkeit bearbeiten";
-$a->strings["Create a new profile using these settings"] = "Neues Profil anlegen und diese Einstellungen verwenden";
-$a->strings["Clone this profile"] = "Dieses Profil duplizieren";
-$a->strings["Delete this profile"] = "Dieses Profil löschen";
-$a->strings["Basic information"] = "Grundinformationen";
-$a->strings["Profile picture"] = "Profilbild";
-$a->strings["Preferences"] = "Vorlieben";
-$a->strings["Status information"] = "Status-Informationen";
-$a->strings["Additional information"] = "Zusätzliche Informationen";
-$a->strings["Relation"] = "Beziehung";
-$a->strings["Miscellaneous"] = "Verschiedenes";
-$a->strings["Your Gender:"] = "Dein Geschlecht:";
-$a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "<span class=\"heart\">&hearts;</span> Beziehungsstatus:";
-$a->strings["Sexual Preference:"] = "Sexuelle Vorlieben:";
-$a->strings["Example: fishing photography software"] = "Beispiel: Fischen Fotografie Software";
-$a->strings["Profile Name:"] = "Profilname:";
-$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "Dies ist dein <strong>öffentliches</strong> Profil.<br />Es <strong>könnte</strong> für jeden Nutzer des Internets sichtbar sein.";
-$a->strings["Your Full Name:"] = "Dein kompletter Name:";
-$a->strings["Title/Description:"] = "Titel/Beschreibung:";
-$a->strings["Street Address:"] = "Adresse:";
-$a->strings["Locality/City:"] = "Wohnort:";
-$a->strings["Region/State:"] = "Region/Bundesstaat:";
-$a->strings["Postal/Zip Code:"] = "Postleitzahl:";
-$a->strings["Country:"] = "Land:";
-$a->strings["Age: "] = "Alter: ";
-$a->strings["Who: (if applicable)"] = "Wer: (falls anwendbar)";
-$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Beispiele: cathy123, Cathy Williams, cathy@example.com";
-$a->strings["Since [date]:"] = "Seit [Datum]:";
-$a->strings["Tell us about yourself..."] = "Erzähle uns ein bisschen von dir …";
-$a->strings["XMPP (Jabber) address:"] = "XMPP (Jabber) Adresse";
-$a->strings["The XMPP address will be propagated to your contacts so that they can follow you."] = "Die XMPP Adresse wird an deine Kontakte verteilt werden, so dass sie auch über XMPP mit dir in Kontakt treten können.";
-$a->strings["Homepage URL:"] = "Adresse der Homepage:";
-$a->strings["Hometown:"] = "Heimatort:";
-$a->strings["Political Views:"] = "Politische Ansichten:";
-$a->strings["Religious Views:"] = "Religiöse Ansichten:";
-$a->strings["Public Keywords:"] = "Öffentliche Schlüsselwörter:";
-$a->strings["(Used for suggesting potential friends, can be seen by others)"] = "(Wird verwendet, um potentielle Kontakte zu finden, kann von Kontakten eingesehen werden)";
-$a->strings["Private Keywords:"] = "Private Schlüsselwörter:";
-$a->strings["(Used for searching profiles, never shown to others)"] = "(Wird für die Suche nach Profilen verwendet und niemals veröffentlicht)";
-$a->strings["Likes:"] = "Likes:";
-$a->strings["Dislikes:"] = "Dislikes:";
-$a->strings["Musical interests"] = "Musikalische Interessen";
-$a->strings["Books, literature"] = "Bücher, Literatur";
-$a->strings["Television"] = "Fernsehen";
-$a->strings["Film/dance/culture/entertainment"] = "Filme/Tänze/Kultur/Unterhaltung";
-$a->strings["Hobbies/Interests"] = "Hobbies/Interessen";
-$a->strings["Love/romance"] = "Liebe/Romantik";
-$a->strings["Work/employment"] = "Arbeit/Anstellung";
-$a->strings["School/education"] = "Schule/Ausbildung";
-$a->strings["Contact information and Social Networks"] = "Kontaktinformationen und Soziale Netzwerke";
-$a->strings["Profile Image"] = "Profilbild";
-$a->strings["visible to everybody"] = "sichtbar für jeden";
-$a->strings["Edit/Manage Profiles"] = "Bearbeite/Verwalte Profile";
-$a->strings["Change profile photo"] = "Profilbild ändern";
-$a->strings["Create New Profile"] = "Neues Profil anlegen";
 $a->strings["Image uploaded but image cropping failed."] = "Bild hochgeladen, aber das Zuschneiden schlug fehl.";
 $a->strings["Image size reduction [%s] failed."] = "Verkleinern der Bildgröße von [%s] scheiterte.";
 $a->strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Drücke Umschalt+Neu Laden oder leere den Browser-Cache, falls das neue Foto nicht gleich angezeigt wird.";
@@ -710,23 +722,6 @@ $a->strings["Crop Image"] = "Bild zurechtschneiden";
 $a->strings["Please adjust the image cropping for optimum viewing."] = "Passe bitte den Bildausschnitt an, damit das Bild optimal dargestellt werden kann.";
 $a->strings["Done Editing"] = "Bearbeitung abgeschlossen";
 $a->strings["Image uploaded successfully."] = "Bild erfolgreich hochgeladen.";
-$a->strings["Permission denied"] = "Zugriff verweigert";
-$a->strings["Invalid profile identifier."] = "Ungültiger Profil-Bezeichner.";
-$a->strings["Profile Visibility Editor"] = "Editor für die Profil-Sichtbarkeit";
-$a->strings["Click on a contact to add or remove."] = "Klicke einen Kontakt an, um ihn hinzuzufügen oder zu entfernen";
-$a->strings["Visible To"] = "Sichtbar für";
-$a->strings["All Contacts (with secure profile access)"] = "Alle Kontakte (mit gesichertem Profilzugriff)";
-$a->strings["Account approved."] = "Konto freigegeben.";
-$a->strings["Registration revoked for %s"] = "Registrierung für %s wurde zurückgezogen";
-$a->strings["Please login."] = "Bitte melde dich an.";
-$a->strings["User deleted their account"] = "Gelöschter Nutzeraccount";
-$a->strings["On your Friendica node an user deleted their account. Please ensure that their data is removed from the backups."] = "Ein Nutzer deiner Friendica-Instanz hat seinen Account gelöscht. Bitte stelle sicher, dass dessen Daten aus deinen Backups entfernt werden.";
-$a->strings["The user id is %d"] = "Die ID des Users lautet %d";
-$a->strings["Remove My Account"] = "Konto löschen";
-$a->strings["This will completely remove your account. Once this has been done it is not recoverable."] = "Dein Konto wird endgültig gelöscht. Es gibt keine Möglichkeit, es wiederherzustellen.";
-$a->strings["Please enter your password for verification:"] = "Bitte gib dein Passwort zur Verifikation ein:";
-$a->strings["Resubscribing to OStatus contacts"] = "Erneuern der OStatus-Abonements";
-$a->strings["Error"] = "Fehler";
 $a->strings["Only logged in users are permitted to perform a search."] = "Nur eingeloggten Benutzern ist das Suchen gestattet.";
 $a->strings["Only one search per minute is permitted for not logged in users."] = "Es ist nur eine Suchanfrage pro Minute für nicht eingeloggte Benutzer gestattet.";
 $a->strings["Search"] = "Suche";
@@ -743,11 +738,13 @@ $a->strings["Delegations"] = "Delegationen";
 $a->strings["Connected apps"] = "Verbundene Programme";
 $a->strings["Export personal data"] = "Persönliche Daten exportieren";
 $a->strings["Remove account"] = "Konto löschen";
+$a->strings["Settings"] = "Einstellungen";
 $a->strings["Missing some important data!"] = "Wichtige Daten fehlen!";
 $a->strings["Update"] = "Aktualisierungen";
 $a->strings["Failed to connect with email account using the settings provided."] = "Verbindung zum E-Mail-Konto mit den angegebenen Einstellungen nicht möglich.";
 $a->strings["Email settings updated."] = "E-Mail Einstellungen bearbeitet.";
 $a->strings["Features updated"] = "Features aktualisiert";
+$a->strings["The theme you chose isn't available."] = "Das gewählte Theme ist nicht verfügbar";
 $a->strings["Relocate message has been send to your contacts"] = "Die Umzugsbenachrichtigung wurde an Deine Kontakte versendet.";
 $a->strings["Passwords do not match."] = "Die Passwörter stimmen nicht überein.";
 $a->strings["Password update failed. Please try again."] = "Aktualisierung des Passworts gescheitert, bitte versuche es noch einmal.";
@@ -784,6 +781,8 @@ $a->strings["Built-in support for %s connectivity is %s"] = "Eingebaute Unterst
 $a->strings["GNU Social (OStatus)"] = "GNU Social (OStatus)";
 $a->strings["Email access is disabled on this site."] = "Zugriff auf E-Mails für diese Seite deaktiviert.";
 $a->strings["General Social Media Settings"] = "Allgemeine Einstellungen zu Sozialen Medien";
+$a->strings["Accept only top level posts by contacts you follow"] = "Ausschließlich Unterhaltungen von meinen Kontakten anzeigen";
+$a->strings["The system does an auto completion of threads when a comment arrives. This has got the side effect that you can receive posts that had been started by a non-follower but had been commented by someone you follow. This setting deactivates this behaviour. When activated, you strictly only will receive posts from people you really do follow."] = "Wenn neue Kommentare empfangen werden führt das System eine Vervollständigung der Unterhaltung durch. Die hat den Nebeneffekt, dass Unterhaltungen in denen einer deiner Kontakte kommentiert haben, die aber nicht von einem deiner Kontakte begonnen wurden in deinem Netzwerk-Stream angezeigt werden können. Diese Option unterbindet dieses Verhalten. Ist sie aktiviert, wirst du ausschließlich die Unterhaltungen angezeigt bekommen, die von deinen Kontakten begonnen wurden.";
 $a->strings["Disable Content Warning"] = "Inhaltswarnung ausschalten";
 $a->strings["Users on networks like Mastodon or Pleroma are able to set a content warning field which collapse their post by default. This disables the automatic collapsing and sets the content warning as the post title. Doesn't affect any other content filtering you eventually set up."] = "Benutzer in Netzwerken wie Mastodon oder Pleroma können ein Inhaltswarnfeld einstellen, das ihren Beitrag standardmäßig ausblendet. Dies deaktiviert das automatische Zusammenklappen und setzt die Inhaltswarnung als Beitragstitel. Beeinflusst keine anderen Inhaltsfilterungen, die du eventuell eingerichtet hast.";
 $a->strings["Disable intelligent shortening"] = "Intelligentes Link-Kürzen ausschalten";
@@ -943,59 +942,286 @@ $a->strings["No suggestions available. If this is a new site, please try again i
 $a->strings["Do you really want to delete this suggestion?"] = "Möchtest du wirklich diese Empfehlung löschen?";
 $a->strings["Ignore/Hide"] = "Ignorieren/Verbergen";
 $a->strings["Friend Suggestions"] = "Kontaktvorschläge";
-$a->strings["Tag(s) removed"] = "Tag(s) entfernt";
-$a->strings["Remove Item Tag"] = "Gegenstands-Tag entfernen";
-$a->strings["Select a tag to remove: "] = "Wähle ein Tag zum Entfernen aus: ";
 $a->strings["Export account"] = "Account exportieren";
 $a->strings["Export your account info and contacts. Use this to make a backup of your account and/or to move it to another server."] = "Exportiere Deine Account-Informationen und Kontakte. Verwende dies, um ein Backup Deines Accounts anzulegen und/oder damit auf einen anderen Server umzuziehen.";
 $a->strings["Export all"] = "Alles exportieren";
 $a->strings["Export your accout info, contacts and all your items as json. Could be a very big file, and could take a lot of time. Use this to make a full backup of your account (photos are not exported)"] = "Exportiere Deine Account-Informationen, Kontakte und alle Einträge als JSON Datei. Dies könnte eine sehr große Datei werden und dementsprechend viel Zeit benötigen. Verwende dies, um ein komplettes Backup Deines Accounts anzulegen (Fotos werden nicht exportiert).";
-$a->strings["User imports on closed servers can only be done by an administrator."] = "Auf geschlossenen Servern können ausschließlich die Administratoren Benutzerkonten importieren.";
-$a->strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Die maximale Anzahl täglicher Registrierungen auf dieser Seite wurde überschritten. Bitte versuche es morgen noch einmal.";
-$a->strings["Import"] = "Import";
-$a->strings["Move account"] = "Account umziehen";
-$a->strings["You can import an account from another Friendica server."] = "Du kannst einen Account von einem anderen Friendica Server importieren.";
-$a->strings["You need to export your account from the old server and upload it here. We will recreate your old account here with all your contacts. We will try also to inform your friends that you moved here."] = "Du musst deinen Account vom alten Server exportieren und hier hochladen. Wir stellen deinen alten Account mit all deinen Kontakten wieder her. Wir werden auch versuchen, deine Kontakte darüber zu informieren, dass du hierher umgezogen bist.";
-$a->strings["This feature is experimental. We can't import contacts from the OStatus network (GNU Social/Statusnet) or from Diaspora"] = "Dieses Feature ist experimentell. Wir können keine Kontakte vom OStatus-Netzwerk (GNU Social/Statusnet) oder von Diaspora importieren";
-$a->strings["Account file"] = "Account-Datei";
-$a->strings["To export your account, go to \"Settings->Export your personal data\" and select \"Export account\""] = "Um Deinen Account zu exportieren, rufe \"Einstellungen -> Persönliche Daten exportieren\" auf und wähle \"Account exportieren\"";
-$a->strings["You aren't following this contact."] = "Du folgst diesem Kontakt.";
-$a->strings["Unfollowing is currently not supported by your network."] = "Bei diesem Netzwerk wird das Entfolgen derzeit nicht unterstützt.";
-$a->strings["Contact unfollowed"] = "Kontakt wird nicht mehr gefolgt";
-$a->strings["Disconnect/Unfollow"] = "Verbindung lösen/Nicht mehr folgen";
-$a->strings["[Embedded content - reload page to view]"] = "[Eingebetteter Inhalt - Seite neu laden zum Betrachten]";
 $a->strings["No videos selected"] = "Keine Videos  ausgewählt";
 $a->strings["View Video"] = "Video ansehen";
 $a->strings["Recent Videos"] = "Neueste Videos";
 $a->strings["Upload New Videos"] = "Neues Video hochladen";
-$a->strings["No contacts."] = "Keine Kontakte.";
-$a->strings["Visit %s's profile [%s]"] = "Besuche %ss Profil [%s]";
+$a->strings["default"] = "Standard";
+$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"] = "Variationen";
+$a->strings["Top Banner"] = "Top Banner";
+$a->strings["Resize image to the width of the screen and show background color below on long pages."] = "Skaliere das Hintergrundbild so, dass es die Breite der Seite einnimmt, und fülle den Rest der Seite mit der Hintergrundfarbe bei langen Seiten.";
+$a->strings["Full screen"] = "Vollbildmodus";
+$a->strings["Resize image to fill entire screen, clipping either the right or the bottom."] = "Skaliere das Bild so, dass es den gesamten Bildschirm füllt. Hierfür wird entweder die Breite oder die Höhe des Bildes automatisch abgeschnitten.";
+$a->strings["Single row mosaic"] = "Mosaik in einer Zeile";
+$a->strings["Resize image to repeat it on a single row, either vertical or horizontal."] = "Skaliere das Bild so, dass es in einer einzelnen Reihe, entweder horizontal oder vertikal, wiederholt wird.";
+$a->strings["Mosaic"] = "Mosaik";
+$a->strings["Repeat image to fill the screen."] = "Wiederhole das Bild, um den Bildschirm zu füllen.";
+$a->strings["Custom"] = "Benutzerdefiniert";
+$a->strings["Note"] = "Hinweis";
+$a->strings["Check image permissions if all users are allowed to see the image"] = "Überprüfe, dass alle Benutzer die Berechtigung haben dieses Bild anzusehen";
+$a->strings["Select color scheme"] = "Farbschema auswählen";
+$a->strings["Copy or paste schemestring"] = "Farbschema kopieren oder einfügen";
+$a->strings["You can copy this string to share your theme with others. Pasting here applies the schemestring"] = "Du kannst den String mit den Farbschema Informationen mit anderen Teilen. Wenn du einen neuen Farbschema-String hier einfügst wird er für deine Einstellungen übernommen.";
+$a->strings["Navigation bar background color"] = "Hintergrundfarbe der Navigationsleiste";
+$a->strings["Navigation bar icon color "] = "Icon Farbe in der Navigationsleiste";
+$a->strings["Link color"] = "Linkfarbe";
+$a->strings["Set the background color"] = "Hintergrundfarbe festlegen";
+$a->strings["Content background opacity"] = "Opazität des Hintergrunds von Beiträgen";
+$a->strings["Set the background image"] = "Hintergrundbild festlegen";
+$a->strings["Background image style"] = "Stil des Hintergrundbildes";
+$a->strings["Enable Compose page"] = "Aktiviere Composer Seite";
+$a->strings["This replaces the jot modal window for writing new posts with a link to <a href=\"compose\">the new Compose page</a>."] = "Dies ersetzt das jot-modale Fenster zum Schreiben neuer Beiträge mit einem Link zu <a href=\"compose\">die neue Composer Seite</a>.";
+$a->strings["Login page background image"] = "Hintergrundbild der Login-Seite";
+$a->strings["Login page background color"] = "Hintergrundfarbe der Login-Seite";
+$a->strings["Leave background image and color empty for theme defaults"] = "Wenn die Theme-Vorgaben verwendet werden sollen, lass bitte die Felder für die Hintergrundfarbe und das Hintergrundbild leer.";
+$a->strings["Guest"] = "Gast";
+$a->strings["Visitor"] = "Besucher";
+$a->strings["Status"] = "Status";
+$a->strings["Your posts and conversations"] = "Deine Beiträge und Unterhaltungen";
+$a->strings["Your profile page"] = "Deine Profilseite";
+$a->strings["Your photos"] = "Deine Fotos";
+$a->strings["Videos"] = "Videos";
+$a->strings["Your videos"] = "Deine Videos";
+$a->strings["Your events"] = "Deine Ereignisse";
+$a->strings["Network"] = "Netzwerk";
+$a->strings["Conversations from your friends"] = "Unterhaltungen Deiner Kontakte";
+$a->strings["Events and Calendar"] = "Ereignisse und Kalender";
+$a->strings["Private mail"] = "Private E-Mail";
+$a->strings["Account settings"] = "Kontoeinstellungen";
 $a->strings["Contacts"] = "Kontakte";
-$a->strings["Number of daily wall messages for %s exceeded. Message failed."] = "Maximale Anzahl der täglichen Pinnwand-Nachrichten für %s ist überschritten. Zustellung fehlgeschlagen.";
-$a->strings["Unable to check your home location."] = "Konnte Deinen Heimatort nicht bestimmen.";
-$a->strings["No recipient."] = "Kein Empfänger.";
-$a->strings["If you wish for %s to respond, please check that the privacy settings on your site allow private mail from unknown senders."] = "Wenn du möchtest, dass %s dir antworten kann, überprüfe deine Privatsphären-Einstellungen und erlaube private Nachrichten von unbekannten Absendern.";
-$a->strings["Invalid request."] = "Ungültige Anfrage";
-$a->strings["Sorry, maybe your upload is bigger than the PHP configuration allows"] = "Entschuldige, die Datei scheint größer zu sein, als es die PHP-Konfiguration erlaubt.";
-$a->strings["Or - did you try to upload an empty file?"] = "Oder - hast du versucht, eine leere Datei hochzuladen?";
-$a->strings["File exceeds size limit of %s"] = "Die Datei ist größer als das erlaubte Limit von %s";
-$a->strings["File upload failed."] = "Hochladen der Datei fehlgeschlagen.";
-$a->strings["Wall Photos"] = "Pinnwand-Bilder";
-$a->strings["Delete this item?"] = "Diesen Beitrag löschen?";
-$a->strings["toggle mobile"] = "mobile Ansicht umschalten";
-$a->strings["No system theme config value set."] = "Es wurde kein Konfigurationswert für das systemweite Theme gesetzt.";
-$a->strings["You must be logged in to use addons. "] = "Du musst angemeldet sein, um Addons benutzen zu können.";
-$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."] = "Das Sicherheitsmerkmal war nicht korrekt. Das passiert meistens, wenn das Formular vor dem Absenden zu lange geöffnet war (länger als 3 Stunden).";
-$a->strings["Could not find any unarchived contact entry for this URL (%s)"] = "Für die URL (%s) konnte kein nicht-archivierter Kontakt gefunden werden";
-$a->strings["The contact entries have been archived"] = "Die Kontakteinträge wurden archiviert.";
-$a->strings["Could not find any contact entry for this URL (%s)"] = "Für die URL (%s) konnte kein Kontakt gefunden werden";
-$a->strings["The contact has been blocked from the node"] = "Der Kontakt wurde von diesem Knoten geblockt";
-$a->strings["Enter new password: "] = "Neues Passwort eingeben:";
-$a->strings["Post update version number has been set to %s."] = "Die Post-Update-Versionsnummer wurde auf %s gesetzt.";
-$a->strings["Check for pending update actions."] = "Überprüfe ausstehende Update-Aktionen";
-$a->strings["Done."] = "Erledigt.";
-$a->strings["Execute pending post updates."] = "Ausstehende Post-Updates ausführen";
-$a->strings["All pending post updates are done."] = "Alle ausstehenden Post-Updates wurden ausgeführt.";
+$a->strings["Manage/edit friends and contacts"] = "Freunde und Kontakte verwalten/bearbeiten";
+$a->strings["Alignment"] = "Ausrichtung";
+$a->strings["Left"] = "Links";
+$a->strings["Center"] = "Mitte";
+$a->strings["Color scheme"] = "Farbschema";
+$a->strings["Posts font size"] = "Schriftgröße in Beiträgen";
+$a->strings["Textareas font size"] = "Schriftgröße in Eingabefeldern";
+$a->strings["Comma separated list of helper forums"] = "Komma-separierte Liste der Helfer-Foren";
+$a->strings["don't show"] = "nicht zeigen";
+$a->strings["show"] = "zeigen";
+$a->strings["Set style"] = "Stil auswählen";
+$a->strings["Community Pages"] = "Foren";
+$a->strings["Community Profiles"] = "Community-Profile";
+$a->strings["Help or @NewHere ?"] = "Hilfe oder @NewHere";
+$a->strings["Connect Services"] = "Verbinde Dienste";
+$a->strings["Find Friends"] = "Kontakte finden";
+$a->strings["Last users"] = "Letzte Nutzer";
+$a->strings["Find People"] = "Leute finden";
+$a->strings["Enter name or interest"] = "Name oder Interessen eingeben";
+$a->strings["Examples: Robert Morgenstein, Fishing"] = "Beispiel: Robert Morgenstein, Angeln";
+$a->strings["Find"] = "Finde";
+$a->strings["Similar Interests"] = "Ähnliche Interessen";
+$a->strings["Random Profile"] = "Zufälliges Profil";
+$a->strings["Invite Friends"] = "Freunde einladen";
+$a->strings["Global Directory"] = "Weltweites Verzeichnis";
+$a->strings["Local Directory"] = "Lokales Verzeichnis";
+$a->strings["Forums"] = "Foren";
+$a->strings["External link to forum"] = "Externer Link zum Forum";
+$a->strings["show more"] = "mehr anzeigen";
+$a->strings["Quick Start"] = "Schnell-Start";
+$a->strings["Help"] = "Hilfe";
+$a->strings["Post to Email"] = "An E-Mail senden";
+$a->strings["Visible to everybody"] = "Für jeden sichtbar";
+$a->strings["Connectors"] = "Connectoren";
+$a->strings["Hide your profile details from unknown viewers?"] = "Profil-Details vor unbekannten Betrachtern verbergen?";
+$a->strings["Connectors disabled, since \"%s\" is enabled."] = "Konnektoren sind nicht verfügbar, da \"%s\" aktiv ist.";
+$a->strings["Close"] = "Schließen";
+$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."] = "Die Datenbankkonfigurationsdatei \"config/local.config.php\" konnte nicht erstellt werden. Um eine Konfigurationsdatei in Ihrem Webserver-Verzeichnis zu erstellen, gehe wie folgt vor.";
+$a->strings["You may need to import the file \"database.sql\" manually using phpmyadmin or mysql."] = "Möglicherweise musst du die Datei \"database.sql\" manuell mit phpmyadmin oder mysql importieren.";
+$a->strings["Please see the file \"INSTALL.txt\"."] = "Lies bitte die \"INSTALL.txt\".";
+$a->strings["Could not find a command line version of PHP in the web server PATH."] = "Konnte keine Kommandozeilenversion von PHP im PATH des Servers finden.";
+$a->strings["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>"] = "Wenn auf deinem Server keine Kommandozeilenversion von PHP installiert ist, kannst du den Hintergrundprozess nicht einrichten. Hier findest du alternative Möglichkeiten<a href='https://github.com/friendica/friendica/blob/master/doc/Install.md#set-up-the-poller'>'für das Worker-Setup'</a>";
+$a->strings["PHP executable path"] = "Pfad zu PHP";
+$a->strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "Gib den kompletten Pfad zur ausführbaren Datei von PHP an. Du kannst dieses Feld auch frei lassen und mit der Installation fortfahren.";
+$a->strings["Command line PHP"] = "Kommandozeilen-PHP";
+$a->strings["PHP executable is not the php cli binary (could be cgi-fgci version)"] = "Die ausführbare Datei von PHP stimmt nicht mit der PHP cli Version überein (es könnte sich um die cgi-fgci Version handeln)";
+$a->strings["Found PHP version: "] = "Gefundene PHP Version:";
+$a->strings["PHP cli binary"] = "PHP CLI Binary";
+$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "Die Kommandozeilenversion von PHP auf Deinem System hat \"register_argc_argv\" nicht aktiviert.";
+$a->strings["This is required for message delivery to work."] = "Dies wird für die Auslieferung von Nachrichten benötigt.";
+$a->strings["PHP register_argc_argv"] = "PHP register_argc_argv";
+$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Fehler: Die Funktion \"openssl_pkey_new\" auf diesem System ist nicht in der Lage, Verschlüsselungsschlüssel zu erzeugen";
+$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Wenn der Server unter Windows läuft, schau dir bitte \"http://www.php.net/manual/en/openssl.installation.php\" an.";
+$a->strings["Generate encryption keys"] = "Schlüssel erzeugen";
+$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Fehler: Das Apache-Modul mod-rewrite wird benötigt, es ist allerdings nicht installiert.";
+$a->strings["Apache mod_rewrite module"] = "Apache mod_rewrite module";
+$a->strings["Error: PDO or MySQLi PHP module required but not installed."] = "Fehler: PDO oder MySQLi PHP Modul erforderlich, aber nicht installiert.";
+$a->strings["Error: The MySQL driver for PDO is not installed."] = "Fehler: der MySQL Treiber für PDO ist nicht installiert";
+$a->strings["PDO or MySQLi PHP module"] = "PDO oder MySQLi PHP Modul";
+$a->strings["Error, XML PHP module required but not installed."] = "Fehler: XML PHP Modul erforderlich aber nicht installiert.";
+$a->strings["XML PHP module"] = "XML PHP Modul";
+$a->strings["libCurl PHP module"] = "PHP: libCurl-Modul";
+$a->strings["Error: libCURL PHP module required but not installed."] = "Fehler: Das libCURL PHP Modul wird benötigt, ist aber nicht installiert.";
+$a->strings["GD graphics PHP module"] = "PHP: GD-Grafikmodul";
+$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Fehler: Das GD-Graphikmodul für PHP mit JPEG-Unterstützung ist nicht installiert.";
+$a->strings["OpenSSL PHP module"] = "PHP: OpenSSL-Modul";
+$a->strings["Error: openssl PHP module required but not installed."] = "Fehler: Das openssl-Modul von PHP ist nicht installiert.";
+$a->strings["mb_string PHP module"] = "PHP: mb_string-Modul";
+$a->strings["Error: mb_string PHP module required but not installed."] = "Fehler: mb_string PHP Module wird benötigt, ist aber nicht installiert.";
+$a->strings["iconv PHP module"] = "PHP iconv Modul";
+$a->strings["Error: iconv PHP module required but not installed."] = "Fehler: Das iconv-Modul von PHP ist nicht installiert.";
+$a->strings["POSIX PHP module"] = "PHP POSIX Modul";
+$a->strings["Error: POSIX PHP module required but not installed."] = "Fehler POSIX PHP Modul erforderlich, aber nicht installiert.";
+$a->strings["JSON PHP module"] = "PHP JASON Modul";
+$a->strings["Error: JSON PHP module required but not installed."] = "Fehler: Das JSON PHP Modul wird benötigt, ist aber nicht installiert.";
+$a->strings["File Information PHP module"] = "PHP Datei Informations-Modul";
+$a->strings["Error: File Information PHP module required but not installed."] = "Fehler: Das Datei Informations PHP Modul ist nicht installiert.";
+$a->strings["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."] = "Das Installationsprogramm muss in der Lage sein, eine Datei namens \"local.config.php\" im Ordner \"config\" Ihres Webservers zu erstellen, ist aber nicht in der Lage dazu.";
+$a->strings["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."] = "In den meisten Fällen ist dies ein Problem mit den Schreibrechten. Der Webserver könnte keine Schreiberlaubnis haben, selbst wenn du sie hast.";
+$a->strings["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."] = "Am Ende dieser Prozedur bekommst du einen Text, der in der local.config.php im Friendica \"config\" Ordner gespeichert werden muss.";
+$a->strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"INSTALL.txt\" for instructions."] = "Alternativ kannst du diesen Schritt aber auch überspringen und die Installation manuell durchführen. Eine Anleitung dazu (Englisch) findest du in der Datei INSTALL.txt.";
+$a->strings["config/local.config.php is writable"] = "config/local.config.php ist schreibbar";
+$a->strings["Friendica uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "Friendica nutzt die Smarty3-Template-Engine, um die Webansichten zu rendern. Smarty3 kompiliert Templates zu PHP, um das Rendern zu beschleunigen.";
+$a->strings["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."] = "Um diese kompilierten Templates zu speichern, benötigt der Webserver Schreibrechte zum Verzeichnis view/smarty3/ im obersten Ordner von Friendica.";
+$a->strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "Bitte stelle sicher, dass der Nutzer, unter dem der Webserver läuft (z.B. www-data), Schreibrechte zu diesem Verzeichnis hat.";
+$a->strings["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."] = "Hinweis: aus Sicherheitsgründen solltest du dem Webserver nur Schreibrechte für view/smarty3/ geben -- Nicht für die darin enthaltenen Template-Dateien (.tpl).";
+$a->strings["view/smarty3 is writable"] = "view/smarty3 ist schreibbar";
+$a->strings["Url rewrite in .htaccess is not working. Make sure you copied .htaccess-dist to .htaccess."] = "Umschreiben der URLs in der .htaccess funktioniert nicht. Vergewissere dich, dass du .htaccess-dist nach.htaccess kopiert hast.";
+$a->strings["Error message from Curl when fetching"] = "Fehlermeldung von Curl während des Ladens";
+$a->strings["Url rewrite is working"] = "URL rewrite funktioniert";
+$a->strings["ImageMagick PHP extension is not installed"] = "ImageMagicx PHP Erweiterung ist nicht installiert.";
+$a->strings["ImageMagick PHP extension is installed"] = "ImageMagick PHP Erweiterung ist installiert";
+$a->strings["ImageMagick supports GIF"] = "ImageMagick unterstützt GIF";
+$a->strings["Database already in use."] = "Die Datenbank wird bereits verwendet.";
+$a->strings["Could not connect to database."] = "Verbindung zur Datenbank gescheitert.";
+$a->strings["Tuesday"] = "Dienstag";
+$a->strings["Wednesday"] = "Mittwoch";
+$a->strings["Thursday"] = "Donnerstag";
+$a->strings["Friday"] = "Freitag";
+$a->strings["Saturday"] = "Samstag";
+$a->strings["January"] = "Januar";
+$a->strings["February"] = "Februar";
+$a->strings["March"] = "März";
+$a->strings["April"] = "April";
+$a->strings["May"] = "Mai";
+$a->strings["June"] = "Juni";
+$a->strings["July"] = "Juli";
+$a->strings["August"] = "August";
+$a->strings["September"] = "September";
+$a->strings["October"] = "Oktober";
+$a->strings["November"] = "November";
+$a->strings["December"] = "Dezember";
+$a->strings["Mon"] = "Mo";
+$a->strings["Tue"] = "Di";
+$a->strings["Wed"] = "Mi";
+$a->strings["Thu"] = "Do";
+$a->strings["Fri"] = "Fr";
+$a->strings["Sat"] = "Sa";
+$a->strings["Sun"] = "So";
+$a->strings["Jan"] = "Jan";
+$a->strings["Feb"] = "Feb";
+$a->strings["Mar"] = "März";
+$a->strings["Apr"] = "Apr";
+$a->strings["Jun"] = "Jun";
+$a->strings["Jul"] = "Juli";
+$a->strings["Aug"] = "Aug";
+$a->strings["Sep"] = "Sep";
+$a->strings["Oct"] = "Okt";
+$a->strings["Nov"] = "Nov";
+$a->strings["Dec"] = "Dez";
+$a->strings["poke"] = "anstupsen";
+$a->strings["poked"] = "stupste";
+$a->strings["ping"] = "anpingen";
+$a->strings["pinged"] = "pingte";
+$a->strings["prod"] = "knuffen";
+$a->strings["prodded"] = "knuffte";
+$a->strings["slap"] = "ohrfeigen";
+$a->strings["slapped"] = "ohrfeigte";
+$a->strings["finger"] = "befummeln";
+$a->strings["fingered"] = "befummelte";
+$a->strings["rebuff"] = "eine Abfuhr erteilen";
+$a->strings["rebuffed"] = "abfuhrerteilte";
+$a->strings["System"] = "System";
+$a->strings["Home"] = "Pinnwand";
+$a->strings["Introductions"] = "Kontaktanfragen";
+$a->strings["%s commented on %s's post"] = "%s hat %ss Beitrag kommentiert";
+$a->strings["%s created a new post"] = "%s hat einen neuen Beitrag erstellt";
+$a->strings["%s liked %s's post"] = "%s mag %ss Beitrag";
+$a->strings["%s disliked %s's post"] = "%s mag %ss Beitrag nicht";
+$a->strings["%s is attending %s's event"] = "%s nimmt an %s's Event teil";
+$a->strings["%s is not attending %s's event"] = "%s nimmt nicht an %s's Event teil";
+$a->strings["%s may attend %s's event"] = "%s nimmt eventuell an %s's Event teil";
+$a->strings["%s is now friends with %s"] = "%s ist jetzt mit %s befreundet";
+$a->strings["Friend Suggestion"] = "Kontaktvorschlag";
+$a->strings["Friend/Connect Request"] = "Kontakt-/Freundschaftsanfrage";
+$a->strings["New Follower"] = "Neuer Bewunderer";
+$a->strings["Welcome %s"] = "Willkommen %s";
+$a->strings["Please upload a profile photo."] = "Bitte lade ein Profilbild hoch.";
+$a->strings["Welcome back %s"] = "Willkommen zurück %s";
+$a->strings["Update %s failed. See error logs."] = "Update %s fehlgeschlagen. Bitte Fehlerprotokoll überprüfen.";
+$a->strings["\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."] = "\nDie Friendica-Entwickler haben vor kurzem das Update %s veröffentlicht, aber bei der Installation ging etwas schrecklich schief.\n\nDas Problem sollte so schnell wie möglich gelöst werden, aber ich schaffe es nicht alleine. Bitte kontaktiere einen Friendica-Entwickler, falls du mir nicht alleine helfen kannst. Meine Datenbank könnte ungültig sein.";
+$a->strings["The error message is\n[pre]%s[/pre]"] = "Die Fehlermeldung lautet\n[pre]%s[/pre]";
+$a->strings["[Friendica Notify] Database update"] = "[Friendica-Benachrichtigung]: Datenbank Update";
+$a->strings["\n\t\t\t\t\tThe friendica database was successfully updated from %s to %s."] = "\n \t\t\t\t\tDie Friendica Datenbank wurde erfolgreich von %s auf %s aktualisiert.";
+$a->strings["Error decoding account file"] = "Fehler beim Verarbeiten der Account-Datei";
+$a->strings["Error! No version data in file! This is not a Friendica account file?"] = "Fehler! Keine Versionsdaten in der Datei! Ist das wirklich eine Friendica-Account-Datei?";
+$a->strings["User '%s' already exists on this server!"] = "Nutzer '%s' existiert bereits auf diesem Server!";
+$a->strings["User creation error"] = "Fehler beim Anlegen des Nutzer-Accounts aufgetreten";
+$a->strings["User profile creation error"] = "Fehler beim Anlegen des Nutzer-Profils";
+$a->strings["%d contact not imported"] = [
+       0 => "%d Kontakt nicht importiert",
+       1 => "%d Kontakte nicht importiert",
+];
+$a->strings["Done. You can now login with your username and password"] = "Erledigt. Du kannst dich jetzt mit deinem Nutzernamen und Passwort anmelden";
+$a->strings["Birthday:"] = "Geburtstag:";
+$a->strings["YYYY-MM-DD or MM-DD"] = "YYYY-MM-DD oder MM-DD";
+$a->strings["never"] = "nie";
+$a->strings["less than a second ago"] = "vor weniger als einer Sekunde";
+$a->strings["year"] = "Jahr";
+$a->strings["years"] = "Jahre";
+$a->strings["months"] = "Monate";
+$a->strings["weeks"] = "Wochen";
+$a->strings["days"] = "Tage";
+$a->strings["hour"] = "Stunde";
+$a->strings["hours"] = "Stunden";
+$a->strings["minute"] = "Minute";
+$a->strings["minutes"] = "Minuten";
+$a->strings["second"] = "Sekunde";
+$a->strings["seconds"] = "Sekunden";
+$a->strings["in %1\$d %2\$s"] = "in %1\$d %2\$s";
+$a->strings["%1\$d %2\$s ago"] = "vor %1\$d %2\$s";
+$a->strings["view full size"] = "Volle Größe anzeigen";
+$a->strings["Image/photo"] = "Bild/Foto";
+$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 hat geschrieben:";
+$a->strings["Encrypted content"] = "Verschlüsselter Inhalt";
+$a->strings["Invalid source protocol"] = "Ungültiges Quell-Protokoll";
+$a->strings["Invalid link protocol"] = "Ungültiges Link-Protokoll";
+$a->strings["Loading more entries..."] = "lade weitere Einträge...";
+$a->strings["The end"] = "Das Ende";
+$a->strings["Follow"] = "Folge";
+$a->strings["@name, !forum, #tags, content"] = "@name, !forum, #tags, content";
+$a->strings["Full Text"] = "Volltext";
+$a->strings["Tags"] = "Tags";
+$a->strings["Click to open/close"] = "Zum Öffnen/Schließen klicken";
+$a->strings["Export"] = "Exportieren";
+$a->strings["Export calendar as ical"] = "Kalender als ical exportieren";
+$a->strings["Export calendar as csv"] = "Kalender als csv exportieren";
+$a->strings["No contacts"] = "Keine Kontakte";
+$a->strings["%d Contact"] = [
+       0 => "%d Kontakt",
+       1 => "%d Kontakte",
+];
+$a->strings["View Contacts"] = "Kontakte anzeigen";
+$a->strings["Trending Tags (last %d hour)"] = [
+       0 => "Trending Tags (%d Stunde)",
+       1 => "Trending Tags (%d Stunden)",
+];
+$a->strings["More Trending Tags"] = "mehr Trending Tags";
+$a->strings["newer"] = "neuer";
+$a->strings["older"] = "älter";
+$a->strings["prev"] = "vorige";
+$a->strings["last"] = "letzte";
 $a->strings["Frequently"] = "immer wieder";
 $a->strings["Hourly"] = "Stündlich";
 $a->strings["Twice daily"] = "Zweimal täglich";
@@ -1046,8 +1272,7 @@ $a->strings["Oodles"] = "Oodles";
 $a->strings["Nonsexual"] = "Nonsexual";
 $a->strings["Single"] = "Single";
 $a->strings["Lonely"] = "Einsam";
-$a->strings["Available"] = "Verfügbar";
-$a->strings["Unavailable"] = "Nicht verfügbar";
+$a->strings["In a relation"] = "In einer Beziehung";
 $a->strings["Has crush"] = "verknallt";
 $a->strings["Infatuated"] = "verliebt";
 $a->strings["Dating"] = "Dating";
@@ -1082,12 +1307,15 @@ $a->strings["Photo Location"] = "Aufnahmeort";
 $a->strings["Photo metadata is normally stripped. This extracts the location (if present) prior to stripping metadata and links it to a map."] = "Die Foto-Metadaten werden ausgelesen. Dadurch kann der Aufnahmeort (wenn vorhanden) in einer Karte angezeigt werden.";
 $a->strings["Export Public Calendar"] = "Öffentlichen Kalender exportieren";
 $a->strings["Ability for visitors to download the public calendar"] = "Möglichkeit für Besucher, den öffentlichen Kalender herunter zu laden";
+$a->strings["Trending Tags"] = "Trending Tags";
+$a->strings["Show a community page widget with a list of the most popular tags in recent public posts."] = "Auf der Gemeinschaftsseite ein Widget mit den meist benutzten Tags in öffentlichen Beiträgen anzeigen.";
 $a->strings["Post Composition Features"] = "Beitragserstellung-Features";
 $a->strings["Auto-mention Forums"] = "Foren automatisch erwähnen";
 $a->strings["Add/remove mention when a forum page is selected/deselected in ACL window."] = "Automatisch eine @-Erwähnung eines Forums einfügen/entfehrnen, wenn dieses im ACL Fenster de-/markiert  wurde.";
 $a->strings["Explicit Mentions"] = "Explizite Erwähnungen";
 $a->strings["Add explicit mentions to comment box for manual control over who gets mentioned in replies."] = "Füge Erwähnungen zum Kommentarfeld hinzu, um manuell über die explizite Erwähnung von Gesprächsteilnehmern zu entscheiden.";
 $a->strings["Network Sidebar"] = "Netzwerk-Seitenleiste";
+$a->strings["Archives"] = "Archiv";
 $a->strings["Ability to select posts by date ranges"] = "Möglichkeit, die Beiträge nach Datumsbereichen zu sortieren";
 $a->strings["Protocol Filter"] = "Protokoll-Filter";
 $a->strings["Enable widget to display Network posts only from selected protocols"] = "Aktiviere Widget, um Netzwerkbeiträge nur von ausgesuchten Protokollen anzuzeigen";
@@ -1106,90 +1334,45 @@ $a->strings["Tag Cloud"] = "Schlagwortwolke";
 $a->strings["Provide a personal tag cloud on your profile page"] = "Wortwolke aus den von dir verwendeten Schlagwörtern im Profil anzeigen";
 $a->strings["Display Membership Date"] = "Mitgliedschaftsdatum anzeigen";
 $a->strings["Display membership date in profile"] = "Das Datum der Registrierung deines Accounts im Profil anzeigen";
-$a->strings["Forums"] = "Foren";
-$a->strings["External link to forum"] = "Externer Link zum Forum";
 $a->strings["Nothing new here"] = "Keine Neuigkeiten";
 $a->strings["Clear notifications"] = "Bereinige Benachrichtigungen";
-$a->strings["@name, !forum, #tags, content"] = "@name, !forum, #tags, content";
 $a->strings["Logout"] = "Abmelden";
 $a->strings["End this session"] = "Diese Sitzung beenden";
-$a->strings["Status"] = "Status";
-$a->strings["Your posts and conversations"] = "Deine Beiträge und Unterhaltungen";
-$a->strings["Your profile page"] = "Deine Profilseite";
-$a->strings["Your photos"] = "Deine Fotos";
-$a->strings["Videos"] = "Videos";
-$a->strings["Your videos"] = "Deine Videos";
-$a->strings["Your events"] = "Deine Ereignisse";
-$a->strings["Personal notes"] = "Persönliche Notizen";
-$a->strings["Your personal notes"] = "Deine persönlichen Notizen";
 $a->strings["Login"] = "Anmeldung";
 $a->strings["Sign in"] = "Anmelden";
-$a->strings["Home"] = "Pinnwand";
+$a->strings["Personal notes"] = "Persönliche Notizen";
+$a->strings["Your personal notes"] = "Deine persönlichen Notizen";
 $a->strings["Home Page"] = "Homepage";
 $a->strings["Register"] = "Registrieren";
 $a->strings["Create an account"] = "Nutzerkonto erstellen";
-$a->strings["Help"] = "Hilfe";
 $a->strings["Help and documentation"] = "Hilfe und Dokumentation";
 $a->strings["Apps"] = "Apps";
 $a->strings["Addon applications, utilities, games"] = "Zusätzliche Anwendungen, Dienstprogramme, Spiele";
 $a->strings["Search site content"] = "Inhalt der Seite durchsuchen";
-$a->strings["Full Text"] = "Volltext";
-$a->strings["Tags"] = "Tags";
 $a->strings["Community"] = "Gemeinschaft";
 $a->strings["Conversations on this and other servers"] = "Unterhaltungen auf diesem und anderen Servern";
-$a->strings["Events and Calendar"] = "Ereignisse und Kalender";
 $a->strings["Directory"] = "Verzeichnis";
 $a->strings["People directory"] = "Nutzerverzeichnis";
 $a->strings["Information"] = "Information";
 $a->strings["Information about this friendica instance"] = "Informationen zu dieser Friendica-Instanz";
 $a->strings["Terms of Service"] = "Nutzungsbedingungen";
 $a->strings["Terms of Service of this Friendica instance"] = "Die Nutzungsbedingungen dieser Friendica-Instanz";
-$a->strings["Network"] = "Netzwerk";
-$a->strings["Conversations from your friends"] = "Unterhaltungen Deiner Kontakte";
 $a->strings["Network Reset"] = "Netzwerk zurücksetzen";
 $a->strings["Load Network page with no filters"] = "Netzwerk-Seite ohne Filter laden";
-$a->strings["Introductions"] = "Kontaktanfragen";
 $a->strings["Friend Requests"] = "Kontaktanfragen";
 $a->strings["See all notifications"] = "Alle Benachrichtigungen anzeigen";
 $a->strings["Mark all system notifications seen"] = "Markiere alle Systembenachrichtigungen als gelesen";
-$a->strings["Private mail"] = "Private E-Mail";
 $a->strings["Inbox"] = "Eingang";
 $a->strings["Outbox"] = "Ausgang";
 $a->strings["Manage"] = "Verwalten";
 $a->strings["Manage other pages"] = "Andere Seiten verwalten";
-$a->strings["Account settings"] = "Kontoeinstellungen";
 $a->strings["Manage/Edit Profiles"] = "Profile verwalten/editieren";
-$a->strings["Manage/edit friends and contacts"] = "Freunde und Kontakte verwalten/bearbeiten";
 $a->strings["Admin"] = "Administration";
 $a->strings["Site setup and configuration"] = "Einstellungen der Seite und Konfiguration";
 $a->strings["Navigation"] = "Navigation";
 $a->strings["Site map"] = "Sitemap";
 $a->strings["Embedding disabled"] = "Einbettungen deaktiviert";
 $a->strings["Embedded content"] = "Eingebetteter Inhalt";
-$a->strings["newer"] = "neuer";
-$a->strings["older"] = "älter";
-$a->strings["prev"] = "vorige";
-$a->strings["last"] = "letzte";
-$a->strings["view full size"] = "Volle Größe anzeigen";
-$a->strings["Image/photo"] = "Bild/Foto";
-$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 hat geschrieben:";
-$a->strings["Encrypted content"] = "Verschlüsselter Inhalt";
-$a->strings["Invalid source protocol"] = "Ungültiges Quell-Protokoll";
-$a->strings["Invalid link protocol"] = "Ungültiges Link-Protokoll";
-$a->strings["Loading more entries..."] = "lade weitere Einträge...";
-$a->strings["The end"] = "Das Ende";
-$a->strings["Follow"] = "Folge";
-$a->strings["Click to open/close"] = "Zum Öffnen/Schließen klicken";
-$a->strings["Export"] = "Exportieren";
-$a->strings["Export calendar as ical"] = "Kalender als ical exportieren";
-$a->strings["Export calendar as csv"] = "Kalender als csv exportieren";
-$a->strings["No contacts"] = "Keine Kontakte";
-$a->strings["%d Contact"] = [
-       0 => "%d Kontakt",
-       1 => "%d Kontakte",
-];
-$a->strings["View Contacts"] = "Kontakte anzeigen";
 $a->strings["Add New Contact"] = "Neuen Kontakt hinzufügen";
 $a->strings["Enter address or web location"] = "Adresse oder Web-Link eingeben";
 $a->strings["Example: bob@example.com, http://example.com/barbara"] = "Beispiel: bob@example.com, http://example.com/barbara";
@@ -1197,172 +1380,31 @@ $a->strings["%d invitation available"] = [
        0 => "%d Einladung verfügbar",
        1 => "%d Einladungen verfügbar",
 ];
-$a->strings["Find People"] = "Leute finden";
-$a->strings["Enter name or interest"] = "Name oder Interessen eingeben";
-$a->strings["Examples: Robert Morgenstein, Fishing"] = "Beispiel: Robert Morgenstein, Angeln";
-$a->strings["Find"] = "Finde";
-$a->strings["Similar Interests"] = "Ähnliche Interessen";
-$a->strings["Random Profile"] = "Zufälliges Profil";
-$a->strings["Invite Friends"] = "Freunde einladen";
-$a->strings["Global Directory"] = "Weltweites Verzeichnis";
-$a->strings["Local Directory"] = "Lokales Verzeichnis";
+$a->strings["Following"] = "Gefolgte";
+$a->strings["Mutual friends"] = "Beidseitige Freundschaft";
+$a->strings["Relationships"] = "Beziehungen";
+$a->strings["All Contacts"] = "Alle Kontakte";
 $a->strings["Protocols"] = "Protokolle";
 $a->strings["All Protocols"] = "Alle Protokolle";
-$a->strings["Saved Folders"] = "Gespeicherte Ordner";
-$a->strings["Everything"] = "Alles";
-$a->strings["Categories"] = "Kategorien";
-$a->strings["%d contact in common"] = [
-       0 => "%d gemeinsamer Kontakt",
-       1 => "%d gemeinsame Kontakte",
-];
-$a->strings["Post to Email"] = "An E-Mail senden";
-$a->strings["Visible to everybody"] = "Für jeden sichtbar";
-$a->strings["show"] = "zeigen";
-$a->strings["don't show"] = "nicht zeigen";
-$a->strings["Connectors"] = "Connectoren";
-$a->strings["Hide your profile details from unknown viewers?"] = "Profil-Details vor unbekannten Betrachtern verbergen?";
-$a->strings["Connectors disabled, since \"%s\" is enabled."] = "Konnektoren sind nicht verfügbar, da \"%s\" aktiv ist.";
-$a->strings["Close"] = "Schließen";
-$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."] = "Die Datenbankkonfigurationsdatei \"config/local.config.php\" konnte nicht erstellt werden. Um eine Konfigurationsdatei in Ihrem Webserver-Verzeichnis zu erstellen, gehe wie folgt vor.";
-$a->strings["You may need to import the file \"database.sql\" manually using phpmyadmin or mysql."] = "Möglicherweise musst du die Datei \"database.sql\" manuell mit phpmyadmin oder mysql importieren.";
-$a->strings["Please see the file \"INSTALL.txt\"."] = "Lies bitte die \"INSTALL.txt\".";
-$a->strings["Could not find a command line version of PHP in the web server PATH."] = "Konnte keine Kommandozeilenversion von PHP im PATH des Servers finden.";
-$a->strings["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>"] = "Wenn auf deinem Server keine Kommandozeilenversion von PHP installiert ist, kannst du den Hintergrundprozess nicht einrichten. Hier findest du alternative Möglichkeiten<a href='https://github.com/friendica/friendica/blob/master/doc/Install.md#set-up-the-poller'>'für das Worker-Setup'</a>";
-$a->strings["PHP executable path"] = "Pfad zu PHP";
-$a->strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "Gib den kompletten Pfad zur ausführbaren Datei von PHP an. Du kannst dieses Feld auch frei lassen und mit der Installation fortfahren.";
-$a->strings["Command line PHP"] = "Kommandozeilen-PHP";
-$a->strings["PHP executable is not the php cli binary (could be cgi-fgci version)"] = "Die ausführbare Datei von PHP stimmt nicht mit der PHP cli Version überein (es könnte sich um die cgi-fgci Version handeln)";
-$a->strings["Found PHP version: "] = "Gefundene PHP Version:";
-$a->strings["PHP cli binary"] = "PHP CLI Binary";
-$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "Die Kommandozeilenversion von PHP auf Deinem System hat \"register_argc_argv\" nicht aktiviert.";
-$a->strings["This is required for message delivery to work."] = "Dies wird für die Auslieferung von Nachrichten benötigt.";
-$a->strings["PHP register_argc_argv"] = "PHP register_argc_argv";
-$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Fehler: Die Funktion \"openssl_pkey_new\" auf diesem System ist nicht in der Lage, Verschlüsselungsschlüssel zu erzeugen";
-$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Wenn der Server unter Windows läuft, schau dir bitte \"http://www.php.net/manual/en/openssl.installation.php\" an.";
-$a->strings["Generate encryption keys"] = "Schlüssel erzeugen";
-$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Fehler: Das Apache-Modul mod-rewrite wird benötigt, es ist allerdings nicht installiert.";
-$a->strings["Apache mod_rewrite module"] = "Apache mod_rewrite module";
-$a->strings["Error: PDO or MySQLi PHP module required but not installed."] = "Fehler: PDO oder MySQLi PHP Modul erforderlich, aber nicht installiert.";
-$a->strings["Error: The MySQL driver for PDO is not installed."] = "Fehler: der MySQL Treiber für PDO ist nicht installiert";
-$a->strings["PDO or MySQLi PHP module"] = "PDO oder MySQLi PHP Modul";
-$a->strings["Error, XML PHP module required but not installed."] = "Fehler: XML PHP Modul erforderlich aber nicht installiert.";
-$a->strings["XML PHP module"] = "XML PHP Modul";
-$a->strings["libCurl PHP module"] = "PHP: libCurl-Modul";
-$a->strings["Error: libCURL PHP module required but not installed."] = "Fehler: Das libCURL PHP Modul wird benötigt, ist aber nicht installiert.";
-$a->strings["GD graphics PHP module"] = "PHP: GD-Grafikmodul";
-$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Fehler: Das GD-Graphikmodul für PHP mit JPEG-Unterstützung ist nicht installiert.";
-$a->strings["OpenSSL PHP module"] = "PHP: OpenSSL-Modul";
-$a->strings["Error: openssl PHP module required but not installed."] = "Fehler: Das openssl-Modul von PHP ist nicht installiert.";
-$a->strings["mb_string PHP module"] = "PHP: mb_string-Modul";
-$a->strings["Error: mb_string PHP module required but not installed."] = "Fehler: mb_string PHP Module wird benötigt, ist aber nicht installiert.";
-$a->strings["iconv PHP module"] = "PHP iconv Modul";
-$a->strings["Error: iconv PHP module required but not installed."] = "Fehler: Das iconv-Modul von PHP ist nicht installiert.";
-$a->strings["POSIX PHP module"] = "PHP POSIX Modul";
-$a->strings["Error: POSIX PHP module required but not installed."] = "Fehler POSIX PHP Modul erforderlich, aber nicht installiert.";
-$a->strings["JSON PHP module"] = "PHP JASON Modul";
-$a->strings["Error: JSON PHP module required but not installed."] = "Fehler: Das JSON PHP Modul wird benötigt, ist aber nicht installiert.";
-$a->strings["File Information PHP module"] = "PHP Datei Informations-Modul";
-$a->strings["Error: File Information PHP module required but not installed."] = "Fehler: Das Datei Informations PHP Modul ist nicht installiert.";
-$a->strings["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."] = "Das Installationsprogramm muss in der Lage sein, eine Datei namens \"local.config.php\" im Ordner \"config\" Ihres Webservers zu erstellen, ist aber nicht in der Lage dazu.";
-$a->strings["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."] = "In den meisten Fällen ist dies ein Problem mit den Schreibrechten. Der Webserver könnte keine Schreiberlaubnis haben, selbst wenn du sie hast.";
-$a->strings["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."] = "Am Ende dieser Prozedur bekommst du einen Text, der in der local.config.php im Friendica \"config\" Ordner gespeichert werden muss.";
-$a->strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"INSTALL.txt\" for instructions."] = "Alternativ kannst du diesen Schritt aber auch überspringen und die Installation manuell durchführen. Eine Anleitung dazu (Englisch) findest du in der Datei INSTALL.txt.";
-$a->strings["config/local.config.php is writable"] = "config/local.config.php ist schreibbar";
-$a->strings["Friendica uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "Friendica nutzt die Smarty3-Template-Engine, um die Webansichten zu rendern. Smarty3 kompiliert Templates zu PHP, um das Rendern zu beschleunigen.";
-$a->strings["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."] = "Um diese kompilierten Templates zu speichern, benötigt der Webserver Schreibrechte zum Verzeichnis view/smarty3/ im obersten Ordner von Friendica.";
-$a->strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "Bitte stelle sicher, dass der Nutzer, unter dem der Webserver läuft (z.B. www-data), Schreibrechte zu diesem Verzeichnis hat.";
-$a->strings["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."] = "Hinweis: aus Sicherheitsgründen solltest du dem Webserver nur Schreibrechte für view/smarty3/ geben -- Nicht für die darin enthaltenen Template-Dateien (.tpl).";
-$a->strings["view/smarty3 is writable"] = "view/smarty3 ist schreibbar";
-$a->strings["Url rewrite in .htaccess is not working. Make sure you copied .htaccess-dist to .htaccess."] = "Umschreiben der URLs in der .htaccess funktioniert nicht. Vergewissere dich, dass du .htaccess-dist nach.htaccess kopiert hast.";
-$a->strings["Error message from Curl when fetching"] = "Fehlermeldung von Curl während des Ladens";
-$a->strings["Url rewrite is working"] = "URL rewrite funktioniert";
-$a->strings["ImageMagick PHP extension is not installed"] = "ImageMagicx PHP Erweiterung ist nicht installiert.";
-$a->strings["ImageMagick PHP extension is installed"] = "ImageMagick PHP Erweiterung ist installiert";
-$a->strings["ImageMagick supports GIF"] = "ImageMagick unterstützt GIF";
-$a->strings["Could not connect to database."] = "Verbindung zur Datenbank gescheitert.";
-$a->strings["Database already in use."] = "Die Datenbank wird bereits verwendet.";
-$a->strings["Tuesday"] = "Dienstag";
-$a->strings["Wednesday"] = "Mittwoch";
-$a->strings["Thursday"] = "Donnerstag";
-$a->strings["Friday"] = "Freitag";
-$a->strings["Saturday"] = "Samstag";
-$a->strings["January"] = "Januar";
-$a->strings["February"] = "Februar";
-$a->strings["March"] = "März";
-$a->strings["April"] = "April";
-$a->strings["May"] = "Mai";
-$a->strings["June"] = "Juni";
-$a->strings["July"] = "Juli";
-$a->strings["August"] = "August";
-$a->strings["September"] = "September";
-$a->strings["October"] = "Oktober";
-$a->strings["November"] = "November";
-$a->strings["December"] = "Dezember";
-$a->strings["Mon"] = "Mo";
-$a->strings["Tue"] = "Di";
-$a->strings["Wed"] = "Mi";
-$a->strings["Thu"] = "Do";
-$a->strings["Fri"] = "Fr";
-$a->strings["Sat"] = "Sa";
-$a->strings["Sun"] = "So";
-$a->strings["Jan"] = "Jan";
-$a->strings["Feb"] = "Feb";
-$a->strings["Mar"] = "März";
-$a->strings["Apr"] = "Apr";
-$a->strings["Jul"] = "Juli";
-$a->strings["Aug"] = "Aug";
-$a->strings["Sep"] = "Sep";
-$a->strings["Oct"] = "Okt";
-$a->strings["Nov"] = "Nov";
-$a->strings["Dec"] = "Dez";
-$a->strings["poke"] = "anstupsen";
-$a->strings["poked"] = "stupste";
-$a->strings["ping"] = "anpingen";
-$a->strings["pinged"] = "pingte";
-$a->strings["prod"] = "knuffen";
-$a->strings["prodded"] = "knuffte";
-$a->strings["slap"] = "ohrfeigen";
-$a->strings["slapped"] = "ohrfeigte";
-$a->strings["finger"] = "befummeln";
-$a->strings["fingered"] = "befummelte";
-$a->strings["rebuff"] = "eine Abfuhr erteilen";
-$a->strings["rebuffed"] = "abfuhrerteilte";
-$a->strings["System"] = "System";
-$a->strings["%s commented on %s's post"] = "%s hat %ss Beitrag kommentiert";
-$a->strings["%s created a new post"] = "%s hat einen neuen Beitrag erstellt";
-$a->strings["%s liked %s's post"] = "%s mag %ss Beitrag";
-$a->strings["%s disliked %s's post"] = "%s mag %ss Beitrag nicht";
-$a->strings["%s is attending %s's event"] = "%s nimmt an %s's Event teil";
-$a->strings["%s is not attending %s's event"] = "%s nimmt nicht an %s's Event teil";
-$a->strings["%s may attend %s's event"] = "%s nimmt eventuell an %s's Event teil";
-$a->strings["%s is now friends with %s"] = "%s ist jetzt mit %s befreundet";
-$a->strings["Friend Suggestion"] = "Kontaktvorschlag";
-$a->strings["Friend/Connect Request"] = "Kontakt-/Freundschaftsanfrage";
-$a->strings["New Follower"] = "Neuer Bewunderer";
-$a->strings["Welcome %s"] = "Willkommen %s";
-$a->strings["Please upload a profile photo."] = "Bitte lade ein Profilbild hoch.";
-$a->strings["Welcome back %s"] = "Willkommen zurück %s";
-$a->strings["Update %s failed. See error logs."] = "Update %s fehlgeschlagen. Bitte Fehlerprotokoll überprüfen.";
-$a->strings["\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."] = "\nDie Friendica-Entwickler haben vor kurzem das Update %s veröffentlicht, aber bei der Installation ging etwas schrecklich schief.\n\nDas Problem sollte so schnell wie möglich gelöst werden, aber ich schaffe es nicht alleine. Bitte kontaktiere einen Friendica-Entwickler, falls du mir nicht alleine helfen kannst. Meine Datenbank könnte ungültig sein.";
-$a->strings["The error message is\n[pre]%s[/pre]"] = "Die Fehlermeldung lautet\n[pre]%s[/pre]";
-$a->strings["[Friendica Notify] Database update"] = "[Friendica-Benachrichtigung]: Datenbank Update";
-$a->strings["\n\t\t\t\t\tThe friendica database was successfully updated from %s to %s."] = "\n \t\t\t\t\tDie Friendica Datenbank wurde erfolgreich von %s auf %s aktualisiert.";
-$a->strings["Error decoding account file"] = "Fehler beim Verarbeiten der Account-Datei";
-$a->strings["Error! No version data in file! This is not a Friendica account file?"] = "Fehler! Keine Versionsdaten in der Datei! Ist das wirklich eine Friendica-Account-Datei?";
-$a->strings["User '%s' already exists on this server!"] = "Nutzer '%s' existiert bereits auf diesem Server!";
-$a->strings["User creation error"] = "Fehler beim Anlegen des Nutzer-Accounts aufgetreten";
-$a->strings["User profile creation error"] = "Fehler beim Anlegen des Nutzer-Profils";
-$a->strings["%d contact not imported"] = [
-       0 => "%d Kontakt nicht importiert",
-       1 => "%d Kontakte nicht importiert",
+$a->strings["Saved Folders"] = "Gespeicherte Ordner";
+$a->strings["Everything"] = "Alles";
+$a->strings["Categories"] = "Kategorien";
+$a->strings["%d contact in common"] = [
+       0 => "%d gemeinsamer Kontakt",
+       1 => "%d gemeinsame Kontakte",
 ];
-$a->strings["Done. You can now login with your username and password"] = "Erledigt. Du kannst dich jetzt mit deinem Nutzernamen und Passwort anmelden";
 $a->strings["There are no tables on MyISAM."] = "Es gibt keine MyISAM-Tabellen.";
 $a->strings["\nError %d occurred during database update:\n%s\n"] = "\nFehler %d beim Update der Datenbank aufgetreten\n%s\n";
 $a->strings["Errors encountered performing database changes: "] = "Fehler beim Ändern der Datenbank aufgetreten";
 $a->strings["%s: Database update"] = "%s: Datenbank Aktualisierung";
 $a->strings["%s: updating %s table."] = "%s: aktualisiere Tabelle %s";
-$a->strings["Legacy module file not found: %s"] = "Legacy-Moduldatei nicht gefunden: %s";
+$a->strings["Filesystem storage failed to create \"%s\". Check you write permissions."] = "Dateisystemspeicher konnte nicht erstellt werden \"%s\". Überprüfe, ob du Schreibberechtigungen hast.";
+$a->strings["Filesystem storage failed to save data to \"%s\". Check your write permissions"] = "Der Dateisystemspeicher konnte die Daten nicht in \"%s\" speichern. Überprüfe Deine Schreibberechtigungen";
+$a->strings["Storage base path"] = "Dateipfad zum Speicher";
+$a->strings["Folder where uploaded files are saved. For maximum security, This should be a path outside web server folder tree"] = "Verzeichnis, in das Dateien hochgeladen werden. Für maximale Sicherheit sollte dies ein Pfad außerhalb der Webserver-Verzeichnisstruktur sein";
+$a->strings["Enter a valid existing folder"] = "Gib einen gültigen, existierenden Ordner ein";
+$a->strings["Database storage failed to update %s"] = "Datenbankspeicher konnte nicht aktualisiert werden %s";
+$a->strings["Database storage failed to insert data"] = "Der Datenbankspeicher konnte keine Daten einfügen";
 $a->strings["Drop Contact"] = "Kontakt löschen";
 $a->strings["Organisation"] = "Organisation";
 $a->strings["News"] = "Nachrichten";
@@ -1383,7 +1425,6 @@ $a->strings["l F d, Y \\@ g:i A"] = "l, d. F Y\\, H:i";
 $a->strings["Starts:"] = "Beginnt:";
 $a->strings["Finishes:"] = "Endet:";
 $a->strings["all-day"] = "ganztägig";
-$a->strings["Jun"] = "Jun";
 $a->strings["Sept"] = "Sep";
 $a->strings["No events to display"] = "Keine Veranstaltung zum Anzeigen";
 $a->strings["l, F j"] = "l, F j";
@@ -1402,6 +1443,7 @@ $a->strings["A deleted group with this name was revived. Existing item permissio
 $a->strings["Default privacy group for new contacts"] = "Voreingestellte Gruppe für neue Kontakte";
 $a->strings["Everybody"] = "Alle Kontakte";
 $a->strings["edit"] = "bearbeiten";
+$a->strings["Groups"] = "Gruppen";
 $a->strings["Edit group"] = "Gruppe bearbeiten";
 $a->strings["Contacts not in any group"] = "Kontakte in keiner Gruppe";
 $a->strings["Create a new group"] = "Neue Gruppe erstellen";
@@ -1419,11 +1461,12 @@ $a->strings["View on separate page"] = "Auf separater Seite ansehen";
 $a->strings["view on separate page"] = "auf separater Seite ansehen";
 $a->strings["[no subject]"] = "[kein Betreff]";
 $a->strings["Edit profile"] = "Profil bearbeiten";
-$a->strings["Atom feed"] = "Atom-Feed";
 $a->strings["Manage/edit profiles"] = "Profile verwalten/editieren";
 $a->strings["Status:"] = "Status:";
 $a->strings["Homepage:"] = "Homepage:";
 $a->strings["XMPP:"] = "XMPP:";
+$a->strings["Unfollow"] = "Nicht mehr folgen";
+$a->strings["Atom feed"] = "Atom-Feed";
 $a->strings["g A l F d"] = "l, d. F G \\U\\h\\r";
 $a->strings["F d"] = "d. F";
 $a->strings["[today]"] = "[heute]";
@@ -1435,7 +1478,6 @@ $a->strings["Upcoming events the next 7 days:"] = "Veranstaltungen der nächsten
 $a->strings["Member since:"] = "Mitglied seit:";
 $a->strings["j F, Y"] = "j F, Y";
 $a->strings["j F"] = "j F";
-$a->strings["Birthday:"] = "Geburtstag:";
 $a->strings["Age:"] = "Alter:";
 $a->strings["for %1\$d %2\$s"] = "für %1\$d %2\$s";
 $a->strings["Religion:"] = "Religion:";
@@ -1453,13 +1495,6 @@ $a->strings["Profile Details"] = "Profildetails";
 $a->strings["Only You Can See This"] = "Nur du kannst das sehen";
 $a->strings["Tips for New Members"] = "Tipps für neue Nutzer";
 $a->strings["OpenWebAuth: %1\$s welcomes %2\$s"] = "OpenWebAuth: %1\$s heißt %2\$s herzlich willkommen";
-$a->strings["Database storage failed to update %s"] = "Datenbankspeicher konnte nicht aktualisiert werden %s";
-$a->strings["Database storage failed to insert data"] = "Der Datenbankspeicher konnte keine Daten einfügen";
-$a->strings["Filesystem storage failed to create \"%s\". Check you write permissions."] = "Dateisystemspeicher konnte nicht erstellt werden \"%s\". Überprüfe, ob du Schreibberechtigungen hast.";
-$a->strings["Filesystem storage failed to save data to \"%s\". Check your write permissions"] = "Der Dateisystemspeicher konnte die Daten nicht in \"%s\" speichern. Überprüfe Deine Schreibberechtigungen";
-$a->strings["Storage base path"] = "Dateipfad zum Speicher";
-$a->strings["Folder where uploaded files are saved. For maximum security, This should be a path outside web server folder tree"] = "Verzeichnis, in das Dateien hochgeladen werden. Für maximale Sicherheit sollte dies ein Pfad außerhalb der Webserver-Verzeichnisstruktur sein";
-$a->strings["Enter a valid existing folder"] = "Gib einen gültigen, existierenden Ordner ein";
 $a->strings["Login failed"] = "Anmeldung fehlgeschlagen";
 $a->strings["Not enough information to authenticate"] = "Nicht genügend Informationen für die Authentifizierung";
 $a->strings["Password can't be empty"] = "Das Passwort kann nicht leer sein";
@@ -1491,7 +1526,6 @@ $a->strings["Your nickname can only contain a-z, 0-9 and _."] = "Dein Spitzname
 $a->strings["Nickname is already registered. Please choose another."] = "Dieser Spitzname ist bereits vergeben. Bitte wähle einen anderen.";
 $a->strings["SERIOUS ERROR: Generation of security keys failed."] = "FATALER FEHLER: Sicherheitsschlüssel konnten nicht erzeugt werden.";
 $a->strings["An error occurred during registration. Please try again."] = "Während der Anmeldung ist ein Fehler aufgetreten. Bitte versuche es noch einmal.";
-$a->strings["default"] = "Standard";
 $a->strings["An error occurred creating your default profile. Please try again."] = "Bei der Erstellung des Standardprofils ist ein Fehler aufgetreten. Bitte versuche es noch einmal.";
 $a->strings["An error occurred creating your self contact. Please try again."] = "Bei der Erstellung deines self-Kontakts ist ein Fehler aufgetreten. Bitte versuche es erneut.";
 $a->strings["An error occurred creating your default contact group. Please try again."] = "Bei der Erstellung deiner Standardgruppe für Kontakte ist ein Fehler aufgetreten. Bitte versuche es erneut.";
@@ -1500,6 +1534,24 @@ $a->strings["Registration at %s"] = "Registrierung als %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"] = "\nHallo %1\$s,\n\ndanke für deine Registrierung auf %2\$s. Dein Account wurde eingerichtet.";
 $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."] = "\nDie Anmelde-Details sind die folgenden:\n\tAdresse der Seite:\t%3\$s\n\tBenutzernamename:\t%1\$s\n\tPasswort:\t%5\$s\n\nDu kannst dein Passwort unter \"Einstellungen\" ändern, sobald du dich\nangemeldet hast.\n\nBitte nimm dir ein paar Minuten, um die anderen Einstellungen auf dieser\nSeite zu kontrollieren.\n\nEventuell magst du ja auch einige Informationen über dich in deinem\nProfil veröffentlichen, damit andere Leute dich einfacher finden können.\nBearbeite hierfür einfach dein Standard-Profil (über die Profil-Seite).\n\nWir empfehlen dir, deinen kompletten Namen anzugeben und ein zu dir\npassendes Profilbild zu wählen, damit dich alte Bekannte wiederfinden.\nAußerdem ist es nützlich, wenn du auf deinem Profil Schlüsselwörter\nangibst. Das erleichtert es, Leute zu finden, die deine Interessen teilen.\n\nWir respektieren deine Privatsphäre - keine dieser Angaben ist nötig.\nWenn du neu im Netzwerk bist und noch niemanden kennst, dann können sie\nallerdings dabei helfen, neue und interessante Kontakte zu knüpfen.\n\nSolltest du dein Nutzerkonto löschen wollen, kannst du dies unter %3\$s/removeme jederzeit tun.\n\nDanke für deine Aufmerksamkeit und willkommen auf %2\$s.";
 $a->strings["Registration details for %s"] = "Details der Registration von %s";
+$a->strings["Sharing notification from Diaspora network"] = "Freigabe-Benachrichtigung von Diaspora";
+$a->strings["Attachments:"] = "Anhänge:";
+$a->strings["%s's timeline"] = "Timeline von %s";
+$a->strings["%s's posts"] = "Beiträge von %s";
+$a->strings["%s's comments"] = "Kommentare von %s";
+$a->strings["%s is now following %s."] = "%s folgt nun %s";
+$a->strings["following"] = "folgen";
+$a->strings["%s stopped following %s."] = "%s hat aufgehört %s, zu folgen";
+$a->strings["stopped following"] = "wird nicht mehr gefolgt";
+$a->strings["(no subject)"] = "(kein Betreff)";
+$a->strings["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."] = "Zum Zwecke der Registrierung und um die Kommunikation zwischen dem Nutzer und seinen Kontakten zu gewährleisten, muß der Nutzer einen Namen (auch Pseudonym) und einen Nutzernamen (Spitzname) sowie eine funktionierende E-Mail-Adresse angeben. Der Name ist auf der Profilseite für alle Nutzer sichtbar, auch wenn die Profildetails nicht angezeigt werden.\nDie E-Mail-Adresse wird nur zur Benachrichtigung des Nutzers verwendet, sie wird nirgends angezeigt. Die Anzeige des Nutzerkontos im Server-Verzeichnis bzw. dem weltweiten Verzeichnis erfolgt gemäß den Einstellungen des Nutzers, sie ist zur Kommunikation nicht zwingend notwendig.";
+$a->strings["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."] = "Diese Daten sind für die Kommunikation notwendig und werden an die Knoten der Kommunikationspartner übermittelt und dort gespeichert. Nutzer können weitere, private Angaben machen, die ebenfalls an die verwendeten Server der Kommunikationspartner übermittelt werden können.";
+$a->strings["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."] = "Angemeldete Nutzer können ihre Nutzerdaten jederzeit von den <a href=\"%1\$s/settings/uexport\">Kontoeinstellungen</a> aus exportieren. Wenn ein Nutzer wünscht das Nutzerkonto zu löschen, so ist dies jederzeit unter <a href=\"%1\$s/removeme\">%1\$s/removeme</a> möglich. Die Löschung des Nutzerkontos ist permanent. Die Löschung der Daten wird auch von den Knoten der Kommunikationspartner angefordert.";
+$a->strings["Privacy Statement"] = "Datenschutzerklärung";
+$a->strings["No installed applications."] = "Keine Applikationen installiert.";
+$a->strings["Applications"] = "Anwendungen";
+$a->strings["Credits"] = "Credits";
+$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 ist ein Gemeinschaftsprojekt, das nicht ohne die Hilfe vieler Personen möglich wäre. Hier ist eine Aufzählung der Personen, die zum Code oder der Übersetzung beigetragen haben. Dank an alle !";
 $a->strings["Addon not found."] = "Addon nicht gefunden.";
 $a->strings["Addon %s disabled."] = "Addon %s ausgeschaltet.";
 $a->strings["Addon %s enabled."] = "Addon %s eingeschaltet.";
@@ -1512,11 +1564,13 @@ $a->strings["Maintainer: "] = "Betreuer:";
 $a->strings["Addon %s failed to install."] = "Addon %s konnte nicht installiert werden";
 $a->strings["Reload active addons"] = "Aktivierte Addons neu laden";
 $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"] = "Es sind derzeit keine Addons auf diesem Knoten verfügbar. Du findest das offizielle Addon-Repository unter %1\$s und weitere eventuell interessante Addons im offenen Addon-Verzeichnis auf %2\$s.";
+$a->strings["The contact has been blocked from the node"] = "Der Kontakt wurde von diesem Knoten geblockt";
+$a->strings["Could not find any contact entry for this URL (%s)"] = "Für die URL (%s) konnte kein Kontakt gefunden werden";
 $a->strings["%s contact unblocked"] = [
        0 => "%sKontakt wieder freigegeben",
        1 => "%sKontakte wieder freigegeben",
 ];
-$a->strings["Remote Contact Blocklist"] = "Sperrliste entfernter Kontakte";
+$a->strings["Remote Contact Blocklist"] = "Blockliste entfernter Kontakte";
 $a->strings["This page allows you to prevent any message from a remote contact to reach your node."] = "Auf dieser Seite kannst du Accounts von anderen Knoten blockieren und damit verhindern, dass ihre Beiträge von deinem Knoten angenommen werden.";
 $a->strings["Block Remote Contact"] = "Blockiere entfernten Kontakt";
 $a->strings["select all"] = "Alle auswählen";
@@ -1526,25 +1580,28 @@ $a->strings["No remote contact is blocked from this node."] = "Derzeit werden ke
 $a->strings["Blocked Remote Contacts"] = "Blockierte Kontakte von anderen Knoten";
 $a->strings["Block New Remote Contact"] = "Blockieren von weiteren Kontakten";
 $a->strings["Photo"] = "Foto:";
+$a->strings["Reason"] = "Grund";
 $a->strings["%s total blocked contact"] = [
        0 => "Insgesamt %s blockierter Kontakt",
        1 => "Insgesamt %s blockierte Kontakte",
 ];
 $a->strings["URL of the remote contact to block."] = "Die URL des entfernten Kontakts, der blockiert werden soll.";
-$a->strings["Server added to blocklist."] = "Server zur Blockliste hinzugefügt.";
+$a->strings["Block Reason"] = "Sperrgrund";
+$a->strings["Server domain pattern added to blocklist."] = "Server Domain Muster zur Blockliste hinzugefügt";
 $a->strings["Site blocklist updated."] = "Blockliste aktualisiert.";
-$a->strings["The blocked domain"] = "Die blockierte Domain";
+$a->strings["Blocked server domain pattern"] = "Blockierte Server Domain Muster";
 $a->strings["Reason for the block"] = "Begründung für die Blockierung";
-$a->strings["The reason why you blocked this domain."] = "Die Begründung, warum du diese Domain blockiert hast.";
-$a->strings["Delete domain"] = "Domain löschen";
+$a->strings["Delete server domain pattern"] = "Server Domain Muster löschen";
 $a->strings["Check to delete this entry from the blocklist"] = "Markieren, um diesen Eintrag von der Blocklist zu entfernen";
-$a->strings["Server Blocklist"] = "Server Blockliste";
-$a->strings["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 domains you should also give a reason why you have blocked the remote server."] = "Auf dieser Seite kannst du die Liste der blockierten Domains aus dem föderalen Netzwerk verwalten, denen es untersagt ist, mit deinem Knoten zu interagieren. Für jede der blockierten Domains musst du außerdem einen Grund für die Sperrung angeben.";
-$a->strings["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."] = "Die Liste der blockierten Domains wird auf der /friendica Seite öffentlich einsehbar gemacht, damit deine Nutzer und Personen, die Kommunikationsprobleme erkunden, die Ursachen einfach finden können.";
+$a->strings["Server Domain Pattern Blocklist"] = "Server Domain Muster Blockliste";
+$a->strings["This page can be used to define a blacklist of server domain patterns from the federated network that are not allowed to interact with your node. For each domain pattern you should also provide the reason why you block it."] = "Auf dieser Seite kannst du Muster definieren mit denen Server Domains aus dem föderierten Netzwerk daran gehindert werden mit deiner Instanz zu interagieren. Es ist ratsam für jedes Muster anzugeben, warum du es zur Blockliste hinzugefügt hast.";
+$a->strings["The list of blocked server domain patterns will be made publically available on the <a href=\"/friendica\">/friendica</a> page so that your users and people investigating communication problems can find the reason easily."] = "Die Liste der blockierten Domain Muster wird auf der Seite <a href=\"/friendica\">/friendica</a> öffentlich einsehbar gemacht, damit deine Nutzer und Personen, die Kommunikationsprobleme erkunden, die Ursachen einfach finden können.";
+$a->strings["<p>The server domain pattern syntax is case-insensitive shell wildcard, comprising the following special characters:</p>\n<ul>\n\t<li><code>*</code>: Any number of characters</li>\n\t<li><code>?</code>: Any single character</li>\n\t<li><code>[&lt;char1&gt;&lt;char2&gt;...]</code>: char1 or char2</li>\n</ul>"] = "<p>Die Server Domain Muster sind Groß-/Kleinschreibung unabhängig mit Shell-Jokerzeichen, die die folgenden Sonderzeichen umfassen:</p>\n<ul>\n\t<li><code>*</code>: Beliebige Anzahl von Zeichen</li>\n\t<li><code>?</code>: Ein einzelnes beliebiges Zeichen</li>\n\t<li><code>[&lt;Zeichen1&gt;&lt;Zeichen2&gt;...]</code>:Zeichen1 oder Zeichen2</li>\n</ul>";
 $a->strings["Add new entry to block list"] = "Neuen Eintrag in die Blockliste";
-$a->strings["Server Domain"] = "Domain des Servers";
-$a->strings["The domain of the new server to add to the block list. Do not include the protocol."] = "Der Domain-Name des Servers, der geblockt werden soll. Gib das Protokoll nicht mit an!";
+$a->strings["Server Domain Pattern"] = "Server Domain Muster";
+$a->strings["The domain pattern of the new server to add to the block list. Do not include the protocol."] = "Das Muster für Server Domains die geblockt werden sollen. Gib das Protokoll nicht mit an!";
 $a->strings["Block reason"] = "Begründung der Blockierung";
+$a->strings["The reason why you blocked this server domain pattern."] = "Die Begründung, warum du dieses Domain Muster blockiert hast.";
 $a->strings["Add Entry"] = "Eintrag hinzufügen";
 $a->strings["Save changes to the blocklist"] = "Änderungen der Blockliste speichern";
 $a->strings["Current Entries in the Blocklist"] = "Aktuelle Einträge der Blockliste";
@@ -1578,6 +1635,7 @@ $a->strings["You need to know the GUID of the item. You can find it e.g. by look
 $a->strings["GUID"] = "GUID";
 $a->strings["The GUID of the item you want to delete."] = "Die GUID des zu löschenden Eintrags";
 $a->strings["Item Guid"] = "Beitrags-Guid";
+$a->strings["The logfile '%s' is not writable. No logging possible"] = "Die Logdatei '%s' ist nicht beschreibbar. Derzeit ist keine Aufzeichnung möglich.";
 $a->strings["Log settings updated."] = "Protokolleinstellungen aktualisiert.";
 $a->strings["PHP log currently enabled."] = "PHP Protokollierung ist derzeit aktiviert.";
 $a->strings["PHP log currently disabled."] = "PHP Protokollierung ist derzeit nicht aktiviert.";
@@ -1717,8 +1775,6 @@ $a->strings["Posts per user on community page"] = "Anzahl der Beiträge pro Benu
 $a->strings["The maximum number of posts per user on the community page. (Not valid for \"Global Community\")"] = "Maximale Anzahl der Beiträge, die von jedem Nutzer auf der Gemeinschaftsseite angezeigt werden. (Gilt nicht für die 'Globale Gemeinschaftsseite')";
 $a->strings["Disable OStatus support"] = "OStatus-Unterstützung deaktivieren";
 $a->strings["Disable built-in OStatus (StatusNet, GNU Social etc.) compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed."] = "Die eingebaute OStatus-Unterstützung (StatusNet, GNU Social, etc.) deaktivieren. Jede Kommunikation in OStatus ist öffentlich, Privatsphäre-Warnungen werden nur bei Bedarf angezeigt.";
-$a->strings["Only import OStatus/ActivityPub threads from our contacts"] = "Nur OStatus/ActivityPub-Konversationen unserer Kontakte importieren";
-$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."] = "Normalerweise werden alle Inhalte von OStatus- und ActivityPub-Kontakten importiert. Mit dieser Option werden nur solche Konversationen gespeichert, die von Kontakten der Nutzer dieses Knotens gestartet wurden.";
 $a->strings["OStatus support can only be enabled if threading is enabled."] = "OStatus Unterstützung kann nur aktiviert werden, wenn \"Threading\" aktiviert ist. ";
 $a->strings["Diaspora support can't be enabled because Friendica was installed into a sub directory."] = "Diaspora Unterstützung kann nicht aktiviert werden, da Friendica in ein Unterverzeichnis installiert ist.";
 $a->strings["Enable Diaspora support"] = "Diaspora-Unterstützung aktivieren";
@@ -1892,35 +1948,8 @@ $a->strings["Nickname"] = "Spitzname";
 $a->strings["Nickname of the new user."] = "Spitznamen für den neuen Nutzer";
 $a->strings["Email address of the new user."] = "Email Adresse des neuen Nutzers";
 $a->strings["No friends to display."] = "Keine Kontakte zum Anzeigen.";
-$a->strings["No installed applications."] = "Keine Applikationen installiert.";
-$a->strings["Applications"] = "Anwendungen";
 $a->strings["Item was not found."] = "Beitrag konnte nicht gefunden werden.";
-$a->strings["Source input"] = "Originaltext:";
-$a->strings["BBCode::toPlaintext"] = "BBCode::toPlaintext";
-$a->strings["BBCode::convert (raw HTML)"] = "BBCode::convert (pures 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"] = "Beitragskörper";
-$a->strings["Item Tags"] = "Tags des Beitrags";
-$a->strings["Source input (Diaspora format)"] = "Originaltext (Diaspora Format): ";
-$a->strings["Markdown::convert (raw HTML)"] = "Markdown::convert (pures HTML)";
-$a->strings["Markdown::convert"] = "Markdown::convert";
-$a->strings["Markdown::toBBCode"] = "Markdown::toBBCode";
-$a->strings["Raw HTML input"] = "Reine  HTML  Eingabe";
-$a->strings["HTML Input"] = "HTML Eingabe";
-$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 (pures HTML)";
-$a->strings["HTML::toMarkdown"] = "HTML::toMarkdown";
-$a->strings["HTML::toPlaintext"] = "HTML::toPlaintext";
-$a->strings["Source text"] = "Quelltext";
-$a->strings["BBCode"] = "BBCode";
-$a->strings["Markdown"] = "Markdown";
-$a->strings["HTML"] = "HTML";
+$a->strings["Submanaged account can't access the administation pages. Please log back in as the master account."] = "Verwaltete Benutzerkonten haben keinen Zugriff auf die Administrationsseiten. Bitte wechsle wieder zurück auf das Administrator Konto.";
 $a->strings["Overview"] = "Übersicht";
 $a->strings["Configuration"] = "Konfiguration";
 $a->strings["Database"] = "Datenbank";
@@ -1928,7 +1957,8 @@ $a->strings["DB updates"] = "DB Updates";
 $a->strings["Inspect Deferred Workers"] = "Verzögerte Worker inspizieren";
 $a->strings["Inspect worker Queue"] = "Worker Warteschlange inspizieren";
 $a->strings["Tools"] = "Werkzeuge";
-$a->strings["Contact Blocklist"] = "Kontakt Sperrliste";
+$a->strings["Contact Blocklist"] = "Kontakt Blockliste";
+$a->strings["Server Blocklist"] = "Server Blockliste";
 $a->strings["Diagnostics"] = "Diagnostik";
 $a->strings["PHP Info"] = "PHP-Info";
 $a->strings["probe address"] = "Adresse untersuchen";
@@ -1937,6 +1967,8 @@ $a->strings["Item Source"] = "Eintrags Quelle";
 $a->strings["Babel"] = "Babel";
 $a->strings["Addon Features"] = "Addon Features";
 $a->strings["User registrations waiting for confirmation"] = "Nutzeranmeldungen, die auf Bestätigung warten";
+$a->strings["People Search - %s"] = "Personensuche - %s";
+$a->strings["Forum Search - %s"] = "Forensuche - %s";
 $a->strings["This page is missing a url parameter."] = "Der Seite fehlt ein URL Parameter.";
 $a->strings["The post was created"] = "Der Beitrag wurde angelegt";
 $a->strings["%d contact edited."] = [
@@ -1946,6 +1978,7 @@ $a->strings["%d contact edited."] = [
 $a->strings["Could not access contact record."] = "Konnte nicht auf die Kontaktdaten zugreifen.";
 $a->strings["Could not locate selected profile."] = "Konnte das ausgewählte Profil nicht finden.";
 $a->strings["Contact updated."] = "Kontakt aktualisiert.";
+$a->strings["Contact not found"] = "Kontakt nicht gefunden";
 $a->strings["Contact has been blocked"] = "Kontakt wurde blockiert";
 $a->strings["Contact has been unblocked"] = "Kontakt wurde wieder freigegeben";
 $a->strings["Contact has been ignored"] = "Kontakt wurde ignoriert";
@@ -1977,6 +2010,7 @@ $a->strings["Contact"] = "Kontakt";
 $a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Bitte wähle eines deiner Profile das angezeigt werden soll, wenn %s dein Profil aufruft.";
 $a->strings["Their personal note"] = "Die persönliche Mitteilung";
 $a->strings["Edit contact notes"] = "Notizen zum Kontakt bearbeiten";
+$a->strings["Visit %s's profile [%s]"] = "Besuche %ss Profil [%s]";
 $a->strings["Block/Unblock contact"] = "Kontakt blockieren/freischalten";
 $a->strings["Ignore contact"] = "Ignoriere den Kontakt";
 $a->strings["Repair URL settings"] = "URL-Einstellungen reparieren";
@@ -1995,12 +2029,7 @@ $a->strings["Send a notification of every new post of this contact"] = "Sende ei
 $a->strings["Blacklisted keywords"] = "Unterdrückte Schlüsselworte ";
 $a->strings["Comma separated list of keywords that should not be converted to hashtags, when \"Fetch information and keywords\" is selected"] = "Komma-Separierte Liste mit Schlüsselworten, die nicht in Hashtags konvertiert werden, wenn \"Beziehe Information und Schlüsselworte\" aktiviert wurde";
 $a->strings["Actions"] = "Aktionen";
-$a->strings["Suggestions"] = "Kontaktvorschläge";
-$a->strings["Suggest potential friends"] = "Kontakte vorschlagen";
-$a->strings["All Contacts"] = "Alle Kontakte";
 $a->strings["Show all contacts"] = "Alle Kontakte anzeigen";
-$a->strings["Unblocked"] = "Ungeblockt";
-$a->strings["Only show unblocked contacts"] = "Nur nicht-blockierte Kontakte anzeigen";
 $a->strings["Blocked"] = "Geblockt";
 $a->strings["Only show blocked contacts"] = "Nur blockierte Kontakte anzeigen";
 $a->strings["Ignored"] = "Ignoriert";
@@ -2027,14 +2056,48 @@ $a->strings["Toggle Blocked status"] = "Geblockt-Status ein-/ausschalten";
 $a->strings["Toggle Ignored status"] = "Ignoriert-Status ein-/ausschalten";
 $a->strings["Toggle Archive status"] = "Archiviert-Status ein-/ausschalten";
 $a->strings["Delete contact"] = "Lösche den Kontakt";
-$a->strings["Credits"] = "Credits";
-$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 ist ein Gemeinschaftsprojekt, das nicht ohne die Hilfe vieler Personen möglich wäre. Hier ist eine Aufzählung der Personen, die zum Code oder der Übersetzung beigetragen haben. Dank an alle !";
+$a->strings["Source input"] = "Originaltext:";
+$a->strings["BBCode::toPlaintext"] = "BBCode::toPlaintext";
+$a->strings["BBCode::convert (raw HTML)"] = "BBCode::convert (pures 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"] = "Beitragskörper";
+$a->strings["Item Tags"] = "Tags des Beitrags";
+$a->strings["Source input (Diaspora format)"] = "Originaltext (Diaspora Format): ";
+$a->strings["Markdown::convert (raw HTML)"] = "Markdown::convert (pures HTML)";
+$a->strings["Markdown::convert"] = "Markdown::convert";
+$a->strings["Markdown::toBBCode"] = "Markdown::toBBCode";
+$a->strings["Raw HTML input"] = "Reine  HTML  Eingabe";
+$a->strings["HTML Input"] = "HTML Eingabe";
+$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 (pures HTML)";
+$a->strings["HTML::toBBCode => BBCode::toPlaintext"] = "HTML::toBBCode => BBCode::toPlaintext";
+$a->strings["HTML::toMarkdown"] = "HTML::toMarkdown";
+$a->strings["HTML::toPlaintext"] = "HTML::toPlaintext";
+$a->strings["HTML::toPlaintext (compact)"] = "HTML::toPlaintext (kompakt)";
+$a->strings["Source text"] = "Quelltext";
+$a->strings["BBCode"] = "BBCode";
+$a->strings["Markdown"] = "Markdown";
+$a->strings["HTML"] = "HTML";
+$a->strings["You must be logged in to use this module"] = "Du musst eingeloggt sein, um dieses Modul benutzen zu können.";
+$a->strings["Source URL"] = "URL der Quelle";
+$a->strings["Time Conversion"] = "Zeitumrechnung";
+$a->strings["Friendica provides this service for sharing events with other networks and friends in unknown timezones."] = "Friendica bietet diese Funktion an, um das Teilen von Events mit Kontakten zu vereinfachen, deren Zeitzone nicht ermittelt werden kann.";
+$a->strings["UTC time: %s"] = "UTC Zeit: %s";
+$a->strings["Current timezone: %s"] = "Aktuelle Zeitzone: %s";
+$a->strings["Converted localtime: %s"] = "Umgerechnete lokale Zeit: %s";
+$a->strings["Please select your timezone:"] = "Bitte wähle Deine Zeitzone:";
+$a->strings["Only logged in users are permitted to perform a probing."] = "Nur eingeloggten Benutzern ist das Untersuchen von Adressen gestattet.";
+$a->strings["Lookup address"] = "Adresse nachschlagen";
 $a->strings["No entries (some entries may be hidden)."] = "Keine Einträge (einige Einträge könnten versteckt sein).";
 $a->strings["Find on this site"] = "Auf diesem Server suchen";
 $a->strings["Results for:"] = "Ergebnisse für:";
 $a->strings["Site Directory"] = "Verzeichnis";
-$a->strings["You must be logged in to use this module"] = "Du musst eingeloggt sein, um dieses Modul benutzen zu können.";
-$a->strings["Source URL"] = "URL der Quelle";
 $a->strings["Filetag %s saved to item"] = "Tag %s für den Eintrag gespeichert";
 $a->strings["- select -"] = "- auswählen -";
 $a->strings["No given contact."] = "Keine Kontakte vorgegeben.";
@@ -2125,12 +2188,17 @@ $a->strings["You are cordially invited to join me and other close friends on Fri
 $a->strings["You will need to supply this invitation code: \$invite_code"] = "Du benötigst den folgenden Einladungscode: \$invite_code";
 $a->strings["Once you have registered, please connect with me via my profile page at:"] = "Sobald du registriert bist, kontaktiere mich bitte auf meiner Profilseite:";
 $a->strings["For more information about the Friendica project and why we feel it is important, please visit http://friendi.ca"] = "Für weitere Informationen über das Friendica-Projekt und warum wir es für ein wichtiges Projekt halten, besuche bitte http://friendi.ca.";
-$a->strings["Time Conversion"] = "Zeitumrechnung";
-$a->strings["Friendica provides this service for sharing events with other networks and friends in unknown timezones."] = "Friendica bietet diese Funktion an, um das Teilen von Events mit Kontakten zu vereinfachen, deren Zeitzone nicht ermittelt werden kann.";
-$a->strings["UTC time: %s"] = "UTC Zeit: %s";
-$a->strings["Current timezone: %s"] = "Aktuelle Zeitzone: %s";
-$a->strings["Converted localtime: %s"] = "Umgerechnete lokale Zeit: %s";
-$a->strings["Please select your timezone:"] = "Bitte wähle Deine Zeitzone:";
+$a->strings["Please enter a post body."] = "Bitte gibt den Text des Beitrags an";
+$a->strings["This feature is only available with the frio theme."] = "Diese Seite kann ausschließlich mit dem Frio Theme verwendet werden.";
+$a->strings["Compose new personal note"] = "Neue persönliche Notiz verfassen";
+$a->strings["Compose new post"] = "Neuen Beitrag verfassen";
+$a->strings["Clear the location"] = "Ort löschen";
+$a->strings["Location services are unavailable on your device"] = "Ortungsdienste sind auf Ihrem Gerät nicht verfügbar";
+$a->strings["Location services are disabled. Please check the website's permissions on your device"] = "Ortungsdienste sind deaktiviert. Bitte überprüfen Sie die Berechtigungen der Website auf Ihrem Gerät";
+$a->strings["Public"] = "Öffentlich";
+$a->strings["This post will be sent to all your followers and can be seen in the community pages and by anyone with its link."] = "Der Beitrag wird an alle gesendet die dir folgen und wird auf der Gemeinschaftsseite zu sehen sein. Jeder der den Link des Beitrags kennt kann ihn einsehen.";
+$a->strings["Limited/Private"] = "Begrenzt/Privat";
+$a->strings["This post will be sent only to the people in the first box, to the exception of the people mentioned in the second box. It won't appear anywhere public."] = "Der Beitrag wird nur an Kontakte gesendet, die im ersten Kasten aufgelistet sind, mit der Ausnahme derer, die im zweiten Kasten aufgelistet werden. Der Beitrag wird nicht öffentlich einsehbar sein.";
 $a->strings["Create a New Account"] = "Neues Konto erstellen";
 $a->strings["Password: "] = "Passwort: ";
 $a->strings["Remember me"] = "Anmeldedaten merken";
@@ -2144,9 +2212,25 @@ $a->strings["Logged out."] = "Abgemeldet.";
 $a->strings["System down for maintenance"] = "System zur Wartung abgeschaltet";
 $a->strings["Page not found."] = "Seite nicht gefunden.";
 $a->strings["Invalid photo with id %s."] = "Fehlerhaftes Foto mit der ID %s.";
-$a->strings["%s's timeline"] = "Timeline von %s";
-$a->strings["%s's posts"] = "Beiträge von %s";
-$a->strings["%s's comments"] = "Kommentare von %s";
+$a->strings["User not found."] = "Benutzer nicht gefunden.";
+$a->strings["No contacts."] = "Keine Kontakte.";
+$a->strings["Follower (%s)"] = [
+       0 => "Folgende (%s)",
+       1 => "Folgende (%s)",
+];
+$a->strings["Following (%s)"] = [
+       0 => "Gefolgte (%s)",
+       1 => "Gefolgte (%s)",
+];
+$a->strings["Mutual friend (%s)"] = [
+       0 => "Beidseitige Freundschafte (%s)",
+       1 => "Beidseitige Freundschaften (%s)",
+];
+$a->strings["Contact (%s)"] = [
+       0 => "Kontakt (%s)",
+       1 => "Kontakte (%s)",
+];
+$a->strings["All contacts"] = "Alle Kontakte";
 $a->strings["You may (optionally) fill in this form via OpenID by supplying your OpenID and clicking \"Register\"."] = "Du kannst dieses Formular auch (optional) mit deiner OpenID ausfüllen, indem du deine OpenID angibst und 'Registrieren' klickst.";
 $a->strings["If you are not familiar with OpenID, please leave that field blank and fill in the rest of the items."] = "Wenn du nicht mit OpenID vertraut bist, lass dieses Feld bitte leer und fülle die restlichen Felder aus.";
 $a->strings["Your OpenID (optional): "] = "Deine OpenID (optional): ";
@@ -2167,6 +2251,23 @@ $a->strings["Failed to send email message. Here your accout details:<br> login:
 $a->strings["Registration successful."] = "Registrierung erfolgreich.";
 $a->strings["Your registration can not be processed."] = "Deine Registrierung konnte nicht verarbeitet werden.";
 $a->strings["Your registration is pending approval by the site owner."] = "Deine Registrierung muss noch vom Betreiber der Seite freigegeben werden.";
+$a->strings["Please enter your password to access this page."] = "Bitte geben Sie Ihr Passwort ein, um auf diese Seite zuzugreifen.";
+$a->strings["App-specific password generation failed: The description is empty."] = "Die Erzeugung des App spezifischen Passworts ist fehlgeschlagen. Die Beschreibung ist leer.";
+$a->strings["App-specific password generation failed: This description already exists."] = "Die Erzeugung des App spezifischen Passworts ist fehlgeschlagen. Die Beschreibung existiert bereits.";
+$a->strings["New app-specific password generated."] = "Neues App spezifisches Passwort erzeugt.";
+$a->strings["App-specific passwords successfully revoked."] = "App spezifische Passwörter erfolgreich widerrufen.";
+$a->strings["App-specific password successfully revoked."] = "App spezifisches Passwort erfolgreich widerrufen.";
+$a->strings["Two-factor app-specific passwords"] = "Zwei-Faktor App spezifische Passwörter.";
+$a->strings["<p>App-specific passwords are randomly generated passwords used instead your regular password to authenticate your account on third-party applications that don't support two-factor authentication.</p>"] = "<p>App spezifische Passwörter sind zufällig generierte Passwörter die anstelle des regulären Passworts zur Anmeldung mit Client Anwendungen verwendet werden, wenn diese Anwendungen die Zwei-Faktor-Authentifizierung nicht unterstützen.</p>";
+$a->strings["Make sure to copy your new app-specific password now. You won’t be able to see it again!"] = "Das neue App spezifische Passwort muss jetzt übertragen werden. Später wirst du es nicht mehr einsehen können!";
+$a->strings["Description"] = "Beschreibung";
+$a->strings["Last Used"] = "Zuletzt verwendet";
+$a->strings["Revoke"] = "Widerrufen";
+$a->strings["Revoke All"] = "Alle widerrufen";
+$a->strings["When you generate a new app-specific password, you must use it right away, it will be shown to you once after you generate it."] = "Wenn du eine neues App spezifisches Passwort erstellst, musst du es sofort verwenden. Es wird dir nur ein einziges Mal nach der Erstellung angezeigt.";
+$a->strings["Generate new app-specific password"] = "Neues App spezifisches Passwort erstellen";
+$a->strings["Friendiqa on my Fairphone 2..."] = "Friendiqa auf meinem Fairphone 2";
+$a->strings["Generate"] = "Erstellen";
 $a->strings["Two-factor authentication successfully disabled."] = "Zwei-Faktor Authentifizierung erfolgreich deaktiviert.";
 $a->strings["<p>Use an application on a mobile device to get two-factor authentication codes when prompted on login.</p>"] = "<p>Benutze eine App auf dein Smartphone um einen Zwei-Faktor identifikations Code zu bekommen wenn beim Loggin das verlagt wird.</p>";
 $a->strings["Authenticator app"] = "Zwei-Faktor Authentifizierungsapp";
@@ -2177,13 +2278,16 @@ $a->strings["<p>Your authenticator app is correctly configured.</p>"] = "<p>Dein
 $a->strings["Recovery codes"] = "Wiederherstellungsschlüssel";
 $a->strings["Remaining valid codes"] = "Verbleibende Wiederherstellungsschlüssel";
 $a->strings["<p>These one-use codes can replace an authenticator app code in case you have lost access to it.</p>"] = "<p>Diese Einmalcodes können einen Authentifikator-App-Code ersetzen, falls Sie den Zugriff darauf verloren haben.</p>";
+$a->strings["App-specific passwords"] = "App spezifische Passwörter";
+$a->strings["Generated app-specific passwords"] = "App spezifische Passwörter erstellen";
+$a->strings["<p>These randomly generated passwords allow you to authenticate on apps not supporting two-factor authentication.</p>"] = "<p>Diese zufällig erzeugten Passwörter erlauben es dir dich mit Apps anzumelden, die keine Zwei-Faktor-Authentifizierung unterstützen.</p>";
 $a->strings["Current password:"] = "Aktuelles Passwort:";
 $a->strings["You need to provide your current password to change two-factor authentication settings."] = "Du musst dein aktuelles Passwort eingeben um die Einstellungen der Zwei-Faktor-Authentifizierung zu ändern";
 $a->strings["Enable two-factor authentication"] = "Aktiviere die Zwei-Faktor-Authentifizierung";
 $a->strings["Disable two-factor authentication"] = "Deaktiviere die Zwei-Faktor-Authentifizierung";
 $a->strings["Show recovery codes"] = "Wiederherstellungscodes anzeigen";
+$a->strings["Manage app-specific passwords"] = "App spezifische Passwörter verwalten";
 $a->strings["Finish app configuration"] = "Beenden Sie die App-Konfiguration";
-$a->strings["Please enter your password to access this page."] = "Bitte geben Sie Ihr Passwort ein, um auf diese Seite zuzugreifen.";
 $a->strings["New recovery codes successfully generated."] = "Neue Wiederherstellungscodes erfolgreich generiert.";
 $a->strings["Two-factor recovery codes"] = "Zwei-Faktor-Wiederherstellungscodes";
 $a->strings["<p>Recovery codes can be used to access your account in the event you lose access to your device and cannot receive two-factor authentication codes.</p><p><strong>Put these in a safe spot!</strong> If you lose your device and don’t have the recovery codes you will lose access to your account.</p>"] = "<p>Wiederherstellungscodes können verwendet werden, um auf Ihr Konto zuzugreifen, falls Sie den Zugriff auf Ihr Gerät verlieren und keine Zwei-Faktor-Authentifizierungscodes erhalten können.</p><p><strong>Bewahren Sie diese an einem sicheren Ort auf!</strong> Wenn Sie Ihr Gerät verlieren und nicht über die Wiederherstellungscodes verfügen, verlieren Sie den Zugriff auf Ihr Konto.</p>";
@@ -2211,10 +2315,6 @@ $a->strings["The requested resource could not be found but may be available in t
 $a->strings["An unexpected condition was encountered and no more specific message is suitable."] = "Eine unerwartete Situation ist eingetreten, zu der keine detailliertere Nachricht vorliegt.";
 $a->strings["The server is currently unavailable (because it is overloaded or down for maintenance). Please try again later."] = "Der Server ist derzeit nicht verfügbar (wegen Überlastung oder Wartungsarbeiten). Bitte versuche es später noch einmal.";
 $a->strings["Go back"] = "Geh zurück";
-$a->strings["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."] = "Zum Zwecke der Registrierung und um die Kommunikation zwischen dem Nutzer und seinen Kontakten zu gewährleisten, muß der Nutzer einen Namen (auch Pseudonym) und einen Nutzernamen (Spitzname) sowie eine funktionierende E-Mail-Adresse angeben. Der Name ist auf der Profilseite für alle Nutzer sichtbar, auch wenn die Profildetails nicht angezeigt werden.\nDie E-Mail-Adresse wird nur zur Benachrichtigung des Nutzers verwendet, sie wird nirgends angezeigt. Die Anzeige des Nutzerkontos im Server-Verzeichnis bzw. dem weltweiten Verzeichnis erfolgt gemäß den Einstellungen des Nutzers, sie ist zur Kommunikation nicht zwingend notwendig.";
-$a->strings["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."] = "Diese Daten sind für die Kommunikation notwendig und werden an die Knoten der Kommunikationspartner übermittelt und dort gespeichert. Nutzer können weitere, private Angaben machen, die ebenfalls an die verwendeten Server der Kommunikationspartner übermittelt werden können.";
-$a->strings["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."] = "Angemeldete Nutzer können ihre Nutzerdaten jederzeit von den <a href=\"%1\$s/settings/uexport\">Kontoeinstellungen</a> aus exportieren. Wenn ein Nutzer wünscht das Nutzerkonto zu löschen, so ist dies jederzeit unter <a href=\"%1\$s/removeme\">%1\$s/removeme</a> möglich. Die Löschung des Nutzerkontos ist permanent. Die Löschung der Daten wird auch von den Knoten der Kommunikationspartner angefordert.";
-$a->strings["Privacy Statement"] = "Datenschutzerklärung";
 $a->strings["Remaining recovery codes: %d"] = "Verbleibende Wiederherstellungscodes: %d";
 $a->strings["Two-factor recovery"] = "Zwei-Faktor-Wiederherstellung";
 $a->strings["<p>You can enter one of your one-time recovery codes in case you lost access to your mobile device.</p>"] = "<p>Sie können einen Ihrer einmaligen Wiederherstellungscodes eingeben, falls Sie den Zugriff auf Ihr Mobilgerät verloren haben.</p>";
@@ -2223,6 +2323,36 @@ $a->strings["Please enter a recovery code"] = "Bitte geben Sie einen Wiederherst
 $a->strings["Submit recovery code and complete login"] = "Senden Sie den Wiederherstellungscode und schließen Sie die Anmeldung ab";
 $a->strings["<p>Open the two-factor authentication app on your device to get an authentication code and verify your identity.</p>"] = "<p>Öffnen Sie die Zwei-Faktor-Authentifizierungs-App auf Ihrem Gerät, um einen Authentifizierungscode abzurufen und Ihre Identität zu überprüfen.</p>";
 $a->strings["Verify code and complete login"] = "Code überprüfen und Anmeldung abschließen";
+$a->strings["Welcome to Friendica"] = "Willkommen bei Friendica";
+$a->strings["New Member Checklist"] = "Checkliste für neue Mitglieder";
+$a->strings["We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page. A link to this page will be visible from your home page for two weeks after your initial registration and then will quietly disappear."] = "Wir möchten dir einige Tipps und Links anbieten, die dir helfen könnten, den Einstieg angenehmer zu machen. Klicke auf ein Element, um die entsprechende Seite zu besuchen. Ein Link zu dieser Seite hier bleibt für dich an deiner Pinnwand für zwei Wochen nach dem Registrierungsdatum sichtbar und wird dann verschwinden.";
+$a->strings["Getting Started"] = "Einstieg";
+$a->strings["Friendica Walk-Through"] = "Friendica Rundgang";
+$a->strings["On your <em>Quick Start</em> page - find a brief introduction to your profile and network tabs, make some new connections, and find some groups to join."] = "Auf der <em>Quick Start</em>-Seite findest du eine kurze Einleitung in die einzelnen Funktionen deines Profils und die Netzwerk-Reiter, wo du interessante Foren findest und neue Kontakte knüpfst.";
+$a->strings["Go to Your Settings"] = "Gehe zu deinen Einstellungen";
+$a->strings["On your <em>Settings</em> page -  change your initial password. Also make a note of your Identity Address. This looks just like an email address - and will be useful in making friends on the free social web."] = "Ändere bitte unter <em>Einstellungen</em> dein Passwort. Außerdem merke dir deine Identifikationsadresse. Diese sieht aus wie eine E-Mail-Adresse und wird benötigt, um Kontakte mit anderen im Friendica Netzwerk zu knüpfen..";
+$a->strings["Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you."] = "Überprüfe die restlichen Einstellungen, insbesondere die Einstellungen zur Privatsphäre. Wenn du dein Profil nicht veröffentlichst, ist das, als wenn du deine Telefonnummer nicht ins Telefonbuch einträgst. Im Allgemeinen solltest du es veröffentlichen - außer all deine Kontakte und potentiellen Kontakte wissen genau, wie sie dich finden können.";
+$a->strings["Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not."] = "Lade ein Profilbild hoch, falls du es noch nicht getan hast. Studien haben gezeigt, dass es zehnmal wahrscheinlicher ist, neue Kontakte zu finden, wenn du ein Bild von dir selbst verwendest, als wenn du dies nicht tust.";
+$a->strings["Edit Your Profile"] = "Editiere dein Profil";
+$a->strings["Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors."] = "Editiere dein <strong>Standard</strong>-Profil nach deinen Vorlieben. Überprüfe die Einstellungen zum Verbergen deiner Kontaktliste vor unbekannten Betrachtern des Profils.";
+$a->strings["Profile Keywords"] = "Profil-Schlüsselbegriffe";
+$a->strings["Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships."] = "Trage ein paar öffentliche Stichwörter in dein Standardprofil ein, die deine Interessen beschreiben. Eventuell sind wir in der Lage, Leute zu finden, die deine Interessen teilen, und können dir dann Kontakte vorschlagen.";
+$a->strings["Connecting"] = "Verbindungen knüpfen";
+$a->strings["Importing Emails"] = "Emails Importieren";
+$a->strings["Enter your email access information on your Connector Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = "Gib deine E-Mail-Zugangsinformationen auf der Connector-Einstellungsseite ein, falls du E-Mails aus Deinem Posteingang importieren und mit Kontakten und Mailinglisten interagieren willst.";
+$a->strings["Go to Your Contacts Page"] = "Gehe zu deiner Kontakt-Seite";
+$a->strings["Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Add New Contact</em> dialog."] = "Die Kontakte-Seite ist die Einstiegsseite, von der aus du Kontakte verwalten und dich mit Personen in anderen Netzwerken verbinden kannst. Normalerweise gibst du dazu einfach ihre Adresse oder die URL der Seite im Kasten <em>Neuen Kontakt hinzufügen</em> ein.";
+$a->strings["Go to Your Site's Directory"] = "Gehe zum Verzeichnis Deiner Friendica-Instanz";
+$a->strings["The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested."] = "Über die Verzeichnisseite kannst du andere Personen auf diesem Server oder anderen, verknüpften Seiten finden. Halte nach einem <em>Verbinden</em>- oder <em>Folgen</em>-Link auf deren Profilseiten Ausschau und gib deine eigene Profiladresse an, falls du danach gefragt wirst.";
+$a->strings["Finding New People"] = "Neue Leute kennenlernen";
+$a->strings["On the side panel of the Contacts page are several tools to find new friends. We can match people by interest, look up people by name or interest, and provide suggestions based on network relationships. On a brand new site, friend suggestions will usually begin to be populated within 24 hours."] = "Im seitlichen Bedienfeld der Kontakteseite gibt es diverse Werkzeuge, um neue Personen zu finden. Wir können Menschen mit den gleichen Interessen finden, anhand von Namen oder Interessen suchen oder aber aufgrund vorhandener Kontakte neue Leute vorschlagen.\nAuf einer brandneuen - soeben erstellten - Seite starten die Kontaktvorschläge innerhalb von 24 Stunden.";
+$a->strings["Group Your Contacts"] = "Gruppiere deine Kontakte";
+$a->strings["Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page."] = "Sobald du einige Kontakte gefunden hast, organisiere sie in Gruppen zur privaten Kommunikation im Seitenmenü der Kontakte-Seite. Du kannst dann mit jeder dieser Gruppen von der Netzwerkseite aus privat interagieren.";
+$a->strings["Why Aren't My Posts Public?"] = "Warum sind meine Beiträge nicht öffentlich?";
+$a->strings["Friendica respects your privacy. By default, your posts will only show up to people you've added as friends. For more information, see the help section from the link above."] = "Friendica respektiert Deine Privatsphäre. Mit der Grundeinstellung werden Deine Beiträge ausschließlich Deinen Kontakten angezeigt. Für weitere Informationen diesbezüglich lies dir bitte den entsprechenden Abschnitt in der Hilfe unter dem obigen Link durch.";
+$a->strings["Getting Help"] = "Hilfe bekommen";
+$a->strings["Go to the Help Section"] = "Zum Hilfe Abschnitt gehen";
+$a->strings["Our <strong>help</strong> pages may be consulted for detail on other program features and resources."] = "Unsere <strong>Hilfe</strong>-Seiten können herangezogen werden, um weitere Einzelheiten zu anderen Programm-Features zu erhalten.";
 $a->strings["This entry was edited"] = "Dieser Beitrag wurde bearbeitet.";
 $a->strings["Private Message"] = "Private Nachricht";
 $a->strings["Delete locally"] = "Lokal löschen";
@@ -2260,76 +2390,19 @@ $a->strings["%d comment"] = [
 ];
 $a->strings["Show more"] = "Zeige mehr";
 $a->strings["Show fewer"] = "Zeige weniger";
-$a->strings["Sharing notification from Diaspora network"] = "Freigabe-Benachrichtigung von Diaspora";
-$a->strings["Attachments:"] = "Anhänge:";
-$a->strings["%s is now following %s."] = "%s folgt nun %s";
-$a->strings["following"] = "folgen";
-$a->strings["%s stopped following %s."] = "%s hat aufgehört %s, zu folgen";
-$a->strings["stopped following"] = "wird nicht mehr gefolgt";
-$a->strings["YYYY-MM-DD or MM-DD"] = "YYYY-MM-DD oder MM-DD";
-$a->strings["never"] = "nie";
-$a->strings["less than a second ago"] = "vor weniger als einer Sekunde";
-$a->strings["year"] = "Jahr";
-$a->strings["years"] = "Jahre";
-$a->strings["months"] = "Monate";
-$a->strings["weeks"] = "Wochen";
-$a->strings["days"] = "Tage";
-$a->strings["hour"] = "Stunde";
-$a->strings["hours"] = "Stunden";
-$a->strings["minute"] = "Minute";
-$a->strings["minutes"] = "Minuten";
-$a->strings["second"] = "Sekunde";
-$a->strings["seconds"] = "Sekunden";
-$a->strings["in %1\$d %2\$s"] = "in %1\$d %2\$s";
-$a->strings["%1\$d %2\$s ago"] = "vor %1\$d %2\$s";
-$a->strings["(no subject)"] = "(kein Betreff)";
+$a->strings["Legacy module file not found: %s"] = "Legacy-Moduldatei nicht gefunden: %s";
+$a->strings["Delete this item?"] = "Diesen Beitrag löschen?";
+$a->strings["toggle mobile"] = "mobile Ansicht umschalten";
+$a->strings["No system theme config value set."] = "Es wurde kein Konfigurationswert für das systemweite Theme gesetzt.";
+$a->strings["You must be logged in to use addons. "] = "Du musst angemeldet sein, um Addons benutzen zu können.";
+$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."] = "Das Sicherheitsmerkmal war nicht korrekt. Das passiert meistens, wenn das Formular vor dem Absenden zu lange geöffnet war (länger als 3 Stunden).";
+$a->strings["Could not find any unarchived contact entry for this URL (%s)"] = "Für die URL (%s) konnte kein nicht-archivierter Kontakt gefunden werden";
+$a->strings["The contact entries have been archived"] = "Die Kontakteinträge wurden archiviert.";
+$a->strings["Enter new password: "] = "Neues Passwort eingeben:";
+$a->strings["Post update version number has been set to %s."] = "Die Post-Update-Versionsnummer wurde auf %s gesetzt.";
+$a->strings["Check for pending update actions."] = "Überprüfe ausstehende Update-Aktionen";
+$a->strings["Done."] = "Erledigt.";
+$a->strings["Execute pending post updates."] = "Ausstehende Post-Updates ausführen";
+$a->strings["All pending post updates are done."] = "Alle ausstehenden Post-Updates wurden ausgeführt.";
 $a->strings["%s: Updating author-id and owner-id in item and thread table. "] = "%s: Aktualisiere die author-id und owner-id in der Thread Tabelle";
 $a->strings["%s: Updating post-type."] = "%s: Aktualisiere Beitrags-Typ";
-$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"] = "Variationen";
-$a->strings["Custom"] = "Benutzerdefiniert";
-$a->strings["Note"] = "Hinweis";
-$a->strings["Check image permissions if all users are allowed to see the image"] = "Überprüfe, dass alle Benutzer die Berechtigung haben dieses Bild anzusehen";
-$a->strings["Select color scheme"] = "Farbschema auswählen";
-$a->strings["Copy or paste schemestring"] = "Farbschema kopieren oder einfügen";
-$a->strings["You can copy this string to share your theme with others. Pasting here applies the schemestring"] = "Du kannst den String mit den Farbschema Informationen mit anderen Teilen. Wenn du einen neuen Farbschema-String hier einfügst wird er für deine Einstellungen übernommen.";
-$a->strings["Navigation bar background color"] = "Hintergrundfarbe der Navigationsleiste";
-$a->strings["Navigation bar icon color "] = "Icon Farbe in der Navigationsleiste";
-$a->strings["Link color"] = "Linkfarbe";
-$a->strings["Set the background color"] = "Hintergrundfarbe festlegen";
-$a->strings["Content background opacity"] = "Opazität des Hintergrunds von Beiträgen";
-$a->strings["Set the background image"] = "Hintergrundbild festlegen";
-$a->strings["Background image style"] = "Stil des Hintergrundbildes";
-$a->strings["Login page background image"] = "Hintergrundbild der Login-Seite";
-$a->strings["Login page background color"] = "Hintergrundfarbe der Login-Seite";
-$a->strings["Leave background image and color empty for theme defaults"] = "Wenn die Theme-Vorgaben verwendet werden sollen, lass bitte die Felder für die Hintergrundfarbe und das Hintergrundbild leer.";
-$a->strings["Top Banner"] = "Top Banner";
-$a->strings["Resize image to the width of the screen and show background color below on long pages."] = "Skaliere das Hintergrundbild so, dass es die Breite der Seite einnimmt, und fülle den Rest der Seite mit der Hintergrundfarbe bei langen Seiten.";
-$a->strings["Full screen"] = "Vollbildmodus";
-$a->strings["Resize image to fill entire screen, clipping either the right or the bottom."] = "Skaliere das Bild so, dass es den gesamten Bildschirm füllt. Hierfür wird entweder die Breite oder die Höhe des Bildes automatisch abgeschnitten.";
-$a->strings["Single row mosaic"] = "Mosaik in einer Zeile";
-$a->strings["Resize image to repeat it on a single row, either vertical or horizontal."] = "Skaliere das Bild so, dass es in einer einzelnen Reihe, entweder horizontal oder vertikal, wiederholt wird.";
-$a->strings["Mosaic"] = "Mosaik";
-$a->strings["Repeat image to fill the screen."] = "Wiederhole das Bild, um den Bildschirm zu füllen.";
-$a->strings["Guest"] = "Gast";
-$a->strings["Visitor"] = "Besucher";
-$a->strings["Alignment"] = "Ausrichtung";
-$a->strings["Left"] = "Links";
-$a->strings["Center"] = "Mitte";
-$a->strings["Color scheme"] = "Farbschema";
-$a->strings["Posts font size"] = "Schriftgröße in Beiträgen";
-$a->strings["Textareas font size"] = "Schriftgröße in Eingabefeldern";
-$a->strings["Comma separated list of helper forums"] = "Komma-separierte Liste der Helfer-Foren";
-$a->strings["Set style"] = "Stil auswählen";
-$a->strings["Community Pages"] = "Foren";
-$a->strings["Community Profiles"] = "Community-Profile";
-$a->strings["Help or @NewHere ?"] = "Hilfe oder @NewHere";
-$a->strings["Connect Services"] = "Verbinde Dienste";
-$a->strings["Find Friends"] = "Kontakte finden";
-$a->strings["Last users"] = "Letzte Nutzer";
-$a->strings["Quick Start"] = "Schnell-Start";
index 683361a0a2079f5abc7996ca6ac3088aa46a1708..07059ce2b7ebe6977f4bef49fceb1ac91a1253ad 100644 (file)
@@ -17,6 +17,7 @@
 # Marquis_de_Carabas <olivier@free-beer.ch>, 2012
 # Olivier <olivier+transifex@migeot.org>, 2011-2012
 # PerigGouanvic <pierre.alain.gouanvic@gmail.com>, 2015
+# Phigger Phigger <automates@lepouete.fr>, 2019
 # StefOfficiel <pichard.stephane@free.fr>, 2015
 # Sylvain Lagacé, 2014-2015
 # Thecross, 2017
@@ -29,9 +30,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-15 08:55-0400\n"
-"PO-Revision-Date: 2019-05-27 20:26+0000\n"
-"Last-Translator: Valvin A <vincent-forum@valvin.fr>\n"
+"POT-Creation-Date: 2019-08-06 16:52+0200\n"
+"PO-Revision-Date: 2019-08-07 10:45+0000\n"
+"Last-Translator: Phigger Phigger <automates@lepouete.fr>\n"
 "Language-Team: French (http://www.transifex.com/Friendica/friendica/language/fr/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -39,825 +40,837 @@ msgstr ""
 "Language: fr\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
-#: include/api.php:1116
-#, 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 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/enotify.php:57
+msgid "Friendica Notification"
+msgstr "Notification Friendica"
 
-#: include/api.php:1130
-#, 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] "Limite hebdomadaire d'%d unique publication atteinte, votre soumission a été rejetée."
-msgstr[1] "Limite hebdomadaire de %d publications atteinte, votre soumission a été rejetée."
+#: include/enotify.php:60
+msgid "Thank You,"
+msgstr "Merci, "
 
-#: include/api.php:1144
+#: include/enotify.php:63
 #, php-format
-msgid "Monthly posting limit of %d post reached. The post was rejected."
-msgstr "La limite mensuelle de%d publication est atteinte. Votre publication a été rejetée."
+msgid "%1$s, %2$s Administrator"
+msgstr "%1$s,, l'administrateur de %2$s"
 
-#: include/api.php:4511 mod/photos.php:91 mod/photos.php:193
-#: mod/photos.php:636 mod/photos.php:1082 mod/photos.php:1099
-#: mod/photos.php:1601 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:763
-#: src/Model/User.php:771 src/Model/User.php:779
-msgid "Profile Photos"
-msgstr "Photos du profil"
+#: include/enotify.php:65
+#, php-format
+msgid "%s Administrator"
+msgstr "L'administrateur de %s"
 
-#: include/conversation.php:160 include/conversation.php:297
-#: src/Model/Item.php:3253
-msgid "event"
-msgstr "événement"
+#: include/enotify.php:134
+#, php-format
+msgid "[Friendica:Notify] New mail received at %s"
+msgstr "[Friendica:Notification] Nouveau courriel reçu sur %s"
 
-#: include/conversation.php:163 include/conversation.php:173
-#: include/conversation.php:300 include/conversation.php:309
-#: mod/subthread.php:88 mod/tagger.php:68
-msgid "status"
-msgstr "le statut"
+#: include/enotify.php:136
+#, php-format
+msgid "%1$s sent you a new private message at %2$s."
+msgstr "%1$s vous a envoyé un nouveau message privé sur %2$s."
 
-#: include/conversation.php:168 include/conversation.php:305
-#: mod/subthread.php:88 mod/tagger.php:68 src/Model/Item.php:3255
-msgid "photo"
-msgstr "photo"
+#: include/enotify.php:137
+msgid "a private message"
+msgstr "un message privé"
 
-#: include/conversation.php:181
+#: include/enotify.php:137
 #, php-format
-msgid "%1$s likes %2$s's %3$s"
-msgstr "%1$s aime %3$s de %2$s"
+msgid "%1$s sent you %2$s."
+msgstr "%1$s vous a envoyé %2$s."
 
-#: include/conversation.php:183
+#: include/enotify.php:139
 #, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
-msgstr "%1$s n'aime pas %3$s de %2$s"
+msgid "Please visit %s to view and/or reply to your private messages."
+msgstr "Merci de visiter %s pour voir vos messages privés et/ou y répondre."
 
-#: include/conversation.php:185
+#: include/enotify.php:172
 #, php-format
-msgid "%1$s attends %2$s's %3$s"
-msgstr "%1$s participe à %3$s de %2$s"
+msgid "%1$s tagged you on [url=%2$s]a %3$s[/url]"
+msgstr "%1$s vous a mentionné•e sur [url=%2$s]un•e %3$s[/url]"
 
-#: include/conversation.php:187
+#: include/enotify.php:178
 #, php-format
-msgid "%1$s doesn't attend %2$s's %3$s"
-msgstr "%1$s ne participe pas à %3$s de %2$s"
+msgid "%1$s commented on [url=%2$s]a %3$s[/url]"
+msgstr "%1$s a commenté sur [url=%2$s]un %3$s[/url]"
 
-#: include/conversation.php:189
+#: include/enotify.php:188
 #, php-format
-msgid "%1$s attends maybe %2$s's %3$s"
-msgstr "%1$s participe peut-être à %3$s de %2$s"
+msgid "%1$s tagged you on [url=%2$s]%3$s's %4$s[/url]"
+msgstr "%1$s vous a mentionné•e sur [url=%2$s]un•e %4$s de %3$s [/url]"
 
-#: include/conversation.php:224
+#: include/enotify.php:195
 #, php-format
-msgid "%1$s is now friends with %2$s"
-msgstr "%1$s est désormais lié à %2$s"
+msgid "%1$s commented on [url=%2$s]%3$s's %4$s[/url]"
+msgstr "%1$s a commenté sur [url=%2$s]le %4$s de %3$s[/url]"
 
-#: include/conversation.php:265
+#: include/enotify.php:207
 #, php-format
-msgid "%1$s poked %2$s"
-msgstr "%1$s a sollicité %2$s"
+msgid "%1$s tagged you on [url=%2$s]your %3$s[/url]"
+msgstr "%1$s vous a mentionné•e sur [url=%2$s]votre %3$s[/url]"
 
-#: include/conversation.php:319 mod/tagger.php:101
+#: include/enotify.php:213
 #, php-format
-msgid "%1$s tagged %2$s's %3$s with %4$s"
-msgstr "%1$s a étiqueté %3$s de %2$s avec %4$s"
-
-#: include/conversation.php:341
-msgid "post/item"
-msgstr "publication/élément"
+msgid "%1$s commented on [url=%2$s]your %3$s[/url]"
+msgstr "%1$s commented on [url=%2$s]your %3$s[/url]"
 
-#: include/conversation.php:342
+#: include/enotify.php:224
 #, php-format
-msgid "%1$s marked %2$s's %3$s as favorite"
-msgstr "%1$s a marqué le %3$s de %2$s comme favori"
-
-#: include/conversation.php:568 mod/photos.php:1433 mod/profiles.php:352
-msgid "Likes"
-msgstr "Derniers \"J'aime\""
-
-#: include/conversation.php:569 mod/photos.php:1433 mod/profiles.php:355
-msgid "Dislikes"
-msgstr "Derniers \"Je n'aime pas\""
-
-#: include/conversation.php:570 include/conversation.php:1564
-#: mod/photos.php:1434
-msgid "Attending"
-msgid_plural "Attending"
-msgstr[0] "Participe"
-msgstr[1] "Participent"
-
-#: include/conversation.php:571 mod/photos.php:1434
-msgid "Not attending"
-msgstr "Ne participe pas"
-
-#: include/conversation.php:572 mod/photos.php:1434
-msgid "Might attend"
-msgstr "Participera peut-être"
-
-#: include/conversation.php:573
-msgid "Reshares"
-msgstr "Partages"
-
-#: include/conversation.php:653 mod/photos.php:1490 src/Object/Post.php:208
-msgid "Select"
-msgstr "Sélectionner"
-
-#: include/conversation.php:654 mod/photos.php:1491 mod/settings.php:735
-#: src/Module/Admin/Users.php:288 src/Module/Contact.php:830
-#: src/Module/Contact.php:1105
-msgid "Delete"
-msgstr "Supprimer"
+msgid "%1$s tagged you on [url=%2$s]their %3$s[/url]"
+msgstr "%1$s vous a mentionné•e sur [url=%2$s]leur %3$s[/url]"
 
-#: include/conversation.php:679 src/Object/Post.php:382
-#: src/Object/Post.php:383
+#: include/enotify.php:230
 #, php-format
-msgid "View %s's profile @ %s"
-msgstr "Voir le profil de %s @ %s"
-
-#: include/conversation.php:692 src/Object/Post.php:370
-msgid "Categories:"
-msgstr "Catégories :"
-
-#: include/conversation.php:693 src/Object/Post.php:371
-msgid "Filed under:"
-msgstr "Rangé sous :"
+msgid "%1$s commented on [url=%2$s]their %3$s[/url]"
+msgstr "%1$s a commenté sur [url=%2$s]leur %3$s[/url]"
 
-#: include/conversation.php:700 src/Object/Post.php:396
+#: include/enotify.php:243
 #, php-format
-msgid "%s from %s"
-msgstr "%s de %s"
-
-#: include/conversation.php:715
-msgid "View in context"
-msgstr "Voir dans le contexte"
-
-#: include/conversation.php:717 include/conversation.php:1230
-#: mod/editpost.php:86 mod/message.php:260 mod/message.php:442
-#: mod/photos.php:1406 mod/wallmessage.php:141 src/Object/Post.php:423
-msgid "Please wait"
-msgstr "Patientez"
-
-#: include/conversation.php:781
-msgid "remove"
-msgstr "enlever"
-
-#: include/conversation.php:785
-msgid "Delete Selected Items"
-msgstr "Supprimer les éléments sélectionnés"
-
-#: include/conversation.php:940 view/theme/frio/theme.php:358
-msgid "Follow Thread"
-msgstr "Suivre le fil"
-
-#: include/conversation.php:941 src/Model/Contact.php:1111
-msgid "View Status"
-msgstr "Voir les statuts"
-
-#: include/conversation.php:942 include/conversation.php:960
-#: mod/dirfind.php:226 mod/match.php:87 mod/suggest.php:87
-#: src/Model/Contact.php:1051 src/Model/Contact.php:1104
-#: src/Model/Contact.php:1112 src/Module/AllFriends.php:74
-#: src/Module/Directory.php:155
-msgid "View Profile"
-msgstr "Voir le profil"
-
-#: include/conversation.php:943 src/Model/Contact.php:1113
-msgid "View Photos"
-msgstr "Voir les photos"
-
-#: include/conversation.php:944 src/Model/Contact.php:1105
-#: src/Model/Contact.php:1114
-msgid "Network Posts"
-msgstr "Publications du réseau"
-
-#: include/conversation.php:945 src/Model/Contact.php:1106
-#: src/Model/Contact.php:1115
-msgid "View Contact"
-msgstr "Voir Contact"
-
-#: include/conversation.php:946 src/Model/Contact.php:1117
-msgid "Send PM"
-msgstr "Message privé"
-
-#: include/conversation.php:947 src/Module/Admin/Blocklist/Contact.php:66
-#: src/Module/Admin/Users.php:289 src/Module/Contact.php:624
-#: src/Module/Contact.php:827 src/Module/Contact.php:1080
-msgid "Block"
-msgstr "Bloquer"
-
-#: include/conversation.php:948 mod/notifications.php:60
-#: mod/notifications.php:186 mod/notifications.php:279
-#: src/Module/Contact.php:625 src/Module/Contact.php:828
-#: src/Module/Contact.php:1088
-msgid "Ignore"
-msgstr "Ignorer"
-
-#: include/conversation.php:952 src/Model/Contact.php:1118
-msgid "Poke"
-msgstr "Sollicitations (pokes)"
-
-#: include/conversation.php:957 mod/dirfind.php:227 mod/follow.php:158
-#: mod/match.php:88 mod/suggest.php:88 src/Content/Widget.php:63
-#: src/Model/Contact.php:1107 src/Module/AllFriends.php:75
-#: src/Module/Contact.php:577 view/theme/vier/theme.php:201
-msgid "Connect/Follow"
-msgstr "Se connecter/Suivre"
+msgid "[Friendica:Notify] %s tagged you"
+msgstr "[Friendica:Notification] %s vous a étiqueté"
 
-#: include/conversation.php:1082
+#: include/enotify.php:245
 #, php-format
-msgid "%s likes this."
-msgstr "%s aime ça."
+msgid "%1$s tagged you at %2$s"
+msgstr "%1$s vous a étiqueté sur %2$s"
 
-#: include/conversation.php:1085
+#: include/enotify.php:247
 #, php-format
-msgid "%s doesn't like this."
-msgstr "%s n'aime pas ça."
+msgid "[Friendica:Notify] Comment to conversation #%1$d by %2$s"
+msgstr "[Friendica:Notification] Commentaire de %2$s sur la conversation #%1$d"
 
-#: include/conversation.php:1088
+#: include/enotify.php:249
 #, php-format
-msgid "%s attends."
-msgstr "%s participe"
+msgid "%s commented on an item/conversation you have been following."
+msgstr "%s a commenté un élément que vous suivez."
 
-#: include/conversation.php:1091
+#: include/enotify.php:254 include/enotify.php:269 include/enotify.php:284
+#: include/enotify.php:303 include/enotify.php:319
 #, php-format
-msgid "%s doesn't attend."
-msgstr "%s ne participe pas"
+msgid "Please visit %s to view and/or reply to the conversation."
+msgstr "Merci de visiter %s pour voir la conversation et/ou y répondre."
 
-#: include/conversation.php:1094
+#: include/enotify.php:261
 #, php-format
-msgid "%s attends maybe."
-msgstr "%s participe peut-être"
+msgid "[Friendica:Notify] %s posted to your profile wall"
+msgstr "[Friendica:Notification] %s a posté sur votre mur"
 
-#: include/conversation.php:1097 include/conversation.php:1140
+#: include/enotify.php:263
 #, php-format
-msgid "%s reshared this."
-msgstr "%sa partagé ceci."
-
-#: include/conversation.php:1105
-msgid "and"
-msgstr "et"
+msgid "%1$s posted to your profile wall at %2$s"
+msgstr "%1$s a publié sur votre mur à %2$s"
 
-#: include/conversation.php:1111
+#: include/enotify.php:264
 #, php-format
-msgid "and %d other people"
-msgstr "et %dautres personnes"
+msgid "%1$s posted to [url=%2$s]your wall[/url]"
+msgstr "%1$s a posté sur [url=%2$s]votre mur[/url]"
 
-#: include/conversation.php:1119
+#: include/enotify.php:276
 #, php-format
-msgid "<span  %1$s>%2$d people</span> like this"
-msgstr "<span  %1$s>%2$d personnes</span> aiment ça"
+msgid "[Friendica:Notify] %s shared a new post"
+msgstr "[Friendica:Notification] %s partage une nouvelle publication"
 
-#: include/conversation.php:1120
+#: include/enotify.php:278
 #, php-format
-msgid "%s like this."
-msgstr "%s aime ça."
+msgid "%1$s shared a new post at %2$s"
+msgstr "%1$s a partagé une nouvelle publication sur %2$s"
 
-#: include/conversation.php:1123
+#: include/enotify.php:279
 #, php-format
-msgid "<span  %1$s>%2$d people</span> don't like this"
-msgstr "<span  %1$s>%2$d personnes</span> n'aiment pas ça"
+msgid "%1$s [url=%2$s]shared a post[/url]."
+msgstr "%1$s [url=%2$s]partage une publication[/url]."
 
-#: include/conversation.php:1124
+#: include/enotify.php:291
 #, php-format
-msgid "%s don't like this."
-msgstr "%s n'aiment pas ça."
+msgid "[Friendica:Notify] %1$s poked you"
+msgstr "[Friendica:Notify] %1$s vous a sollicité"
 
-#: include/conversation.php:1127
+#: include/enotify.php:293
 #, php-format
-msgid "<span  %1$s>%2$d people</span> attend"
-msgstr "<span %1$s>%2$d personnes</span> participent"
+msgid "%1$s poked you at %2$s"
+msgstr "%1$s vous a sollicité via %2$s"
 
-#: include/conversation.php:1128
+#: include/enotify.php:294
 #, php-format
-msgid "%s attend."
-msgstr "%s participent."
+msgid "%1$s [url=%2$s]poked you[/url]."
+msgstr "%1$s vous a [url=%2$s]sollicité[/url]."
 
-#: include/conversation.php:1131
+#: include/enotify.php:311
 #, php-format
-msgid "<span  %1$s>%2$d people</span> don't attend"
-msgstr "<span  %1$s>%2$d personnes</span> ne participent pas"
+msgid "[Friendica:Notify] %s tagged your post"
+msgstr "[Friendica:Notification] %s a étiqueté votre publication"
 
-#: include/conversation.php:1132
+#: include/enotify.php:313
 #, php-format
-msgid "%s don't attend."
-msgstr "%s ne participent pas."
+msgid "%1$s tagged your post at %2$s"
+msgstr "%1$s a étiqueté votre publication sur %2$s"
 
-#: include/conversation.php:1135
+#: include/enotify.php:314
 #, php-format
-msgid "<span  %1$s>%2$d people</span> attend maybe"
-msgstr "<span  %1$s>%2$d personnes</span> vont peut-être participer"
+msgid "%1$s tagged [url=%2$s]your post[/url]"
+msgstr "%1$s a étiqueté [url=%2$s]votre publication[/url]"
 
-#: include/conversation.php:1136
+#: include/enotify.php:326
+msgid "[Friendica:Notify] Introduction received"
+msgstr "[Friendica:Notification] Introduction reçue"
+
+#: include/enotify.php:328
 #, php-format
-msgid "%s attend maybe."
-msgstr "%sparticipent peut-être"
+msgid "You've received an introduction from '%1$s' at %2$s"
+msgstr "Vous avez reçu une introduction de '%1$s' sur %2$s"
 
-#: include/conversation.php:1139
+#: include/enotify.php:329
 #, php-format
-msgid "<span  %1$s>%2$d people</span> reshared this"
-msgstr "<span  %1$s>%2$dpersonnes</span>ont partagé ceci"
+msgid "You've received [url=%1$s]an introduction[/url] from %2$s."
+msgstr "Vous avez reçu [url=%1$s]une introduction[/url] de %2$s."
 
-#: include/conversation.php:1169
-msgid "Visible to <strong>everybody</strong>"
-msgstr "Visible par <strong>tout le monde</strong>"
+#: include/enotify.php:334 include/enotify.php:380
+#, php-format
+msgid "You may visit their profile at %s"
+msgstr "Vous pouvez visiter son profil sur %s"
 
-#: include/conversation.php:1170 src/Object/Post.php:886
-msgid "Please enter a image/video/audio/webpage URL:"
-msgstr "Veuillez entrer une URL d'image/vidéo/page web."
+#: include/enotify.php:336
+#, php-format
+msgid "Please visit %s to approve or reject the introduction."
+msgstr "Merci de visiter %s pour approuver ou rejeter l'introduction."
 
-#: include/conversation.php:1171
-msgid "Tag term:"
-msgstr "Étiquette :"
+#: include/enotify.php:343
+msgid "[Friendica:Notify] A new person is sharing with you"
+msgstr "[Notification Friendica] Une nouvelle personne partage avec vous"
 
-#: include/conversation.php:1172 src/Module/Filer/SaveTag.php:49
-msgid "Save to Folder:"
-msgstr "Sauver dans le Dossier :"
+#: include/enotify.php:345 include/enotify.php:346
+#, php-format
+msgid "%1$s is sharing with you at %2$s"
+msgstr "%1$s partage avec vous sur %2$s"
 
-#: include/conversation.php:1173
-msgid "Where are you right now?"
-msgstr "Où êtes-vous actuellement ?"
+#: include/enotify.php:353
+msgid "[Friendica:Notify] You have a new follower"
+msgstr "[Friendica:Notification] Vous avez un nouvel abonné"
 
-#: include/conversation.php:1174
-msgid "Delete item(s)?"
-msgstr "Supprimer les élément(s) ?"
+#: include/enotify.php:355 include/enotify.php:356
+#, php-format
+msgid "You have a new follower at %2$s : %1$s"
+msgstr "Vous avez un nouvel abonné à %2$s : %1$s"
 
-#: include/conversation.php:1206
-msgid "New Post"
-msgstr "Nouvelle publication"
+#: include/enotify.php:369
+msgid "[Friendica:Notify] Friend suggestion received"
+msgstr "[Friendica:Notification] Nouvelle suggestion d'amitié"
 
-#: include/conversation.php:1209
-msgid "Share"
-msgstr "Partager"
+#: include/enotify.php:371
+#, php-format
+msgid "You've received a friend suggestion from '%1$s' at %2$s"
+msgstr "Vous avez reçu une suggestion de '%1$s' sur %2$s"
 
-#: include/conversation.php:1210 mod/editpost.php:72 mod/message.php:258
-#: mod/message.php:439 mod/wallmessage.php:139
-msgid "Upload photo"
-msgstr "Joindre photo"
+#: include/enotify.php:372
+#, php-format
+msgid ""
+"You've received [url=%1$s]a friend suggestion[/url] for %2$s from %3$s."
+msgstr "Vous avez reçu [url=%1$s]une suggestion[/url] de %3$s pour %2$s."
 
-#: include/conversation.php:1211 mod/editpost.php:73
-msgid "upload photo"
-msgstr "envoi image"
+#: include/enotify.php:378
+msgid "Name:"
+msgstr "Nom :"
 
-#: include/conversation.php:1212 mod/editpost.php:74
-msgid "Attach file"
-msgstr "Joindre fichier"
+#: include/enotify.php:379
+msgid "Photo:"
+msgstr "Photo :"
 
-#: include/conversation.php:1213 mod/editpost.php:75
-msgid "attach file"
-msgstr "ajout fichier"
+#: include/enotify.php:382
+#, php-format
+msgid "Please visit %s to approve or reject the suggestion."
+msgstr "Merci de visiter %s pour approuver ou rejeter la suggestion."
 
-#: include/conversation.php:1214 src/Object/Post.php:878
-msgid "Bold"
-msgstr "Gras"
+#: include/enotify.php:390 include/enotify.php:405
+msgid "[Friendica:Notify] Connection accepted"
+msgstr "[Friendica:Notification] Connexion acceptée"
 
-#: include/conversation.php:1215 src/Object/Post.php:879
-msgid "Italic"
-msgstr "Italique"
+#: include/enotify.php:392 include/enotify.php:407
+#, php-format
+msgid "'%1$s' has accepted your connection request at %2$s"
+msgstr "'%1$s' a accepté votre demande de connexion à %2$s"
 
-#: include/conversation.php:1216 src/Object/Post.php:880
-msgid "Underline"
-msgstr "Souligné"
+#: include/enotify.php:393 include/enotify.php:408
+#, php-format
+msgid "%2$s has accepted your [url=%1$s]connection request[/url]."
+msgstr "%2$s a accepté votre [url=%1$s]demande de connexion[/url]."
 
-#: include/conversation.php:1217 src/Object/Post.php:881
-msgid "Quote"
-msgstr "Citation"
+#: include/enotify.php:398
+msgid ""
+"You are now mutual friends and may exchange status updates, photos, and "
+"email without restriction."
+msgstr "Vous êtes désormais mutuellement amis, et pouvez échanger des mises-à-jour d'état, des photos, et des messages sans restriction."
 
-#: include/conversation.php:1218 src/Object/Post.php:882
-msgid "Code"
-msgstr "Code"
+#: include/enotify.php:400
+#, php-format
+msgid "Please visit %s if you wish to make any changes to this relationship."
+msgstr "Veuillez visiter %s si vous souhaitez modifier cette relation."
 
-#: include/conversation.php:1219 src/Object/Post.php:883
-msgid "Image"
-msgstr "Image"
+#: include/enotify.php:413
+#, php-format
+msgid ""
+"'%1$s' has chosen to accept you a fan, which restricts some forms of "
+"communication - such as private messaging and some profile interactions. If "
+"this is a celebrity or community page, these settings were applied "
+"automatically."
+msgstr "'%1$s' a choisi de vous accepter comme fan ce qui empêche certains canaux de communication tel les messages privés et certaines interactions de profil. Ceci est une page de célébrité ou de communauté, ces paramètres ont été appliqués automatiquement."
 
-#: include/conversation.php:1220 src/Object/Post.php:884
-msgid "Link"
-msgstr "Lien"
+#: include/enotify.php:415
+#, php-format
+msgid ""
+"'%1$s' may choose to extend this into a two-way or more permissive "
+"relationship in the future."
+msgstr "%1$s peut choisir à l'avenir de rendre cette relation réciproque ou au moins plus permissive."
 
-#: include/conversation.php:1221 src/Object/Post.php:885
-msgid "Link or Media"
-msgstr "Lien ou média"
+#: include/enotify.php:417
+#, php-format
+msgid "Please visit %s  if you wish to make any changes to this relationship."
+msgstr "Veuillez visiter %s si vous souhaitez modifier cette relation."
 
-#: include/conversation.php:1222 mod/editpost.php:82
-msgid "Set your location"
-msgstr "Définir votre localisation"
+#: include/enotify.php:427 mod/removeme.php:46
+msgid "[Friendica System Notify]"
+msgstr "[Friendica Notification Sytème]"
 
-#: include/conversation.php:1223 mod/editpost.php:83
-msgid "set location"
-msgstr "spéc. localisation"
+#: include/enotify.php:427
+msgid "registration request"
+msgstr "demande d'inscription"
 
-#: include/conversation.php:1224 mod/editpost.php:84
-msgid "Clear browser location"
-msgstr "Effacer la localisation du navigateur"
+#: include/enotify.php:429
+#, php-format
+msgid "You've received a registration request from '%1$s' at %2$s"
+msgstr "Vous avez reçu une demande d'inscription de %1$s sur %2$s"
 
-#: include/conversation.php:1225 mod/editpost.php:85
-msgid "clear location"
-msgstr "supp. localisation"
+#: include/enotify.php:430
+#, php-format
+msgid "You've received a [url=%1$s]registration request[/url] from %2$s."
+msgstr "%2$s vous a envoyé une [url=%1$s]demande de création de compte[/url]."
 
-#: include/conversation.php:1227 mod/editpost.php:99
-msgid "Set title"
-msgstr "Définir un titre"
+#: include/enotify.php:435
+#, php-format
+msgid ""
+"Full Name:\t%s\n"
+"Site Location:\t%s\n"
+"Login Name:\t%s (%s)"
+msgstr "Nom complet :\t%s\nAdresse du site :\t%s\nIdentifiant :\t%s (%s)"
 
-#: include/conversation.php:1229 mod/editpost.php:101
-msgid "Categories (comma-separated list)"
-msgstr "Catégories (séparées par des virgules)"
+#: include/enotify.php:441
+#, php-format
+msgid "Please visit %s to approve or reject the request."
+msgstr "Veuillez visiter %s pour approuver ou rejeter la demande."
 
-#: include/conversation.php:1231 mod/editpost.php:87
-msgid "Permission settings"
-msgstr "Réglages des permissions"
+#: include/api.php:1119
+#, 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 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/conversation.php:1232 mod/editpost.php:116
-msgid "permissions"
-msgstr "permissions"
+#: include/api.php:1133
+#, 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] "Limite hebdomadaire d'%d unique publication atteinte, votre soumission a été rejetée."
+msgstr[1] "Limite hebdomadaire de %d publications atteinte, votre soumission a été rejetée."
 
-#: include/conversation.php:1241 mod/editpost.php:96
-msgid "Public post"
-msgstr "Publication publique"
+#: include/api.php:1147
+#, php-format
+msgid "Monthly posting limit of %d post reached. The post was rejected."
+msgstr "La limite mensuelle de%d publication est atteinte. Votre publication a été rejetée."
 
-#: include/conversation.php:1245 mod/editpost.php:107 mod/events.php:549
-#: mod/photos.php:1424 mod/photos.php:1463 mod/photos.php:1523
-#: src/Object/Post.php:887
-msgid "Preview"
-msgstr "Aperçu"
+#: include/api.php:4587 mod/photos.php:91 mod/photos.php:196
+#: mod/photos.php:640 mod/photos.php:1090 mod/photos.php:1107
+#: mod/photos.php:1610 mod/profile_photo.php:85 mod/profile_photo.php:94
+#: mod/profile_photo.php:103 mod/profile_photo.php:210
+#: mod/profile_photo.php:298 mod/profile_photo.php:308 src/Model/User.php:796
+#: src/Model/User.php:804 src/Model/User.php:812
+msgid "Profile Photos"
+msgstr "Photos du profil"
 
-#: include/conversation.php:1249 include/items.php:397
-#: mod/dfrn_request.php:650 mod/editpost.php:110 mod/fbrowser.php:110
-#: mod/fbrowser.php:139 mod/follow.php:172 mod/message.php:153
-#: mod/photos.php:1076 mod/photos.php:1183 mod/settings.php:675
-#: mod/settings.php:701 mod/suggest.php:76 mod/tagrm.php:20 mod/tagrm.php:115
-#: mod/unfollow.php:132 src/Module/Contact.php:450
-msgid "Cancel"
-msgstr "Annuler"
+#: include/conversation.php:161 include/conversation.php:298
+#: src/Model/Item.php:3300
+msgid "event"
+msgstr "événement"
 
-#: include/conversation.php:1254
-msgid "Post to Groups"
-msgstr "Publier aux groupes"
+#: include/conversation.php:164 include/conversation.php:174
+#: include/conversation.php:301 include/conversation.php:310
+#: mod/subthread.php:88 mod/tagger.php:69
+msgid "status"
+msgstr "le statut"
 
-#: include/conversation.php:1255
-msgid "Post to Contacts"
-msgstr "Publier aux contacts"
+#: include/conversation.php:169 include/conversation.php:306
+#: mod/subthread.php:88 mod/tagger.php:69 src/Model/Item.php:3302
+msgid "photo"
+msgstr "photo"
 
-#: include/conversation.php:1256
-msgid "Private post"
-msgstr "Message privé"
+#: include/conversation.php:182
+#, php-format
+msgid "%1$s likes %2$s's %3$s"
+msgstr "%1$s aime %3$s de %2$s"
 
-#: include/conversation.php:1261 mod/editpost.php:114
-#: src/Model/Profile.php:366
-msgid "Message"
-msgstr "Message"
+#: include/conversation.php:184
+#, php-format
+msgid "%1$s doesn't like %2$s's %3$s"
+msgstr "%1$s n'aime pas %3$s de %2$s"
 
-#: include/conversation.php:1262 mod/editpost.php:115
-msgid "Browser"
-msgstr "Navigateur"
+#: include/conversation.php:186
+#, php-format
+msgid "%1$s attends %2$s's %3$s"
+msgstr "%1$s participe à %3$s de %2$s"
 
-#: include/conversation.php:1534
-msgid "View all"
-msgstr "Voir tout"
+#: include/conversation.php:188
+#, php-format
+msgid "%1$s doesn't attend %2$s's %3$s"
+msgstr "%1$s ne participe pas à %3$s de %2$s"
 
-#: include/conversation.php:1558
-msgid "Like"
-msgid_plural "Likes"
-msgstr[0] "Like"
-msgstr[1] "Likes"
+#: include/conversation.php:190
+#, php-format
+msgid "%1$s attends maybe %2$s's %3$s"
+msgstr "%1$s participe peut-être à %3$s de %2$s"
 
-#: include/conversation.php:1561
-msgid "Dislike"
-msgid_plural "Dislikes"
-msgstr[0] "Dislike"
-msgstr[1] "Dislikes"
-
-#: include/conversation.php:1567
-msgid "Not Attending"
-msgid_plural "Not Attending"
-msgstr[0] "Ne participe pas"
-msgstr[1] "Ne participent pas"
+#: include/conversation.php:225
+#, php-format
+msgid "%1$s is now friends with %2$s"
+msgstr "%1$s est désormais lié à %2$s"
 
-#: include/conversation.php:1570 src/Content/ContactSelector.php:167
-msgid "Undecided"
-msgid_plural "Undecided"
-msgstr[0] "Indécis"
-msgstr[1] "Indécis"
+#: include/conversation.php:266
+#, php-format
+msgid "%1$s poked %2$s"
+msgstr "%1$s a sollicité %2$s"
 
-#: include/enotify.php:57
-msgid "Friendica Notification"
-msgstr "Notification Friendica"
+#: include/conversation.php:320 mod/tagger.php:102
+#, php-format
+msgid "%1$s tagged %2$s's %3$s with %4$s"
+msgstr "%1$s a étiqueté %3$s de %2$s avec %4$s"
 
-#: include/enotify.php:60
-msgid "Thank You,"
-msgstr "Merci, "
+#: include/conversation.php:342
+msgid "post/item"
+msgstr "publication/élément"
 
-#: include/enotify.php:63
+#: include/conversation.php:343
 #, php-format
-msgid "%1$s, %2$s Administrator"
-msgstr "%1$s,, l'administrateur de %2$s"
+msgid "%1$s marked %2$s's %3$s as favorite"
+msgstr "%1$s a marqué le %3$s de %2$s comme favori"
 
-#: include/enotify.php:65
-#, php-format
-msgid "%s Administrator"
-msgstr "L'administrateur de %s"
+#: include/conversation.php:569 mod/profiles.php:352 mod/photos.php:1442
+msgid "Likes"
+msgstr "Derniers \"J'aime\""
 
-#: include/enotify.php:134
-#, php-format
-msgid "[Friendica:Notify] New mail received at %s"
-msgstr "[Friendica:Notification] Nouveau courriel reçu sur %s"
+#: include/conversation.php:570 mod/profiles.php:355 mod/photos.php:1442
+msgid "Dislikes"
+msgstr "Derniers \"Je n'aime pas\""
 
-#: include/enotify.php:136
-#, php-format
-msgid "%1$s sent you a new private message at %2$s."
-msgstr "%1$s vous a envoyé un nouveau message privé sur %2$s."
+#: include/conversation.php:571 include/conversation.php:1565
+#: mod/photos.php:1443
+msgid "Attending"
+msgid_plural "Attending"
+msgstr[0] "Participe"
+msgstr[1] "Participent"
 
-#: include/enotify.php:137
-msgid "a private message"
-msgstr "un message privé"
+#: include/conversation.php:572 mod/photos.php:1443
+msgid "Not attending"
+msgstr "Ne participe pas"
 
-#: include/enotify.php:137
-#, php-format
-msgid "%1$s sent you %2$s."
-msgstr "%1$s vous a envoyé %2$s."
+#: include/conversation.php:573 mod/photos.php:1443
+msgid "Might attend"
+msgstr "Participera peut-être"
 
-#: include/enotify.php:139
-#, php-format
-msgid "Please visit %s to view and/or reply to your private messages."
-msgstr "Merci de visiter %s pour voir vos messages privés et/ou y répondre."
+#: include/conversation.php:574
+msgid "Reshares"
+msgstr "Partages"
 
-#: include/enotify.php:172
-#, php-format
-msgid "%1$s tagged you on [url=%2$s]a %3$s[/url]"
-msgstr "%1$s vous a mentionné•e sur [url=%2$s]un•e %3$s[/url]"
+#: include/conversation.php:654 mod/photos.php:1499 src/Object/Post.php:209
+msgid "Select"
+msgstr "Sélectionner"
 
-#: include/enotify.php:178
-#, php-format
-msgid "%1$s commented on [url=%2$s]a %3$s[/url]"
-msgstr "%1$s a commenté sur [url=%2$s]un %3$s[/url]"
+#: include/conversation.php:655 mod/photos.php:1500 mod/settings.php:738
+#: src/Module/Admin/Users.php:288 src/Module/Contact.php:830
+#: src/Module/Contact.php:1101
+msgid "Delete"
+msgstr "Supprimer"
 
-#: include/enotify.php:188
+#: include/conversation.php:680 src/Object/Post.php:383
+#: src/Object/Post.php:384
 #, php-format
-msgid "%1$s tagged you on [url=%2$s]%3$s's %4$s[/url]"
-msgstr "%1$s vous a mentionné•e sur [url=%2$s]un•e %4$s de %3$s [/url]"
+msgid "View %s's profile @ %s"
+msgstr "Voir le profil de %s @ %s"
 
-#: include/enotify.php:195
-#, php-format
-msgid "%1$s commented on [url=%2$s]%3$s's %4$s[/url]"
-msgstr "%1$s a commenté sur [url=%2$s]le %4$s de %3$s[/url]"
+#: include/conversation.php:693 src/Object/Post.php:371
+msgid "Categories:"
+msgstr "Catégories :"
 
-#: include/enotify.php:207
-#, php-format
-msgid "%1$s tagged you on [url=%2$s]your %3$s[/url]"
-msgstr "%1$s vous a mentionné•e sur [url=%2$s]votre %3$s[/url]"
+#: include/conversation.php:694 src/Object/Post.php:372
+msgid "Filed under:"
+msgstr "Rangé sous :"
 
-#: include/enotify.php:213
+#: include/conversation.php:701 src/Object/Post.php:397
 #, php-format
-msgid "%1$s commented on [url=%2$s]your %3$s[/url]"
-msgstr "%1$s commented on [url=%2$s]your %3$s[/url]"
+msgid "%s from %s"
+msgstr "%s de %s"
 
-#: include/enotify.php:224
-#, php-format
-msgid "%1$s tagged you on [url=%2$s]their %3$s[/url]"
-msgstr "%1$s vous a mentionné•e sur [url=%2$s]leur %3$s[/url]"
+#: include/conversation.php:716
+msgid "View in context"
+msgstr "Voir dans le contexte"
 
-#: include/enotify.php:230
-#, php-format
-msgid "%1$s commented on [url=%2$s]their %3$s[/url]"
-msgstr "%1$s a commenté sur [url=%2$s]leur %3$s[/url]"
+#: include/conversation.php:718 include/conversation.php:1231
+#: mod/wallmessage.php:141 mod/editpost.php:86 mod/message.php:260
+#: mod/message.php:442 mod/photos.php:1415 src/Module/Item/Compose.php:193
+#: src/Object/Post.php:424
+msgid "Please wait"
+msgstr "Patientez"
 
-#: include/enotify.php:243
+#: include/conversation.php:782
+msgid "remove"
+msgstr "enlever"
+
+#: include/conversation.php:786
+msgid "Delete Selected Items"
+msgstr "Supprimer les éléments sélectionnés"
+
+#: include/conversation.php:941 view/theme/frio/theme.php:363
+msgid "Follow Thread"
+msgstr "Suivre le fil"
+
+#: include/conversation.php:942 src/Model/Contact.php:1198
+msgid "View Status"
+msgstr "Voir les statuts"
+
+#: include/conversation.php:943 include/conversation.php:961 mod/match.php:87
+#: mod/suggest.php:87 src/Model/Contact.php:1138 src/Model/Contact.php:1191
+#: src/Model/Contact.php:1199 src/Module/AllFriends.php:74
+#: src/Module/BaseSearchModule.php:133 src/Module/Directory.php:150
+msgid "View Profile"
+msgstr "Voir le profil"
+
+#: include/conversation.php:944 src/Model/Contact.php:1200
+msgid "View Photos"
+msgstr "Voir les photos"
+
+#: include/conversation.php:945 src/Model/Contact.php:1192
+#: src/Model/Contact.php:1201
+msgid "Network Posts"
+msgstr "Publications du réseau"
+
+#: include/conversation.php:946 src/Model/Contact.php:1193
+#: src/Model/Contact.php:1202
+msgid "View Contact"
+msgstr "Voir Contact"
+
+#: include/conversation.php:947 src/Model/Contact.php:1204
+msgid "Send PM"
+msgstr "Message privé"
+
+#: include/conversation.php:948 src/Module/Admin/Blocklist/Contact.php:67
+#: src/Module/Admin/Users.php:289 src/Module/Contact.php:623
+#: src/Module/Contact.php:827 src/Module/Contact.php:1076
+msgid "Block"
+msgstr "Bloquer"
+
+#: include/conversation.php:949 mod/notifications.php:60
+#: mod/notifications.php:189 mod/notifications.php:282
+#: src/Module/Contact.php:624 src/Module/Contact.php:828
+#: src/Module/Contact.php:1084
+msgid "Ignore"
+msgstr "Ignorer"
+
+#: include/conversation.php:953 src/Model/Contact.php:1205
+msgid "Poke"
+msgstr "Sollicitations (pokes)"
+
+#: include/conversation.php:958 mod/match.php:88 mod/follow.php:160
+#: mod/suggest.php:88 view/theme/vier/theme.php:201 src/Content/Widget.php:66
+#: src/Model/Contact.php:1194 src/Module/AllFriends.php:75
+#: src/Module/BaseSearchModule.php:134
+msgid "Connect/Follow"
+msgstr "Se connecter/Suivre"
+
+#: include/conversation.php:1083
 #, php-format
-msgid "[Friendica:Notify] %s tagged you"
-msgstr "[Friendica:Notification] %s vous a étiqueté"
+msgid "%s likes this."
+msgstr "%s aime ça."
 
-#: include/enotify.php:245
+#: include/conversation.php:1086
 #, php-format
-msgid "%1$s tagged you at %2$s"
-msgstr "%1$s vous a étiqueté sur %2$s"
+msgid "%s doesn't like this."
+msgstr "%s n'aime pas ça."
 
-#: include/enotify.php:247
+#: include/conversation.php:1089
 #, php-format
-msgid "[Friendica:Notify] Comment to conversation #%1$d by %2$s"
-msgstr "[Friendica:Notification] Commentaire de %2$s sur la conversation #%1$d"
+msgid "%s attends."
+msgstr "%s participe"
 
-#: include/enotify.php:249
+#: include/conversation.php:1092
 #, php-format
-msgid "%s commented on an item/conversation you have been following."
-msgstr "%s a commenté un élément que vous suivez."
+msgid "%s doesn't attend."
+msgstr "%s ne participe pas"
 
-#: include/enotify.php:254 include/enotify.php:269 include/enotify.php:284
-#: include/enotify.php:303 include/enotify.php:319
+#: include/conversation.php:1095
 #, php-format
-msgid "Please visit %s to view and/or reply to the conversation."
-msgstr "Merci de visiter %s pour voir la conversation et/ou y répondre."
+msgid "%s attends maybe."
+msgstr "%s participe peut-être"
 
-#: include/enotify.php:261
+#: include/conversation.php:1098 include/conversation.php:1141
 #, php-format
-msgid "[Friendica:Notify] %s posted to your profile wall"
-msgstr "[Friendica:Notification] %s a posté sur votre mur"
+msgid "%s reshared this."
+msgstr "%sa partagé ceci."
 
-#: include/enotify.php:263
+#: include/conversation.php:1106
+msgid "and"
+msgstr "et"
+
+#: include/conversation.php:1112
 #, php-format
-msgid "%1$s posted to your profile wall at %2$s"
-msgstr "%1$s a publié sur votre mur à %2$s"
+msgid "and %d other people"
+msgstr "et %dautres personnes"
 
-#: include/enotify.php:264
+#: include/conversation.php:1120
 #, php-format
-msgid "%1$s posted to [url=%2$s]your wall[/url]"
-msgstr "%1$s a posté sur [url=%2$s]votre mur[/url]"
+msgid "<span  %1$s>%2$d people</span> like this"
+msgstr "<span  %1$s>%2$d personnes</span> aiment ça"
 
-#: include/enotify.php:276
+#: include/conversation.php:1121
 #, php-format
-msgid "[Friendica:Notify] %s shared a new post"
-msgstr "[Friendica:Notification] %s partage une nouvelle publication"
+msgid "%s like this."
+msgstr "%s aime ça."
 
-#: include/enotify.php:278
+#: include/conversation.php:1124
 #, php-format
-msgid "%1$s shared a new post at %2$s"
-msgstr "%1$s a partagé une nouvelle publication sur %2$s"
+msgid "<span  %1$s>%2$d people</span> don't like this"
+msgstr "<span  %1$s>%2$d personnes</span> n'aiment pas ça"
 
-#: include/enotify.php:279
+#: include/conversation.php:1125
 #, php-format
-msgid "%1$s [url=%2$s]shared a post[/url]."
-msgstr "%1$s [url=%2$s]partage une publication[/url]."
+msgid "%s don't like this."
+msgstr "%s n'aiment pas ça."
 
-#: include/enotify.php:291
+#: include/conversation.php:1128
 #, php-format
-msgid "[Friendica:Notify] %1$s poked you"
-msgstr "[Friendica:Notify] %1$s vous a sollicité"
+msgid "<span  %1$s>%2$d people</span> attend"
+msgstr "<span %1$s>%2$d personnes</span> participent"
 
-#: include/enotify.php:293
+#: include/conversation.php:1129
 #, php-format
-msgid "%1$s poked you at %2$s"
-msgstr "%1$s vous a sollicité via %2$s"
+msgid "%s attend."
+msgstr "%s participent."
 
-#: include/enotify.php:294
+#: include/conversation.php:1132
 #, php-format
-msgid "%1$s [url=%2$s]poked you[/url]."
-msgstr "%1$s vous a [url=%2$s]sollicité[/url]."
+msgid "<span  %1$s>%2$d people</span> don't attend"
+msgstr "<span  %1$s>%2$d personnes</span> ne participent pas"
 
-#: include/enotify.php:311
+#: include/conversation.php:1133
 #, php-format
-msgid "[Friendica:Notify] %s tagged your post"
-msgstr "[Friendica:Notification] %s a étiqueté votre publication"
+msgid "%s don't attend."
+msgstr "%s ne participent pas."
 
-#: include/enotify.php:313
+#: include/conversation.php:1136
 #, php-format
-msgid "%1$s tagged your post at %2$s"
-msgstr "%1$s a étiqueté votre publication sur %2$s"
+msgid "<span  %1$s>%2$d people</span> attend maybe"
+msgstr "<span  %1$s>%2$d personnes</span> vont peut-être participer"
 
-#: include/enotify.php:314
+#: include/conversation.php:1137
 #, php-format
-msgid "%1$s tagged [url=%2$s]your post[/url]"
-msgstr "%1$s a étiqueté [url=%2$s]votre publication[/url]"
+msgid "%s attend maybe."
+msgstr "%sparticipent peut-être"
 
-#: include/enotify.php:326
-msgid "[Friendica:Notify] Introduction received"
-msgstr "[Friendica:Notification] Introduction reçue"
-
-#: include/enotify.php:328
+#: include/conversation.php:1140
 #, php-format
-msgid "You've received an introduction from '%1$s' at %2$s"
-msgstr "Vous avez reçu une introduction de '%1$s' sur %2$s"
+msgid "<span  %1$s>%2$d people</span> reshared this"
+msgstr "<span  %1$s>%2$dpersonnes</span>ont partagé ceci"
 
-#: include/enotify.php:329
-#, php-format
-msgid "You've received [url=%1$s]an introduction[/url] from %2$s."
-msgstr "Vous avez reçu [url=%1$s]une introduction[/url] de %2$s."
+#: include/conversation.php:1170
+msgid "Visible to <strong>everybody</strong>"
+msgstr "Visible par <strong>tout le monde</strong>"
 
-#: include/enotify.php:334 include/enotify.php:380
-#, php-format
-msgid "You may visit their profile at %s"
-msgstr "Vous pouvez visiter son profil sur %s"
+#: include/conversation.php:1171 src/Module/Item/Compose.php:187
+#: src/Object/Post.php:887
+msgid "Please enter a image/video/audio/webpage URL:"
+msgstr "Veuillez entrer une URL d'image/vidéo/page web."
 
-#: include/enotify.php:336
-#, php-format
-msgid "Please visit %s to approve or reject the introduction."
-msgstr "Merci de visiter %s pour approuver ou rejeter l'introduction."
+#: include/conversation.php:1172
+msgid "Tag term:"
+msgstr "Étiquette :"
 
-#: include/enotify.php:343
-msgid "[Friendica:Notify] A new person is sharing with you"
-msgstr "[Notification Friendica] Une nouvelle personne partage avec vous"
+#: include/conversation.php:1173 src/Module/Filer/SaveTag.php:48
+msgid "Save to Folder:"
+msgstr "Sauver dans le Dossier :"
 
-#: include/enotify.php:345 include/enotify.php:346
-#, php-format
-msgid "%1$s is sharing with you at %2$s"
-msgstr "%1$s partage avec vous sur %2$s"
+#: include/conversation.php:1174
+msgid "Where are you right now?"
+msgstr "Où êtes-vous actuellement ?"
 
-#: include/enotify.php:353
-msgid "[Friendica:Notify] You have a new follower"
-msgstr "[Friendica:Notification] Vous avez un nouvel abonné"
+#: include/conversation.php:1175
+msgid "Delete item(s)?"
+msgstr "Supprimer les élément(s) ?"
 
-#: include/enotify.php:355 include/enotify.php:356
-#, php-format
-msgid "You have a new follower at %2$s : %1$s"
-msgstr "Vous avez un nouvel abonné à %2$s : %1$s"
+#: include/conversation.php:1207
+msgid "New Post"
+msgstr "Nouvelle publication"
 
-#: include/enotify.php:369
-msgid "[Friendica:Notify] Friend suggestion received"
-msgstr "[Friendica:Notification] Nouvelle suggestion d'amitié"
+#: include/conversation.php:1210
+msgid "Share"
+msgstr "Partager"
 
-#: include/enotify.php:371
-#, php-format
-msgid "You've received a friend suggestion from '%1$s' at %2$s"
-msgstr "Vous avez reçu une suggestion de '%1$s' sur %2$s"
+#: include/conversation.php:1211 mod/wallmessage.php:139 mod/editpost.php:72
+#: mod/message.php:258 mod/message.php:439
+msgid "Upload photo"
+msgstr "Joindre photo"
 
-#: include/enotify.php:372
-#, php-format
-msgid ""
-"You've received [url=%1$s]a friend suggestion[/url] for %2$s from %3$s."
-msgstr "Vous avez reçu [url=%1$s]une suggestion[/url] de %3$s pour %2$s."
+#: include/conversation.php:1212 mod/editpost.php:73
+msgid "upload photo"
+msgstr "envoi image"
 
-#: include/enotify.php:378
-msgid "Name:"
-msgstr "Nom :"
+#: include/conversation.php:1213 mod/editpost.php:74
+msgid "Attach file"
+msgstr "Joindre fichier"
 
-#: include/enotify.php:379
-msgid "Photo:"
-msgstr "Photo :"
+#: include/conversation.php:1214 mod/editpost.php:75
+msgid "attach file"
+msgstr "ajout fichier"
 
-#: include/enotify.php:382
-#, php-format
-msgid "Please visit %s to approve or reject the suggestion."
-msgstr "Merci de visiter %s pour approuver ou rejeter la suggestion."
+#: include/conversation.php:1215 src/Module/Item/Compose.php:179
+#: src/Object/Post.php:879
+msgid "Bold"
+msgstr "Gras"
 
-#: include/enotify.php:390 include/enotify.php:405
-msgid "[Friendica:Notify] Connection accepted"
-msgstr "[Friendica:Notification] Connexion acceptée"
+#: include/conversation.php:1216 src/Module/Item/Compose.php:180
+#: src/Object/Post.php:880
+msgid "Italic"
+msgstr "Italique"
 
-#: include/enotify.php:392 include/enotify.php:407
-#, php-format
-msgid "'%1$s' has accepted your connection request at %2$s"
-msgstr "'%1$s' a accepté votre demande de connexion à %2$s"
+#: include/conversation.php:1217 src/Module/Item/Compose.php:181
+#: src/Object/Post.php:881
+msgid "Underline"
+msgstr "Souligné"
 
-#: include/enotify.php:393 include/enotify.php:408
-#, php-format
-msgid "%2$s has accepted your [url=%1$s]connection request[/url]."
-msgstr "%2$s a accepté votre [url=%1$s]demande de connexion[/url]."
+#: include/conversation.php:1218 src/Module/Item/Compose.php:182
+#: src/Object/Post.php:882
+msgid "Quote"
+msgstr "Citation"
 
-#: include/enotify.php:398
-msgid ""
-"You are now mutual friends and may exchange status updates, photos, and "
-"email without restriction."
-msgstr "Vous êtes désormais mutuellement amis, et pouvez échanger des mises-à-jour d'état, des photos, et des messages sans restriction."
+#: include/conversation.php:1219 src/Module/Item/Compose.php:183
+#: src/Object/Post.php:883
+msgid "Code"
+msgstr "Code"
 
-#: include/enotify.php:400
-#, php-format
-msgid "Please visit %s if you wish to make any changes to this relationship."
-msgstr "Veuillez visiter %s si vous souhaitez modifier cette relation."
+#: include/conversation.php:1220 src/Module/Item/Compose.php:184
+#: src/Object/Post.php:884
+msgid "Image"
+msgstr "Image"
 
-#: include/enotify.php:413
-#, php-format
-msgid ""
-"'%1$s' has chosen to accept you a fan, which restricts some forms of "
-"communication - such as private messaging and some profile interactions. If "
-"this is a celebrity or community page, these settings were applied "
-"automatically."
-msgstr "'%1$s' a choisi de vous accepter comme fan ce qui empêche certains canaux de communication tel les messages privés et certaines interactions de profil. Ceci est une page de célébrité ou de communauté, ces paramètres ont été appliqués automatiquement."
+#: include/conversation.php:1221 src/Module/Item/Compose.php:185
+#: src/Object/Post.php:885
+msgid "Link"
+msgstr "Lien"
 
-#: include/enotify.php:415
-#, php-format
-msgid ""
-"'%1$s' may choose to extend this into a two-way or more permissive "
-"relationship in the future."
-msgstr "%1$s peut choisir à l'avenir de rendre cette relation réciproque ou au moins plus permissive."
+#: include/conversation.php:1222 src/Module/Item/Compose.php:186
+#: src/Object/Post.php:886
+msgid "Link or Media"
+msgstr "Lien ou média"
 
-#: include/enotify.php:417
-#, php-format
-msgid "Please visit %s  if you wish to make any changes to this relationship."
-msgstr "Veuillez visiter %s si vous souhaitez modifier cette relation."
+#: include/conversation.php:1223 mod/editpost.php:82
+#: src/Module/Item/Compose.php:189
+msgid "Set your location"
+msgstr "Définir votre localisation"
 
-#: include/enotify.php:427 mod/removeme.php:46
-msgid "[Friendica System Notify]"
-msgstr "[Friendica Notification Sytème]"
+#: include/conversation.php:1224 mod/editpost.php:83
+msgid "set location"
+msgstr "spéc. localisation"
 
-#: include/enotify.php:427
-msgid "registration request"
-msgstr "demande d'inscription"
+#: include/conversation.php:1225 mod/editpost.php:84
+msgid "Clear browser location"
+msgstr "Effacer la localisation du navigateur"
 
-#: include/enotify.php:429
-#, php-format
-msgid "You've received a registration request from '%1$s' at %2$s"
-msgstr "Vous avez reçu une demande d'inscription de %1$s sur %2$s"
+#: include/conversation.php:1226 mod/editpost.php:85
+msgid "clear location"
+msgstr "supp. localisation"
 
-#: include/enotify.php:430
-#, php-format
-msgid "You've received a [url=%1$s]registration request[/url] from %2$s."
-msgstr "%2$s vous a envoyé une [url=%1$s]demande de création de compte[/url]."
+#: include/conversation.php:1228 mod/editpost.php:99
+#: src/Module/Item/Compose.php:194
+msgid "Set title"
+msgstr "Définir un titre"
 
-#: include/enotify.php:435
-#, php-format
-msgid ""
-"Full Name:\t%s\n"
-"Site Location:\t%s\n"
-"Login Name:\t%s (%s)"
-msgstr "Nom complet :\t%s\nAdresse du site :\t%s\nIdentifiant :\t%s (%s)"
+#: include/conversation.php:1230 mod/editpost.php:101
+#: src/Module/Item/Compose.php:195
+msgid "Categories (comma-separated list)"
+msgstr "Catégories (séparées par des virgules)"
 
-#: include/enotify.php:441
-#, php-format
-msgid "Please visit %s to approve or reject the request."
-msgstr "Veuillez visiter %s pour approuver ou rejeter la demande."
+#: include/conversation.php:1232 mod/editpost.php:87
+msgid "Permission settings"
+msgstr "Réglages des permissions"
+
+#: include/conversation.php:1233 mod/editpost.php:116
+msgid "permissions"
+msgstr "permissions"
+
+#: include/conversation.php:1242 mod/editpost.php:96
+msgid "Public post"
+msgstr "Publication publique"
+
+#: include/conversation.php:1246 mod/editpost.php:107 mod/events.php:550
+#: mod/photos.php:1433 mod/photos.php:1472 mod/photos.php:1532
+#: src/Module/Item/Compose.php:188 src/Object/Post.php:888
+msgid "Preview"
+msgstr "Aperçu"
+
+#: include/conversation.php:1250 include/items.php:397 mod/tagrm.php:20
+#: mod/tagrm.php:115 mod/unfollow.php:132 mod/dfrn_request.php:650
+#: mod/editpost.php:110 mod/fbrowser.php:110 mod/fbrowser.php:139
+#: mod/follow.php:174 mod/message.php:153 mod/photos.php:1084
+#: mod/photos.php:1191 mod/settings.php:678 mod/settings.php:704
+#: mod/suggest.php:76 src/Module/Contact.php:464
+msgid "Cancel"
+msgstr "Annuler"
+
+#: include/conversation.php:1255
+msgid "Post to Groups"
+msgstr "Publier aux groupes"
+
+#: include/conversation.php:1256
+msgid "Post to Contacts"
+msgstr "Publier aux contacts"
+
+#: include/conversation.php:1257
+msgid "Private post"
+msgstr "Message privé"
+
+#: include/conversation.php:1262 mod/editpost.php:114
+#: src/Model/Profile.php:542 src/Module/Contact.php:339
+msgid "Message"
+msgstr "Message"
+
+#: include/conversation.php:1263 mod/editpost.php:115
+msgid "Browser"
+msgstr "Navigateur"
+
+#: include/conversation.php:1535
+msgid "View all"
+msgstr "Voir tout"
+
+#: include/conversation.php:1559
+msgid "Like"
+msgid_plural "Likes"
+msgstr[0] "Like"
+msgstr[1] "Likes"
+
+#: include/conversation.php:1562
+msgid "Dislike"
+msgid_plural "Dislikes"
+msgstr[0] "Dislike"
+msgstr[1] "Dislikes"
+
+#: include/conversation.php:1568
+msgid "Not Attending"
+msgid_plural "Not Attending"
+msgstr[0] "Ne participe pas"
+msgstr[1] "Ne participent pas"
+
+#: include/conversation.php:1571 src/Content/ContactSelector.php:167
+msgid "Undecided"
+msgid_plural "Undecided"
+msgstr[0] "Indécis"
+msgstr[1] "Indécis"
 
-#: include/items.php:354 mod/notice.php:19
-#: src/Module/Admin/Themes/Details.php:53 src/Module/Admin/Themes/Index.php:41
-#: src/Module/ItemBody.php:27 src/Module/ItemBody.php:40
+#: include/items.php:354 src/Module/Admin/Themes/Details.php:53
+#: src/Module/Admin/Themes/Index.php:41 src/Module/Debug/ItemBody.php:27
+#: src/Module/Debug/ItemBody.php:40
 msgid "Item not found."
 msgstr "Élément introuvable."
 
@@ -865,48 +878,41 @@ msgstr "Élément introuvable."
 msgid "Do you really want to delete this item?"
 msgstr "Voulez-vous vraiment supprimer cet élément ?"
 
-#: include/items.php:394 mod/api.php:109 mod/dfrn_request.php:640
-#: mod/follow.php:161 mod/message.php:150 mod/profiles.php:526
-#: mod/profiles.php:529 mod/profiles.php:551 mod/settings.php:1084
-#: mod/settings.php:1090 mod/settings.php:1097 mod/settings.php:1101
-#: mod/settings.php:1105 mod/settings.php:1109 mod/settings.php:1113
-#: mod/settings.php:1117 mod/settings.php:1137 mod/settings.php:1138
-#: mod/settings.php:1139 mod/settings.php:1140 mod/settings.php:1141
-#: mod/suggest.php:73 src/Module/Contact.php:447 src/Module/Register.php:97
+#: include/items.php:394 mod/api.php:109 mod/profiles.php:526
+#: mod/profiles.php:529 mod/profiles.php:551 mod/dfrn_request.php:640
+#: mod/follow.php:163 mod/message.php:150 mod/settings.php:1089
+#: mod/settings.php:1095 mod/settings.php:1102 mod/settings.php:1106
+#: mod/settings.php:1110 mod/settings.php:1114 mod/settings.php:1118
+#: mod/settings.php:1122 mod/settings.php:1142 mod/settings.php:1143
+#: mod/settings.php:1144 mod/settings.php:1145 mod/settings.php:1146
+#: mod/suggest.php:73 src/Module/Contact.php:461 src/Module/Register.php:97
 msgid "Yes"
 msgstr "Oui"
 
-#: include/items.php:444 mod/api.php:34 mod/api.php:39 mod/cal.php:301
-#: mod/common.php:27 mod/crepair.php:90 mod/delegate.php:30
-#: mod/delegate.php:48 mod/delegate.php:59 mod/dfrn_confirm.php:64
-#: mod/dirfind.php:29 mod/editpost.php:21 mod/events.php:207 mod/follow.php:57
-#: mod/follow.php:132 mod/fsuggest.php:77 mod/item.php:169 mod/manage.php:130
-#: mod/message.php:56 mod/message.php:101 mod/network.php:36 mod/notes.php:27
-#: mod/notifications.php:70 mod/ostatus_subscribe.php:18 mod/photos.php:178
-#: mod/photos.php:958 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:50 mod/settings.php:163 mod/settings.php:664
-#: mod/suggest.php:39 mod/uimport.php:17 mod/unfollow.php:22
-#: 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/Module/Attach.php:42
-#: src/Module/Contact.php:362 src/Module/FollowConfirm.php:27
+#: include/items.php:444 mod/api.php:34 mod/api.php:39 mod/delegate.php:30
+#: mod/delegate.php:48 mod/delegate.php:59 mod/ostatus_subscribe.php:18
+#: mod/regmod.php:89 mod/repair_ostatus.php:16 mod/uimport.php:17
+#: mod/unfollow.php:22 mod/unfollow.php:77 mod/unfollow.php:109
+#: 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 mod/profiles.php:182
+#: mod/profiles.php:499 mod/cal.php:301 mod/common.php:27 mod/crepair.php:90
+#: mod/dfrn_confirm.php:64 mod/editpost.php:21 mod/events.php:208
+#: mod/follow.php:57 mod/follow.php:134 mod/fsuggest.php:63 mod/item.php:170
+#: mod/manage.php:130 mod/message.php:56 mod/message.php:101
+#: mod/network.php:37 mod/notes.php:27 mod/notifications.php:70
+#: mod/photos.php:178 mod/photos.php:962 mod/poke.php:141
+#: mod/profile_photo.php:32 mod/profile_photo.php:177
+#: mod/profile_photo.php:197 mod/settings.php:52 mod/settings.php:165
+#: mod/settings.php:667 mod/suggest.php:39 src/Module/Attach.php:42
+#: src/Module/Contact.php:378 src/Module/FollowConfirm.php:27
 #: src/Module/Group.php:31 src/Module/Group.php:77 src/Module/Invite.php:22
-#: src/Module/Invite.php:110 src/Module/Register.php:192
+#: src/Module/Invite.php:110 src/Module/Notifications/Notify.php:19
+#: src/Module/Profile/Contacts.php:50 src/Module/Register.php:192
+#: src/Module/Search/Directory.php:17
 msgid "Permission denied."
 msgstr "Permission refusée."
 
-#: include/items.php:515 src/Content/Feature.php:99
-msgid "Archives"
-msgstr "Archives"
-
-#: include/items.php:521 src/Content/ForumManager.php:135
-#: src/Content/Widget.php:329 view/theme/vier/theme.php:255
-msgid "show more"
-msgstr "montrer plus"
-
 #: mod/api.php:84 mod/api.php:106
 msgid "Authorize application connection"
 msgstr "Autoriser l'application à se connecter"
@@ -915,7 +921,7 @@ msgstr "Autoriser l'application à se connecter"
 msgid "Return to your app and insert this Securty Code:"
 msgstr "Retournez à votre application et saisissez ce Code de Sécurité : "
 
-#: mod/api.php:94
+#: mod/api.php:94 src/Module/BaseAdminModule.php:56
 msgid "Please login to continue."
 msgstr "Merci de vous connecter pour continuer."
 
@@ -925,263 +931,32 @@ msgid ""
 " and/or create new posts for you?"
 msgstr "Voulez-vous autoriser cette application à accéder à vos publications et contacts, et/ou à créer des billets à votre place?"
 
-#: mod/api.php:110 mod/dfrn_request.php:640 mod/follow.php:161
-#: mod/profiles.php:526 mod/profiles.php:530 mod/profiles.php:551
-#: mod/settings.php:1084 mod/settings.php:1090 mod/settings.php:1097
-#: mod/settings.php:1101 mod/settings.php:1105 mod/settings.php:1109
-#: mod/settings.php:1113 mod/settings.php:1117 mod/settings.php:1137
-#: mod/settings.php:1138 mod/settings.php:1139 mod/settings.php:1140
-#: mod/settings.php:1141 src/Module/Register.php:98
+#: mod/api.php:110 mod/profiles.php:526 mod/profiles.php:530
+#: mod/profiles.php:551 mod/dfrn_request.php:640 mod/follow.php:163
+#: mod/settings.php:1089 mod/settings.php:1095 mod/settings.php:1102
+#: mod/settings.php:1106 mod/settings.php:1110 mod/settings.php:1114
+#: mod/settings.php:1118 mod/settings.php:1122 mod/settings.php:1142
+#: mod/settings.php:1143 mod/settings.php:1144 mod/settings.php:1145
+#: mod/settings.php:1146 src/Module/Register.php:98
 msgid "No"
 msgstr "Non"
 
-#: mod/cal.php:34 mod/cal.php:38 mod/community.php:39 mod/follow.php:20
-#: mod/viewcontacts.php:23 mod/viewcontacts.php:27 src/Module/ItemBody.php:18
-msgid "Access denied."
-msgstr "Accès refusé."
+#: mod/delegate.php:42
+msgid "Parent user not found."
+msgstr "Compte parent inconnu."
 
-#: mod/cal.php:140 mod/display.php:306 src/Module/Profile.php:176
-msgid "Access to this profile has been restricted."
-msgstr "L'accès au profil a été restreint."
+#: mod/delegate.php:149
+msgid "No parent user"
+msgstr "Pas d'utilisateur parent"
 
-#: mod/cal.php:271 mod/events.php:382 src/Content/Nav.php:159
-#: src/Content/Nav.php:225 src/Model/Profile.php:931 src/Model/Profile.php:942
-#: view/theme/frio/theme.php:266 view/theme/frio/theme.php:270
-msgid "Events"
-msgstr "Événements"
+#: mod/delegate.php:164
+msgid "Parent Password:"
+msgstr "Mot de passe du compte parent :"
 
-#: mod/cal.php:272 mod/events.php:383
-msgid "View"
-msgstr "Vue"
-
-#: mod/cal.php:273 mod/events.php:385
-msgid "Previous"
-msgstr "Précédent"
-
-#: mod/cal.php:274 mod/events.php:386 src/Module/Install.php:173
-msgid "Next"
-msgstr "Suivant"
-
-#: mod/cal.php:277 mod/events.php:391 src/Model/Event.php:428
-msgid "today"
-msgstr "aujourd'hui"
-
-#: mod/cal.php:278 mod/events.php:392 src/Model/Event.php:429
-#: src/Util/Temporal.php:314
-msgid "month"
-msgstr "mois"
-
-#: mod/cal.php:279 mod/events.php:393 src/Model/Event.php:430
-#: src/Util/Temporal.php:315
-msgid "week"
-msgstr "semaine"
-
-#: mod/cal.php:280 mod/events.php:394 src/Model/Event.php:431
-#: src/Util/Temporal.php:316
-msgid "day"
-msgstr "jour"
-
-#: mod/cal.php:281 mod/events.php:395
-msgid "list"
-msgstr "liste"
-
-#: mod/cal.php:294 src/Console/NewPassword.php:67 src/Model/User.php:351
-msgid "User not found"
-msgstr "Utilisateur introuvable"
-
-#: mod/cal.php:310
-msgid "This calendar format is not supported"
-msgstr "Format de calendrier inconnu"
-
-#: mod/cal.php:312
-msgid "No exportable data found"
-msgstr "Rien à exporter"
-
-#: mod/cal.php:329
-msgid "calendar"
-msgstr "calendrier"
-
-#: mod/common.php:90
-msgid "No contacts in common."
-msgstr "Pas de contacts en commun."
-
-#: mod/common.php:141 src/Module/Contact.php:895
-msgid "Common Friends"
-msgstr "Amis communs"
-
-#: mod/community.php:32 mod/dfrn_request.php:597 mod/display.php:204
-#: mod/photos.php:846 mod/probe.php:14 mod/search.php:96 mod/search.php:102
-#: mod/videos.php:118 mod/viewcontacts.php:46 src/Module/Directory.php:43
-#: src/Module/WebFinger.php:19
-msgid "Public access denied."
-msgstr "Accès public refusé."
-
-#: mod/community.php:75
-msgid "Community option not available."
-msgstr "L'option communauté n'est pas disponible"
-
-#: mod/community.php:92
-msgid "Not available."
-msgstr "Indisponible."
-
-#: mod/community.php:102
-msgid "Local Community"
-msgstr "Communauté locale"
-
-#: mod/community.php:105
-msgid "Posts from local users on this server"
-msgstr "Conversations publiques démarrées par des utilisateurs locaux"
-
-#: mod/community.php:113
-msgid "Global Community"
-msgstr "Communauté globale"
-
-#: mod/community.php:116
-msgid "Posts from users of the whole federated network"
-msgstr "Conversations publiques provenant du réseau fédéré global"
-
-#: mod/community.php:162 mod/search.php:223
-msgid "No results."
-msgstr "Aucun résultat."
-
-#: mod/community.php:206
-msgid ""
-"This community stream shows all public posts received by this node. They may"
-" not reflect the opinions of this node’s users."
-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/crepair.php:79
-msgid "Contact settings applied."
-msgstr "Réglages du contact appliqués."
-
-#: mod/crepair.php:81
-msgid "Contact update failed."
-msgstr "Impossible d'appliquer les réglages."
-
-#: mod/crepair.php:102 mod/dfrn_confirm.php:125 mod/fsuggest.php:28
-#: mod/fsuggest.php:89 mod/redir.php:31 mod/redir.php:137
-#: src/Module/FollowConfirm.php:46 src/Module/Group.php:92
-msgid "Contact not found."
-msgstr "Contact introuvable."
-
-#: 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>ATTENTION: Manipulation réservée aux experts</strong>, toute information incorrecte pourrait empêcher la communication avec ce contact."
-
-#: 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 "une photo"
-
-#: mod/crepair.php:130 mod/crepair.php:132
-msgid "No mirroring"
-msgstr "Pas de miroir"
-
-#: mod/crepair.php:130
-msgid "Mirror as forwarded posting"
-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 "Refléter les publications de ce profil comme les vôtres"
-
-#: mod/crepair.php:145
-msgid "Return to contact editor"
-msgstr "Retour à l'éditeur de contact"
-
-#: mod/crepair.php:147
-msgid "Refetch contact data"
-msgstr "Récupérer à nouveau les données de contact"
-
-#: mod/crepair.php:149 mod/events.php:551 mod/fsuggest.php:106
-#: mod/manage.php:183 mod/message.php:261 mod/message.php:441
-#: mod/photos.php:987 mod/photos.php:1093 mod/photos.php:1378
-#: mod/photos.php:1423 mod/photos.php:1462 mod/photos.php:1522
-#: mod/poke.php:184 mod/profiles.php:562 src/Module/Contact.php:597
-#: src/Module/Install.php:211 src/Module/Install.php:251
-#: src/Module/Install.php:287 src/Module/Invite.php:157
-#: src/Module/Localtime.php:45 src/Object/Post.php:877
-#: view/theme/duepuntozero/config.php:72 view/theme/frio/config.php:121
-#: view/theme/quattro/config.php:74 view/theme/vier/config.php:120
-msgid "Submit"
-msgstr "Envoyer"
-
-#: mod/crepair.php:150
-msgid "Remote Self"
-msgstr "Identité à distance"
-
-#: mod/crepair.php:153
-msgid "Mirror postings from this contact"
-msgstr "Copier les publications de ce contact"
-
-#: mod/crepair.php:155
-msgid ""
-"Mark this contact as remote_self, this will cause friendica to repost new "
-"entries from this contact."
-msgstr "Marquer ce contact comme étant remote_self, friendica republiera alors les nouvelles entrées de ce contact."
-
-#: mod/crepair.php:159 mod/settings.php:676 mod/settings.php:702
-#: src/Module/Admin/Blocklist/Contact.php:72 src/Module/Admin/Users.php:272
-#: src/Module/Admin/Users.php:283 src/Module/Admin/Users.php:297
-#: src/Module/Admin/Users.php:313
-msgid "Name"
-msgstr "Nom"
-
-#: mod/crepair.php:160
-msgid "Account Nickname"
-msgstr "Pseudo du compte"
-
-#: mod/crepair.php:161
-msgid "@Tagname - overrides Name/Nickname"
-msgstr "@NomEtiquette - prend le pas sur Nom/Pseudo"
-
-#: mod/crepair.php:162
-msgid "Account URL"
-msgstr "URL du compte"
-
-#: mod/crepair.php:163
-msgid "Account URL Alias"
-msgstr "Alias d'URL du compte"
-
-#: mod/crepair.php:164
-msgid "Friend Request URL"
-msgstr "Echec du téléversement de l'image."
-
-#: mod/crepair.php:165
-msgid "Friend Confirm URL"
-msgstr "Accès public refusé."
-
-#: mod/crepair.php:166
-msgid "Notification Endpoint URL"
-msgstr "Aucune photo sélectionnée"
-
-#: mod/crepair.php:167
-msgid "Poll/Feed URL"
-msgstr "Téléverser des photos"
-
-#: mod/crepair.php:168
-msgid "New photo from this URL"
-msgstr "Nouvelle photo depuis cette URL"
-
-#: mod/delegate.php:42
-msgid "Parent user not found."
-msgstr "Compte parent inconnu."
-
-#: mod/delegate.php:149
-msgid "No parent user"
-msgstr "Pas d'utilisateur parent"
-
-#: mod/delegate.php:164
-msgid "Parent Password:"
-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 "Veuillez saisir le mot de passe du compte parent pour authentifier votre requête."
+#: mod/delegate.php:164
+msgid ""
+"Please enter the password of the parent account to legitimize your request."
+msgstr "Veuillez saisir le mot de passe du compte parent pour authentifier votre requête."
 
 #: mod/delegate.php:171
 msgid "Parent User"
@@ -1193,21 +968,21 @@ msgid ""
 "settings. Please double check whom you give this access."
 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:175 mod/settings.php:674 mod/settings.php:781
-#: mod/settings.php:869 mod/settings.php:948 mod/settings.php:1173
+#: mod/delegate.php:175 mod/settings.php:677 mod/settings.php:784
+#: mod/settings.php:874 mod/settings.php:953 mod/settings.php:1178
 #: src/Module/Admin/Addons/Index.php:52 src/Module/Admin/Features.php:69
-#: src/Module/Admin/Logs/Settings.php:59 src/Module/Admin/Site.php:570
+#: src/Module/Admin/Logs/Settings.php:65 src/Module/Admin/Site.php:569
 #: src/Module/Admin/Themes/Index.php:95 src/Module/Admin/Tos.php:50
 msgid "Save Settings"
 msgstr "Sauvegarder les paramètres"
 
-#: mod/delegate.php:176 src/Content/Nav.php:260
+#: mod/delegate.php:176 src/Content/Nav.php:263
 msgid "Delegate Page Management"
 msgstr "Déléguer la gestion de la page"
 
 #: mod/delegate.php:177
 msgid "Delegates"
-msgstr ""
+msgstr "Délégataires"
 
 #: mod/delegate.php:179
 msgid ""
@@ -1236,1896 +1011,2149 @@ msgstr "Ajouter"
 msgid "No entries."
 msgstr "Aucune entrée."
 
-#: mod/dfrn_confirm.php:70 mod/profiles.php:43 mod/profiles.php:152
-#: mod/profiles.php:196 mod/profiles.php:511
-msgid "Profile not found."
-msgstr "Profil introuvable."
+#: mod/oexchange.php:32
+msgid "Post successful."
+msgstr "Publication réussie."
 
-#: mod/dfrn_confirm.php:126
-msgid ""
-"This may occasionally happen if contact was requested by both persons and it"
-" has already been approved."
-msgstr "Ceci peut se produire lorsque le contact a été requis par les deux personnes et a déjà été approuvé."
+#: mod/ostatus_subscribe.php:23
+msgid "Subscribing to OStatus contacts"
+msgstr "Inscription aux contacts OStatus"
 
-#: mod/dfrn_confirm.php:227
-msgid "Response from remote site was not understood."
-msgstr "Réponse du site distant incomprise."
+#: mod/ostatus_subscribe.php:35
+msgid "No contact provided."
+msgstr "Pas de contact fourni."
 
-#: mod/dfrn_confirm.php:234 mod/dfrn_confirm.php:240
-msgid "Unexpected response from remote site: "
-msgstr "Réponse inattendue du site distant : "
+#: mod/ostatus_subscribe.php:42
+msgid "Couldn't fetch information for contact."
+msgstr "Impossible de récupérer les informations pour ce contact."
 
-#: mod/dfrn_confirm.php:249
-msgid "Confirmation completed successfully."
-msgstr "Confirmation achevée avec succès."
+#: mod/ostatus_subscribe.php:52
+msgid "Couldn't fetch friends for contact."
+msgstr "Impossible de récupérer les amis de ce contact."
 
-#: mod/dfrn_confirm.php:261
-msgid "Temporary failure. Please wait and try again."
-msgstr "Échec temporaire. Merci de recommencer ultérieurement."
+#: mod/ostatus_subscribe.php:70 mod/repair_ostatus.php:52
+msgid "Done"
+msgstr "Terminé"
 
-#: mod/dfrn_confirm.php:264
-msgid "Introduction failed or was revoked."
-msgstr "Introduction échouée ou annulée."
+#: mod/ostatus_subscribe.php:84
+msgid "success"
+msgstr "réussite"
 
-#: mod/dfrn_confirm.php:269
-msgid "Remote site reported: "
-msgstr "Alerte du site distant : "
+#: mod/ostatus_subscribe.php:86
+msgid "failed"
+msgstr "échec"
 
-#: mod/dfrn_confirm.php:374
-#, php-format
-msgid "No user record found for '%s' "
-msgstr "Pas d'utilisateur trouvé pour '%s' "
+#: mod/ostatus_subscribe.php:89 src/Object/Post.php:285
+msgid "ignored"
+msgstr "ignoré"
 
-#: mod/dfrn_confirm.php:384
-msgid "Our site encryption key is apparently messed up."
-msgstr "Notre clé de chiffrement de site est apparemment corrompue."
+#: mod/ostatus_subscribe.php:94 mod/repair_ostatus.php:58
+msgid "Keep this window open until done."
+msgstr "Veuillez garder cette fenêtre ouverte jusqu'à la fin."
 
-#: mod/dfrn_confirm.php:395
-msgid "Empty site URL was provided or URL could not be decrypted by us."
-msgstr "URL de site absente ou indéchiffrable."
-
-#: mod/dfrn_confirm.php:411
-msgid "Contact record was not found for you on our site."
-msgstr "Pas d'entrée pour ce contact sur notre site."
-
-#: mod/dfrn_confirm.php:425
-#, php-format
-msgid "Site public key not available in contact record for URL %s."
-msgstr "La clé publique du site ne se trouve pas dans l'enregistrement du contact pour l'URL %s."
-
-#: mod/dfrn_confirm.php:441
-msgid ""
-"The ID provided by your system is a duplicate on our system. It should work "
-"if you try again."
-msgstr "L'identifiant fourni par votre système fait doublon sur le notre. Cela peut fonctionner si vous réessayez."
-
-#: mod/dfrn_confirm.php:452
-msgid "Unable to set your contact credentials on our system."
-msgstr "Impossible de vous définir des permissions sur notre système."
+#: mod/profperm.php:30
+msgid "Permission denied"
+msgstr "Permission refusée"
 
-#: mod/dfrn_confirm.php:508
-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/profperm.php:36 mod/profperm.php:69
+msgid "Invalid profile identifier."
+msgstr "Identifiant de profil invalide."
 
-#: mod/dfrn_confirm.php:538 mod/dfrn_request.php:560
-#: src/Model/Contact.php:2217
-msgid "[Name Withheld]"
-msgstr "[Nom non-publié]"
+#: mod/profperm.php:115
+msgid "Profile Visibility Editor"
+msgstr "Éditer la visibilité du profil"
 
-#: mod/dfrn_poll.php:125 mod/dfrn_poll.php:530
-#, php-format
-msgid "%1$s welcomes %2$s"
-msgstr "%1$s accueille %2$s"
+#: mod/profperm.php:117 view/theme/frio/theme.php:268 src/Content/Nav.php:161
+#: src/Model/Profile.php:881 src/Model/Profile.php:917
+#: src/Module/Contact.php:656 src/Module/Contact.php:872
+#: src/Module/Welcome.php:38
+msgid "Profile"
+msgstr "Profil"
 
-#: mod/dfrn_request.php:98
-msgid "This introduction has already been accepted."
-msgstr "Cette introduction a déjà été acceptée."
+#: mod/profperm.php:119 src/Module/Group.php:321
+msgid "Click on a contact to add or remove."
+msgstr "Cliquez sur un contact pour l'ajouter ou le supprimer."
 
-#: mod/dfrn_request.php:116 mod/dfrn_request.php:354
-msgid "Profile location is not valid or does not contain profile information."
-msgstr "L'emplacement du profil est invalide ou ne contient pas de profil valide."
+#: mod/profperm.php:128
+msgid "Visible To"
+msgstr "Visible par"
 
-#: mod/dfrn_request.php:120 mod/dfrn_request.php:358
-msgid "Warning: profile location has no identifiable owner name."
-msgstr "Attention: l'emplacement du profil n'a pas de nom identifiable."
+#: mod/profperm.php:144
+msgid "All Contacts (with secure profile access)"
+msgstr "Tous les contacts (ayant un accès sécurisé)"
 
-#: mod/dfrn_request.php:123 mod/dfrn_request.php:361
-msgid "Warning: profile location has no profile photo."
-msgstr "Attention: l'emplacement du profil n'a pas de photo de profil."
+#: mod/regmod.php:53
+msgid "Account approved."
+msgstr "Inscription validée."
 
-#: mod/dfrn_request.php:127 mod/dfrn_request.php:365
+#: mod/regmod.php:77
 #, php-format
-msgid "%d required parameter was not found at the given location"
-msgid_plural "%d required parameters were not found at the given location"
-msgstr[0] "%d paramètre requis n'a pas été trouvé à l'endroit indiqué"
-msgstr[1] "%d paramètres requis n'ont pas été trouvés à l'endroit indiqué"
+msgid "Registration revoked for %s"
+msgstr "Inscription révoquée pour %s"
 
-#: mod/dfrn_request.php:165
-msgid "Introduction complete."
-msgstr "Phase d'introduction achevée."
+#: mod/regmod.php:84
+msgid "Please login."
+msgstr "Merci de vous connecter."
 
-#: mod/dfrn_request.php:201
-msgid "Unrecoverable protocol error."
-msgstr "Erreur de protocole non-récupérable."
+#: mod/removeme.php:46
+msgid "User deleted their account"
+msgstr "L'utilisateur a supprimé son compte"
 
-#: mod/dfrn_request.php:228
-msgid "Profile unavailable."
-msgstr "Profil indisponible."
+#: mod/removeme.php:47
+msgid ""
+"On your Friendica node an user deleted their account. Please ensure that "
+"their data is removed from the backups."
+msgstr "Sur votre nœud Friendica, un utilisateur a supprimé son compte. Veuillez vous assurer que ses données sont supprimées des sauvegardes."
 
-#: mod/dfrn_request.php:249
+#: mod/removeme.php:48
 #, php-format
-msgid "%s has received too many connection requests today."
-msgstr "%s a reçu trop de demandes d'introduction aujourd'hui."
-
-#: mod/dfrn_request.php:250
-msgid "Spam protection measures have been invoked."
-msgstr "Des mesures de protection contre le spam ont été déclenchées."
-
-#: mod/dfrn_request.php:251
-msgid "Friends are advised to please try again in 24 hours."
-msgstr "Les relations sont encouragées à attendre 24 heures pour recommencer."
-
-#: mod/dfrn_request.php:275
-msgid "Invalid locator"
-msgstr "Localisateur invalide"
+msgid "The user id is %d"
+msgstr "L'identifiant d'utilisateur est %d"
 
-#: mod/dfrn_request.php:311
-msgid "You have already introduced yourself here."
-msgstr "Vous vous êtes déjà présenté ici."
+#: mod/removeme.php:84 mod/removeme.php:87
+msgid "Remove My Account"
+msgstr "Supprimer mon compte"
 
-#: mod/dfrn_request.php:314
-#, php-format
-msgid "Apparently you are already friends with %s."
-msgstr "Il semblerait que vous soyez déjà ami avec %s."
+#: mod/removeme.php:85
+msgid ""
+"This will completely remove your account. Once this has been done it is not "
+"recoverable."
+msgstr "Ceci supprimera totalement votre compte. Cette opération est irréversible."
 
-#: mod/dfrn_request.php:334
-msgid "Invalid profile URL."
-msgstr "URL de profil invalide."
+#: mod/removeme.php:86
+msgid "Please enter your password for verification:"
+msgstr "Merci de saisir votre mot de passe pour vérification :"
 
-#: mod/dfrn_request.php:340 src/Model/Contact.php:1878
-msgid "Disallowed profile URL."
-msgstr "URL de profil interdite."
+#: mod/repair_ostatus.php:21
+msgid "Resubscribing to OStatus contacts"
+msgstr "Réinscription aux contacts OStatus"
 
-#: mod/dfrn_request.php:346 src/Model/Contact.php:1883
-#: src/Module/Admin/Blocklist/Server.php:64
-#: src/Module/Admin/Blocklist/Server.php:83 src/Module/Friendica.php:59
-msgid "Blocked domain"
-msgstr "Domaine bloqué"
+#: mod/repair_ostatus.php:37 src/Module/TwoFactor/Verify.php:64
+msgid "Error"
+msgid_plural "Errors"
+msgstr[0] "Erreur"
+msgstr[1] "Erreurs"
 
-#: mod/dfrn_request.php:413 src/Module/Contact.php:237
-msgid "Failed to update contact record."
-msgstr "Échec de mise à jour du contact."
+#: mod/tagrm.php:31
+msgid "Tag(s) removed"
+msgstr "Étiquette(s) supprimée(s)"
 
-#: mod/dfrn_request.php:433
-msgid "Your introduction has been sent."
-msgstr "Votre introduction a été envoyée."
+#: mod/tagrm.php:101
+msgid "Remove Item Tag"
+msgstr "Enlever l'étiquette de l'élément"
 
-#: mod/dfrn_request.php:471
-msgid ""
-"Remote subscription can't be done for your network. Please subscribe "
-"directly on your system."
-msgstr "L'abonnement à distance ne peut pas être fait pour votre réseau. Merci de vous abonner directement sur votre système."
+#: mod/tagrm.php:103
+msgid "Select a tag to remove: "
+msgstr "Sélectionner une étiquette à supprimer :"
 
-#: mod/dfrn_request.php:487
-msgid "Please login to confirm introduction."
-msgstr "Connectez-vous pour confirmer l'introduction."
+#: mod/uimport.php:30
+msgid "User imports on closed servers can only be done by an administrator."
+msgstr "L'import d'utilisateur sur un serveur fermé ne peut être effectué que par un administrateur."
 
-#: mod/dfrn_request.php:495
+#: mod/uimport.php:39 src/Module/Register.php:59
 msgid ""
-"Incorrect identity currently logged in. Please login to "
-"<strong>this</strong> profile."
-msgstr "Identité incorrecte actuellement connectée. Merci de vous connecter à <strong>ce</strong> profil."
-
-#: mod/dfrn_request.php:509 mod/dfrn_request.php:524
-msgid "Confirm"
-msgstr "Confirmer"
+"This site has exceeded the number of allowed daily account registrations. "
+"Please try again tomorrow."
+msgstr "Le nombre d'inscriptions quotidiennes pour ce site a été dépassé. Merci de réessayer demain."
 
-#: mod/dfrn_request.php:520
-msgid "Hide this contact"
-msgstr "Cacher ce contact"
+#: mod/uimport.php:54 src/Module/Register.php:141
+msgid "Import"
+msgstr "Importer"
 
-#: mod/dfrn_request.php:522
-#, php-format
-msgid "Welcome home %s."
-msgstr "Bienvenue chez vous, %s."
+#: mod/uimport.php:56
+msgid "Move account"
+msgstr "Migrer le compte"
 
-#: mod/dfrn_request.php:523
-#, php-format
-msgid "Please confirm your introduction/connection request to %s."
-msgstr "Merci de confirmer votre demande d'introduction auprès de %s."
+#: mod/uimport.php:57
+msgid "You can import an account from another Friendica server."
+msgstr "Vous pouvez importer un compte d'un autre serveur Friendica."
 
-#: mod/dfrn_request.php:632
+#: mod/uimport.php:58
 msgid ""
-"Please enter your 'Identity Address' from one of the following supported "
-"communications networks:"
-msgstr "Merci d'entrer votre \"adresse d'identité\" de l'un des réseaux de communication suivant:"
+"You need to export your account from the old server and upload it here. We "
+"will recreate your old account here with all your contacts. We will try also"
+" to inform your friends that you moved here."
+msgstr "Vous devez exporter votre compte à partir de l'ancien serveur et le téléverser ici. Nous recréerons votre ancien compte ici avec tous vos contacts. Nous tenterons également d'informer vos amis que vous avez déménagé ici."
 
-#: mod/dfrn_request.php:634
-#, php-format
+#: mod/uimport.php:59
 msgid ""
-"If you are not yet a member of the free social web, <a href=\"%s\">follow "
-"this link to find a public Friendica site and join us today</a>."
-msgstr "Si vous n'êtes pas encore un membre du réseau sociale Libre, <a href=\"%s\">Suivez ce lien pour trouver une instance publique Friendica et nous rejoindre aujourd'hui</a>."
+"This feature is experimental. We can't import contacts from the OStatus "
+"network (GNU Social/Statusnet) or from Diaspora"
+msgstr "Cette fonctionalité est expérimentale. Il n'est pas possible d'importer des contacts depuis le réseau OStatus (GNU Social/Statusnet) ou depuis Diaspora."
 
-#: mod/dfrn_request.php:637
-msgid "Friend/Connection Request"
-msgstr "Requête de relation/amitié"
+#: mod/uimport.php:60
+msgid "Account file"
+msgstr "Fichier du compte"
 
-#: mod/dfrn_request.php:638
+#: mod/uimport.php:60
 msgid ""
-"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
-"testuser@gnusocial.de"
-msgstr "Exemples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@gnusocial.de"
+"To export your account, go to \"Settings->Export your personal data\" and "
+"select \"Export account\""
+msgstr "Pour exporter votre compte, allez dans \"Paramètres> Exporter vos données personnelles\" et sélectionnez \"exportation de compte\""
 
-#: mod/dfrn_request.php:639 mod/follow.php:160
-msgid "Please answer the following:"
-msgstr "Merci de répondre à ce qui suit :"
+#: mod/unfollow.php:36 mod/unfollow.php:92
+msgid "You aren't following this contact."
+msgstr "Vous ne suivez pas ce contact."
 
-#: mod/dfrn_request.php:640 mod/follow.php:161
-#, php-format
-msgid "Does %s know you?"
-msgstr "Est-ce que %s vous connaît?"
+#: mod/unfollow.php:46 mod/unfollow.php:98
+msgid "Unfollowing is currently not supported by your network."
+msgstr "Le désabonnement n'est actuellement pas supporté par votre réseau."
 
-#: mod/dfrn_request.php:641 mod/follow.php:162
-msgid "Add a personal note:"
-msgstr "Ajouter une note personnelle :"
+#: mod/unfollow.php:67
+msgid "Contact unfollowed"
+msgstr "Contact désabonné"
 
-#: mod/dfrn_request.php:643
-msgid "Friendica"
-msgstr "Friendica"
+#: mod/unfollow.php:118
+msgid "Disconnect/Unfollow"
+msgstr "Se déconnecter/Ne plus suivre"
 
-#: mod/dfrn_request.php:644
-msgid "GNU Social (Pleroma, Mastodon)"
-msgstr "GNU Social (Pleroma, Mastodon)"
+#: mod/unfollow.php:128 mod/dfrn_request.php:647 mod/follow.php:170
+msgid "Your Identity Address:"
+msgstr "Votre adresse d'identité :"
 
-#: mod/dfrn_request.php:645
-msgid "Diaspora (Socialhome, Hubzilla)"
-msgstr "Diaspora (Socialhome, Hubzilla)"
+#: mod/unfollow.php:131 mod/dfrn_request.php:649 mod/follow.php:76
+msgid "Submit Request"
+msgstr "Envoyer la requête"
 
-#: mod/dfrn_request.php:646
-#, php-format
-msgid ""
-" - please do not use this form.  Instead, enter %s into your Diaspora search"
-" bar."
-msgstr " - merci de ne pas utiliser ce formulaire.   Entrez plutôt %s dans votre barre de recherche Diaspora."
-
-#: mod/dfrn_request.php:647 mod/follow.php:168 mod/unfollow.php:128
-msgid "Your Identity Address:"
-msgstr "Votre adresse d'identité :"
+#: mod/unfollow.php:137 mod/follow.php:179 mod/notifications.php:182
+#: mod/notifications.php:274 src/Module/Admin/Blocklist/Contact.php:83
+#: src/Module/Contact.php:641
+msgid "Profile URL"
+msgstr "URL du Profil"
 
-#: mod/dfrn_request.php:649 mod/follow.php:74 mod/unfollow.php:131
-msgid "Submit Request"
-msgstr "Envoyer la requête"
+#: mod/unfollow.php:147 mod/follow.php:195 src/Model/Profile.php:912
+#: src/Module/Contact.php:867
+msgid "Status Messages and Posts"
+msgstr "Messages d'état et publications"
 
-#: mod/dirfind.php:55
-#, php-format
-msgid "People Search - %s"
-msgstr "Recherche de personne - %s"
+#: mod/update_community.php:23 mod/update_contact.php:23
+#: mod/update_display.php:24 mod/update_network.php:33 mod/update_notes.php:36
+#: mod/update_profile.php:34
+msgid "[Embedded content - reload page to view]"
+msgstr "[Ccontenu incorporé - rechargez la page pour le voir]"
 
-#: mod/dirfind.php:66
-#, php-format
-msgid "Forum Search - %s"
-msgstr "Recherche de Forum - %s"
+#: 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
+msgid "Invalid request."
+msgstr "Requête invalide."
 
-#: mod/dirfind.php:217 mod/match.php:102 mod/suggest.php:106
-#: src/Content/Widget.php:39 src/Model/Profile.php:309
-#: src/Module/AllFriends.php:91
-msgid "Connect"
-msgstr "Se connecter"
+#: mod/wall_attach.php:103
+msgid "Sorry, maybe your upload is bigger than the PHP configuration allows"
+msgstr "Désolé, il semble que votre fichier est plus important que ce que la configuration de PHP autorise"
 
-#: mod/dirfind.php:259 mod/match.php:130
-msgid "No matches"
-msgstr "Aucune correspondance"
+#: mod/wall_attach.php:103
+msgid "Or - did you try to upload an empty file?"
+msgstr "Ou — auriez-vous essayé de télécharger un fichier vide ?"
 
-#: mod/display.php:257 mod/display.php:342
-msgid "The requested item doesn't exist or has been deleted."
-msgstr "L'objet recherché n'existe pas ou a été supprimé."
+#: mod/wall_attach.php:114
+#, php-format
+msgid "File exceeds size limit of %s"
+msgstr "La taille du fichier dépasse la limite de %s"
 
-#: mod/display.php:417
-msgid "The feed for this item is unavailable."
-msgstr "Le flux pour cet objet n'est pas disponible."
+#: mod/wall_attach.php:129
+msgid "File upload failed."
+msgstr "Le téléversement a échoué."
 
-#: mod/editpost.php:28 mod/editpost.php:38
-msgid "Item not found"
-msgstr "Élément introuvable"
+#: mod/wall_upload.php:198 mod/photos.php:683 mod/photos.php:686
+#: mod/photos.php:715 mod/profile_photo.php:152
+#, php-format
+msgid "Image exceeds size limit of %s"
+msgstr "L'image dépasse la taille limite de %s"
 
-#: mod/editpost.php:45
-msgid "Edit post"
-msgstr "Éditer la publication"
+#: mod/wall_upload.php:212 mod/photos.php:738 mod/profile_photo.php:161
+msgid "Unable to process image."
+msgstr "Impossible de traiter l'image."
 
-#: mod/editpost.php:71 mod/notes.php:46 src/Content/Text/HTML.php:894
-#: src/Module/Filer/SaveTag.php:50
-msgid "Save"
-msgstr "Sauver"
+#: mod/wall_upload.php:243
+msgid "Wall Photos"
+msgstr "Photos du mur"
 
-#: mod/editpost.php:76 mod/message.php:259 mod/message.php:440
-#: mod/wallmessage.php:140
-msgid "Insert web link"
-msgstr "Insérer lien web"
+#: mod/wall_upload.php:251 mod/photos.php:767 mod/profile_photo.php:303
+msgid "Image upload failed."
+msgstr "Le téléversement de l'image a échoué."
 
-#: mod/editpost.php:77
-msgid "web link"
-msgstr "lien web"
+#: 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/editpost.php:78
-msgid "Insert video link"
-msgstr "Insérer un lien video"
+#: mod/wallmessage.php:60 mod/message.php:70
+msgid "No recipient selected."
+msgstr "Pas de destinataire sélectionné."
 
-#: mod/editpost.php:79
-msgid "video link"
-msgstr "lien vidéo"
+#: mod/wallmessage.php:63
+msgid "Unable to check your home location."
+msgstr "Impossible de vérifier votre localisation."
 
-#: mod/editpost.php:80
-msgid "Insert audio link"
-msgstr "Insérer un lien audio"
+#: mod/wallmessage.php:66 mod/message.php:77
+msgid "Message could not be sent."
+msgstr "Impossible d'envoyer le message."
 
-#: mod/editpost.php:81
-msgid "audio link"
-msgstr "lien audio"
+#: mod/wallmessage.php:69 mod/message.php:80
+msgid "Message collection failure."
+msgstr "Récupération des messages infructueuse."
 
-#: mod/editpost.php:95 src/Core/ACL.php:308
-msgid "CC: email addresses"
-msgstr "CC: adresses de courriel"
+#: mod/wallmessage.php:72 mod/message.php:83
+msgid "Message sent."
+msgstr "Message envoyé."
 
-#: mod/editpost.php:102 src/Core/ACL.php:309
-msgid "Example: bob@example.com, mary@example.com"
-msgstr "Exemple : bob@exemple.com, mary@exemple.com"
+#: mod/wallmessage.php:89 mod/wallmessage.php:98
+msgid "No recipient."
+msgstr "Pas de destinataire."
 
-#: mod/events.php:117 mod/events.php:119
-msgid "Event can not end before it has started."
-msgstr "L'événement ne peut pas se terminer avant d'avoir commencé."
+#: mod/wallmessage.php:123 mod/message.php:204 mod/message.php:360
+msgid "Please enter a link URL:"
+msgstr "Entrez un lien web :"
 
-#: mod/events.php:126 mod/events.php:128
-msgid "Event title and start time are required."
-msgstr "Vous devez donner un nom et un horaire de début à l'événement."
+#: mod/wallmessage.php:128 mod/message.php:246
+msgid "Send Private Message"
+msgstr "Envoyer un message privé"
 
-#: mod/events.php:384
-msgid "Create New Event"
-msgstr "Créer un nouvel événement"
+#: 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/events.php:507
-msgid "Event details"
-msgstr "Détails de l'événement"
+#: mod/wallmessage.php:130 mod/message.php:247 mod/message.php:430
+msgid "To:"
+msgstr "À:"
 
-#: mod/events.php:508
-msgid "Starting date and Title are required."
-msgstr "La date de début et le titre sont requis."
+#: mod/wallmessage.php:131 mod/message.php:251 mod/message.php:432
+msgid "Subject:"
+msgstr "Sujet:"
 
-#: mod/events.php:509 mod/events.php:514
-msgid "Event Starts:"
-msgstr "Début de l'événement :"
+#: mod/wallmessage.php:137 mod/message.php:255 mod/message.php:435
+#: src/Module/Invite.php:150
+msgid "Your message:"
+msgstr "Votre message :"
 
-#: mod/events.php:509 mod/events.php:541 mod/profiles.php:592
-msgid "Required"
-msgstr "Requis"
+#: mod/wallmessage.php:140 mod/editpost.php:76 mod/message.php:259
+#: mod/message.php:440
+msgid "Insert web link"
+msgstr "Insérer lien web"
 
-#: mod/events.php:522 mod/events.php:547
-msgid "Finish date/time is not known or not relevant"
-msgstr "Date / heure de fin inconnue ou sans objet"
+#: mod/match.php:49
+msgid "No keywords to match. Please add keywords to your default profile."
+msgstr "Aucun mot-clé en correspondance. Merci d'ajouter des mots-clés à votre profil par défaut."
 
-#: mod/events.php:524 mod/events.php:529
-msgid "Event Finishes:"
-msgstr "Fin de l'événement :"
+#: mod/match.php:102 mod/suggest.php:106 src/Content/Widget.php:42
+#: src/Module/AllFriends.php:91 src/Module/BaseSearchModule.php:131
+msgid "Connect"
+msgstr "Se connecter"
 
-#: mod/events.php:535 mod/events.php:548
-msgid "Adjust for viewer timezone"
-msgstr "Ajuster à la zone horaire du visiteur"
+#: mod/match.php:115 src/Content/Pager.php:198
+msgid "first"
+msgstr "premier"
 
-#: mod/events.php:537
-msgid "Description:"
-msgstr "Description :"
+#: mod/match.php:120 src/Content/Pager.php:258
+msgid "next"
+msgstr "suivant"
 
-#: mod/events.php:539 mod/notifications.php:261 src/Model/Event.php:68
-#: src/Model/Event.php:95 src/Model/Event.php:437 src/Model/Event.php:933
-#: src/Model/Profile.php:439 src/Module/Contact.php:646
-#: src/Module/Directory.php:142
-msgid "Location:"
-msgstr "Localisation :"
+#: mod/match.php:130 src/Module/BaseSearchModule.php:92
+msgid "No matches"
+msgstr "Aucune correspondance"
 
-#: mod/events.php:541 mod/events.php:543
-msgid "Title:"
-msgstr "Titre :"
+#: mod/match.php:135
+msgid "Profile Match"
+msgstr "Correpondance de profils"
 
-#: mod/events.php:544 mod/events.php:545
-msgid "Share this event"
-msgstr "Partager cet événement"
+#: mod/profiles.php:43 mod/profiles.php:152 mod/profiles.php:196
+#: mod/profiles.php:511 mod/dfrn_confirm.php:70
+msgid "Profile not found."
+msgstr "Profil introuvable."
 
-#: mod/events.php:552 src/Model/Profile.php:871
-msgid "Basic"
-msgstr "Simple"
+#: mod/profiles.php:62
+msgid "Profile deleted."
+msgstr "Profil supprimé."
 
-#: mod/events.php:553 src/Model/Profile.php:872 src/Module/Admin/Site.php:575
-#: src/Module/Contact.php:905
-msgid "Advanced"
-msgstr "Avancé"
+#: mod/profiles.php:78 mod/profiles.php:114
+msgid "Profile-"
+msgstr "Profil-"
 
-#: mod/events.php:554 mod/photos.php:1005 mod/photos.php:1374
-#: src/Core/ACL.php:314
-msgid "Permissions"
-msgstr "Permissions"
+#: mod/profiles.php:97 mod/profiles.php:135
+msgid "New profile created."
+msgstr "Nouveau profil créé."
 
-#: mod/events.php:570
-msgid "Failed to remove event"
-msgstr "La suppression de l'événement a échoué."
+#: mod/profiles.php:120
+msgid "Profile unavailable to clone."
+msgstr "Ce profil ne peut être cloné."
 
-#: mod/events.php:572
-msgid "Event removed"
-msgstr "Événement supprimé."
+#: mod/profiles.php:206
+msgid "Profile Name is required."
+msgstr "Le nom du profil est requis."
 
-#: mod/fbrowser.php:43 src/Content/Nav.php:157 src/Model/Profile.php:911
-#: view/theme/frio/theme.php:264
-msgid "Photos"
-msgstr "Photos"
+#: mod/profiles.php:346
+msgid "Marital Status"
+msgstr "Statut marital"
 
-#: mod/fbrowser.php:52 mod/fbrowser.php:76 mod/photos.php:193
-#: mod/photos.php:969 mod/photos.php:1082 mod/photos.php:1099
-#: mod/photos.php:1575 mod/photos.php:1590 src/Model/Photo.php:552
-#: src/Model/Photo.php:561
-msgid "Contact Photos"
-msgstr "Photos du contact"
+#: mod/profiles.php:349
+msgid "Romantic Partner"
+msgstr "Partenaire / conjoint"
 
-#: mod/fbrowser.php:112 mod/fbrowser.php:141 mod/profile_photo.php:254
-msgid "Upload"
-msgstr "Téléverser"
+#: mod/profiles.php:358
+msgid "Work/Employment"
+msgstr "Travail / Occupation"
 
-#: mod/fbrowser.php:136
-msgid "Files"
-msgstr "Fichiers"
+#: mod/profiles.php:361
+msgid "Religion"
+msgstr "Religion"
 
-#: mod/follow.php:46
-msgid "The contact could not be added."
-msgstr "Le contact n'a pas pu être ajouté."
+#: mod/profiles.php:364
+msgid "Political Views"
+msgstr "Tendance politique"
 
-#: mod/follow.php:85
-msgid "You already added this contact."
-msgstr "Vous avez déjà ajouté ce contact."
+#: mod/profiles.php:367
+msgid "Gender"
+msgstr "Sexe"
 
-#: mod/follow.php:97
-msgid "Diaspora support isn't enabled. Contact can't be added."
-msgstr "Le support de Diaspora est désactivé. Le contact ne peut pas être ajouté."
+#: mod/profiles.php:370
+msgid "Sexual Preference"
+msgstr "Préférence sexuelle"
 
-#: mod/follow.php:104
-msgid "OStatus support is disabled. Contact can't be added."
-msgstr "Le support d'OStatus est désactivé. Le contact ne peut pas être ajouté."
+#: mod/profiles.php:373
+msgid "XMPP"
+msgstr "XMPP"
 
-#: mod/follow.php:111
-msgid "The network type couldn't be detected. Contact can't be added."
-msgstr "Impossible de détecter le type de réseau. Le contact ne peut pas être ajouté."
+#: mod/profiles.php:376
+msgid "Homepage"
+msgstr "Site internet"
 
-#: mod/follow.php:177 mod/notifications.php:179 mod/notifications.php:271
-#: mod/unfollow.php:137 src/Module/Admin/Blocklist/Contact.php:72
-#: src/Module/Admin/Blocklist/Contact.php:82 src/Module/Contact.php:642
-msgid "Profile URL"
-msgstr "URL du Profil"
+#: mod/profiles.php:379 mod/profiles.php:578
+msgid "Interests"
+msgstr "Centres d'intérêt"
 
-#: mod/follow.php:181 mod/notifications.php:265 src/Model/Profile.php:801
-#: src/Module/Contact.php:652
-msgid "Tags:"
-msgstr "Étiquette :"
+#: mod/profiles.php:382
+msgid "Address"
+msgstr "Adresse"
 
-#: mod/follow.php:193 mod/unfollow.php:147 src/Model/Profile.php:898
-#: src/Module/Contact.php:867
-msgid "Status Messages and Posts"
-msgstr "Messages d'état et publications"
+#: mod/profiles.php:389 mod/profiles.php:574
+msgid "Location"
+msgstr "Localisation"
 
-#: mod/fsuggest.php:69
-msgid "Friend suggestion sent."
-msgstr "Suggestion d'amitié/contact envoyée."
+#: mod/profiles.php:469
+msgid "Profile updated."
+msgstr "Profil mis à jour."
 
-#: mod/fsuggest.php:93
-msgid "Suggest Friends"
-msgstr "Suggérer des amis/contacts"
+#: mod/profiles.php:523
+msgid "Hide contacts and friends:"
+msgstr "Cacher mes contacts et amis :"
 
-#: mod/fsuggest.php:95
-#, php-format
-msgid "Suggest a friend for %s"
-msgstr "Suggérer un ami/contact pour %s"
+#: mod/profiles.php:528
+msgid "Hide your contact/friend list from viewers of this profile?"
+msgstr "Cacher ma liste d'amis / contacts des visiteurs de ce profil ?"
 
-#: mod/hcard.php:20
-msgid "No profile"
-msgstr "Aucun profil"
+#: mod/profiles.php:548
+msgid "Show more profile fields:"
+msgstr "Afficher plus d'infos de profil :"
 
-#: mod/item.php:122
-msgid "Unable to locate original post."
-msgstr "Impossible de localiser la publication originale."
+#: mod/profiles.php:560
+msgid "Profile Actions"
+msgstr "Actions de Profil"
 
-#: mod/item.php:322
-msgid "Empty post discarded."
-msgstr "Publication vide rejetée."
+#: mod/profiles.php:561
+msgid "Edit Profile Details"
+msgstr "Éditer les détails du profil"
 
-#: mod/item.php:839
-#, php-format
-msgid ""
-"This message was sent to you by %s, a member of the Friendica social "
-"network."
-msgstr "Ce message vous a été envoyé par %s, membre du réseau social Friendica."
+#: mod/profiles.php:562 mod/crepair.php:149 mod/events.php:552
+#: mod/fsuggest.php:92 mod/manage.php:183 mod/message.php:261
+#: mod/message.php:441 mod/photos.php:991 mod/photos.php:1101
+#: mod/photos.php:1387 mod/photos.php:1432 mod/photos.php:1471
+#: mod/photos.php:1531 mod/poke.php:184 view/theme/duepuntozero/config.php:72
+#: view/theme/frio/config.php:127 view/theme/quattro/config.php:74
+#: view/theme/vier/config.php:120 src/Module/Contact.php:598
+#: src/Module/Debug/Localtime.php:45 src/Module/Install.php:213
+#: src/Module/Install.php:253 src/Module/Install.php:289
+#: src/Module/Invite.php:157 src/Module/Item/Compose.php:178
+#: src/Object/Post.php:878
+msgid "Submit"
+msgstr "Envoyer"
 
-#: mod/item.php:841
-#, php-format
-msgid "You may visit them online at %s"
-msgstr "Vous pouvez leur rendre visite sur %s"
+#: mod/profiles.php:563
+msgid "Change Profile Photo"
+msgstr "Changer la photo du profil"
 
-#: mod/item.php:842
-msgid ""
-"Please contact the sender by replying to this post if you do not wish to "
-"receive these messages."
-msgstr "Merci de contacter l’émetteur en répondant à cette publication si vous ne souhaitez pas recevoir ces messages."
+#: mod/profiles.php:565
+msgid "View this profile"
+msgstr "Voir ce profil"
 
-#: mod/item.php:846
-#, php-format
-msgid "%s posted an update."
-msgstr "%s a publié une mise à jour."
+#: mod/profiles.php:566
+msgid "View all profiles"
+msgstr "Voir tous les profils"
 
-#: mod/lockview.php:46 mod/lockview.php:57
-msgid "Remote privacy information not available."
-msgstr "Informations de confidentialité indisponibles."
+#: mod/profiles.php:567 mod/profiles.php:662 src/Model/Profile.php:423
+msgid "Edit visibility"
+msgstr "Changer la visibilité"
 
-#: mod/lockview.php:66
-msgid "Visible to:"
-msgstr "Visible par :"
+#: mod/profiles.php:568
+msgid "Create a new profile using these settings"
+msgstr "Créer un nouveau profil en utilisant ces réglages"
 
-#: mod/lostpass.php:26
-msgid "No valid account found."
-msgstr "Impossible de trouver un compte valide."
+#: mod/profiles.php:569
+msgid "Clone this profile"
+msgstr "Cloner ce profil"
 
-#: mod/lostpass.php:38
-msgid "Password reset request issued. Check your email."
-msgstr "Réinitialisation du mot de passe en cours. Vérifiez votre courriel."
+#: mod/profiles.php:570
+msgid "Delete this profile"
+msgstr "Supprimer ce profil"
 
-#: mod/lostpass.php:44
-#, php-format
-msgid ""
-"\n"
-"\t\tDear %1$s,\n"
-"\t\t\tA request was recently received at \"%2$s\" to reset your account\n"
-"\t\tpassword. In order to confirm this request, please select the verification link\n"
-"\t\tbelow or paste it into your web browser address bar.\n"
-"\n"
-"\t\tIf you did NOT request this change, please DO NOT follow the link\n"
-"\t\tprovided and ignore and/or delete this email, the request will expire shortly.\n"
-"\n"
-"\t\tYour password will not be changed unless we can verify that you\n"
-"\t\tissued this request."
-msgstr "\n\t\tCher(e) %1$s,\n\t\t\tUne demande vient d'être faite à \"%2$s\" pour réinitialiser votre mot de passe. \n\t\tAfin de confirmer cette demande, merci de sélectionner le lien ci-dessous \n\t\tet de le coller dans la barre d'adresse de votre navigateur.\n\n\t\tSi vous n'avez PAS fait cette demande de changement, merci de NE PAS suivre le lien\n\t\tfourni et d'ignorer et/ou supprimer ce message. La demande expirera rapidement.\n\n\t\tVotre mot de passe ne changera pas tant que nous n'avons pas vérifier que vous êtes à l'origine de la demande."
+#: mod/profiles.php:572
+msgid "Basic information"
+msgstr "Information de base"
 
-#: mod/lostpass.php:55
-#, php-format
-msgid ""
-"\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"
-msgstr ""
+#: mod/profiles.php:573
+msgid "Profile picture"
+msgstr "Image de profil"
 
-#: mod/lostpass.php:74
-#, php-format
-msgid "Password reset requested at %s"
-msgstr "Requête de réinitialisation de mot de passe à %s"
+#: mod/profiles.php:575
+msgid "Preferences"
+msgstr "Préférences"
 
-#: mod/lostpass.php:89
-msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
-msgstr "Impossible d'honorer cette demande. (Vous l'avez peut-être déjà utilisée par le passé.) La réinitialisation a échoué."
+#: mod/profiles.php:576
+msgid "Status information"
+msgstr "Information sur le statut"
 
-#: mod/lostpass.php:102
-msgid "Request has expired, please make a new one."
-msgstr "La requête a expiré, veuillez la renouveler."
+#: mod/profiles.php:577
+msgid "Additional information"
+msgstr "Information additionnelle"
 
-#: mod/lostpass.php:117
-msgid "Forgot your Password?"
-msgstr "Mot de passe oublié ?"
+#: mod/profiles.php:579 mod/network.php:992
+#: src/Core/NotificationsManager.php:158
+msgid "Personal"
+msgstr "Personnel"
 
-#: mod/lostpass.php:118
-msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
-msgstr "Entrez votre adresse de courriel et validez pour réinitialiser votre mot de passe. Vous recevrez la suite des instructions par courriel."
+#: mod/profiles.php:580
+msgid "Relation"
+msgstr "Relation"
 
-#: mod/lostpass.php:119 src/Module/Login.php:327
-msgid "Nickname or Email: "
-msgstr "Pseudo ou eMail : "
+#: mod/profiles.php:581 src/Util/Temporal.php:79 src/Util/Temporal.php:81
+msgid "Miscellaneous"
+msgstr "Divers"
 
-#: mod/lostpass.php:120
-msgid "Reset"
-msgstr "Réinitialiser"
+#: mod/profiles.php:583 mod/profile_photo.php:246 src/Module/Welcome.php:39
+msgid "Upload Profile Photo"
+msgstr "Téléverser une photo de profil"
 
-#: mod/lostpass.php:135 src/Module/Login.php:339
-msgid "Password Reset"
-msgstr "Réinitialiser le mot de passe"
+#: mod/profiles.php:584
+msgid "Your Gender:"
+msgstr "Votre genre :"
 
-#: mod/lostpass.php:136
-msgid "Your password has been reset as requested."
-msgstr "Votre mot de passe a bien été réinitialisé."
+#: mod/profiles.php:585
+msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
+msgstr "<span class=\"heart\">&hearts;</span> Statut marital :"
 
-#: mod/lostpass.php:137
-msgid "Your new password is"
-msgstr "Votre nouveau mot de passe est "
+#: mod/profiles.php:586 src/Model/Profile.php:800
+msgid "Sexual Preference:"
+msgstr "Préférence sexuelle :"
 
-#: mod/lostpass.php:138
-msgid "Save or copy your new password - and then"
-msgstr "Sauvez ou copiez ce nouveau mot de passe - puis"
+#: mod/profiles.php:587
+msgid "Example: fishing photography software"
+msgstr "Exemple : football dessin programmation"
 
-#: mod/lostpass.php:139
-msgid "click here to login"
-msgstr "cliquez ici pour vous connecter"
+#: mod/profiles.php:592
+msgid "Profile Name:"
+msgstr "Nom du profil :"
 
-#: mod/lostpass.php:140
-msgid ""
-"Your password may be changed from the <em>Settings</em> page after "
-"successful login."
-msgstr "Votre mot de passe peut être changé depuis la page &lt;em&gt;Réglages&lt;/em&gt;, une fois que vous serez connecté."
+#: mod/profiles.php:592 mod/events.php:510 mod/events.php:542
+msgid "Required"
+msgstr "Requis"
 
-#: mod/lostpass.php:147
-#, php-format
+#: mod/profiles.php:594
 msgid ""
-"\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"
-msgstr ""
+"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
+"be visible to anybody using the internet."
+msgstr "Ceci est votre profil <strong>public</strong>.<br />Il <strong>peut</strong> être visible par n'importe quel utilisateur d'Internet."
 
-#: mod/lostpass.php:153
-#, php-format
+#: mod/profiles.php:595
+msgid "Your Full Name:"
+msgstr "Votre nom complet :"
+
+#: mod/profiles.php:596
+msgid "Title/Description:"
+msgstr "Titre / Description :"
+
+#: mod/profiles.php:599
+msgid "Street Address:"
+msgstr "Adresse postale :"
+
+#: mod/profiles.php:600
+msgid "Locality/City:"
+msgstr "Ville :"
+
+#: mod/profiles.php:601
+msgid "Region/State:"
+msgstr "Région / État :"
+
+#: mod/profiles.php:602
+msgid "Postal/Zip Code:"
+msgstr "Code postal :"
+
+#: mod/profiles.php:603
+msgid "Country:"
+msgstr "Pays :"
+
+#: mod/profiles.php:604 src/Util/Temporal.php:149
+msgid "Age: "
+msgstr "Age : "
+
+#: mod/profiles.php:607
+msgid "Who: (if applicable)"
+msgstr "Qui : (si pertinent)"
+
+#: mod/profiles.php:607
+msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
+msgstr "Exemples: cathy123, Cathy Williams, cathy@example.com"
+
+#: mod/profiles.php:608
+msgid "Since [date]:"
+msgstr "Depuis [date]  :"
+
+#: mod/profiles.php:610
+msgid "Tell us about yourself..."
+msgstr "Parlez-nous de vous..."
+
+#: mod/profiles.php:611
+msgid "XMPP (Jabber) address:"
+msgstr "Adresse XMPP (Jabber) :"
+
+#: mod/profiles.php:611
 msgid ""
-"\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"
-msgstr ""
+"The XMPP address will be propagated to your contacts so that they can follow"
+" you."
+msgstr "Votre adresse XMPP sera transmise à vos contacts pour qu'ils puissent vous suivre."
 
-#: mod/lostpass.php:169
-#, php-format
-msgid "Your password has been changed at %s"
-msgstr "Votre mot de passe a été modifié à %s"
+#: mod/profiles.php:612
+msgid "Homepage URL:"
+msgstr "Page personnelle :"
 
-#: mod/manage.php:179
-msgid "Manage Identities and/or Pages"
-msgstr "Gérer les identités et/ou les pages"
+#: mod/profiles.php:613 src/Model/Profile.php:808
+msgid "Hometown:"
+msgstr " Ville d'origine :"
+
+#: mod/profiles.php:614 src/Model/Profile.php:816
+msgid "Political Views:"
+msgstr "Opinions politiques :"
+
+#: mod/profiles.php:615
+msgid "Religious Views:"
+msgstr "Opinions religieuses :"
+
+#: mod/profiles.php:616
+msgid "Public Keywords:"
+msgstr "Mots-clés publics :"
+
+#: mod/profiles.php:616
+msgid "(Used for suggesting potential friends, can be seen by others)"
+msgstr "(Utilisés pour vous suggérer des amis potentiels. Ils peuvent être vus par autrui)"
+
+#: mod/profiles.php:617
+msgid "Private Keywords:"
+msgstr "Mots-clés privés :"
+
+#: mod/profiles.php:617
+msgid "(Used for searching profiles, never shown to others)"
+msgstr "(Utilisés pour rechercher des profils. Ils ne seront jamais montrés à autrui)"
+
+#: mod/profiles.php:618 src/Model/Profile.php:832
+msgid "Likes:"
+msgstr "J'aime :"
+
+#: mod/profiles.php:619 src/Model/Profile.php:836
+msgid "Dislikes:"
+msgstr "Je n'aime pas :"
+
+#: mod/profiles.php:620
+msgid "Musical interests"
+msgstr "Goûts musicaux"
+
+#: mod/profiles.php:621
+msgid "Books, literature"
+msgstr "Lectures"
+
+#: mod/profiles.php:622
+msgid "Television"
+msgstr "Télévision"
+
+#: mod/profiles.php:623
+msgid "Film/dance/culture/entertainment"
+msgstr "Cinéma / Danse / Culture / Divertissement"
+
+#: mod/profiles.php:624
+msgid "Hobbies/Interests"
+msgstr "Passe-temps / Centres d'intérêt"
+
+#: mod/profiles.php:625
+msgid "Love/romance"
+msgstr "Amour / Romance"
+
+#: mod/profiles.php:626
+msgid "Work/employment"
+msgstr "Activité professionnelle / Occupation"
+
+#: mod/profiles.php:627
+msgid "School/education"
+msgstr "Études / Formation"
+
+#: mod/profiles.php:628
+msgid "Contact information and Social Networks"
+msgstr "Coordonnées / Réseaux sociaux"
+
+#: mod/profiles.php:659 src/Model/Profile.php:419
+msgid "Profile Image"
+msgstr "Image du profil"
+
+#: mod/profiles.php:661 src/Model/Profile.php:422
+msgid "visible to everybody"
+msgstr "visible par tous"
+
+#: mod/profiles.php:668
+msgid "Edit/Manage Profiles"
+msgstr "Editer / gérer les profils"
+
+#: mod/profiles.php:669 src/Model/Profile.php:409 src/Model/Profile.php:430
+msgid "Change profile photo"
+msgstr "Changer de photo de profil"
+
+#: mod/profiles.php:670 src/Model/Profile.php:410
+msgid "Create New Profile"
+msgstr "Créer un nouveau profil"
+
+#: mod/cal.php:34 mod/cal.php:38 mod/community.php:40 mod/follow.php:20
+#: src/Module/Debug/ItemBody.php:18
+msgid "Access denied."
+msgstr "Accès refusé."
+
+#: mod/cal.php:140 mod/display.php:301 src/Module/Profile.php:177
+msgid "Access to this profile has been restricted."
+msgstr "L'accès au profil a été restreint."
+
+#: mod/cal.php:271 mod/events.php:383 view/theme/frio/theme.php:271
+#: view/theme/frio/theme.php:275 src/Content/Nav.php:164
+#: src/Content/Nav.php:228 src/Model/Profile.php:945 src/Model/Profile.php:956
+msgid "Events"
+msgstr "Événements"
+
+#: mod/cal.php:272 mod/events.php:384
+msgid "View"
+msgstr "Vue"
+
+#: mod/cal.php:273 mod/events.php:386
+msgid "Previous"
+msgstr "Précédent"
+
+#: mod/cal.php:274 mod/events.php:387 src/Module/Install.php:175
+msgid "Next"
+msgstr "Suivant"
+
+#: mod/cal.php:277 mod/events.php:392 src/Model/Event.php:428
+msgid "today"
+msgstr "aujourd'hui"
+
+#: mod/cal.php:278 mod/events.php:393 src/Util/Temporal.php:314
+#: src/Model/Event.php:429
+msgid "month"
+msgstr "mois"
+
+#: mod/cal.php:279 mod/events.php:394 src/Util/Temporal.php:315
+#: src/Model/Event.php:430
+msgid "week"
+msgstr "semaine"
+
+#: mod/cal.php:280 mod/events.php:395 src/Util/Temporal.php:316
+#: src/Model/Event.php:431
+msgid "day"
+msgstr "jour"
+
+#: mod/cal.php:281 mod/events.php:396
+msgid "list"
+msgstr "liste"
+
+#: mod/cal.php:294 src/Model/User.php:384 src/Console/NewPassword.php:88
+msgid "User not found"
+msgstr "Utilisateur introuvable"
+
+#: mod/cal.php:310
+msgid "This calendar format is not supported"
+msgstr "Format de calendrier inconnu"
+
+#: mod/cal.php:312
+msgid "No exportable data found"
+msgstr "Rien à exporter"
+
+#: mod/cal.php:329
+msgid "calendar"
+msgstr "calendrier"
+
+#: mod/common.php:90
+msgid "No contacts in common."
+msgstr "Pas de contacts en commun."
+
+#: mod/common.php:141 src/Module/Contact.php:895
+msgid "Common Friends"
+msgstr "Amis communs"
+
+#: mod/community.php:33 mod/dfrn_request.php:597 mod/display.php:199
+#: mod/photos.php:850 mod/search.php:87 mod/search.php:93 mod/videos.php:118
+#: src/Module/Debug/Probe.php:20 src/Module/Debug/WebFinger.php:19
+#: src/Module/Directory.php:30
+msgid "Public access denied."
+msgstr "Accès public refusé."
+
+#: mod/community.php:76
+msgid "Community option not available."
+msgstr "L'option communauté n'est pas disponible"
+
+#: mod/community.php:93
+msgid "Not available."
+msgstr "Indisponible."
+
+#: mod/community.php:103
+msgid "Local Community"
+msgstr "Communauté locale"
+
+#: mod/community.php:106
+msgid "Posts from local users on this server"
+msgstr "Conversations publiques démarrées par des utilisateurs locaux"
+
+#: mod/community.php:114
+msgid "Global Community"
+msgstr "Communauté globale"
+
+#: mod/community.php:117
+msgid "Posts from users of the whole federated network"
+msgstr "Conversations publiques provenant du réseau fédéré global"
 
-#: mod/manage.php:180
+#: mod/community.php:163 mod/search.php:222
+msgid "No results."
+msgstr "Aucun résultat."
+
+#: mod/community.php:215
 msgid ""
-"Toggle between different identities or community/group pages which share "
-"your account details or which you have been granted \"manage\" permissions"
-msgstr "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."
+"This community stream shows all public posts received by this node. They may"
+" not reflect the opinions of this node’s users."
+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/manage.php:181
-msgid "Select an identity to manage: "
-msgstr "Choisir une identité à gérer: "
+#: mod/crepair.php:79
+msgid "Contact settings applied."
+msgstr "Réglages du contact appliqués."
 
-#: mod/match.php:49
-msgid "No keywords to match. Please add keywords to your default profile."
-msgstr "Aucun mot-clé en correspondance. Merci d'ajouter des mots-clés à votre profil par défaut."
+#: mod/crepair.php:81
+msgid "Contact update failed."
+msgstr "Impossible d'appliquer les réglages."
 
-#: mod/match.php:115 src/Content/Pager.php:198
-msgid "first"
-msgstr "premier"
+#: mod/crepair.php:102 mod/dfrn_confirm.php:125 mod/fsuggest.php:32
+#: mod/fsuggest.php:75 mod/redir.php:32 mod/redir.php:140
+#: src/Module/FollowConfirm.php:46 src/Module/Group.php:92
+msgid "Contact not found."
+msgstr "Contact introuvable."
 
-#: mod/match.php:120 src/Content/Pager.php:258
-msgid "next"
-msgstr "suivant"
+#: 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>ATTENTION: Manipulation réservée aux experts</strong>, toute information incorrecte pourrait empêcher la communication avec ce contact."
 
-#: mod/match.php:135
-msgid "Profile Match"
-msgstr "Correpondance de profils"
+#: 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 "une photo"
 
-#: mod/message.php:33 mod/message.php:116 src/Content/Nav.php:254
-msgid "New Message"
-msgstr "Nouveau message"
+#: mod/crepair.php:130 mod/crepair.php:132
+msgid "No mirroring"
+msgstr "Pas de miroir"
 
-#: mod/message.php:70 mod/wallmessage.php:60
-msgid "No recipient selected."
-msgstr "Pas de destinataire sélectionné."
+#: mod/crepair.php:130
+msgid "Mirror as forwarded posting"
+msgstr "Refléter les publications de ce profil comme des partages"
 
-#: mod/message.php:74
-msgid "Unable to locate contact information."
-msgstr "Impossible de localiser les informations du contact."
+#: mod/crepair.php:130 mod/crepair.php:132
+msgid "Mirror as my own posting"
+msgstr "Refléter les publications de ce profil comme les vôtres"
 
-#: mod/message.php:77 mod/wallmessage.php:66
-msgid "Message could not be sent."
-msgstr "Impossible d'envoyer le message."
+#: mod/crepair.php:145
+msgid "Return to contact editor"
+msgstr "Retour à l'éditeur de contact"
 
-#: mod/message.php:80 mod/wallmessage.php:69
-msgid "Message collection failure."
-msgstr "Récupération des messages infructueuse."
+#: mod/crepair.php:147
+msgid "Refetch contact data"
+msgstr "Récupérer à nouveau les données de contact"
 
-#: mod/message.php:83 mod/wallmessage.php:72
-msgid "Message sent."
-msgstr "Message envoyé."
+#: mod/crepair.php:150
+msgid "Remote Self"
+msgstr "Identité à distance"
 
-#: mod/message.php:110 mod/notifications.php:47 mod/notifications.php:187
-#: mod/notifications.php:243
-msgid "Discard"
-msgstr "Rejeter"
+#: mod/crepair.php:153
+msgid "Mirror postings from this contact"
+msgstr "Copier les publications de ce contact"
 
-#: mod/message.php:123 src/Content/Nav.php:251 view/theme/frio/theme.php:271
-msgid "Messages"
-msgstr "Messages"
+#: mod/crepair.php:155
+msgid ""
+"Mark this contact as remote_self, this will cause friendica to repost new "
+"entries from this contact."
+msgstr "Marquer ce contact comme étant remote_self, friendica republiera alors les nouvelles entrées de ce contact."
 
-#: mod/message.php:148
-msgid "Do you really want to delete this message?"
-msgstr "Voulez-vous vraiment supprimer ce message ?"
+#: mod/crepair.php:159 mod/settings.php:679 mod/settings.php:705
+#: src/Module/Admin/Blocklist/Contact.php:73 src/Module/Admin/Users.php:272
+#: src/Module/Admin/Users.php:283 src/Module/Admin/Users.php:297
+#: src/Module/Admin/Users.php:313
+msgid "Name"
+msgstr "Nom"
 
-#: mod/message.php:166
-msgid "Conversation not found."
-msgstr "Conversation inconnue."
+#: mod/crepair.php:160
+msgid "Account Nickname"
+msgstr "Pseudo du compte"
 
-#: mod/message.php:171
-msgid "Message deleted."
-msgstr "Message supprimé."
+#: mod/crepair.php:161
+msgid "@Tagname - overrides Name/Nickname"
+msgstr "@NomEtiquette - prend le pas sur Nom/Pseudo"
 
-#: mod/message.php:176 mod/message.php:190
-msgid "Conversation removed."
-msgstr "Conversation supprimée."
+#: mod/crepair.php:162
+msgid "Account URL"
+msgstr "URL du compte"
 
-#: mod/message.php:204 mod/message.php:360 mod/wallmessage.php:123
-msgid "Please enter a link URL:"
-msgstr "Entrez un lien web :"
+#: mod/crepair.php:163
+msgid "Account URL Alias"
+msgstr "Alias d'URL du compte"
 
-#: mod/message.php:246 mod/wallmessage.php:128
-msgid "Send Private Message"
-msgstr "Envoyer un message privé"
+#: mod/crepair.php:164
+msgid "Friend Request URL"
+msgstr "Echec du téléversement de l'image."
 
-#: mod/message.php:247 mod/message.php:430 mod/wallmessage.php:130
-msgid "To:"
-msgstr "À:"
+#: mod/crepair.php:165
+msgid "Friend Confirm URL"
+msgstr "Accès public refusé."
 
-#: mod/message.php:251 mod/message.php:432 mod/wallmessage.php:131
-msgid "Subject:"
-msgstr "Sujet:"
+#: mod/crepair.php:166
+msgid "Notification Endpoint URL"
+msgstr "Aucune photo sélectionnée"
 
-#: mod/message.php:255 mod/message.php:435 mod/wallmessage.php:137
-#: src/Module/Invite.php:150
-msgid "Your message:"
-msgstr "Votre message :"
+#: mod/crepair.php:167
+msgid "Poll/Feed URL"
+msgstr "Téléverser des photos"
 
-#: mod/message.php:289
-msgid "No messages."
-msgstr "Aucun message."
+#: mod/crepair.php:168
+msgid "New photo from this URL"
+msgstr "Nouvelle photo depuis cette URL"
 
-#: mod/message.php:352
-msgid "Message not available."
-msgstr "Message indisponible."
+#: mod/dfrn_confirm.php:126
+msgid ""
+"This may occasionally happen if contact was requested by both persons and it"
+" has already been approved."
+msgstr "Ceci peut se produire lorsque le contact a été requis par les deux personnes et a déjà été approuvé."
 
-#: mod/message.php:406
-msgid "Delete message"
-msgstr "Effacer message"
+#: mod/dfrn_confirm.php:227
+msgid "Response from remote site was not understood."
+msgstr "Réponse du site distant incomprise."
 
-#: mod/message.php:408 mod/message.php:540
-msgid "D, d M Y - g:i A"
-msgstr "D, d M Y - g:i A"
+#: mod/dfrn_confirm.php:234 mod/dfrn_confirm.php:240
+msgid "Unexpected response from remote site: "
+msgstr "Réponse inattendue du site distant : "
 
-#: mod/message.php:423 mod/message.php:537
-msgid "Delete conversation"
-msgstr "Effacer conversation"
+#: mod/dfrn_confirm.php:249
+msgid "Confirmation completed successfully."
+msgstr "Confirmation achevée avec succès."
 
-#: mod/message.php:425
-msgid ""
-"No secure communications available. You <strong>may</strong> be able to "
-"respond from the sender's profile page."
-msgstr "Pas de communications sécurisées possibles. Vous serez <strong>peut-être</strong> en mesure de répondre depuis la page de profil de l'émetteur."
+#: mod/dfrn_confirm.php:261
+msgid "Temporary failure. Please wait and try again."
+msgstr "Échec temporaire. Merci de recommencer ultérieurement."
 
-#: mod/message.php:429
-msgid "Send Reply"
-msgstr "Répondre"
+#: mod/dfrn_confirm.php:264
+msgid "Introduction failed or was revoked."
+msgstr "Introduction échouée ou annulée."
 
-#: mod/message.php:512
-#, php-format
-msgid "Unknown sender - %s"
-msgstr "Émetteur inconnu - %s"
+#: mod/dfrn_confirm.php:269
+msgid "Remote site reported: "
+msgstr "Alerte du site distant : "
 
-#: mod/message.php:514
+#: mod/dfrn_confirm.php:374
 #, php-format
-msgid "You and %s"
-msgstr "Vous et %s"
+msgid "No user record found for '%s' "
+msgstr "Pas d'utilisateur trouvé pour '%s' "
 
-#: mod/message.php:516
-#, php-format
-msgid "%s and You"
-msgstr "%s et vous"
+#: mod/dfrn_confirm.php:384
+msgid "Our site encryption key is apparently messed up."
+msgstr "Notre clé de chiffrement de site est apparemment corrompue."
 
-#: mod/message.php:543
+#: mod/dfrn_confirm.php:395
+msgid "Empty site URL was provided or URL could not be decrypted by us."
+msgstr "URL de site absente ou indéchiffrable."
+
+#: mod/dfrn_confirm.php:411
+msgid "Contact record was not found for you on our site."
+msgstr "Pas d'entrée pour ce contact sur notre site."
+
+#: mod/dfrn_confirm.php:425
 #, php-format
-msgid "%d message"
-msgid_plural "%d messages"
-msgstr[0] "%d message"
-msgstr[1] "%d messages"
+msgid "Site public key not available in contact record for URL %s."
+msgstr "La clé publique du site ne se trouve pas dans l'enregistrement du contact pour l'URL %s."
 
-#: mod/network.php:184 mod/search.php:38
-msgid "Remove term"
-msgstr "Retirer le terme"
+#: mod/dfrn_confirm.php:441
+msgid ""
+"The ID provided by your system is a duplicate on our system. It should work "
+"if you try again."
+msgstr "L'identifiant fourni par votre système fait doublon sur le notre. Cela peut fonctionner si vous réessayez."
 
-#: mod/network.php:191 mod/search.php:47
-msgid "Saved Searches"
-msgstr "Recherches"
+#: mod/dfrn_confirm.php:452
+msgid "Unable to set your contact credentials on our system."
+msgstr "Impossible de vous définir des permissions sur notre système."
 
-#: mod/network.php:192 src/Model/Group.php:434
-msgid "add"
-msgstr "ajouter"
+#: mod/dfrn_confirm.php:508
+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:538 mod/dfrn_request.php:560
+#: src/Model/Contact.php:2457
+msgid "[Name Withheld]"
+msgstr "[Nom non-publié]"
 
-#: mod/network.php:572
+#: mod/dfrn_poll.php:125 mod/dfrn_poll.php:530
 #, php-format
-msgid ""
-"Warning: This group contains %s member from a network that doesn't allow non"
-" public messages."
-msgid_plural ""
-"Warning: This group contains %s members from a network that doesn't allow "
-"non public messages."
-msgstr[0] ""
-msgstr[1] ""
+msgid "%1$s welcomes %2$s"
+msgstr "%1$s accueille %2$s"
+
+#: mod/dfrn_request.php:98
+msgid "This introduction has already been accepted."
+msgstr "Cette introduction a déjà été acceptée."
 
-#: mod/network.php:575
-msgid "Messages in this group won't be send to these receivers."
-msgstr "Les messages dans ce groupe ne seront pas envoyés à ces destinataires."
+#: mod/dfrn_request.php:116 mod/dfrn_request.php:354
+msgid "Profile location is not valid or does not contain profile information."
+msgstr "L'emplacement du profil est invalide ou ne contient pas de profil valide."
 
-#: mod/network.php:642
-msgid "No such group"
-msgstr "Groupe inexistant"
+#: mod/dfrn_request.php:120 mod/dfrn_request.php:358
+msgid "Warning: profile location has no identifiable owner name."
+msgstr "Attention: l'emplacement du profil n'a pas de nom identifiable."
 
-#: mod/network.php:663 src/Module/Group.php:288
-msgid "Group is empty"
-msgstr "Groupe vide"
+#: mod/dfrn_request.php:123 mod/dfrn_request.php:361
+msgid "Warning: profile location has no profile photo."
+msgstr "Attention: l'emplacement du profil n'a pas de photo de profil."
 
-#: mod/network.php:667
+#: mod/dfrn_request.php:127 mod/dfrn_request.php:365
 #, php-format
-msgid "Group: %s"
-msgstr "Group : %s"
+msgid "%d required parameter was not found at the given location"
+msgid_plural "%d required parameters were not found at the given location"
+msgstr[0] "%d paramètre requis n'a pas été trouvé à l'endroit indiqué"
+msgstr[1] "%d paramètres requis n'ont pas été trouvés à l'endroit indiqué"
 
-#: mod/network.php:693
-msgid "Private messages to this person are at risk of public disclosure."
-msgstr "Les messages privés envoyés à ce contact s'exposent à une diffusion incontrôlée."
+#: mod/dfrn_request.php:165
+msgid "Introduction complete."
+msgstr "Phase d'introduction achevée."
 
-#: mod/network.php:696 src/Module/AllFriends.php:35
-#: src/Module/AllFriends.php:43
-msgid "Invalid contact."
-msgstr "Contact invalide."
+#: mod/dfrn_request.php:201
+msgid "Unrecoverable protocol error."
+msgstr "Erreur de protocole non-récupérable."
 
-#: mod/network.php:975
-msgid "Commented Order"
-msgstr "Tri par commentaires"
+#: mod/dfrn_request.php:228
+msgid "Profile unavailable."
+msgstr "Profil indisponible."
 
-#: mod/network.php:978
-msgid "Sort by Comment Date"
-msgstr "Trier par date de commentaire"
+#: mod/dfrn_request.php:249
+#, php-format
+msgid "%s has received too many connection requests today."
+msgstr "%s a reçu trop de demandes d'introduction aujourd'hui."
 
-#: mod/network.php:983
-msgid "Posted Order"
-msgstr "Tri des publications"
+#: mod/dfrn_request.php:250
+msgid "Spam protection measures have been invoked."
+msgstr "Des mesures de protection contre le spam ont été déclenchées."
 
-#: mod/network.php:986
-msgid "Sort by Post Date"
-msgstr "Trier par date de publication"
+#: mod/dfrn_request.php:251
+msgid "Friends are advised to please try again in 24 hours."
+msgstr "Les relations sont encouragées à attendre 24 heures pour recommencer."
 
-#: mod/network.php:993 mod/profiles.php:579
-#: src/Core/NotificationsManager.php:158
-msgid "Personal"
-msgstr "Personnel"
+#: mod/dfrn_request.php:275
+msgid "Invalid locator"
+msgstr "Localisateur invalide"
 
-#: mod/network.php:996
-msgid "Posts that mention or involve you"
-msgstr "Publications qui vous concernent"
+#: mod/dfrn_request.php:311
+msgid "You have already introduced yourself here."
+msgstr "Vous vous êtes déjà présenté ici."
 
-#: mod/network.php:1003
-msgid "New"
-msgstr "Nouveau"
+#: mod/dfrn_request.php:314
+#, php-format
+msgid "Apparently you are already friends with %s."
+msgstr "Il semblerait que vous soyez déjà ami avec %s."
 
-#: mod/network.php:1006
-msgid "Activity Stream - by date"
-msgstr "Flux d'activités - par date"
+#: mod/dfrn_request.php:334
+msgid "Invalid profile URL."
+msgstr "URL de profil invalide."
 
-#: mod/network.php:1014
-msgid "Shared Links"
-msgstr "Liens partagés"
+#: mod/dfrn_request.php:340 src/Model/Contact.php:2099
+msgid "Disallowed profile URL."
+msgstr "URL de profil interdite."
 
-#: mod/network.php:1017
-msgid "Interesting Links"
-msgstr "Liens intéressants"
+#: mod/dfrn_request.php:346 src/Model/Contact.php:2104
+#: src/Module/Friendica.php:59
+msgid "Blocked domain"
+msgstr "Domaine bloqué"
 
-#: mod/network.php:1024
-msgid "Starred"
-msgstr "Mis en avant"
+#: mod/dfrn_request.php:413 src/Module/Contact.php:143
+msgid "Failed to update contact record."
+msgstr "Échec de mise à jour du contact."
 
-#: mod/network.php:1027
-msgid "Favourite Posts"
-msgstr "Publications favorites"
+#: mod/dfrn_request.php:433
+msgid "Your introduction has been sent."
+msgstr "Votre introduction a été envoyée."
 
-#: mod/newmember.php:12
-msgid "Welcome to Friendica"
-msgstr "Bienvenue sur Friendica"
+#: mod/dfrn_request.php:471
+msgid ""
+"Remote subscription can't be done for your network. Please subscribe "
+"directly on your system."
+msgstr "L'abonnement à distance ne peut pas être fait pour votre réseau. Merci de vous abonner directement sur votre système."
 
-#: mod/newmember.php:13
-msgid "New Member Checklist"
-msgstr "Checklist du nouvel utilisateur"
+#: mod/dfrn_request.php:487
+msgid "Please login to confirm introduction."
+msgstr "Connectez-vous pour confirmer l'introduction."
 
-#: mod/newmember.php:15
+#: mod/dfrn_request.php:495
 msgid ""
-"We would like to offer some tips and links to help make your experience "
-"enjoyable. Click any item to visit the relevant page. A link to this page "
-"will be visible from your home page for two weeks after your initial "
-"registration and then will quietly disappear."
-msgstr "Nous souhaiterions vous donner quelques astuces et ressources pour rendre votre expérience la plus agréable possible. Cliquez sur n'importe lequel de ces éléments pour visiter la page correspondante. Un lien vers cette page restera visible sur votre page d'accueil pendant les deux semaines qui suivent votre inscription initiale, puis disparaîtra silencieusement."
+"Incorrect identity currently logged in. Please login to "
+"<strong>this</strong> profile."
+msgstr "Identité incorrecte actuellement connectée. Merci de vous connecter à <strong>ce</strong> profil."
 
-#: mod/newmember.php:16
-msgid "Getting Started"
-msgstr "Bien démarrer"
+#: mod/dfrn_request.php:509 mod/dfrn_request.php:524
+msgid "Confirm"
+msgstr "Confirmer"
 
-#: mod/newmember.php:18
-msgid "Friendica Walk-Through"
-msgstr "Friendica pas-à-pas"
+#: mod/dfrn_request.php:520
+msgid "Hide this contact"
+msgstr "Cacher ce contact"
 
-#: mod/newmember.php:18
-msgid ""
-"On your <em>Quick Start</em> page - find a brief introduction to your "
-"profile and network tabs, make some new connections, and find some groups to"
-" join."
-msgstr "Sur votre page d'accueil, dans <em>Conseils aux nouveaux venus</em> - vous trouverez une rapide introduction aux onglets Profil et Réseau, pourrez vous connecter à Facebook, établir de nouvelles relations, et choisir des groupes à rejoindre."
+#: mod/dfrn_request.php:522
+#, php-format
+msgid "Welcome home %s."
+msgstr "Bienvenue chez vous, %s."
 
-#: mod/newmember.php:20 mod/settings.php:145 src/Content/Nav.php:262
-#: src/Module/Admin/Addons/Details.php:102
-#: src/Module/Admin/Themes/Details.php:107
-#: src/Module/BaseSettingsModule.php:105 view/theme/frio/theme.php:272
-msgid "Settings"
-msgstr "Réglages"
+#: mod/dfrn_request.php:523
+#, php-format
+msgid "Please confirm your introduction/connection request to %s."
+msgstr "Merci de confirmer votre demande d'introduction auprès de %s."
 
-#: mod/newmember.php:22
-msgid "Go to Your Settings"
-msgstr "Éditer vos Réglages"
+#: mod/dfrn_request.php:632
+msgid ""
+"Please enter your 'Identity Address' from one of the following supported "
+"communications networks:"
+msgstr "Merci d'entrer votre \"adresse d'identité\" de l'un des réseaux de communication suivant:"
 
-#: mod/newmember.php:22
+#: mod/dfrn_request.php:634
+#, php-format
 msgid ""
-"On your <em>Settings</em> page -  change your initial password. Also make a "
-"note of your Identity Address. This looks just like an email address - and "
-"will be useful in making friends on the free social web."
-msgstr "Sur la page des <em>Réglages</em> -     changez votre mot de passe initial. Notez bien votre Identité. Elle ressemble à une adresse de courriel - et vous sera utile pour vous faire des amis dans le web social libre."
+"If you are not yet a member of the free social web, <a href=\"%s\">follow "
+"this link to find a public Friendica site and join us today</a>."
+msgstr "Si vous n'êtes pas encore un membre du réseau sociale Libre, <a href=\"%s\">Suivez ce lien pour trouver une instance publique Friendica et nous rejoindre aujourd'hui</a>."
+
+#: mod/dfrn_request.php:637
+msgid "Friend/Connection Request"
+msgstr "Requête de relation/amitié"
 
-#: mod/newmember.php:23
+#: mod/dfrn_request.php:638
 msgid ""
-"Review the other settings, particularly the privacy settings. An unpublished"
-" directory listing is like having an unlisted phone number. In general, you "
-"should probably publish your listing - unless all of your friends and "
-"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."
+"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
+"testuser@gnusocial.de"
+msgstr "Exemples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@gnusocial.de"
 
-#: mod/newmember.php:25 mod/profperm.php:117 src/Content/Nav.php:156
-#: src/Model/Profile.php:870 src/Model/Profile.php:903
-#: src/Module/Contact.php:657 src/Module/Contact.php:872
-#: view/theme/frio/theme.php:263
-msgid "Profile"
-msgstr "Profil"
+#: mod/dfrn_request.php:639 mod/follow.php:162
+msgid "Please answer the following:"
+msgstr "Merci de répondre à ce qui suit :"
 
-#: 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"
+#: mod/dfrn_request.php:640 mod/follow.php:163
+#, php-format
+msgid "Does %s know you?"
+msgstr "Est-ce que %s vous connaît?"
 
-#: mod/newmember.php:27
-msgid ""
-"Upload a profile photo if you have not done so already. Studies have shown "
-"that people with real photos of themselves are ten times more likely to make"
-" friends than people who do not."
-msgstr "Téléversez (envoyez) une photo de profil si vous n'en avez pas déjà une. Les études montrent que les gens qui affichent de vraies photos d'eux sont dix fois plus susceptibles de se faire des amis."
+#: mod/dfrn_request.php:641 mod/follow.php:164
+msgid "Add a personal note:"
+msgstr "Ajouter une note personnelle :"
 
-#: mod/newmember.php:28
-msgid "Edit Your Profile"
-msgstr "Éditer votre Profil"
+#: mod/dfrn_request.php:643
+msgid "Friendica"
+msgstr "Friendica"
 
-#: mod/newmember.php:28
-msgid ""
-"Edit your <strong>default</strong> profile to your liking. Review the "
-"settings for hiding your list of friends and hiding the profile from unknown"
-" visitors."
-msgstr "Éditez votre profil <strong>par défaut</strong> à votre convenance. Vérifiez les réglages concernant la visibilité de votre liste d'amis par les visiteurs inconnus."
+#: mod/dfrn_request.php:644
+msgid "GNU Social (Pleroma, Mastodon)"
+msgstr "GNU Social (Pleroma, Mastodon)"
 
-#: mod/newmember.php:29
-msgid "Profile Keywords"
-msgstr "Mots-clés du profil"
+#: mod/dfrn_request.php:645
+msgid "Diaspora (Socialhome, Hubzilla)"
+msgstr "Diaspora (Socialhome, Hubzilla)"
 
-#: mod/newmember.php:29
+#: mod/dfrn_request.php:646
+#, php-format
 msgid ""
-"Set some public keywords for your default profile which describe your "
-"interests. We may be able to find other people with similar interests and "
-"suggest friendships."
-msgstr "Choisissez quelques mots-clé publics pour votre profil par défaut. Ils pourront ainsi décrire vos centres d'intérêt, et nous pourrons vous proposer des contacts qui les partagent."
+" - please do not use this form.  Instead, enter %s into your Diaspora search"
+" bar."
+msgstr " - merci de ne pas utiliser ce formulaire.   Entrez plutôt %s dans votre barre de recherche Diaspora."
 
-#: mod/newmember.php:31
-msgid "Connecting"
-msgstr "Connexions"
+#: mod/display.php:252 mod/display.php:337
+msgid "The requested item doesn't exist or has been deleted."
+msgstr "L'objet recherché n'existe pas ou a été supprimé."
 
-#: mod/newmember.php:37
-msgid "Importing Emails"
-msgstr "Importer courriels"
+#: mod/display.php:412
+msgid "The feed for this item is unavailable."
+msgstr "Le flux pour cet objet n'est pas disponible."
 
-#: mod/newmember.php:37
-msgid ""
-"Enter your email access information on your Connector Settings page if you "
-"wish to import and interact with friends or mailing lists from your email "
-"INBOX"
-msgstr "Entrez vos paramètres de courriel dans les Réglages des connecteurs si vous souhaitez importer et interagir avec des amis ou des listes venant de votre Boîte de Réception."
+#: mod/editpost.php:28 mod/editpost.php:38
+msgid "Item not found"
+msgstr "Élément introuvable"
 
-#: mod/newmember.php:40
-msgid "Go to Your Contacts Page"
-msgstr "Consulter vos Contacts"
+#: mod/editpost.php:45
+msgid "Edit post"
+msgstr "Éditer la publication"
 
-#: mod/newmember.php:40
-msgid ""
-"Your Contacts page is your gateway to managing friendships and connecting "
-"with friends on other networks. Typically you enter their address or site "
-"URL in the <em>Add New Contact</em> dialog."
-msgstr "Votre page Contacts est le point d'entrée vers la gestion de vos amitiés/relations et la connexion à des amis venant d'autres réseaux. Typiquement, vous pourrez y rentrer leur adresse d'Identité ou l'URL de leur site dans le formulaire <em>Ajouter un nouveau contact</em>."
+#: mod/editpost.php:71 mod/notes.php:46 src/Content/Text/HTML.php:883
+#: src/Module/Filer/SaveTag.php:49
+msgid "Save"
+msgstr "Sauver"
 
-#: mod/newmember.php:41
-msgid "Go to Your Site's Directory"
-msgstr "Consulter l'Annuaire de votre Site"
+#: mod/editpost.php:77
+msgid "web link"
+msgstr "lien web"
 
-#: mod/newmember.php:41
-msgid ""
-"The Directory page lets you find other people in this network or other "
-"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
-"their profile page. Provide your own Identity Address if requested."
-msgstr "La page Annuaire vous permet de trouver d'autres personnes au sein de ce réseaux ou parmi d'autres sites fédérés. Cherchez un lien <em>Relier</em> ou <em>Suivre</em> sur leur profil. Vous pourrez avoir besoin d'indiquer votre adresse d'identité."
+#: mod/editpost.php:78
+msgid "Insert video link"
+msgstr "Insérer un lien video"
+
+#: mod/editpost.php:79
+msgid "video link"
+msgstr "lien vidéo"
 
-#: mod/newmember.php:42
-msgid "Finding New People"
-msgstr "Trouver de nouvelles personnes"
+#: mod/editpost.php:80
+msgid "Insert audio link"
+msgstr "Insérer un lien audio"
 
-#: mod/newmember.php:42
-msgid ""
-"On the side panel of the Contacts page are several tools to find new "
-"friends. We can match people by interest, look up people by name or "
-"interest, and provide suggestions based on network relationships. On a brand"
-" new site, friend suggestions will usually begin to be populated within 24 "
-"hours."
-msgstr "Sur le panneau latéral de la page Contacts, il y a plusieurs moyens de trouver de nouveaux amis. Nous pouvons mettre les gens en relation selon leurs intérêts, rechercher des amis par nom ou intérêt, et fournir des suggestions en fonction de la topologie du réseau. Sur un site tout neuf, les suggestions d'amitié devraient commencer à apparaître au bout de 24 heures."
+#: mod/editpost.php:81
+msgid "audio link"
+msgstr "lien audio"
 
-#: mod/newmember.php:44 src/Model/Group.php:435 src/Module/Contact.php:756
-msgid "Groups"
-msgstr "Groupes"
+#: mod/editpost.php:95 src/Core/ACL.php:308 src/Module/Item/Compose.php:200
+msgid "CC: email addresses"
+msgstr "CC: adresses de courriel"
 
-#: mod/newmember.php:46
-msgid "Group Your Contacts"
-msgstr "Grouper vos contacts"
+#: mod/editpost.php:102 src/Core/ACL.php:309
+msgid "Example: bob@example.com, mary@example.com"
+msgstr "Exemple : bob@exemple.com, mary@exemple.com"
 
-#: mod/newmember.php:46
-msgid ""
-"Once you have made some friends, organize them into private conversation "
-"groups from the sidebar of your Contacts page and then you can interact with"
-" each group privately on your Network page."
-msgstr "Une fois que vous avez trouvé quelques amis, organisez-les en groupes de conversation privés depuis le panneau latéral de la page Contacts. Vous pourrez ensuite interagir avec chaque groupe de manière privée depuis la page Réseau."
+#: mod/events.php:118 mod/events.php:120
+msgid "Event can not end before it has started."
+msgstr "L'événement ne peut pas se terminer avant d'avoir commencé."
 
-#: mod/newmember.php:49
-msgid "Why Aren't My Posts Public?"
-msgstr "Pourquoi mes éléments ne sont pas publics ?"
+#: mod/events.php:127 mod/events.php:129
+msgid "Event title and start time are required."
+msgstr "Vous devez donner un nom et un horaire de début à l'événement."
 
-#: mod/newmember.php:49
-msgid ""
-"Friendica respects your privacy. By default, your posts will only show up to"
-" people you've added as friends. For more information, see the help section "
-"from the link above."
-msgstr "Friendica respecte votre vie privée. Par défaut, toutes vos publications seront seulement montrés à vos amis. Pour plus d'information, consultez la section \"aide\" du lien ci-dessus."
+#: mod/events.php:385
+msgid "Create New Event"
+msgstr "Créer un nouvel événement"
 
-#: mod/newmember.php:53
-msgid "Getting Help"
-msgstr "Obtenir de l'aide"
+#: mod/events.php:508
+msgid "Event details"
+msgstr "Détails de l'événement"
 
-#: mod/newmember.php:55
-msgid "Go to the Help Section"
-msgstr "Aller à la section Aide"
+#: mod/events.php:509
+msgid "Starting date and Title are required."
+msgstr "La date de début et le titre sont requis."
 
-#: mod/newmember.php:55
-msgid ""
-"Our <strong>help</strong> pages may be consulted for detail on other program"
-" features and resources."
-msgstr "Nos pages d'<strong>aide</strong> peuvent être consultées pour davantage de détails sur les fonctionnalités ou les ressources."
+#: mod/events.php:510 mod/events.php:515
+msgid "Event Starts:"
+msgstr "Début de l'événement :"
 
-#: mod/notes.php:34 src/Model/Profile.php:953
-msgid "Personal Notes"
-msgstr "Notes personnelles"
+#: mod/events.php:523 mod/events.php:548
+msgid "Finish date/time is not known or not relevant"
+msgstr "Date / heure de fin inconnue ou sans objet"
 
-#: mod/notifications.php:38
-msgid "Invalid request identifier."
-msgstr "Identifiant de demande invalide."
+#: mod/events.php:525 mod/events.php:530
+msgid "Event Finishes:"
+msgstr "Fin de l'événement :"
 
-#: mod/notifications.php:93 src/Content/Nav.php:246
-msgid "Notifications"
-msgstr "Notifications"
+#: mod/events.php:536 mod/events.php:549
+msgid "Adjust for viewer timezone"
+msgstr "Ajuster à la zone horaire du visiteur"
 
-#: mod/notifications.php:107
-msgid "Network Notifications"
-msgstr "Notifications du réseau"
+#: mod/events.php:538
+msgid "Description:"
+msgstr "Description :"
 
-#: mod/notifications.php:112 mod/notify.php:72
-msgid "System Notifications"
-msgstr "Notifications du système"
+#: mod/events.php:540 mod/notifications.php:264 src/Model/Event.php:68
+#: src/Model/Event.php:95 src/Model/Event.php:437 src/Model/Event.php:933
+#: src/Model/Profile.php:447 src/Module/Contact.php:645
+#: src/Module/Directory.php:137
+msgid "Location:"
+msgstr "Localisation :"
 
-#: mod/notifications.php:117
-msgid "Personal Notifications"
-msgstr "Notifications personnelles"
+#: mod/events.php:542 mod/events.php:544
+msgid "Title:"
+msgstr "Titre :"
 
-#: mod/notifications.php:122
-msgid "Home Notifications"
-msgstr "Notifications de page d'accueil"
+#: mod/events.php:545 mod/events.php:546
+msgid "Share this event"
+msgstr "Partager cet événement"
 
-#: mod/notifications.php:142
-msgid "Show unread"
-msgstr "Afficher non-lus"
+#: mod/events.php:553 src/Model/Profile.php:882
+msgid "Basic"
+msgstr "Simple"
 
-#: mod/notifications.php:142
-msgid "Show all"
-msgstr "Tout afficher"
+#: mod/events.php:554 src/Model/Profile.php:883 src/Module/Admin/Site.php:574
+#: src/Module/Contact.php:905
+msgid "Advanced"
+msgstr "Avancé"
 
-#: mod/notifications.php:153
-msgid "Show Ignored Requests"
-msgstr "Voir les demandes ignorées"
+#: mod/events.php:555 mod/photos.php:1009 mod/photos.php:1383
+#: src/Core/ACL.php:314
+msgid "Permissions"
+msgstr "Permissions"
 
-#: mod/notifications.php:153
-msgid "Hide Ignored Requests"
-msgstr "Cacher les demandes ignorées"
+#: mod/events.php:571
+msgid "Failed to remove event"
+msgstr "La suppression de l'événement a échoué."
 
-#: mod/notifications.php:166 mod/notifications.php:251
-msgid "Notification type:"
-msgstr "Type de notification :"
+#: mod/events.php:573
+msgid "Event removed"
+msgstr "Événement supprimé."
 
-#: mod/notifications.php:169
-msgid "Suggested by:"
-msgstr "Suggéré par :"
+#: mod/fbrowser.php:43 view/theme/frio/theme.php:269 src/Content/Nav.php:162
+#: src/Model/Profile.php:925
+msgid "Photos"
+msgstr "Photos"
 
-#: mod/notifications.php:181 mod/notifications.php:268
-#: src/Module/Contact.php:633
-msgid "Hide this contact from others"
-msgstr "Cacher ce contact aux autres"
+#: mod/fbrowser.php:52 mod/fbrowser.php:76 mod/photos.php:196
+#: mod/photos.php:973 mod/photos.php:1090 mod/photos.php:1107
+#: mod/photos.php:1584 mod/photos.php:1599 src/Model/Photo.php:574
+#: src/Model/Photo.php:583
+msgid "Contact Photos"
+msgstr "Photos du contact"
 
-#: mod/notifications.php:183 mod/notifications.php:277
-#: src/Module/Admin/Users.php:286
-msgid "Approve"
-msgstr "Approuver"
+#: mod/fbrowser.php:112 mod/fbrowser.php:141 mod/profile_photo.php:247
+msgid "Upload"
+msgstr "Téléverser"
 
-#: mod/notifications.php:203
-msgid "Claims to be known to you: "
-msgstr "Prétend que vous le connaissez : "
+#: mod/fbrowser.php:136
+msgid "Files"
+msgstr "Fichiers"
 
-#: mod/notifications.php:204
-msgid "yes"
-msgstr "oui"
+#: mod/follow.php:46
+msgid "The contact could not be added."
+msgstr "Le contact n'a pas pu être ajouté."
 
-#: mod/notifications.php:204
-msgid "no"
-msgstr "non"
+#: mod/follow.php:87
+msgid "You already added this contact."
+msgstr "Vous avez déjà ajouté ce contact."
 
-#: mod/notifications.php:205 mod/notifications.php:209
-msgid "Shall your connection be bidirectional or not?"
-msgstr "Souhaitez vous que votre connexion soit bi-directionnelle ?"
+#: mod/follow.php:99
+msgid "Diaspora support isn't enabled. Contact can't be added."
+msgstr "Le support de Diaspora est désactivé. Le contact ne peut pas être ajouté."
 
-#: mod/notifications.php:206 mod/notifications.php:210
-#, php-format
-msgid ""
-"Accepting %s as a friend allows %s to subscribe to your posts, and you will "
-"also receive updates from them in your news feed."
-msgstr ""
+#: mod/follow.php:106
+msgid "OStatus support is disabled. Contact can't be added."
+msgstr "Le support d'OStatus est désactivé. Le contact ne peut pas être ajouté."
 
-#: mod/notifications.php:207
-#, php-format
-msgid ""
-"Accepting %s as a subscriber allows them to subscribe to your posts, but you"
-" will not receive updates from them in your news feed."
-msgstr ""
+#: mod/follow.php:113
+msgid "The network type couldn't be detected. Contact can't be added."
+msgstr "Impossible de détecter le type de réseau. Le contact ne peut pas être ajouté."
 
-#: mod/notifications.php:211
-#, php-format
-msgid ""
-"Accepting %s as a sharer allows them to subscribe to your posts, but you "
-"will not receive updates from them in your news feed."
-msgstr ""
+#: mod/follow.php:183 mod/notifications.php:268 src/Model/Profile.php:812
+#: src/Module/Contact.php:651
+msgid "Tags:"
+msgstr "Étiquette :"
 
-#: mod/notifications.php:222
-msgid "Friend"
-msgstr "Ami"
+#: mod/fsuggest.php:44
+msgid "Suggested contact not found."
+msgstr "Contact suggéré non trouvé"
 
-#: mod/notifications.php:223
-msgid "Sharer"
-msgstr "Initiateur du partage"
+#: mod/fsuggest.php:57
+msgid "Friend suggestion sent."
+msgstr "Suggestion d'amitié/contact envoyée."
 
-#: mod/notifications.php:223
-msgid "Subscriber"
-msgstr "Abonné∙e"
+#: mod/fsuggest.php:79
+msgid "Suggest Friends"
+msgstr "Suggérer des amis/contacts"
 
-#: mod/notifications.php:263 src/Model/Profile.php:445
-#: src/Model/Profile.php:813 src/Module/Contact.php:650
-#: src/Module/Directory.php:150
-msgid "About:"
-msgstr "À propos :"
+#: mod/fsuggest.php:81
+#, php-format
+msgid "Suggest a friend for %s"
+msgstr "Suggérer un ami/contact pour %s"
 
-#: mod/notifications.php:267 src/Model/Profile.php:442
-#: src/Model/Profile.php:752 src/Module/Directory.php:147
-msgid "Gender:"
-msgstr "Genre :"
+#: mod/hcard.php:20
+msgid "No profile"
+msgstr "Aucun profil"
 
-#: mod/notifications.php:274 src/Model/Profile.php:539
-#: src/Module/Contact.php:90
-msgid "Network:"
-msgstr "Réseau"
+#: mod/item.php:123
+msgid "Unable to locate original post."
+msgstr "Impossible de localiser la publication originale."
 
-#: mod/notifications.php:288
-msgid "No introductions."
-msgstr "Aucune demande d'introduction."
+#: mod/item.php:323
+msgid "Empty post discarded."
+msgstr "Publication vide rejetée."
 
-#: mod/notifications.php:322
+#: mod/item.php:803
 #, php-format
-msgid "No more %s notifications."
-msgstr "Aucune notification de %s"
+msgid ""
+"This message was sent to you by %s, a member of the Friendica social "
+"network."
+msgstr "Ce message vous a été envoyé par %s, membre du réseau social Friendica."
 
-#: mod/notify.php:68
-msgid "No more system notifications."
-msgstr "Pas plus de notifications système."
+#: mod/item.php:805
+#, php-format
+msgid "You may visit them online at %s"
+msgstr "Vous pouvez leur rendre visite sur %s"
 
-#: mod/oexchange.php:32
-msgid "Post successful."
-msgstr "Publication réussie."
+#: mod/item.php:806
+msgid ""
+"Please contact the sender by replying to this post if you do not wish to "
+"receive these messages."
+msgstr "Merci de contacter l’émetteur en répondant à cette publication si vous ne souhaitez pas recevoir ces messages."
 
-#: mod/openid.php:31
-msgid "OpenID protocol error. No ID returned."
-msgstr "Erreur de protocole OpenID. Pas d'ID en retour."
+#: mod/item.php:810
+#, php-format
+msgid "%s posted an update."
+msgstr "%s a publié une mise à jour."
 
-#: mod/openid.php:67
-msgid ""
-"Account not found and OpenID registration is not permitted on this site."
-msgstr "Compte introuvable, et l'inscription OpenID n'est pas autorisée sur ce site."
+#: mod/lockview.php:47 mod/lockview.php:58
+msgid "Remote privacy information not available."
+msgstr "Informations de confidentialité indisponibles."
 
-#: mod/openid.php:117 src/Module/Login.php:93 src/Module/Login.php:144
-msgid "Login failed."
-msgstr "Échec de connexion."
+#: mod/lockview.php:67
+msgid "Visible to:"
+msgstr "Visible par :"
 
-#: mod/ostatus_subscribe.php:23
-msgid "Subscribing to OStatus contacts"
-msgstr "Inscription aux contacts OStatus"
+#: mod/lockview.php:73 mod/lockview.php:108 src/Content/Widget.php:192
+#: src/Module/Contact.php:797 src/Module/Item/Compose.php:97
+#: src/Module/Profile/Contacts.php:126
+msgid "Followers"
+msgstr "Abonnés"
 
-#: mod/ostatus_subscribe.php:35
-msgid "No contact provided."
-msgstr "Pas de contact fourni."
+#: mod/lockview.php:79 mod/lockview.php:114 src/Module/Item/Compose.php:104
+msgid "Mutuals"
+msgstr "Mutuels"
 
-#: mod/ostatus_subscribe.php:42
-msgid "Couldn't fetch information for contact."
-msgstr "Impossible de récupérer les informations pour ce contact."
+#: mod/lostpass.php:26
+msgid "No valid account found."
+msgstr "Impossible de trouver un compte valide."
 
-#: mod/ostatus_subscribe.php:52
-msgid "Couldn't fetch friends for contact."
-msgstr "Impossible de récupérer les amis de ce contact."
+#: mod/lostpass.php:38
+msgid "Password reset request issued. Check your email."
+msgstr "Réinitialisation du mot de passe en cours. Vérifiez votre courriel."
+
+#: mod/lostpass.php:44
+#, php-format
+msgid ""
+"\n"
+"\t\tDear %1$s,\n"
+"\t\t\tA request was recently received at \"%2$s\" to reset your account\n"
+"\t\tpassword. In order to confirm this request, please select the verification link\n"
+"\t\tbelow or paste it into your web browser address bar.\n"
+"\n"
+"\t\tIf you did NOT request this change, please DO NOT follow the link\n"
+"\t\tprovided and ignore and/or delete this email, the request will expire shortly.\n"
+"\n"
+"\t\tYour password will not be changed unless we can verify that you\n"
+"\t\tissued this request."
+msgstr "\n\t\tCher(e) %1$s,\n\t\t\tUne demande vient d'être faite à \"%2$s\" pour réinitialiser votre mot de passe. \n\t\tAfin de confirmer cette demande, merci de sélectionner le lien ci-dessous \n\t\tet de le coller dans la barre d'adresse de votre navigateur.\n\n\t\tSi vous n'avez PAS fait cette demande de changement, merci de NE PAS suivre le lien\n\t\tfourni et d'ignorer et/ou supprimer ce message. La demande expirera rapidement.\n\n\t\tVotre mot de passe ne changera pas tant que nous n'avons pas vérifier que vous êtes à l'origine de la demande."
 
-#: mod/ostatus_subscribe.php:70 mod/repair_ostatus.php:52
-msgid "Done"
-msgstr "Terminé"
+#: mod/lostpass.php:55
+#, php-format
+msgid ""
+"\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"
+msgstr "\n\t\tSuivez ce lien pour confirmer votre identité :\n\n\t\t%1$s\n\n\t\tVous recevrez alors un message contenant votre nouveau mot de passe.\n\t\tVous pourrez changer ce mot de passe depuis les paramètres de votre compte une fois connecté.\n\n\t\tInformations de connexion :\n\n\t\tAdresse :\t%2$s\n\t\tIdentifiant :\t%3$s"
 
-#: mod/ostatus_subscribe.php:84
-msgid "success"
-msgstr "réussite"
+#: mod/lostpass.php:74
+#, php-format
+msgid "Password reset requested at %s"
+msgstr "Requête de réinitialisation de mot de passe à %s"
 
-#: mod/ostatus_subscribe.php:86
-msgid "failed"
-msgstr "échec"
+#: mod/lostpass.php:89
+msgid ""
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
+msgstr "Impossible d'honorer cette demande. (Vous l'avez peut-être déjà utilisée par le passé.) La réinitialisation a échoué."
 
-#: mod/ostatus_subscribe.php:89 src/Object/Post.php:284
-msgid "ignored"
-msgstr "ignoré"
+#: mod/lostpass.php:102
+msgid "Request has expired, please make a new one."
+msgstr "La requête a expiré, veuillez la renouveler."
 
-#: mod/ostatus_subscribe.php:94 mod/repair_ostatus.php:58
-msgid "Keep this window open until done."
-msgstr "Veuillez garder cette fenêtre ouverte jusqu'à la fin."
+#: mod/lostpass.php:117
+msgid "Forgot your Password?"
+msgstr "Mot de passe oublié ?"
 
-#: mod/photos.php:113 src/Model/Profile.php:914
-msgid "Photo Albums"
-msgstr "Albums photo"
+#: mod/lostpass.php:118
+msgid ""
+"Enter your email address and submit to have your password reset. Then check "
+"your email for further instructions."
+msgstr "Entrez votre adresse de courriel et validez pour réinitialiser votre mot de passe. Vous recevrez la suite des instructions par courriel."
 
-#: mod/photos.php:114 mod/photos.php:1630
-msgid "Recent Photos"
-msgstr "Photos récentes"
+#: mod/lostpass.php:119 src/Module/Login.php:318
+msgid "Nickname or Email: "
+msgstr "Pseudo ou eMail : "
 
-#: mod/photos.php:116 mod/photos.php:1144 mod/photos.php:1632
-msgid "Upload New Photos"
-msgstr "Téléverser de nouvelles photos"
+#: mod/lostpass.php:120
+msgid "Reset"
+msgstr "Réinitialiser"
 
-#: mod/photos.php:134 mod/settings.php:58 src/Module/BaseSettingsModule.php:18
-msgid "everybody"
-msgstr "tout le monde"
+#: mod/lostpass.php:135 src/Module/Login.php:330
+msgid "Password Reset"
+msgstr "Réinitialiser le mot de passe"
 
-#: mod/photos.php:185
-msgid "Contact information unavailable"
-msgstr "Informations de contact indisponibles"
+#: mod/lostpass.php:136
+msgid "Your password has been reset as requested."
+msgstr "Votre mot de passe a bien été réinitialisé."
 
-#: mod/photos.php:204
-msgid "Album not found."
-msgstr "Album introuvable."
+#: mod/lostpass.php:137
+msgid "Your new password is"
+msgstr "Votre nouveau mot de passe est "
 
-#: mod/photos.php:262
-msgid "Album successfully deleted"
-msgstr ""
+#: mod/lostpass.php:138
+msgid "Save or copy your new password - and then"
+msgstr "Sauvez ou copiez ce nouveau mot de passe - puis"
 
-#: mod/photos.php:264
-msgid "Album was empty."
-msgstr ""
+#: mod/lostpass.php:139
+msgid "click here to login"
+msgstr "cliquez ici pour vous connecter"
 
-#: mod/photos.php:586
-msgid "a photo"
-msgstr "une photo"
+#: mod/lostpass.php:140
+msgid ""
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
+msgstr "Votre mot de passe peut être changé depuis la page &lt;em&gt;Réglages&lt;/em&gt;, une fois que vous serez connecté."
 
-#: mod/photos.php:586
+#: mod/lostpass.php:147
 #, php-format
-msgid "%1$s was tagged in %2$s by %3$s"
-msgstr "%1$s a été étiqueté dans %2$s par %3$s"
+msgid ""
+"\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"
+msgstr "\n\t\t\t\tChère/Cher %1$s,\n\t\t\t\t\tVotre mot de passe a été changé ainsi que vous l’avez demandé. Veuillez conserver cette informations dans vos archives (ou changer immédiatement votre mot de passe pour un autre dont vous vous souviendrez).\n\t\t\t"
 
-#: mod/photos.php:679 mod/photos.php:682 mod/photos.php:711
-#: mod/profile_photo.php:152 mod/wall_upload.php:198
+#: mod/lostpass.php:153
 #, php-format
-msgid "Image exceeds size limit of %s"
-msgstr "L'image dépasse la taille limite de %s"
+msgid ""
+"\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"
+msgstr "\n\t\t\t\tVoici vos informations de connexion :\n\n\t\t\t\tAdresse :\t%1$s\n\t\t\t\tIdentifiant :\t%2$s\n\t\t\t\tMot de passe :\t%3$s\n\n\t\t\t\tVous pourrez changer votre mot de passe dans les paramètres de votre compte une fois connecté.\n\t\t\t"
 
-#: mod/photos.php:685
-msgid "Image upload didn't complete, please try again"
-msgstr ""
+#: mod/lostpass.php:169
+#, php-format
+msgid "Your password has been changed at %s"
+msgstr "Votre mot de passe a été modifié à %s"
 
-#: mod/photos.php:688
-msgid "Image file is missing"
-msgstr ""
+#: mod/manage.php:179
+msgid "Manage Identities and/or Pages"
+msgstr "Gérer les identités et/ou les pages"
 
-#: mod/photos.php:693
+#: mod/manage.php:180
 msgid ""
-"Server can't accept new file upload at this time, please contact your "
-"administrator"
-msgstr ""
+"Toggle between different identities or community/group pages which share "
+"your account details or which you have been granted \"manage\" permissions"
+msgstr "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."
 
-#: mod/photos.php:719
-msgid "Image file is empty."
-msgstr "Fichier image vide."
+#: mod/manage.php:181
+msgid "Select an identity to manage: "
+msgstr "Choisir une identité à gérer: "
 
-#: mod/photos.php:734 mod/profile_photo.php:161 mod/wall_upload.php:212
-msgid "Unable to process image."
-msgstr "Impossible de traiter l'image."
+#: mod/message.php:33 mod/message.php:116 src/Content/Nav.php:257
+msgid "New Message"
+msgstr "Nouveau message"
 
-#: mod/photos.php:763 mod/profile_photo.php:310 mod/wall_upload.php:251
-msgid "Image upload failed."
-msgstr "Le téléversement de l'image a échoué."
+#: mod/message.php:74
+msgid "Unable to locate contact information."
+msgstr "Impossible de localiser les informations du contact."
 
-#: mod/photos.php:851
-msgid "No photos selected"
-msgstr "Aucune photo sélectionnée"
+#: mod/message.php:110 mod/notifications.php:47 mod/notifications.php:190
+#: mod/notifications.php:246
+msgid "Discard"
+msgstr "Rejeter"
 
-#: mod/photos.php:943 mod/videos.php:210
-msgid "Access to this item is restricted."
-msgstr "Accès restreint à cet élément."
+#: mod/message.php:123 view/theme/frio/theme.php:276 src/Content/Nav.php:254
+msgid "Messages"
+msgstr "Messages"
 
-#: mod/photos.php:997
-msgid "Upload Photos"
-msgstr "Téléverser des photos"
+#: mod/message.php:148
+msgid "Do you really want to delete this message?"
+msgstr "Voulez-vous vraiment supprimer ce message ?"
 
-#: mod/photos.php:1001 mod/photos.php:1089
-msgid "New album name: "
-msgstr "Nom du nouvel album : "
+#: mod/message.php:166
+msgid "Conversation not found."
+msgstr "Conversation inconnue."
 
-#: mod/photos.php:1002
-msgid "or select existing album:"
-msgstr ""
+#: mod/message.php:171
+msgid "Message deleted."
+msgstr "Message supprimé."
 
-#: mod/photos.php:1003
-msgid "Do not show a status post for this upload"
-msgstr "Ne pas publier de notice de statut pour cet envoi"
+#: mod/message.php:176 mod/message.php:190
+msgid "Conversation removed."
+msgstr "Conversation supprimée."
 
-#: mod/photos.php:1019 mod/photos.php:1382 mod/settings.php:1208
-msgid "Show to Groups"
-msgstr "Montrer aux groupes"
+#: mod/message.php:289
+msgid "No messages."
+msgstr "Aucun message."
 
-#: mod/photos.php:1020 mod/photos.php:1383 mod/settings.php:1209
-msgid "Show to Contacts"
-msgstr "Montrer aux Contacts"
+#: mod/message.php:352
+msgid "Message not available."
+msgstr "Message indisponible."
 
-#: mod/photos.php:1071
-msgid "Do you really want to delete this photo album and all its photos?"
-msgstr "Voulez-vous vraiment supprimer cet album photo et toutes ses photos ?"
+#: mod/message.php:406
+msgid "Delete message"
+msgstr "Effacer message"
 
-#: mod/photos.php:1073 mod/photos.php:1094
-msgid "Delete Album"
-msgstr "Effacer l'album"
+#: mod/message.php:408 mod/message.php:540
+msgid "D, d M Y - g:i A"
+msgstr "D, d M Y - g:i A"
 
-#: mod/photos.php:1100
-msgid "Edit Album"
-msgstr "Éditer l'album"
+#: mod/message.php:423 mod/message.php:537
+msgid "Delete conversation"
+msgstr "Effacer conversation"
 
-#: mod/photos.php:1101
-msgid "Drop Album"
-msgstr ""
+#: mod/message.php:425
+msgid ""
+"No secure communications available. You <strong>may</strong> be able to "
+"respond from the sender's profile page."
+msgstr "Pas de communications sécurisées possibles. Vous serez <strong>peut-être</strong> en mesure de répondre depuis la page de profil de l'émetteur."
 
-#: mod/photos.php:1106
-msgid "Show Newest First"
-msgstr "Plus récent d'abord"
+#: mod/message.php:429
+msgid "Send Reply"
+msgstr "Répondre"
 
-#: mod/photos.php:1108
-msgid "Show Oldest First"
-msgstr "Plus ancien d'abord"
+#: mod/message.php:512
+#, php-format
+msgid "Unknown sender - %s"
+msgstr "Émetteur inconnu - %s"
 
-#: mod/photos.php:1129 mod/photos.php:1615
-msgid "View Photo"
-msgstr "Voir la photo"
+#: mod/message.php:514
+#, php-format
+msgid "You and %s"
+msgstr "Vous et %s"
 
-#: mod/photos.php:1166
-msgid "Permission denied. Access to this item may be restricted."
-msgstr "Interdit. L'accès à cet élément peut avoir été restreint."
+#: mod/message.php:516
+#, php-format
+msgid "%s and You"
+msgstr "%s et vous"
 
-#: mod/photos.php:1168
-msgid "Photo not available"
-msgstr "Photo indisponible"
+#: mod/message.php:543
+#, php-format
+msgid "%d message"
+msgid_plural "%d messages"
+msgstr[0] "%d message"
+msgstr[1] "%d messages"
 
-#: mod/photos.php:1178
-msgid "Do you really want to delete this photo?"
-msgstr "Voulez-vous vraiment supprimer cette photo ?"
+#: mod/network.php:183 mod/search.php:35
+msgid "Remove term"
+msgstr "Retirer le terme"
+
+#: mod/network.php:190 mod/search.php:44
+msgid "Saved Searches"
+msgstr "Recherches"
+
+#: mod/network.php:191 src/Model/Group.php:483
+msgid "add"
+msgstr "ajouter"
 
-#: mod/photos.php:1180 mod/photos.php:1379
-msgid "Delete Photo"
-msgstr "Effacer la photo"
+#: mod/network.php:571
+#, php-format
+msgid ""
+"Warning: This group contains %s member from a network that doesn't allow non"
+" public messages."
+msgid_plural ""
+"Warning: This group contains %s members from a network that doesn't allow "
+"non public messages."
+msgstr[0] "Attention : Ce groupe contient %s membre d'un réseau qui n'autorise pas les messages non publics."
+msgstr[1] "Attention : Ce groupe contient %s membres d'un réseau qui n'autorise pas les messages non publics."
 
-#: mod/photos.php:1271
-msgid "View photo"
-msgstr "Voir photo"
+#: mod/network.php:574
+msgid "Messages in this group won't be send to these receivers."
+msgstr "Les messages dans ce groupe ne seront pas envoyés à ces destinataires."
 
-#: mod/photos.php:1273
-msgid "Edit photo"
-msgstr "Éditer la photo"
+#: mod/network.php:641
+msgid "No such group"
+msgstr "Groupe inexistant"
 
-#: mod/photos.php:1274
-msgid "Delete photo"
-msgstr ""
+#: mod/network.php:662 src/Module/Group.php:288
+msgid "Group is empty"
+msgstr "Groupe vide"
 
-#: mod/photos.php:1275
-msgid "Use as profile photo"
-msgstr "Utiliser comme photo de profil"
+#: mod/network.php:666
+#, php-format
+msgid "Group: %s"
+msgstr "Group : %s"
 
-#: mod/photos.php:1282
-msgid "Private Photo"
-msgstr ""
+#: mod/network.php:692
+msgid "Private messages to this person are at risk of public disclosure."
+msgstr "Les messages privés envoyés à ce contact s'exposent à une diffusion incontrôlée."
 
-#: mod/photos.php:1288
-msgid "View Full Size"
-msgstr "Voir en taille réelle"
+#: mod/network.php:695 src/Module/AllFriends.php:35
+#: src/Module/AllFriends.php:43
+msgid "Invalid contact."
+msgstr "Contact invalide."
 
-#: mod/photos.php:1347
-msgid "Tags: "
-msgstr "Étiquettes :"
+#: mod/network.php:974
+msgid "Commented Order"
+msgstr "Tri par commentaires"
 
-#: mod/photos.php:1350
-msgid "[Select tags to remove]"
-msgstr ""
+#: mod/network.php:977
+msgid "Sort by Comment Date"
+msgstr "Trier par date de commentaire"
 
-#: mod/photos.php:1365
-msgid "New album name"
-msgstr "Nom du nouvel album"
+#: mod/network.php:982
+msgid "Posted Order"
+msgstr "Tri des publications"
 
-#: mod/photos.php:1366
-msgid "Caption"
-msgstr "Titre"
+#: mod/network.php:985
+msgid "Sort by Post Date"
+msgstr "Trier par date de publication"
 
-#: mod/photos.php:1367
-msgid "Add a Tag"
-msgstr "Ajouter une étiquette"
+#: mod/network.php:995
+msgid "Posts that mention or involve you"
+msgstr "Publications qui vous concernent"
 
-#: mod/photos.php:1367
-msgid ""
-"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
-msgstr "Exemples : @bob, @Barbara_Jensen, @jim@example.com, #Californie, #vacances"
+#: mod/network.php:1002
+msgid "New"
+msgstr "Nouveau"
 
-#: mod/photos.php:1368
-msgid "Do not rotate"
-msgstr "Pas de rotation"
+#: mod/network.php:1005
+msgid "Activity Stream - by date"
+msgstr "Flux d'activités - par date"
 
-#: mod/photos.php:1369
-msgid "Rotate CW (right)"
-msgstr "Tourner dans le sens des aiguilles d'une montre (vers la droite)"
+#: mod/network.php:1013
+msgid "Shared Links"
+msgstr "Liens partagés"
 
-#: mod/photos.php:1370
-msgid "Rotate CCW (left)"
-msgstr "Tourner dans le sens contraire des aiguilles d'une montre (vers la gauche)"
+#: mod/network.php:1016
+msgid "Interesting Links"
+msgstr "Liens intéressants"
 
-#: mod/photos.php:1404 src/Object/Post.php:312
-msgid "I like this (toggle)"
-msgstr "J'aime"
+#: mod/network.php:1023
+msgid "Starred"
+msgstr "Mis en avant"
 
-#: mod/photos.php:1405 src/Object/Post.php:313
-msgid "I don't like this (toggle)"
-msgstr "Je n'aime pas"
+#: mod/network.php:1026
+msgid "Favourite Posts"
+msgstr "Publications favorites"
 
-#: mod/photos.php:1420 mod/photos.php:1459 mod/photos.php:1519
-#: src/Module/Contact.php:1021 src/Object/Post.php:874
-msgid "This is you"
-msgstr "C'est vous"
+#: mod/notes.php:34 src/Model/Profile.php:967
+msgid "Personal Notes"
+msgstr "Notes personnelles"
 
-#: mod/photos.php:1422 mod/photos.php:1461 mod/photos.php:1521
-#: src/Object/Post.php:419 src/Object/Post.php:876
-msgid "Comment"
-msgstr "Commenter"
+#: mod/notifications.php:38
+msgid "Invalid request identifier."
+msgstr "Identifiant de demande invalide."
 
-#: mod/photos.php:1550
-msgid "Map"
-msgstr "Carte"
+#: mod/notifications.php:93 src/Content/Nav.php:249
+msgid "Notifications"
+msgstr "Notifications"
 
-#: mod/photos.php:1621 mod/videos.php:287
-msgid "View Album"
-msgstr "Voir l'album"
+#: mod/notifications.php:107
+msgid "Network Notifications"
+msgstr "Notifications du réseau"
 
-#: mod/ping.php:272
-msgid "{0} wants to be your friend"
-msgstr "{0} souhaite être votre ami(e)"
+#: mod/notifications.php:112
+msgid "System Notifications"
+msgstr "Notifications du système"
 
-#: mod/ping.php:288
-msgid "{0} requested registration"
-msgstr "{0} a demandé à s'inscrire"
+#: mod/notifications.php:117
+msgid "Personal Notifications"
+msgstr "Notifications personnelles"
 
-#: mod/poke.php:177
-msgid "Poke/Prod"
-msgstr "Solliciter"
+#: mod/notifications.php:122
+msgid "Home Notifications"
+msgstr "Notifications de page d'accueil"
 
-#: mod/poke.php:178
-msgid "poke, prod or do other things to somebody"
-msgstr "solliciter (poke/...) quelqu'un"
+#: mod/notifications.php:145
+msgid "Show unread"
+msgstr "Afficher non-lus"
 
-#: mod/poke.php:179
-msgid "Recipient"
-msgstr "Destinataire"
+#: mod/notifications.php:145
+msgid "Show all"
+msgstr "Tout afficher"
 
-#: mod/poke.php:180
-msgid "Choose what you wish to do to recipient"
-msgstr "Choisissez ce que vous voulez faire au destinataire"
+#: mod/notifications.php:156
+msgid "Show Ignored Requests"
+msgstr "Voir les demandes ignorées"
 
-#: mod/poke.php:183
-msgid "Make this post private"
-msgstr "Rendez ce message privé"
+#: mod/notifications.php:156
+msgid "Hide Ignored Requests"
+msgstr "Cacher les demandes ignorées"
 
-#: mod/probe.php:13 src/Module/WebFinger.php:18
-msgid "Only logged in users are permitted to perform a probing."
-msgstr ""
+#: mod/notifications.php:169 mod/notifications.php:254
+msgid "Notification type:"
+msgstr "Type de notification :"
 
-#: mod/profiles.php:62
-msgid "Profile deleted."
-msgstr "Profil supprimé."
+#: mod/notifications.php:172
+msgid "Suggested by:"
+msgstr "Suggéré par :"
 
-#: mod/profiles.php:78 mod/profiles.php:114
-msgid "Profile-"
-msgstr "Profil-"
+#: mod/notifications.php:184 mod/notifications.php:271
+#: src/Module/Contact.php:632
+msgid "Hide this contact from others"
+msgstr "Cacher ce contact aux autres"
 
-#: mod/profiles.php:97 mod/profiles.php:135
-msgid "New profile created."
-msgstr "Nouveau profil créé."
+#: mod/notifications.php:186 mod/notifications.php:280
+#: src/Module/Admin/Users.php:286
+msgid "Approve"
+msgstr "Approuver"
 
-#: mod/profiles.php:120
-msgid "Profile unavailable to clone."
-msgstr "Ce profil ne peut être cloné."
+#: mod/notifications.php:206
+msgid "Claims to be known to you: "
+msgstr "Prétend que vous le connaissez : "
 
-#: mod/profiles.php:206
-msgid "Profile Name is required."
-msgstr "Le nom du profil est requis."
+#: mod/notifications.php:207
+msgid "yes"
+msgstr "oui"
 
-#: mod/profiles.php:346
-msgid "Marital Status"
-msgstr "Statut marital"
+#: mod/notifications.php:207
+msgid "no"
+msgstr "non"
 
-#: mod/profiles.php:349
-msgid "Romantic Partner"
-msgstr "Partenaire / conjoint"
+#: mod/notifications.php:208 mod/notifications.php:212
+msgid "Shall your connection be bidirectional or not?"
+msgstr "Souhaitez vous que votre connexion soit bi-directionnelle ?"
 
-#: mod/profiles.php:358
-msgid "Work/Employment"
-msgstr "Travail / Occupation"
+#: mod/notifications.php:209 mod/notifications.php:213
+#, php-format
+msgid ""
+"Accepting %s as a friend allows %s to subscribe to your posts, and you will "
+"also receive updates from them in your news feed."
+msgstr "Accepter %s comme ami autorise %s à s'abonner à vos publications, et vous recevrez également des nouvelles d'eux dans votre fil d'actualités."
 
-#: mod/profiles.php:361
-msgid "Religion"
-msgstr "Religion"
+#: mod/notifications.php:210
+#, php-format
+msgid ""
+"Accepting %s as a subscriber allows them to subscribe to your posts, but you"
+" will not receive updates from them in your news feed."
+msgstr "Accepter %s comme ami les autorise à s'abonner à vos publications, mais vous ne recevrez pas de nouvelles d'eux dans votre fil d'actualités."
 
-#: mod/profiles.php:364
-msgid "Political Views"
-msgstr "Tendance politique"
+#: mod/notifications.php:214
+#, php-format
+msgid ""
+"Accepting %s as a sharer allows them to subscribe to your posts, but you "
+"will not receive updates from them in your news feed."
+msgstr ""
 
-#: mod/profiles.php:367
-msgid "Gender"
-msgstr "Sexe"
+#: mod/notifications.php:225
+msgid "Friend"
+msgstr "Ami"
 
-#: mod/profiles.php:370
-msgid "Sexual Preference"
-msgstr "Préférence sexuelle"
+#: mod/notifications.php:226
+msgid "Sharer"
+msgstr "Initiateur du partage"
 
-#: mod/profiles.php:373
-msgid "XMPP"
-msgstr "XMPP"
+#: mod/notifications.php:226
+msgid "Subscriber"
+msgstr "Abonné∙e"
 
-#: mod/profiles.php:376
-msgid "Homepage"
-msgstr "Site internet"
+#: mod/notifications.php:266 src/Model/Profile.php:453
+#: src/Model/Profile.php:824 src/Module/Contact.php:649
+#: src/Module/Directory.php:145
+msgid "About:"
+msgstr "À propos :"
 
-#: mod/profiles.php:379 mod/profiles.php:578
-msgid "Interests"
-msgstr "Centres d'intérêt"
+#: mod/notifications.php:270 src/Model/Profile.php:450
+#: src/Model/Profile.php:763 src/Module/Directory.php:142
+msgid "Gender:"
+msgstr "Genre :"
 
-#: mod/profiles.php:382 src/Module/Admin/Blocklist/Contact.php:72
-msgid "Address"
-msgstr "Adresse"
+#: mod/notifications.php:277 src/Model/Profile.php:550
+#: src/Module/Contact.php:333
+msgid "Network:"
+msgstr "Réseau"
 
-#: mod/profiles.php:389 mod/profiles.php:574
-msgid "Location"
-msgstr "Localisation"
+#: mod/notifications.php:291
+msgid "No introductions."
+msgstr "Aucune demande d'introduction."
 
-#: mod/profiles.php:469
-msgid "Profile updated."
-msgstr "Profil mis à jour."
+#: mod/notifications.php:325
+#, php-format
+msgid "No more %s notifications."
+msgstr "Aucune notification de %s"
 
-#: mod/profiles.php:523
-msgid "Hide contacts and friends:"
-msgstr "Cacher mes contacts et amis :"
+#: mod/openid.php:31
+msgid "OpenID protocol error. No ID returned."
+msgstr "Erreur de protocole OpenID. Pas d'ID en retour."
 
-#: mod/profiles.php:528
-msgid "Hide your contact/friend list from viewers of this profile?"
-msgstr "Cacher ma liste d'amis / contacts des visiteurs de ce profil ?"
+#: mod/openid.php:67
+msgid ""
+"Account not found and OpenID registration is not permitted on this site."
+msgstr "Compte introuvable, et l'inscription OpenID n'est pas autorisée sur ce site."
+
+#: mod/openid.php:117 src/Module/Login.php:88 src/Module/Login.php:139
+msgid "Login failed."
+msgstr "Échec de connexion."
 
-#: mod/profiles.php:548
-msgid "Show more profile fields:"
-msgstr "Afficher plus d'infos de profil :"
+#: mod/photos.php:113 src/Model/Profile.php:928
+msgid "Photo Albums"
+msgstr "Albums photo"
 
-#: mod/profiles.php:560
-msgid "Profile Actions"
-msgstr "Actions de Profil"
+#: mod/photos.php:114 mod/photos.php:1639
+msgid "Recent Photos"
+msgstr "Photos récentes"
 
-#: mod/profiles.php:561
-msgid "Edit Profile Details"
-msgstr "Éditer les détails du profil"
+#: mod/photos.php:116 mod/photos.php:1152 mod/photos.php:1641
+msgid "Upload New Photos"
+msgstr "Téléverser de nouvelles photos"
 
-#: mod/profiles.php:563
-msgid "Change Profile Photo"
-msgstr "Changer la photo du profil"
+#: mod/photos.php:134 mod/settings.php:60 src/Module/BaseSettingsModule.php:18
+msgid "everybody"
+msgstr "tout le monde"
 
-#: mod/profiles.php:565
-msgid "View this profile"
-msgstr "Voir ce profil"
+#: mod/photos.php:185
+msgid "Contact information unavailable"
+msgstr "Informations de contact indisponibles"
 
-#: mod/profiles.php:566
-msgid "View all profiles"
-msgstr ""
+#: mod/photos.php:207
+msgid "Album not found."
+msgstr "Album introuvable."
 
-#: mod/profiles.php:567 mod/profiles.php:662 src/Model/Profile.php:415
-msgid "Edit visibility"
-msgstr "Changer la visibilité"
+#: mod/photos.php:265
+msgid "Album successfully deleted"
+msgstr "Album bien supprimé"
 
-#: mod/profiles.php:568
-msgid "Create a new profile using these settings"
-msgstr "Créer un nouveau profil en utilisant ces réglages"
+#: mod/photos.php:267
+msgid "Album was empty."
+msgstr "L'album était vide"
 
-#: mod/profiles.php:569
-msgid "Clone this profile"
-msgstr "Cloner ce profil"
+#: mod/photos.php:590
+msgid "a photo"
+msgstr "une photo"
 
-#: mod/profiles.php:570
-msgid "Delete this profile"
-msgstr "Supprimer ce profil"
+#: mod/photos.php:590
+#, php-format
+msgid "%1$s was tagged in %2$s by %3$s"
+msgstr "%1$s a été étiqueté dans %2$s par %3$s"
 
-#: mod/profiles.php:572
-msgid "Basic information"
-msgstr "Information de base"
+#: mod/photos.php:689
+msgid "Image upload didn't complete, please try again"
+msgstr "La mise en ligne de l'image ne s'est pas terminée, veuillez réessayer"
 
-#: mod/profiles.php:573
-msgid "Profile picture"
-msgstr "Image de profil"
+#: mod/photos.php:692
+msgid "Image file is missing"
+msgstr "Fichier image manquant"
 
-#: mod/profiles.php:575
-msgid "Preferences"
-msgstr "Préférences"
+#: mod/photos.php:697
+msgid ""
+"Server can't accept new file upload at this time, please contact your "
+"administrator"
+msgstr "Le serveur ne peut pas accepter la mise en ligne d'un nouveau fichier en ce moment, veuillez contacter un administrateur"
 
-#: mod/profiles.php:576
-msgid "Status information"
-msgstr "Information sur le statut"
+#: mod/photos.php:723
+msgid "Image file is empty."
+msgstr "Fichier image vide."
 
-#: mod/profiles.php:577
-msgid "Additional information"
-msgstr "Information additionnelle"
+#: mod/photos.php:855
+msgid "No photos selected"
+msgstr "Aucune photo sélectionnée"
 
-#: mod/profiles.php:580
-msgid "Relation"
-msgstr "Relation"
+#: mod/photos.php:947 mod/videos.php:210
+msgid "Access to this item is restricted."
+msgstr "Accès restreint à cet élément."
 
-#: mod/profiles.php:581 src/Util/Temporal.php:79 src/Util/Temporal.php:81
-msgid "Miscellaneous"
-msgstr "Divers"
+#: mod/photos.php:1001
+msgid "Upload Photos"
+msgstr "Téléverser des photos"
 
-#: mod/profiles.php:584
-msgid "Your Gender:"
-msgstr "Votre genre :"
+#: mod/photos.php:1005 mod/photos.php:1097
+msgid "New album name: "
+msgstr "Nom du nouvel album : "
 
-#: mod/profiles.php:585
-msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
-msgstr "<span class=\"heart\">&hearts;</span> Statut marital :"
+#: mod/photos.php:1006
+msgid "or select existing album:"
+msgstr "ou sélectionner un album existant"
 
-#: mod/profiles.php:586 src/Model/Profile.php:789
-msgid "Sexual Preference:"
-msgstr "Préférence sexuelle :"
+#: mod/photos.php:1007
+msgid "Do not show a status post for this upload"
+msgstr "Ne pas publier de notice de statut pour cet envoi"
 
-#: mod/profiles.php:587
-msgid "Example: fishing photography software"
-msgstr "Exemple : football dessin programmation"
+#: mod/photos.php:1023 mod/photos.php:1391 mod/settings.php:1213
+msgid "Show to Groups"
+msgstr "Montrer aux groupes"
 
-#: mod/profiles.php:592
-msgid "Profile Name:"
-msgstr "Nom du profil :"
+#: mod/photos.php:1024 mod/photos.php:1392 mod/settings.php:1214
+msgid "Show to Contacts"
+msgstr "Montrer aux Contacts"
 
-#: mod/profiles.php:594
-msgid ""
-"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
-"be visible to anybody using the internet."
-msgstr "Ceci est votre profil <strong>public</strong>.<br />Il <strong>peut</strong> être visible par n'importe quel utilisateur d'Internet."
+#: mod/photos.php:1079
+msgid "Do you really want to delete this photo album and all its photos?"
+msgstr "Voulez-vous vraiment supprimer cet album photo et toutes ses photos ?"
 
-#: mod/profiles.php:595
-msgid "Your Full Name:"
-msgstr "Votre nom complet :"
+#: mod/photos.php:1081 mod/photos.php:1102
+msgid "Delete Album"
+msgstr "Effacer l'album"
 
-#: mod/profiles.php:596
-msgid "Title/Description:"
-msgstr "Titre / Description :"
+#: mod/photos.php:1108
+msgid "Edit Album"
+msgstr "Éditer l'album"
 
-#: mod/profiles.php:599
-msgid "Street Address:"
-msgstr "Adresse postale :"
+#: mod/photos.php:1109
+msgid "Drop Album"
+msgstr ""
 
-#: mod/profiles.php:600
-msgid "Locality/City:"
-msgstr "Ville :"
+#: mod/photos.php:1114
+msgid "Show Newest First"
+msgstr "Plus récent d'abord"
 
-#: mod/profiles.php:601
-msgid "Region/State:"
-msgstr "Région / État :"
+#: mod/photos.php:1116
+msgid "Show Oldest First"
+msgstr "Plus ancien d'abord"
 
-#: mod/profiles.php:602
-msgid "Postal/Zip Code:"
-msgstr "Code postal :"
+#: mod/photos.php:1137 mod/photos.php:1624
+msgid "View Photo"
+msgstr "Voir la photo"
 
-#: mod/profiles.php:603
-msgid "Country:"
-msgstr "Pays :"
+#: mod/photos.php:1174
+msgid "Permission denied. Access to this item may be restricted."
+msgstr "Interdit. L'accès à cet élément peut avoir été restreint."
 
-#: mod/profiles.php:604 src/Util/Temporal.php:149
-msgid "Age: "
-msgstr "Age : "
+#: mod/photos.php:1176
+msgid "Photo not available"
+msgstr "Photo indisponible"
 
-#: mod/profiles.php:607
-msgid "Who: (if applicable)"
-msgstr "Qui : (si pertinent)"
+#: mod/photos.php:1186
+msgid "Do you really want to delete this photo?"
+msgstr "Voulez-vous vraiment supprimer cette photo ?"
 
-#: mod/profiles.php:607
-msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
-msgstr "Exemples: cathy123, Cathy Williams, cathy@example.com"
+#: mod/photos.php:1188 mod/photos.php:1388
+msgid "Delete Photo"
+msgstr "Effacer la photo"
 
-#: mod/profiles.php:608
-msgid "Since [date]:"
-msgstr "Depuis [date]  :"
+#: mod/photos.php:1279
+msgid "View photo"
+msgstr "Voir photo"
 
-#: mod/profiles.php:610
-msgid "Tell us about yourself..."
-msgstr "Parlez-nous de vous..."
+#: mod/photos.php:1281
+msgid "Edit photo"
+msgstr "Éditer la photo"
 
-#: mod/profiles.php:611
-msgid "XMPP (Jabber) address:"
-msgstr "Adresse XMPP (Jabber) :"
+#: mod/photos.php:1282
+msgid "Delete photo"
+msgstr "Effacer la photo"
 
-#: mod/profiles.php:611
-msgid ""
-"The XMPP address will be propagated to your contacts so that they can follow"
-" you."
-msgstr "Votre adresse XMPP sera transmise à vos contacts pour qu'ils puissent vous suivre."
+#: mod/photos.php:1283
+msgid "Use as profile photo"
+msgstr "Utiliser comme photo de profil"
 
-#: mod/profiles.php:612
-msgid "Homepage URL:"
-msgstr "Page personnelle :"
+#: mod/photos.php:1290
+msgid "Private Photo"
+msgstr "Photo privée"
 
-#: mod/profiles.php:613 src/Model/Profile.php:797
-msgid "Hometown:"
-msgstr " Ville d'origine :"
+#: mod/photos.php:1296
+msgid "View Full Size"
+msgstr "Voir en taille réelle"
 
-#: mod/profiles.php:614 src/Model/Profile.php:805
-msgid "Political Views:"
-msgstr "Opinions politiques :"
+#: mod/photos.php:1356
+msgid "Tags: "
+msgstr "Étiquettes :"
 
-#: mod/profiles.php:615
-msgid "Religious Views:"
-msgstr "Opinions religieuses :"
+#: mod/photos.php:1359
+msgid "[Select tags to remove]"
+msgstr "[Sélectionner les étiquettes à supprimer]"
 
-#: mod/profiles.php:616
-msgid "Public Keywords:"
-msgstr "Mots-clés publics :"
+#: mod/photos.php:1374
+msgid "New album name"
+msgstr "Nom du nouvel album"
 
-#: mod/profiles.php:616
-msgid "(Used for suggesting potential friends, can be seen by others)"
-msgstr "(Utilisés pour vous suggérer des amis potentiels. Ils peuvent être vus par autrui)"
+#: mod/photos.php:1375
+msgid "Caption"
+msgstr "Titre"
 
-#: mod/profiles.php:617
-msgid "Private Keywords:"
-msgstr "Mots-clés privés :"
+#: mod/photos.php:1376
+msgid "Add a Tag"
+msgstr "Ajouter une étiquette"
 
-#: mod/profiles.php:617
-msgid "(Used for searching profiles, never shown to others)"
-msgstr "(Utilisés pour rechercher des profils. Ils ne seront jamais montrés à autrui)"
+#: mod/photos.php:1376
+msgid ""
+"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+msgstr "Exemples : @bob, @Barbara_Jensen, @jim@example.com, #Californie, #vacances"
 
-#: mod/profiles.php:618 src/Model/Profile.php:821
-msgid "Likes:"
-msgstr "J'aime :"
+#: mod/photos.php:1377
+msgid "Do not rotate"
+msgstr "Pas de rotation"
 
-#: mod/profiles.php:619 src/Model/Profile.php:825
-msgid "Dislikes:"
-msgstr "Je n'aime pas :"
+#: mod/photos.php:1378
+msgid "Rotate CW (right)"
+msgstr "Tourner dans le sens des aiguilles d'une montre (vers la droite)"
 
-#: mod/profiles.php:620
-msgid "Musical interests"
-msgstr "Goûts musicaux"
+#: mod/photos.php:1379
+msgid "Rotate CCW (left)"
+msgstr "Tourner dans le sens contraire des aiguilles d'une montre (vers la gauche)"
 
-#: mod/profiles.php:621
-msgid "Books, literature"
-msgstr "Lectures"
+#: mod/photos.php:1413 src/Object/Post.php:313
+msgid "I like this (toggle)"
+msgstr "J'aime"
 
-#: mod/profiles.php:622
-msgid "Television"
-msgstr "Télévision"
+#: mod/photos.php:1414 src/Object/Post.php:314
+msgid "I don't like this (toggle)"
+msgstr "Je n'aime pas"
 
-#: mod/profiles.php:623
-msgid "Film/dance/culture/entertainment"
-msgstr "Cinéma / Danse / Culture / Divertissement"
+#: mod/photos.php:1429 mod/photos.php:1468 mod/photos.php:1528
+#: src/Module/Contact.php:1017 src/Module/Item/Compose.php:176
+#: src/Object/Post.php:875
+msgid "This is you"
+msgstr "C'est vous"
 
-#: mod/profiles.php:624
-msgid "Hobbies/Interests"
-msgstr "Passe-temps / Centres d'intérêt"
+#: mod/photos.php:1431 mod/photos.php:1470 mod/photos.php:1530
+#: src/Object/Post.php:420 src/Object/Post.php:877
+msgid "Comment"
+msgstr "Commenter"
 
-#: mod/profiles.php:625
-msgid "Love/romance"
-msgstr "Amour / Romance"
+#: mod/photos.php:1559
+msgid "Map"
+msgstr "Carte"
 
-#: mod/profiles.php:626
-msgid "Work/employment"
-msgstr "Activité professionnelle / Occupation"
+#: mod/photos.php:1630 mod/videos.php:287
+msgid "View Album"
+msgstr "Voir l'album"
 
-#: mod/profiles.php:627
-msgid "School/education"
-msgstr "Études / Formation"
+#: mod/ping.php:272
+msgid "{0} wants to be your friend"
+msgstr "{0} souhaite être votre ami(e)"
 
-#: mod/profiles.php:628
-msgid "Contact information and Social Networks"
-msgstr "Coordonnées / Réseaux sociaux"
+#: mod/ping.php:288
+msgid "{0} requested registration"
+msgstr "{0} a demandé à s'inscrire"
 
-#: mod/profiles.php:659 src/Model/Profile.php:411
-msgid "Profile Image"
-msgstr "Image du profil"
+#: mod/poke.php:177
+msgid "Poke/Prod"
+msgstr "Solliciter"
 
-#: mod/profiles.php:661 src/Model/Profile.php:414
-msgid "visible to everybody"
-msgstr "visible par tous"
+#: mod/poke.php:178
+msgid "poke, prod or do other things to somebody"
+msgstr "solliciter (poke/...) quelqu'un"
 
-#: mod/profiles.php:668
-msgid "Edit/Manage Profiles"
-msgstr "Editer / gérer les profils"
+#: mod/poke.php:179
+msgid "Recipient"
+msgstr "Destinataire"
 
-#: mod/profiles.php:669 src/Model/Profile.php:401 src/Model/Profile.php:423
-msgid "Change profile photo"
-msgstr "Changer de photo de profil"
+#: mod/poke.php:180
+msgid "Choose what you wish to do to recipient"
+msgstr "Choisissez ce que vous voulez faire au destinataire"
 
-#: mod/profiles.php:670 src/Model/Profile.php:402
-msgid "Create New Profile"
-msgstr "Créer un nouveau profil"
+#: mod/poke.php:183
+msgid "Make this post private"
+msgstr "Rendez ce message privé"
 
 #: 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
+#: mod/profile_photo.php:311
 #, php-format
 msgid "Image size reduction [%s] failed."
 msgstr "Réduction de la taille de l'image [%s] échouée."
@@ -3140,363 +3168,313 @@ msgstr "Rechargez la page avec la touche Maj pressée, ou bien effacez le cache
 msgid "Unable to process image"
 msgstr "Impossible de traiter l'image"
 
-#: mod/profile_photo.php:251
+#: mod/profile_photo.php:244
 msgid "Upload File:"
 msgstr "Fichier à téléverser :"
 
-#: mod/profile_photo.php:252
+#: mod/profile_photo.php:245
 msgid "Select a profile:"
 msgstr "Choisir un profil :"
 
-#: mod/profile_photo.php:257
+#: mod/profile_photo.php:250
 msgid "or"
 msgstr "ou"
 
-#: mod/profile_photo.php:258
+#: mod/profile_photo.php:251
 msgid "skip this step"
 msgstr "ignorer cette étape"
 
-#: mod/profile_photo.php:258
+#: mod/profile_photo.php:251
 msgid "select a photo from your photo albums"
 msgstr "choisissez une photo depuis vos albums"
 
-#: mod/profile_photo.php:271
+#: mod/profile_photo.php:264
 msgid "Crop Image"
 msgstr "(Re)cadrer l'image"
 
-#: mod/profile_photo.php:272
+#: mod/profile_photo.php:265
 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
+#: mod/profile_photo.php:267
 msgid "Done Editing"
 msgstr "Édition terminée"
 
-#: mod/profile_photo.php:308
+#: mod/profile_photo.php:301
 msgid "Image uploaded successfully."
 msgstr "Image téléversée avec succès."
 
-#: mod/profperm.php:30
-msgid "Permission denied"
-msgstr "Permission refusée"
-
-#: 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:119 src/Module/Group.php:321
-msgid "Click on a contact to add or remove."
-msgstr "Cliquez sur un contact pour l'ajouter ou le supprimer."
-
-#: 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"
-msgstr ""
-
-#: mod/removeme.php:47
-msgid ""
-"On your Friendica node an user deleted their account. Please ensure that "
-"their data is removed from the backups."
-msgstr ""
-
-#: mod/removeme.php:48
-#, php-format
-msgid "The user id is %d"
-msgstr "L'identifiant d'utilisateur est %d"
-
-#: mod/removeme.php:84 mod/removeme.php:87
-msgid "Remove My Account"
-msgstr "Supprimer mon compte"
-
-#: mod/removeme.php:85
-msgid ""
-"This will completely remove your account. Once this has been done it is not "
-"recoverable."
-msgstr "Ceci supprimera totalement votre compte. Cette opération est irréversible."
-
-#: mod/removeme.php:86
-msgid "Please enter your password for verification:"
-msgstr "Merci de saisir votre mot de passe pour vérification :"
-
-#: mod/repair_ostatus.php:21
-msgid "Resubscribing to OStatus contacts"
-msgstr "Réinscription aux contacts OStatus"
-
-#: mod/repair_ostatus.php:37
-msgid "Error"
-msgstr "Erreur"
-
-#: mod/search.php:101
+#: mod/search.php:92
 msgid "Only logged in users are permitted to perform a search."
 msgstr "Seuls les utilisateurs inscrits sont autorisés à lancer une recherche."
 
-#: mod/search.php:123
+#: mod/search.php:114
 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:143 src/Content/Nav.php:197 src/Content/Text/HTML.php:900
+#: mod/search.php:134 src/Content/Text/HTML.php:889 src/Content/Nav.php:200
 msgid "Search"
 msgstr "Recherche"
 
-#: mod/search.php:229
+#: mod/search.php:228
 #, php-format
 msgid "Items tagged with: %s"
 msgstr "Éléments taggés %s"
 
-#: mod/search.php:231 src/Module/Contact.php:819
+#: mod/search.php:230 src/Module/Contact.php:819
 #, php-format
 msgid "Results for: %s"
 msgstr "Résultats pour : %s"
 
-#: mod/settings.php:63 src/Module/BaseSettingsModule.php:24
+#: mod/settings.php:65 src/Module/BaseSettingsModule.php:24
 msgid "Account"
 msgstr "Compte"
 
-#: mod/settings.php:71 src/Module/BaseSettingsModule.php:31
-#: src/Module/Settings/TwoFactor/Index.php:83
-#: src/Module/TwoFactor/Verify.php:60
+#: mod/settings.php:73 src/Module/BaseSettingsModule.php:31
+#: src/Module/Settings/TwoFactor/Index.php:89
+#: src/Module/TwoFactor/Verify.php:62
 msgid "Two-factor authentication"
 msgstr "Authentification à double facteurs."
 
-#: mod/settings.php:78 src/Content/Nav.php:265 src/Model/Profile.php:394
+#: mod/settings.php:80 src/Content/Nav.php:268 src/Model/Profile.php:402
 #: src/Module/BaseSettingsModule.php:38
 msgid "Profiles"
 msgstr "Profils"
 
-#: mod/settings.php:86 src/Module/BaseAdminModule.php:84
+#: mod/settings.php:88 src/Module/BaseAdminModule.php:84
 #: src/Module/BaseSettingsModule.php:46
 msgid "Additional features"
 msgstr "Fonctions supplémentaires"
 
-#: mod/settings.php:94 src/Module/BaseSettingsModule.php:54
+#: mod/settings.php:96 src/Module/BaseSettingsModule.php:54
 msgid "Display"
 msgstr "Afficher"
 
-#: mod/settings.php:101 mod/settings.php:839
+#: mod/settings.php:103 mod/settings.php:843
 #: src/Module/BaseSettingsModule.php:61
 msgid "Social Networks"
 msgstr "Réseaux sociaux"
 
-#: mod/settings.php:108 src/Module/Admin/Addons/Details.php:100
+#: mod/settings.php:110 src/Module/Admin/Addons/Details.php:100
 #: src/Module/Admin/Addons/Index.php:51 src/Module/BaseAdminModule.php:82
 #: src/Module/BaseSettingsModule.php:68
 msgid "Addons"
 msgstr "Extensions"
 
-#: mod/settings.php:115 src/Content/Nav.php:260
+#: mod/settings.php:117 src/Content/Nav.php:263
 #: src/Module/BaseSettingsModule.php:75
 msgid "Delegations"
 msgstr "Délégations"
 
-#: mod/settings.php:122 src/Module/BaseSettingsModule.php:82
+#: mod/settings.php:124 src/Module/BaseSettingsModule.php:82
 msgid "Connected apps"
 msgstr "Applications connectées"
 
-#: mod/settings.php:129 mod/uexport.php:52
+#: mod/settings.php:131 mod/uexport.php:59
 #: src/Module/BaseSettingsModule.php:89
 msgid "Export personal data"
 msgstr "Exporter"
 
-#: mod/settings.php:136 src/Module/BaseSettingsModule.php:96
+#: mod/settings.php:138 src/Module/BaseSettingsModule.php:96
 msgid "Remove account"
 msgstr "Supprimer le compte"
 
-#: mod/settings.php:188
+#: mod/settings.php:147 view/theme/frio/theme.php:277 src/Content/Nav.php:265
+#: src/Module/Admin/Addons/Details.php:102
+#: src/Module/Admin/Themes/Details.php:107
+#: src/Module/BaseSettingsModule.php:105 src/Module/Welcome.php:33
+msgid "Settings"
+msgstr "Réglages"
+
+#: mod/settings.php:190
 msgid "Missing some important data!"
 msgstr "Il manque certaines informations importantes !"
 
-#: mod/settings.php:190 mod/settings.php:700 src/Module/Contact.php:826
+#: mod/settings.php:192 mod/settings.php:703 src/Module/Contact.php:826
 msgid "Update"
 msgstr "Mises à jour"
 
-#: mod/settings.php:299
+#: mod/settings.php:302
 msgid "Failed to connect with email account using the settings provided."
 msgstr "Impossible de se connecter au compte courriel configuré."
 
-#: mod/settings.php:304
+#: mod/settings.php:307
 msgid "Email settings updated."
 msgstr "Réglages de courriel mis à jour."
 
-#: mod/settings.php:320
+#: mod/settings.php:323
 msgid "Features updated"
 msgstr "Fonctionnalités mises à jour"
 
-#: mod/settings.php:393
+#: mod/settings.php:384
+msgid "The theme you chose isn't available."
+msgstr "Le thème que vous avez choisi n'est pas disponible."
+
+#: mod/settings.php:396
 msgid "Relocate message has been send to your contacts"
 msgstr "Un message de relocalisation a été envoyé à vos contacts."
 
-#: mod/settings.php:405
+#: mod/settings.php:408
 msgid "Passwords do not match."
 msgstr "Les mots de passe ne correspondent pas."
 
-#: mod/settings.php:413 src/Console/NewPassword.php:80
+#: mod/settings.php:416 src/Console/NewPassword.php:101
 msgid "Password update failed. Please try again."
 msgstr "Le changement de mot de passe a échoué. Merci de recommencer."
 
-#: mod/settings.php:416 src/Console/NewPassword.php:83
+#: mod/settings.php:419 src/Console/NewPassword.php:104
 msgid "Password changed."
 msgstr "Mot de passe changé."
 
-#: mod/settings.php:419
+#: mod/settings.php:422
 msgid "Password unchanged."
 msgstr "Mot de passe non changé."
 
-#: mod/settings.php:500
+#: mod/settings.php:503
 msgid " Please use a shorter name."
 msgstr " Merci d'utiliser un nom plus court."
 
-#: mod/settings.php:503
+#: mod/settings.php:506
 msgid " Name too short."
 msgstr " Nom trop court."
 
-#: mod/settings.php:510 src/Module/Settings/TwoFactor/Index.php:66
+#: mod/settings.php:513 src/Module/Settings/TwoFactor/Index.php:72
 msgid "Wrong Password"
 msgstr "Mauvais mot de passe"
 
-#: mod/settings.php:515
+#: mod/settings.php:518
 msgid "Invalid email."
 msgstr "Courriel invalide."
 
-#: mod/settings.php:521
+#: mod/settings.php:524
 msgid "Cannot change to that email."
 msgstr "Ne peut pas changer vers ce courriel."
 
-#: mod/settings.php:571
+#: mod/settings.php:574
 msgid "Private forum has no privacy permissions. Using default privacy group."
 msgstr "Ce forum privé n'a pas de paramètres de vie privée. Utilisation des paramètres de confidentialité par défaut."
 
-#: mod/settings.php:574
+#: mod/settings.php:577
 msgid "Private forum has no privacy permissions and no default privacy group."
 msgstr "Ce forum privé n'a pas de paramètres de vie privée ni de paramètres de confidentialité par défaut."
 
-#: mod/settings.php:614
+#: mod/settings.php:617
 msgid "Settings updated."
 msgstr "Réglages mis à jour."
 
-#: mod/settings.php:673 mod/settings.php:699 mod/settings.php:733
+#: mod/settings.php:676 mod/settings.php:702 mod/settings.php:736
 msgid "Add application"
 msgstr "Ajouter une application"
 
-#: mod/settings.php:677 mod/settings.php:703
+#: mod/settings.php:680 mod/settings.php:706
 msgid "Consumer Key"
 msgstr "Clé utilisateur"
 
-#: mod/settings.php:678 mod/settings.php:704
+#: mod/settings.php:681 mod/settings.php:707
 msgid "Consumer Secret"
 msgstr "Secret utilisateur"
 
-#: mod/settings.php:679 mod/settings.php:705
+#: mod/settings.php:682 mod/settings.php:708
 msgid "Redirect"
 msgstr "Rediriger"
 
-#: mod/settings.php:680 mod/settings.php:706
+#: mod/settings.php:683 mod/settings.php:709
 msgid "Icon url"
 msgstr "URL de l'icône"
 
-#: mod/settings.php:691
+#: mod/settings.php:694
 msgid "You can't edit this application."
 msgstr "Vous ne pouvez pas éditer cette application."
 
-#: mod/settings.php:732
+#: mod/settings.php:735
 msgid "Connected Apps"
 msgstr "Applications connectées"
 
-#: mod/settings.php:734 src/Object/Post.php:167 src/Object/Post.php:169
+#: mod/settings.php:737 src/Object/Post.php:168 src/Object/Post.php:170
 msgid "Edit"
 msgstr "Éditer"
 
-#: mod/settings.php:736
+#: mod/settings.php:739
 msgid "Client key starts with"
 msgstr "La clé cliente commence par"
 
-#: mod/settings.php:737
+#: mod/settings.php:740
 msgid "No name"
 msgstr "Sans nom"
 
-#: mod/settings.php:738
+#: mod/settings.php:741
 msgid "Remove authorization"
 msgstr "Révoquer l'autorisation"
 
-#: mod/settings.php:749
+#: mod/settings.php:752
 msgid "No Addon settings configured"
 msgstr "Aucuns paramètres d'Extension paramétré."
 
-#: mod/settings.php:758
+#: mod/settings.php:761
 msgid "Addon Settings"
 msgstr "Paramètres d'extension"
 
-#: mod/settings.php:772 src/Module/Admin/Features.php:58
+#: mod/settings.php:775 src/Module/Admin/Features.php:58
 #: src/Module/Admin/Features.php:59
 msgid "Off"
 msgstr "Éteint"
 
-#: mod/settings.php:772 src/Module/Admin/Features.php:58
+#: mod/settings.php:775 src/Module/Admin/Features.php:58
 #: src/Module/Admin/Features.php:59
 msgid "On"
 msgstr "Allumé"
 
-#: mod/settings.php:779
+#: mod/settings.php:782
 msgid "Additional Features"
 msgstr "Fonctions supplémentaires"
 
-#: mod/settings.php:802 src/Content/ContactSelector.php:87
+#: mod/settings.php:806 src/Content/ContactSelector.php:87
 msgid "Diaspora"
 msgstr "Diaspora"
 
-#: mod/settings.php:802 mod/settings.php:803
+#: mod/settings.php:806 mod/settings.php:807
 msgid "enabled"
 msgstr "activé"
 
-#: mod/settings.php:802 mod/settings.php:803
+#: mod/settings.php:806 mod/settings.php:807
 msgid "disabled"
 msgstr "désactivé"
 
-#: mod/settings.php:802 mod/settings.php:803
+#: mod/settings.php:806 mod/settings.php:807
 #, php-format
 msgid "Built-in support for %s connectivity is %s"
 msgstr "Le support natif pour la connectivité %s est %s"
 
-#: mod/settings.php:803
+#: mod/settings.php:807
 msgid "GNU Social (OStatus)"
 msgstr "GNU Social (OStatus)"
 
-#: mod/settings.php:834
+#: mod/settings.php:838
 msgid "Email access is disabled on this site."
 msgstr "L'accès courriel est désactivé sur ce site."
 
-#: mod/settings.php:844
+#: mod/settings.php:848
 msgid "General Social Media Settings"
 msgstr "Paramètres généraux des réseaux sociaux"
 
-#: mod/settings.php:845
+#: mod/settings.php:849
+msgid "Accept only top level posts by contacts you follow"
+msgstr ""
+
+#: mod/settings.php:849
+msgid ""
+"The system does an auto completion of threads when a comment arrives. This "
+"has got the side effect that you can receive posts that had been started by "
+"a non-follower but had been commented by someone you follow. This setting "
+"deactivates this behaviour. When activated, you strictly only will receive "
+"posts from people you really do follow."
+msgstr "Le système effectue une auto-complétion des fils quand un commentaire arrive. Ceci a l'effet secondaire que vous pouvez recevoir des publications qui ont été démarrées par un non-abonné mais qui a été commenté par quelqu'un que vous suivez. Ce paramètre désactive ce comportement. Quand activé, vous ne recevrez strictement que les publications des personnes que vous suivez vraiment."
+
+#: mod/settings.php:850
 msgid "Disable Content Warning"
 msgstr "Désactiver les avertissements de contenus (CW)"
 
-#: mod/settings.php:845
+#: mod/settings.php:850
 msgid ""
 "Users on networks like Mastodon or Pleroma are able to set a content warning"
 " field which collapse their post by default. This disables the automatic "
@@ -3504,352 +3482,352 @@ msgid ""
 "any other content filtering you eventually set up."
 msgstr "Les utilisateurs sur les réseaux comme Mastodon ou Pleroma sont en mesure de mettre un champs d'avertissement de contenu qui cache leur message par défaut. Cela désactive la fermeture automatique et met le message d'avertissement de contenu comme titre de la publication. "
 
-#: mod/settings.php:846
+#: mod/settings.php:851
 msgid "Disable intelligent shortening"
 msgstr "Désactiver la réduction d'URL"
 
-#: mod/settings.php:846
+#: mod/settings.php:851
 msgid ""
 "Normally the system tries to find the best link to add to shortened posts. "
 "If this option is enabled then every shortened post will always point to the"
 " original friendica post."
 msgstr "Normalement, le système tente de trouver le meilleur lien à ajouter aux publications raccourcies. Si cette option est activée, les publications raccourcies dirigeront toujours vers leur publication d'origine sur Friendica."
 
-#: mod/settings.php:847
+#: mod/settings.php:852
 msgid "Automatically follow any GNU Social (OStatus) followers/mentioners"
 msgstr "Suivre automatiquement ceux qui me suivent ou me mentionnent sur GNU Social (OStatus)"
 
-#: mod/settings.php:847
+#: mod/settings.php:852
 msgid ""
 "If you receive a message from an unknown OStatus user, this option decides "
 "what to do. If it is checked, a new contact will be created for every "
 "unknown user."
 msgstr "Si vous recevez un message d'un utilisateur OStatus inconnu, cette option détermine ce qui sera fait. Si elle est cochée, un nouveau contact sera créé pour chaque utilisateur inconnu."
 
-#: mod/settings.php:848
+#: mod/settings.php:853
 msgid "Default group for OStatus contacts"
 msgstr "Groupe par défaut pour les contacts OStatus"
 
-#: mod/settings.php:849
+#: mod/settings.php:854
 msgid "Your legacy GNU Social account"
 msgstr "Le compte GNU Social que vous avez déjà"
 
-#: mod/settings.php:849
+#: mod/settings.php:854
 msgid ""
 "If you enter your old GNU Social/Statusnet account name here (in the format "
 "user@domain.tld), your contacts will be added automatically. The field will "
 "be emptied when done."
 msgstr "Si vous entrez le nom de votre ancien compte GNU Social / StatusNet ici (utiliser le format utilisateur@domaine.tld), vos contacts seront ajoutés automatiquement. Le champ sera vidé lorsque ce sera terminé."
 
-#: mod/settings.php:852
+#: mod/settings.php:857
 msgid "Repair OStatus subscriptions"
 msgstr "Réparer les abonnements OStatus"
 
-#: mod/settings.php:856
+#: mod/settings.php:861
 msgid "Email/Mailbox Setup"
 msgstr "Réglages de courriel/boîte à lettre"
 
-#: mod/settings.php:857
+#: mod/settings.php:862
 msgid ""
 "If you wish to communicate with email contacts using this service "
 "(optional), please specify how to connect to your mailbox."
 msgstr "Si vous souhaitez communiquer avec vos contacts \"courriel\" (facultatif), merci de nous indiquer comment vous connecter à votre boîte."
 
-#: mod/settings.php:858
+#: mod/settings.php:863
 msgid "Last successful email check:"
 msgstr "Dernière vérification réussie des courriels :"
 
-#: mod/settings.php:860
+#: mod/settings.php:865
 msgid "IMAP server name:"
 msgstr "Nom du serveur IMAP :"
 
-#: mod/settings.php:861
+#: mod/settings.php:866
 msgid "IMAP port:"
 msgstr "Port IMAP :"
 
-#: mod/settings.php:862
+#: mod/settings.php:867
 msgid "Security:"
 msgstr "Sécurité :"
 
-#: mod/settings.php:862 mod/settings.php:867
+#: mod/settings.php:867 mod/settings.php:872
 msgid "None"
 msgstr "Aucun(e)"
 
-#: mod/settings.php:863
+#: mod/settings.php:868
 msgid "Email login name:"
 msgstr "Nom de connexion :"
 
-#: mod/settings.php:864
+#: mod/settings.php:869
 msgid "Email password:"
 msgstr "Mot de passe :"
 
-#: mod/settings.php:865
+#: mod/settings.php:870
 msgid "Reply-to address:"
 msgstr "Adresse de réponse :"
 
-#: mod/settings.php:866
+#: mod/settings.php:871
 msgid "Send public posts to all email contacts:"
 msgstr "Envoyer les publications publiques à tous les contacts courriels :"
 
-#: mod/settings.php:867
+#: mod/settings.php:872
 msgid "Action after import:"
 msgstr "Action après import :"
 
-#: mod/settings.php:867 src/Content/Nav.php:248
+#: mod/settings.php:872 src/Content/Nav.php:251
 msgid "Mark as seen"
 msgstr "Marquer comme vu"
 
-#: mod/settings.php:867
+#: mod/settings.php:872
 msgid "Move to folder"
 msgstr "Déplacer vers"
 
-#: mod/settings.php:868
+#: mod/settings.php:873
 msgid "Move to folder:"
 msgstr "Déplacer vers :"
 
-#: mod/settings.php:892 src/Module/Admin/Site.php:435
+#: mod/settings.php:897 src/Module/Admin/Site.php:434
 msgid "No special theme for mobile devices"
 msgstr "Pas de thème particulier pour les terminaux mobiles"
 
-#: mod/settings.php:900
+#: mod/settings.php:905
 #, php-format
 msgid "%s - (Unsupported)"
 msgstr "%s- (non supporté)"
 
-#: mod/settings.php:902 src/Module/Admin/Site.php:452
+#: mod/settings.php:907 src/Module/Admin/Site.php:451
 #, php-format
 msgid "%s - (Experimental)"
 msgstr "%s- (expérimental)"
 
-#: mod/settings.php:930 src/Core/L10n.php:371 src/Model/Event.php:395
+#: mod/settings.php:935 src/Core/L10n/L10n.php:370 src/Model/Event.php:395
 msgid "Sunday"
 msgstr "Dimanche"
 
-#: mod/settings.php:930 src/Core/L10n.php:371 src/Model/Event.php:396
+#: mod/settings.php:935 src/Core/L10n/L10n.php:370 src/Model/Event.php:396
 msgid "Monday"
 msgstr "Lundi"
 
-#: mod/settings.php:946
+#: mod/settings.php:951
 msgid "Display Settings"
 msgstr "Affichage"
 
-#: mod/settings.php:952
+#: mod/settings.php:957
 msgid "Display Theme:"
 msgstr "Thème d'affichage:"
 
-#: mod/settings.php:953
+#: mod/settings.php:958
 msgid "Mobile Theme:"
 msgstr "Thème mobile:"
 
-#: mod/settings.php:954
+#: mod/settings.php:959
 msgid "Suppress warning of insecure networks"
 msgstr "Retire l'avertissement des réseaux non sécurisés"
 
-#: mod/settings.php:954
+#: mod/settings.php:959
 msgid ""
 "Should the system suppress the warning that the current group contains "
 "members of networks that can't receive non public postings."
 msgstr "Est ce que le système doit supprimer l'avertissement que le groupe actuel contient des membres de réseaux qui ne pourront pas recevoir les publications non publiques."
 
-#: mod/settings.php:955
+#: mod/settings.php:960
 msgid "Update browser every xx seconds"
 msgstr "Mettre à jour l'affichage toutes les xx secondes"
 
-#: mod/settings.php:955
+#: mod/settings.php:960
 msgid "Minimum of 10 seconds. Enter -1 to disable it."
 msgstr "Minimum de 10 secondes. Saisir -1 pour désactiver."
 
-#: mod/settings.php:956
+#: mod/settings.php:961
 msgid "Number of items to display per page:"
 msgstr "Nombre d’éléments par page :"
 
-#: mod/settings.php:956 mod/settings.php:957
+#: mod/settings.php:961 mod/settings.php:962
 msgid "Maximum of 100 items"
 msgstr "Maximum de 100 éléments"
 
-#: mod/settings.php:957
+#: mod/settings.php:962
 msgid "Number of items to display per page when viewed from mobile device:"
 msgstr "Nombre d'éléments à afficher par page pour un appareil mobile"
 
-#: mod/settings.php:958
+#: mod/settings.php:963
 msgid "Don't show emoticons"
 msgstr "Ne pas afficher les émoticônes"
 
-#: mod/settings.php:959
+#: mod/settings.php:964
 msgid "Calendar"
 msgstr "Calendrier"
 
-#: mod/settings.php:960
+#: mod/settings.php:965
 msgid "Beginning of week:"
 msgstr "Début de la semaine :"
 
-#: mod/settings.php:961
+#: mod/settings.php:966
 msgid "Don't show notices"
 msgstr "Ne plus afficher les avis"
 
-#: mod/settings.php:962
+#: mod/settings.php:967
 msgid "Infinite scroll"
 msgstr "Défilement infini"
 
-#: mod/settings.php:963
+#: mod/settings.php:968
 msgid "Automatic updates only at the top of the network page"
 msgstr "Mises à jour automatiques seulement en haut de la page Réseau"
 
-#: mod/settings.php:963
+#: mod/settings.php:968
 msgid ""
 "When disabled, the network page is updated all the time, which could be "
 "confusing while reading."
 msgstr "Si désactivé, la page Réseau est mise à jour en permanence, ce qui peut rendre la lecture difficile."
 
-#: mod/settings.php:964
+#: mod/settings.php:969
 msgid "Bandwidth Saver Mode"
 msgstr "Mode économiseur de bande-passante."
 
-#: mod/settings.php:964
+#: mod/settings.php:969
 msgid ""
 "When enabled, embedded content is not displayed on automatic updates, they "
 "only show on page reload."
 msgstr "Si activé, le contenu intégré aux pages est mis à jour uniquement lors du rafraîchissement manuel des pages : il n'est plus mis à jour lors des rafraîchissements automatiques."
 
-#: mod/settings.php:965
+#: mod/settings.php:970
 msgid "Smart Threading"
 msgstr "Fil de discussion intelligent."
 
-#: mod/settings.php:965
+#: mod/settings.php:970
 msgid ""
 "When enabled, suppress extraneous thread indentation while keeping it where "
 "it matters. Only works if threading is available and enabled."
 msgstr "Lorsqu'il est activé, il supprime les indentations supplémentaires du fil de discussion mais les conserve là où c'est important. Ne fonctionne que si le fil de discussion est disponible et activé. "
 
-#: mod/settings.php:967
+#: mod/settings.php:972
 msgid "General Theme Settings"
 msgstr "Paramètres généraux de thème"
 
-#: mod/settings.php:968
+#: mod/settings.php:973
 msgid "Custom Theme Settings"
 msgstr "Paramètres personnalisés de thème"
 
-#: mod/settings.php:969
+#: mod/settings.php:974
 msgid "Content Settings"
 msgstr "Paramètres de contenu"
 
-#: mod/settings.php:970 view/theme/duepuntozero/config.php:73
-#: view/theme/frio/config.php:122 view/theme/quattro/config.php:75
+#: mod/settings.php:975 view/theme/duepuntozero/config.php:73
+#: view/theme/frio/config.php:128 view/theme/quattro/config.php:75
 #: view/theme/vier/config.php:121
 msgid "Theme settings"
 msgstr "Réglages du thème graphique"
 
-#: mod/settings.php:984
+#: mod/settings.php:989
 msgid "Unable to find your profile. Please contact your admin."
 msgstr "Impossible de trouver votre profile. Merci de contacter votre administrateur."
 
-#: mod/settings.php:1023
+#: mod/settings.php:1028
 msgid "Account Types"
 msgstr "Type de compte"
 
-#: mod/settings.php:1024
+#: mod/settings.php:1029
 msgid "Personal Page Subtypes"
 msgstr "Sous-catégories de page personnelle"
 
-#: mod/settings.php:1025
+#: mod/settings.php:1030
 msgid "Community Forum Subtypes"
 msgstr "Sous-catégories de forums communautaires"
 
-#: mod/settings.php:1032 src/Module/Admin/Users.php:229
+#: mod/settings.php:1037 src/Module/Admin/Users.php:229
 msgid "Personal Page"
 msgstr "Page personnelle"
 
-#: mod/settings.php:1033
+#: mod/settings.php:1038
 msgid "Account for a personal profile."
 msgstr "Compte pour profil personnel."
 
-#: mod/settings.php:1036 src/Module/Admin/Users.php:230
+#: mod/settings.php:1041 src/Module/Admin/Users.php:230
 msgid "Organisation Page"
 msgstr "Page Associative"
 
-#: mod/settings.php:1037
+#: mod/settings.php:1042
 msgid ""
 "Account for an organisation that automatically approves contact requests as "
 "\"Followers\"."
 msgstr "Compte pour une organisation qui accepte les demandes comme \"Abonnés\"."
 
-#: mod/settings.php:1040 src/Module/Admin/Users.php:231
+#: mod/settings.php:1045 src/Module/Admin/Users.php:231
 msgid "News Page"
 msgstr "Page d'informations"
 
-#: mod/settings.php:1041
+#: mod/settings.php:1046
 msgid ""
 "Account for a news reflector that automatically approves contact requests as"
 " \"Followers\"."
 msgstr "Compte pour les miroirs de nouvelles qui accepte automatiquement les de contact comme \"Abonnés\"."
 
-#: mod/settings.php:1044 src/Module/Admin/Users.php:232
+#: mod/settings.php:1049 src/Module/Admin/Users.php:232
 msgid "Community Forum"
 msgstr "Forum Communautaire"
 
-#: mod/settings.php:1045
+#: mod/settings.php:1050
 msgid "Account for community discussions."
 msgstr "Compte pour des discussions communautaires."
 
-#: mod/settings.php:1048 src/Module/Admin/Users.php:222
+#: mod/settings.php:1053 src/Module/Admin/Users.php:222
 msgid "Normal Account Page"
 msgstr "Compte normal"
 
-#: mod/settings.php:1049
+#: mod/settings.php:1054
 msgid ""
 "Account for a regular personal profile that requires manual approval of "
 "\"Friends\" and \"Followers\"."
 msgstr "Compte pour un profil personnel qui nécessite une approbation manuelle des \"Amis\" et \"Abonnés\"."
 
-#: mod/settings.php:1052 src/Module/Admin/Users.php:223
+#: mod/settings.php:1057 src/Module/Admin/Users.php:223
 msgid "Soapbox Page"
 msgstr "Compte \"boîte à savon\""
 
-#: mod/settings.php:1053
+#: mod/settings.php:1058
 msgid ""
 "Account for a public profile that automatically approves contact requests as"
 " \"Followers\"."
 msgstr "Compte pour un profil public qui accepte les demandes de contact comme \"Abonnés\"."
 
-#: mod/settings.php:1056 src/Module/Admin/Users.php:224
+#: mod/settings.php:1061 src/Module/Admin/Users.php:224
 msgid "Public Forum"
 msgstr "Forum public"
 
-#: mod/settings.php:1057
+#: mod/settings.php:1062
 msgid "Automatically approves all contact requests."
 msgstr "Les demandes de participation au forum sont automatiquement acceptées."
 
-#: mod/settings.php:1060 src/Module/Admin/Users.php:225
+#: mod/settings.php:1065 src/Module/Admin/Users.php:225
 msgid "Automatic Friend Page"
 msgstr "Compte d' \"amitié automatique\""
 
-#: mod/settings.php:1061
+#: mod/settings.php:1066
 msgid ""
 "Account for a popular profile that automatically approves contact requests "
 "as \"Friends\"."
 msgstr "Compte qui accepte automatiquement les demandes d'ajout en tant qu'ami."
 
-#: mod/settings.php:1064
+#: mod/settings.php:1069
 msgid "Private Forum [Experimental]"
 msgstr "Forum privé [expérimental]"
 
-#: mod/settings.php:1065
+#: mod/settings.php:1070
 msgid "Requires manual approval of contact requests."
 msgstr "Les demandes de participation au forum nécessitent une approbation."
 
-#: mod/settings.php:1076
+#: mod/settings.php:1081
 msgid "OpenID:"
 msgstr "OpenID:"
 
-#: mod/settings.php:1076
+#: mod/settings.php:1081
 msgid "(Optional) Allow this OpenID to login to this account."
 msgstr "&amp;nbsp;(Facultatif) Autoriser cet OpenID à se connecter à ce compte."
 
-#: mod/settings.php:1084
+#: mod/settings.php:1089
 msgid "Publish your default profile in your local site directory?"
 msgstr "Publier votre profil par défaut sur l'annuaire local de ce site ?"
 
-#: mod/settings.php:1084
+#: mod/settings.php:1089
 #, php-format
 msgid ""
 "Your profile will be published in this node's <a href=\"%s\">local "
@@ -3857,314 +3835,314 @@ msgid ""
 " system settings."
 msgstr "Votre profil sera public sur l'<a href=\"%s\">annuaire local</a> de cette instance. Les détails de votre profil pourront être visible publiquement selon les paramètres de votre système."
 
-#: mod/settings.php:1090
+#: mod/settings.php:1095
 msgid "Publish your default profile in the global social directory?"
 msgstr "Publier votre profil par défaut sur l'annuaire global ?"
 
-#: mod/settings.php:1090
+#: mod/settings.php:1095
 #, php-format
 msgid ""
 "Your profile will be published in the global friendica directories (e.g. <a "
 "href=\"%s\">%s</a>). Your profile will be visible in public."
 msgstr "Votre profil sera publié dans l'annuaire global de friendica (i.e. <a href=\"%s\">%s</a>). Votre profil sera visible publiquement."
 
-#: mod/settings.php:1097
+#: mod/settings.php:1102
 msgid "Hide your contact/friend list from viewers of your default profile?"
 msgstr "Cacher votre liste de contacts/amis des visiteurs de votre profil par défaut?"
 
-#: mod/settings.php:1097
+#: mod/settings.php:1102
 msgid ""
 "Your contact list won't be shown in your default profile page. You can "
 "decide to show your contact list separately for each additional profile you "
 "create"
 msgstr "Votre liste de contacts ne sera pas affiché sur la page de votre profil par défaut. Vous pouvez choisir d'afficher votre liste de contact séparément pour chaque profil que vous créez."
 
-#: mod/settings.php:1101
+#: mod/settings.php:1106
 msgid "Hide your profile details from anonymous viewers?"
 msgstr "Cacher les détails de votre profil pour les lecteurs anonymes."
 
-#: mod/settings.php:1101
+#: mod/settings.php:1106
 msgid ""
 "Anonymous visitors will only see your profile picture, your display name and"
 " the nickname you are using on your profile page. Your public posts and "
 "replies will still be accessible by other means."
-msgstr ""
+msgstr "Les visiteurs anonymes ne verront que votre image de profil, votre nom affiché, et le surnom que vous utilisez sur votre page de profil. Vos publications publics et réponses seront toujours accessibles par d'autres moyens."
 
-#: mod/settings.php:1105
+#: mod/settings.php:1110
 msgid "Allow friends to post to your profile page?"
 msgstr "Autoriser vos amis à publier sur votre profil ?"
 
-#: mod/settings.php:1105
+#: mod/settings.php:1110
 msgid ""
 "Your contacts may write posts on your profile wall. These posts will be "
 "distributed to your contacts"
 msgstr ""
 
-#: mod/settings.php:1109
+#: mod/settings.php:1114
 msgid "Allow friends to tag your posts?"
 msgstr "Autoriser vos amis à étiqueter vos publications?"
 
-#: mod/settings.php:1109
+#: mod/settings.php:1114
 msgid "Your contacts can add additional tags to your posts."
 msgstr ""
 
-#: mod/settings.php:1113
+#: mod/settings.php:1118
 msgid "Allow us to suggest you as a potential friend to new members?"
 msgstr "Autoriser les suggestions d'amis potentiels aux nouveaux arrivants?"
 
-#: mod/settings.php:1113
+#: mod/settings.php:1118
 msgid ""
 "If you like, Friendica may suggest new members to add you as a contact."
 msgstr ""
 
-#: mod/settings.php:1117
+#: mod/settings.php:1122
 msgid "Permit unknown people to send you private mail?"
 msgstr "Autoriser les messages privés d'inconnus?"
 
-#: mod/settings.php:1117
+#: mod/settings.php:1122
 msgid ""
 "Friendica network users may send you private messages even if they are not "
 "in your contact list."
 msgstr ""
 
-#: mod/settings.php:1121
+#: mod/settings.php:1126
 msgid "Profile is <strong>not published</strong>."
 msgstr "Ce profil n'est <strong>pas publié</strong>."
 
-#: mod/settings.php:1127
+#: mod/settings.php:1132
 #, php-format
 msgid "Your Identity Address is <strong>'%s'</strong> or '%s'."
 msgstr "L’adresse de votre profil est <strong>'%s'</strong> ou '%s'."
 
-#: mod/settings.php:1134
+#: mod/settings.php:1139
 msgid "Automatically expire posts after this many days:"
 msgstr "Les publications expirent automatiquement après (en jours) :"
 
-#: mod/settings.php:1134
+#: mod/settings.php:1139
 msgid "If empty, posts will not expire. Expired posts will be deleted"
 msgstr "Si ce champ est vide, les publications n'expireront pas. Les publications expirées seront supprimées"
 
-#: mod/settings.php:1135
+#: mod/settings.php:1140
 msgid "Advanced expiration settings"
 msgstr "Réglages avancés de l'expiration"
 
-#: mod/settings.php:1136
+#: mod/settings.php:1141
 msgid "Advanced Expiration"
 msgstr "Expiration (avancé)"
 
-#: mod/settings.php:1137
+#: mod/settings.php:1142
 msgid "Expire posts:"
 msgstr "Faire expirer les publications :"
 
-#: mod/settings.php:1138
+#: mod/settings.php:1143
 msgid "Expire personal notes:"
 msgstr "Faire expirer les notes personnelles :"
 
-#: mod/settings.php:1139
+#: mod/settings.php:1144
 msgid "Expire starred posts:"
 msgstr "Faire expirer les publications marqués :"
 
-#: mod/settings.php:1140
+#: mod/settings.php:1145
 msgid "Expire photos:"
 msgstr "Faire expirer les photos :"
 
-#: mod/settings.php:1141
+#: mod/settings.php:1146
 msgid "Only expire posts by others:"
 msgstr "Faire expirer seulement les publications des autres:"
 
-#: mod/settings.php:1171
+#: mod/settings.php:1176
 msgid "Account Settings"
 msgstr "Compte"
 
-#: mod/settings.php:1179
+#: mod/settings.php:1184
 msgid "Password Settings"
 msgstr "Réglages de mot de passe"
 
-#: mod/settings.php:1180 src/Module/Register.php:130
+#: mod/settings.php:1185 src/Module/Register.php:130
 msgid "New Password:"
 msgstr "Nouveau mot de passe :"
 
-#: mod/settings.php:1180
+#: mod/settings.php:1185
 msgid ""
 "Allowed characters are a-z, A-Z, 0-9 and special characters except white "
 "spaces, accentuated letters and colon (:)."
 msgstr ""
 
-#: mod/settings.php:1181 src/Module/Register.php:131
+#: mod/settings.php:1186 src/Module/Register.php:131
 msgid "Confirm:"
 msgstr "Confirmer :"
 
-#: mod/settings.php:1181
+#: mod/settings.php:1186
 msgid "Leave password fields blank unless changing"
 msgstr "Laissez les champs de mot de passe vierges, sauf si vous désirez les changer"
 
-#: mod/settings.php:1182
+#: mod/settings.php:1187
 msgid "Current Password:"
 msgstr "Mot de passe actuel :"
 
-#: mod/settings.php:1182 mod/settings.php:1183
+#: mod/settings.php:1187 mod/settings.php:1188
 msgid "Your current password to confirm the changes"
 msgstr "Votre mot de passe actuel pour confirmer les modifications"
 
-#: mod/settings.php:1183
+#: mod/settings.php:1188
 msgid "Password:"
 msgstr "Mot de passe :"
 
-#: mod/settings.php:1187
+#: mod/settings.php:1192
 msgid "Basic Settings"
 msgstr "Réglages de base"
 
-#: mod/settings.php:1188 src/Model/Profile.php:745
+#: mod/settings.php:1193 src/Model/Profile.php:756
 msgid "Full Name:"
 msgstr "Nom complet :"
 
-#: mod/settings.php:1189
+#: mod/settings.php:1194
 msgid "Email Address:"
 msgstr "Adresse courriel :"
 
-#: mod/settings.php:1190
+#: mod/settings.php:1195
 msgid "Your Timezone:"
 msgstr "Votre fuseau horaire :"
 
-#: mod/settings.php:1191
+#: mod/settings.php:1196
 msgid "Your Language:"
 msgstr "Votre langue :"
 
-#: mod/settings.php:1191
+#: mod/settings.php:1196
 msgid ""
 "Set the language we use to show you friendica interface and to send you "
 "emails"
 msgstr "Détermine la langue que nous utilisons pour afficher votre interface Friendica et pour vous envoyer des courriels"
 
-#: mod/settings.php:1192
+#: mod/settings.php:1197
 msgid "Default Post Location:"
 msgstr "Emplacement de publication par défaut:"
 
-#: mod/settings.php:1193
+#: mod/settings.php:1198
 msgid "Use Browser Location:"
 msgstr "Utiliser la localisation géographique du navigateur:"
 
-#: mod/settings.php:1196
+#: mod/settings.php:1201
 msgid "Security and Privacy Settings"
 msgstr "Réglages de sécurité et vie privée"
 
-#: mod/settings.php:1198
+#: mod/settings.php:1203
 msgid "Maximum Friend Requests/Day:"
 msgstr "Nombre maximal de requêtes d'amitié par jour :"
 
-#: mod/settings.php:1198 mod/settings.php:1227
+#: mod/settings.php:1203 mod/settings.php:1232
 msgid "(to prevent spam abuse)"
 msgstr "(pour limiter l'impact du spam)"
 
-#: mod/settings.php:1199
+#: mod/settings.php:1204
 msgid "Default Post Permissions"
 msgstr "Permissions de publication par défaut"
 
-#: mod/settings.php:1200
+#: mod/settings.php:1205
 msgid "(click to open/close)"
 msgstr "(cliquer pour ouvrir/fermer)"
 
-#: mod/settings.php:1210
+#: mod/settings.php:1215
 msgid "Default Private Post"
 msgstr "Message privé par défaut"
 
-#: mod/settings.php:1211
+#: mod/settings.php:1216
 msgid "Default Public Post"
 msgstr "Message publique par défaut"
 
-#: mod/settings.php:1215
+#: mod/settings.php:1220
 msgid "Default Permissions for New Posts"
 msgstr "Permissions par défaut pour les nouvelles publications"
 
-#: mod/settings.php:1227
+#: mod/settings.php:1232
 msgid "Maximum private messages per day from unknown people:"
 msgstr "Maximum de messages privés d'inconnus par jour :"
 
-#: mod/settings.php:1230
+#: mod/settings.php:1235
 msgid "Notification Settings"
 msgstr "Réglages de notification"
 
-#: mod/settings.php:1231
+#: mod/settings.php:1236
 msgid "Send a notification email when:"
 msgstr "Envoyer un courriel de notification quand:"
 
-#: mod/settings.php:1232
+#: mod/settings.php:1237
 msgid "You receive an introduction"
 msgstr "Vous recevez une introduction"
 
-#: mod/settings.php:1233
+#: mod/settings.php:1238
 msgid "Your introductions are confirmed"
 msgstr "Vos introductions sont confirmées"
 
-#: mod/settings.php:1234
+#: mod/settings.php:1239
 msgid "Someone writes on your profile wall"
 msgstr "Quelqu'un écrit sur votre mur"
 
-#: mod/settings.php:1235
+#: mod/settings.php:1240
 msgid "Someone writes a followup comment"
 msgstr "Quelqu'un vous commente"
 
-#: mod/settings.php:1236
+#: mod/settings.php:1241
 msgid "You receive a private message"
 msgstr "Vous recevez un message privé"
 
-#: mod/settings.php:1237
+#: mod/settings.php:1242
 msgid "You receive a friend suggestion"
 msgstr "Vous avez reçu une suggestion d'ami"
 
-#: mod/settings.php:1238
+#: mod/settings.php:1243
 msgid "You are tagged in a post"
 msgstr "Vous avez été étiqueté dans une publication"
 
-#: mod/settings.php:1239
+#: mod/settings.php:1244
 msgid "You are poked/prodded/etc. in a post"
 msgstr "Vous avez été sollicité dans une publication"
 
-#: mod/settings.php:1241
+#: mod/settings.php:1246
 msgid "Activate desktop notifications"
 msgstr "Activer les notifications de bureau"
 
-#: mod/settings.php:1241
+#: mod/settings.php:1246
 msgid "Show desktop popup on new notifications"
 msgstr "Afficher dans des pop-ups les nouvelles notifications"
 
-#: mod/settings.php:1243
+#: mod/settings.php:1248
 msgid "Text-only notification emails"
 msgstr "Courriels de notification en format texte"
 
-#: mod/settings.php:1245
+#: mod/settings.php:1250
 msgid "Send text only notification emails, without the html part"
 msgstr "Envoyer le texte des courriels de notification, sans la composante html"
 
-#: mod/settings.php:1247
+#: mod/settings.php:1252
 msgid "Show detailled notifications"
 msgstr "Notifications détaillées"
 
-#: mod/settings.php:1249
+#: mod/settings.php:1254
 msgid ""
 "Per default, notifications are condensed to a single notification per item. "
 "When enabled every notification is displayed."
 msgstr ""
 
-#: mod/settings.php:1251
+#: mod/settings.php:1256
 msgid "Advanced Account/Page Type Settings"
 msgstr "Paramètres avancés de compte/page"
 
-#: mod/settings.php:1252
+#: mod/settings.php:1257
 msgid "Change the behaviour of this account for special situations"
 msgstr "Modifier le comportement de ce compte dans certaines situations"
 
-#: mod/settings.php:1255
+#: mod/settings.php:1260
 msgid "Relocate"
 msgstr "Relocaliser"
 
-#: mod/settings.php:1256
+#: mod/settings.php:1261
 msgid ""
 "If you have moved this profile from another server, and some of your "
 "contacts don't receive your updates, try pushing this button."
 msgstr "Si vous avez migré ce profil depuis un autre serveur et que vos contacts ne reçoivent plus vos mises à jour, essayez ce bouton."
 
-#: mod/settings.php:1257
+#: mod/settings.php:1262
 msgid "Resend relocate message to contacts"
 msgstr "Renvoyer un message de relocalisation aux contacts."
 
@@ -4189,1024 +4167,1153 @@ msgstr "Voulez-vous vraiment supprimer cette suggestion ?"
 
 #: mod/suggest.php:89 mod/suggest.php:109
 msgid "Ignore/Hide"
-msgstr "Ignorer/cacher"
-
-#: mod/suggest.php:119 src/Content/Widget.php:66 view/theme/vier/theme.php:204
-msgid "Friend Suggestions"
-msgstr "Suggestions d'amitiés/contacts"
-
-#: mod/tagrm.php:31
-msgid "Tag(s) removed"
-msgstr ""
-
-#: mod/tagrm.php:101
-msgid "Remove Item Tag"
-msgstr "Enlever l'étiquette de l'élément"
-
-#: mod/tagrm.php:103
-msgid "Select a tag to remove: "
-msgstr "Sélectionner une étiquette à supprimer :"
+msgstr "Ignorer/cacher"
+
+#: mod/suggest.php:119 view/theme/vier/theme.php:204 src/Content/Widget.php:69
+msgid "Friend Suggestions"
+msgstr "Suggestions d'amitiés/contacts"
 
-#: mod/uexport.php:45
+#: mod/uexport.php:52
 msgid "Export account"
 msgstr "Exporter le compte"
 
-#: mod/uexport.php:45
+#: mod/uexport.php:52
 msgid ""
 "Export your account info and contacts. Use this to make a backup of your "
 "account and/or to move it to another server."
 msgstr "Exportez votre compte, vos infos et vos contacts. Vous pourrez utiliser le résultat comme sauvegarde et/ou pour le ré-importer sur un autre serveur."
 
-#: mod/uexport.php:46
+#: mod/uexport.php:53
 msgid "Export all"
 msgstr "Tout exporter"
 
-#: mod/uexport.php:46
+#: mod/uexport.php:53
 msgid ""
 "Export your accout info, contacts and all your items as json. Could be a "
 "very big file, and could take a lot of time. Use this to make a full backup "
 "of your account (photos are not exported)"
 msgstr "Exportez votre compte, vos infos, vos contacts et toutes vos publications (en JSON). Le fichier résultant peut être extrêmement volumineux, et sa production peut durer longtemps. Vous pourrez l'utiliser pour faire une sauvegarde complète (à part les photos)."
 
-#: mod/uimport.php:30
-msgid "User imports on closed servers can only be done by an administrator."
-msgstr ""
+#: mod/videos.php:123
+msgid "No videos selected"
+msgstr "Pas de vidéo sélectionné"
 
-#: mod/uimport.php:39 src/Module/Register.php:59
-msgid ""
-"This site has exceeded the number of allowed daily account registrations. "
-"Please try again tomorrow."
-msgstr "Le nombre d'inscriptions quotidiennes pour ce site a été dépassé. Merci de réessayer demain."
+#: mod/videos.php:280 src/Model/Item.php:3468
+msgid "View Video"
+msgstr "Regarder la vidéo"
 
-#: mod/uimport.php:54 src/Module/Register.php:141
-msgid "Import"
-msgstr "Importer"
+#: mod/videos.php:295
+msgid "Recent Videos"
+msgstr "Vidéos récente"
 
-#: mod/uimport.php:56
-msgid "Move account"
-msgstr "Migrer le compte"
+#: mod/videos.php:297
+msgid "Upload New Videos"
+msgstr "Téléversé une nouvelle vidéo"
 
-#: mod/uimport.php:57
-msgid "You can import an account from another Friendica server."
-msgstr "Vous pouvez importer un compte d'un autre serveur Friendica."
+#: view/theme/duepuntozero/config.php:55 src/Model/User.php:745
+msgid "default"
+msgstr "défaut"
 
-#: mod/uimport.php:58
+#: view/theme/duepuntozero/config.php:56
+msgid "greenzero"
+msgstr "greenzero"
+
+#: view/theme/duepuntozero/config.php:57
+msgid "purplezero"
+msgstr "purplezero"
+
+#: view/theme/duepuntozero/config.php:58
+msgid "easterbunny"
+msgstr "easterbunny"
+
+#: view/theme/duepuntozero/config.php:59
+msgid "darkzero"
+msgstr "darkzero"
+
+#: view/theme/duepuntozero/config.php:60
+msgid "comix"
+msgstr "comix"
+
+#: view/theme/duepuntozero/config.php:61
+msgid "slackr"
+msgstr "slackr"
+
+#: view/theme/duepuntozero/config.php:74
+msgid "Variations"
+msgstr "Variations"
+
+#: view/theme/frio/php/Image.php:24
+msgid "Top Banner"
+msgstr "Bannière du haut"
+
+#: view/theme/frio/php/Image.php:24
 msgid ""
-"You need to export your account from the old server and upload it here. We "
-"will recreate your old account here with all your contacts. We will try also"
-" to inform your friends that you moved here."
-msgstr "Vous devez exporter votre compte à partir de l'ancien serveur et le téléverser ici. Nous recréerons votre ancien compte ici avec tous vos contacts. Nous tenterons également d'informer vos amis que vous avez déménagé ici."
+"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."
 
-#: mod/uimport.php:59
+#: view/theme/frio/php/Image.php:25
+msgid "Full screen"
+msgstr "Plein écran"
+
+#: view/theme/frio/php/Image.php:25
 msgid ""
-"This feature is experimental. We can't import contacts from the OStatus "
-"network (GNU Social/Statusnet) or from Diaspora"
-msgstr "Cette fonctionalité est expérimentale. Il n'est pas possible d'importer des contacts depuis le réseau OStatus (GNU Social/Statusnet) ou depuis Diaspora."
+"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."
 
-#: mod/uimport.php:60
-msgid "Account file"
-msgstr "Fichier du compte"
+#: view/theme/frio/php/Image.php:26
+msgid "Single row mosaic"
+msgstr "Mosaïque sur un rang"
 
-#: mod/uimport.php:60
+#: view/theme/frio/php/Image.php:26
 msgid ""
-"To export your account, go to \"Settings->Export your personal data\" and "
-"select \"Export account\""
-msgstr "Pour exporter votre compte, allez dans \"Paramètres> Exporter vos données personnelles\" et sélectionnez \"exportation de compte\""
+"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."
 
-#: mod/unfollow.php:36 mod/unfollow.php:92
-msgid "You aren't following this contact."
-msgstr ""
+#: view/theme/frio/php/Image.php:27
+msgid "Mosaic"
+msgstr "Mosaïque"
 
-#: mod/unfollow.php:46 mod/unfollow.php:98
-msgid "Unfollowing is currently not supported by your network."
+#: view/theme/frio/php/Image.php:27
+msgid "Repeat image to fill the screen."
+msgstr "Dupliquer l'image pour couvrir l'écran."
+
+#: view/theme/frio/config.php:111
+msgid "Custom"
+msgstr "Personnalisé"
+
+#: view/theme/frio/config.php:123
+msgid "Note"
+msgstr "Remarque"
+
+#: view/theme/frio/config.php:123
+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."
+
+#: view/theme/frio/config.php:129
+msgid "Select color scheme"
+msgstr "Choisir le schéma de couleurs"
+
+#: view/theme/frio/config.php:130
+msgid "Copy or paste schemestring"
 msgstr ""
 
-#: mod/unfollow.php:67
-msgid "Contact unfollowed"
+#: view/theme/frio/config.php:130
+msgid ""
+"You can copy this string to share your theme with others. Pasting here "
+"applies the schemestring"
 msgstr ""
 
-#: mod/unfollow.php:118 src/Module/Contact.php:573
-msgid "Disconnect/Unfollow"
-msgstr "Se déconnecter/Ne plus suivre"
+#: view/theme/frio/config.php:131
+msgid "Navigation bar background color"
+msgstr "Couleur d'arrière-plan de la barre de navigation"
 
-#: mod/update_community.php:23 mod/update_contact.php:23
-#: mod/update_display.php:24 mod/update_network.php:33 mod/update_notes.php:36
-#: mod/update_profile.php:34
-msgid "[Embedded content - reload page to view]"
-msgstr "[Ccontenu incorporé - rechargez la page pour le voir]"
+#: view/theme/frio/config.php:132
+msgid "Navigation bar icon color "
+msgstr "Couleur des icônes de la barre de navigation"
 
-#: mod/videos.php:123
-msgid "No videos selected"
-msgstr "Pas de vidéo sélectionné"
+#: view/theme/frio/config.php:133
+msgid "Link color"
+msgstr "Couleur des liens"
 
-#: mod/videos.php:280 src/Model/Item.php:3421
-msgid "View Video"
-msgstr "Regarder la vidéo"
+#: view/theme/frio/config.php:134
+msgid "Set the background color"
+msgstr "Couleur d'arrière-plan"
 
-#: mod/videos.php:295
-msgid "Recent Videos"
-msgstr "Vidéos récente"
+#: view/theme/frio/config.php:135
+msgid "Content background opacity"
+msgstr "Opacité du contenu d'arrière-plan"
 
-#: mod/videos.php:297
-msgid "Upload New Videos"
-msgstr "Téléversé une nouvelle vidéo"
+#: view/theme/frio/config.php:136
+msgid "Set the background image"
+msgstr "Image d'arrière-plan"
 
-#: mod/viewcontacts.php:78
-msgid "No contacts."
-msgstr "Aucun contact."
+#: view/theme/frio/config.php:137
+msgid "Background image style"
+msgstr "Style de l'image de fond"
 
-#: mod/viewcontacts.php:94 src/Module/Contact.php:606
-#: src/Module/Contact.php:1027
-#, php-format
-msgid "Visit %s's profile [%s]"
-msgstr "Visiter le profil de %s [%s]"
+#: view/theme/frio/config.php:139
+msgid "Enable Compose page"
+msgstr ""
 
-#: mod/viewcontacts.php:114 src/Content/Nav.php:202 src/Content/Nav.php:268
-#: src/Content/Text/HTML.php:911 src/Model/Profile.php:974
-#: src/Model/Profile.php:977 src/Module/Contact.php:814
-#: src/Module/Contact.php:884 view/theme/frio/theme.php:273
-msgid "Contacts"
-msgstr "Contacts"
+#: view/theme/frio/config.php:139
+msgid ""
+"This replaces the jot modal window for writing new posts with a link to <a "
+"href=\"compose\">the new Compose page</a>."
+msgstr ""
 
-#: 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."
+#: view/theme/frio/config.php:143
+msgid "Login page background image"
+msgstr "Image de fond de la page de login"
 
-#: mod/wallmessage.php:63
-msgid "Unable to check your home location."
-msgstr "Impossible de vérifier votre localisation."
+#: view/theme/frio/config.php:147
+msgid "Login page background color"
+msgstr "Couleur d'arrière-plan de la page de login"
 
-#: mod/wallmessage.php:89 mod/wallmessage.php:98
-msgid "No recipient."
-msgstr "Pas de destinataire."
+#: view/theme/frio/config.php:147
+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"
 
-#: 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."
+#: view/theme/frio/theme.php:246
+msgid "Guest"
+msgstr "Invité"
 
-#: 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
-msgid "Invalid request."
-msgstr "Requête invalide."
+#: view/theme/frio/theme.php:251
+msgid "Visitor"
+msgstr "Visiteur"
 
-#: mod/wall_attach.php:103
-msgid "Sorry, maybe your upload is bigger than the PHP configuration allows"
-msgstr "Désolé, il semble que votre fichier est plus important que ce que la configuration de PHP autorise"
+#: view/theme/frio/theme.php:267 src/Content/Nav.php:160
+#: src/Model/Profile.php:909 src/Module/Contact.php:654
+#: src/Module/Contact.php:856 src/Module/Settings/TwoFactor/Index.php:91
+msgid "Status"
+msgstr "Statut"
 
-#: mod/wall_attach.php:103
-msgid "Or - did you try to upload an empty file?"
-msgstr "Ou — auriez-vous essayé de télécharger un fichier vide ?"
+#: view/theme/frio/theme.php:267 src/Content/Nav.php:160
+#: src/Content/Nav.php:244
+msgid "Your posts and conversations"
+msgstr "Vos publications et conversations"
 
-#: mod/wall_attach.php:114
-#, php-format
-msgid "File exceeds size limit of %s"
-msgstr "La taille du fichier dépasse la limite de %s"
+#: view/theme/frio/theme.php:268 src/Content/Nav.php:161
+msgid "Your profile page"
+msgstr "Votre page de profil"
 
-#: mod/wall_attach.php:129
-msgid "File upload failed."
-msgstr "Le téléversement a échoué."
+#: view/theme/frio/theme.php:269 src/Content/Nav.php:162
+msgid "Your photos"
+msgstr "Vos photos"
 
-#: mod/wall_upload.php:243
-msgid "Wall Photos"
-msgstr "Photos du mur"
+#: view/theme/frio/theme.php:270 src/Content/Nav.php:163
+#: src/Model/Profile.php:933 src/Model/Profile.php:936
+msgid "Videos"
+msgstr "Vidéos"
+
+#: view/theme/frio/theme.php:270 src/Content/Nav.php:163
+msgid "Your videos"
+msgstr "Vos vidéos"
+
+#: view/theme/frio/theme.php:271 src/Content/Nav.php:164
+msgid "Your events"
+msgstr "Vos événements"
+
+#: view/theme/frio/theme.php:274 src/Core/NotificationsManager.php:151
+#: src/Content/Nav.php:241
+msgid "Network"
+msgstr "Réseau"
+
+#: view/theme/frio/theme.php:274 src/Content/Nav.php:241
+msgid "Conversations from your friends"
+msgstr "Conversations de vos amis"
+
+#: view/theme/frio/theme.php:275 src/Content/Nav.php:228
+#: src/Model/Profile.php:948 src/Model/Profile.php:959
+msgid "Events and Calendar"
+msgstr "Événements et agenda"
+
+#: view/theme/frio/theme.php:276 src/Content/Nav.php:254
+msgid "Private mail"
+msgstr "Messages privés"
+
+#: view/theme/frio/theme.php:277 src/Content/Nav.php:265
+msgid "Account settings"
+msgstr "Compte"
 
-#: src/App.php:505
-msgid "Delete this item?"
-msgstr "Effacer cet élément?"
+#: view/theme/frio/theme.php:278 src/Content/Text/HTML.php:900
+#: src/Content/Nav.php:205 src/Content/Nav.php:271 src/Model/Profile.php:988
+#: src/Model/Profile.php:991 src/Module/Contact.php:800
+#: src/Module/Contact.php:884
+msgid "Contacts"
+msgstr "Contacts"
 
-#: src/App.php:547
-msgid "toggle mobile"
-msgstr "activ. mobile"
+#: view/theme/frio/theme.php:278 src/Content/Nav.php:271
+msgid "Manage/edit friends and contacts"
+msgstr "Gérer/éditer les amitiés et contacts"
 
-#: src/App.php:863
-msgid "No system theme config value set."
-msgstr ""
+#: view/theme/quattro/config.php:76
+msgid "Alignment"
+msgstr "Alignement"
 
-#: src/App.php:1163
-msgid "You must be logged in to use addons. "
-msgstr "Vous devez être connecté pour utiliser les greffons."
+#: view/theme/quattro/config.php:76
+msgid "Left"
+msgstr "Gauche"
 
-#: src/BaseModule.php:135
-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/quattro/config.php:76
+msgid "Center"
+msgstr "Centre"
 
-#: src/Console/ArchiveContact.php:65
-#, php-format
-msgid "Could not find any unarchived contact entry for this URL (%s)"
-msgstr ""
+#: view/theme/quattro/config.php:77
+msgid "Color scheme"
+msgstr "Palette de couleurs"
 
-#: src/Console/ArchiveContact.php:68
-msgid "The contact entries have been archived"
-msgstr ""
+#: view/theme/quattro/config.php:78
+msgid "Posts font size"
+msgstr "Taille de texte des publications"
 
-#: src/Console/GlobalCommunityBlock.php:65
-#: src/Module/Admin/Blocklist/Contact.php:29
-#, php-format
-msgid "Could not find any contact entry for this URL (%s)"
-msgstr "Aucun profil distant n'a été trouvé à cette URL (%s)"
+#: view/theme/quattro/config.php:79
+msgid "Textareas font size"
+msgstr "Taille de police des zones de texte"
 
-#: src/Console/GlobalCommunityBlock.php:68
-#: src/Module/Admin/Blocklist/Contact.php:27
-msgid "The contact has been blocked from the node"
-msgstr "Le profile distant a été bloqué"
+#: 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/Console/NewPassword.php:72
-msgid "Enter new password: "
-msgstr ""
+#: view/theme/vier/config.php:116 src/Core/ACL.php:302
+msgid "don't show"
+msgstr "cacher"
 
-#: src/Console/PostUpdate.php:50
-#, php-format
-msgid "Post update version number has been set to %s."
-msgstr ""
+#: view/theme/vier/config.php:116 src/Core/ACL.php:301
+msgid "show"
+msgstr "montrer"
 
-#: src/Console/PostUpdate.php:58
-msgid "Check for pending update actions."
-msgstr ""
+#: view/theme/vier/config.php:122
+msgid "Set style"
+msgstr "Définir le style"
 
-#: src/Console/PostUpdate.php:60
-msgid "Done."
-msgstr ""
+#: view/theme/vier/config.php:123
+msgid "Community Pages"
+msgstr "Pages de Communauté"
 
-#: src/Console/PostUpdate.php:62
-msgid "Execute pending post updates."
-msgstr ""
+#: view/theme/vier/config.php:124 view/theme/vier/theme.php:151
+msgid "Community Profiles"
+msgstr "Profils communautaires"
 
-#: src/Console/PostUpdate.php:68
-msgid "All pending post updates are done."
-msgstr ""
+#: view/theme/vier/config.php:125
+msgid "Help or @NewHere ?"
+msgstr "Aide ou @NewHere?"
 
-#: src/Content/ContactSelector.php:58
-msgid "Frequently"
-msgstr ""
+#: view/theme/vier/config.php:126 view/theme/vier/theme.php:373
+msgid "Connect Services"
+msgstr "Connecter des services"
 
-#: src/Content/ContactSelector.php:59
-msgid "Hourly"
-msgstr ""
+#: view/theme/vier/config.php:127
+msgid "Find Friends"
+msgstr "Trouver des amis"
 
-#: src/Content/ContactSelector.php:60
-msgid "Twice daily"
-msgstr ""
+#: view/theme/vier/config.php:128 view/theme/vier/theme.php:181
+msgid "Last users"
+msgstr "Derniers utilisateurs"
 
-#: src/Content/ContactSelector.php:61
-msgid "Daily"
-msgstr ""
+#: view/theme/vier/theme.php:199 src/Content/Widget.php:64
+msgid "Find People"
+msgstr "Trouver des personnes"
 
-#: src/Content/ContactSelector.php:62
-msgid "Weekly"
-msgstr ""
+#: view/theme/vier/theme.php:200 src/Content/Widget.php:65
+msgid "Enter name or interest"
+msgstr "Entrez un nom ou un centre d'intérêt"
 
-#: src/Content/ContactSelector.php:63
-msgid "Monthly"
-msgstr ""
+#: view/theme/vier/theme.php:202 src/Content/Widget.php:67
+msgid "Examples: Robert Morgenstein, Fishing"
+msgstr "Exemples : Robert Morgenstein, Pêche"
 
-#: src/Content/ContactSelector.php:83
-msgid "DFRN"
-msgstr ""
+#: view/theme/vier/theme.php:203 src/Content/Widget.php:68
+#: src/Module/Contact.php:820 src/Module/Directory.php:86
+msgid "Find"
+msgstr "Trouver"
 
-#: src/Content/ContactSelector.php:84
-msgid "OStatus"
-msgstr ""
+#: view/theme/vier/theme.php:205 src/Content/Widget.php:70
+msgid "Similar Interests"
+msgstr "Intérêts similaires"
 
-#: src/Content/ContactSelector.php:85
-msgid "RSS/Atom"
-msgstr ""
+#: view/theme/vier/theme.php:206 src/Content/Widget.php:71
+msgid "Random Profile"
+msgstr "Profil au hasard"
 
-#: src/Content/ContactSelector.php:86 src/Module/Admin/Users.php:272
-#: src/Module/Admin/Users.php:283 src/Module/Admin/Users.php:297
-#: src/Module/Admin/Users.php:315
-msgid "Email"
-msgstr "Courriel"
+#: view/theme/vier/theme.php:207 src/Content/Widget.php:72
+msgid "Invite Friends"
+msgstr "Inviter des amis"
 
-#: src/Content/ContactSelector.php:88
-msgid "Zot!"
-msgstr ""
+#: view/theme/vier/theme.php:208 src/Content/Widget.php:73
+#: src/Module/Directory.php:78
+msgid "Global Directory"
+msgstr "Annuaire global"
 
-#: src/Content/ContactSelector.php:89
-msgid "LinkedIn"
-msgstr ""
+#: view/theme/vier/theme.php:210 src/Content/Widget.php:75
+msgid "Local Directory"
+msgstr "Annuaire local"
 
-#: src/Content/ContactSelector.php:90
-msgid "XMPP/IM"
-msgstr ""
+#: view/theme/vier/theme.php:250 src/Content/Text/HTML.php:903
+#: src/Content/ForumManager.php:130 src/Content/Nav.php:209
+msgid "Forums"
+msgstr "Forums"
 
-#: src/Content/ContactSelector.php:91
-msgid "MySpace"
-msgstr ""
+#: 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:92
-msgid "Google+"
-msgstr ""
+#: view/theme/vier/theme.php:255 src/Content/ForumManager.php:135
+#: src/Content/Widget.php:407 src/Content/Widget.php:507
+msgid "show more"
+msgstr "montrer plus"
 
-#: src/Content/ContactSelector.php:93
-msgid "pump.io"
-msgstr ""
+#: view/theme/vier/theme.php:288
+msgid "Quick Start"
+msgstr "Démarrage rapide"
 
-#: src/Content/ContactSelector.php:94
-msgid "Twitter"
-msgstr ""
+#: view/theme/vier/theme.php:294 src/Content/Nav.php:192
+#: src/Module/Help.php:50 src/Module/Settings/TwoFactor/AppSpecific.php:99
+#: src/Module/Settings/TwoFactor/Index.php:90
+#: src/Module/Settings/TwoFactor/Recovery.php:77
+#: src/Module/Settings/TwoFactor/Verify.php:117
+msgid "Help"
+msgstr "Aide"
 
-#: src/Content/ContactSelector.php:95
-msgid "Diaspora Connector"
-msgstr ""
+#: src/Core/ACL.php:288 src/Module/Item/Compose.php:139
+msgid "Post to Email"
+msgstr "Publier aux courriels"
 
-#: src/Content/ContactSelector.php:96
-msgid "GNU Social Connector"
-msgstr ""
+#: src/Core/ACL.php:300
+msgid "Visible to everybody"
+msgstr "Visible par tout le monde"
 
-#: src/Content/ContactSelector.php:97
-msgid "ActivityPub"
+#: src/Core/ACL.php:311
+msgid "Connectors"
 msgstr ""
 
-#: src/Content/ContactSelector.php:98
-msgid "pnut"
-msgstr ""
+#: src/Core/ACL.php:313
+msgid "Hide your profile details from unknown viewers?"
+msgstr "Cacher les détails du profil aux visiteurs inconnus?"
 
-#: src/Content/ContactSelector.php:153 src/Content/ContactSelector.php:193
-#: src/Content/ContactSelector.php:231
-msgid "No answer"
-msgstr ""
+#: src/Core/ACL.php:313
+#, php-format
+msgid "Connectors disabled, since \"%s\" is enabled."
+msgstr "Les connecteurs sont désactivés parce que \"%s\" est activé."
 
-#: src/Content/ContactSelector.php:154
-msgid "Male"
-msgstr ""
+#: src/Core/ACL.php:315
+msgid "Close"
+msgstr "Fermer"
 
-#: src/Content/ContactSelector.php:155
-msgid "Female"
+#: 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 ""
 
-#: src/Content/ContactSelector.php:156
-msgid "Currently Male"
-msgstr ""
+#: src/Core/Installer.php:182
+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."
 
-#: src/Content/ContactSelector.php:157
-msgid "Currently Female"
-msgstr ""
+#: src/Core/Installer.php:183 src/Module/Install.php:174
+#: src/Module/Install.php:330
+msgid "Please see the file \"INSTALL.txt\"."
+msgstr "Référez-vous au fichier \"INSTALL.txt\"."
 
-#: src/Content/ContactSelector.php:158
-msgid "Mostly Male"
-msgstr ""
+#: 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/Content/ContactSelector.php:159
-msgid "Mostly Female"
+#: 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 "
+"href='https://github.com/friendica/friendica/blob/master/doc/Install.md#set-"
+"up-the-worker'>'Setup the worker'</a>"
 msgstr ""
 
-#: src/Content/ContactSelector.php:160
-msgid "Transgender"
-msgstr ""
+#: src/Core/Installer.php:250
+msgid "PHP executable path"
+msgstr "Chemin vers l'exécutable de PHP"
 
-#: src/Content/ContactSelector.php:161
-msgid "Intersex"
-msgstr ""
+#: src/Core/Installer.php:250
+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/ContactSelector.php:162
-msgid "Transsexual"
-msgstr ""
+#: src/Core/Installer.php:255
+msgid "Command line PHP"
+msgstr "Version \"ligne de commande\" de PHP"
 
-#: src/Content/ContactSelector.php:163
-msgid "Hermaphrodite"
-msgstr ""
+#: src/Core/Installer.php:264
+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/ContactSelector.php:164
-msgid "Neuter"
-msgstr ""
+#: src/Core/Installer.php:265
+msgid "Found PHP version: "
+msgstr "Version de PHP :"
 
-#: src/Content/ContactSelector.php:165
-msgid "Non-specific"
-msgstr "Non-spécifique"
+#: src/Core/Installer.php:267
+msgid "PHP cli binary"
+msgstr "PHP cli binary"
 
-#: src/Content/ContactSelector.php:166
-msgid "Other"
-msgstr "Autre"
+#: src/Core/Installer.php:280
+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/ContactSelector.php:194
-msgid "Males"
-msgstr "Hommes"
+#: src/Core/Installer.php:281
+msgid "This is required for message delivery to work."
+msgstr "Ceci est requis pour que la livraison des messages fonctionne."
 
-#: src/Content/ContactSelector.php:195
-msgid "Females"
-msgstr "Femmes"
+#: src/Core/Installer.php:286
+msgid "PHP register_argc_argv"
+msgstr "PHP register_argc_argv"
 
-#: src/Content/ContactSelector.php:196
-msgid "Gay"
-msgstr "Gay"
+#: src/Core/Installer.php:318
+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/ContactSelector.php:197
-msgid "Lesbian"
-msgstr "Lesbienne"
+#: src/Core/Installer.php:319
+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/ContactSelector.php:198
-msgid "No Preference"
-msgstr "Sans préférence"
+#: src/Core/Installer.php:322
+msgid "Generate encryption keys"
+msgstr "Générer les clés de chiffrement"
 
-#: src/Content/ContactSelector.php:199
-msgid "Bisexual"
-msgstr "Bisexuel"
+#: src/Core/Installer.php:374
+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/ContactSelector.php:200
-msgid "Autosexual"
-msgstr "Auto-sexuel"
+#: src/Core/Installer.php:379
+msgid "Apache mod_rewrite module"
+msgstr "Module mod_rewrite Apache"
 
-#: src/Content/ContactSelector.php:201
-msgid "Abstinent"
-msgstr "Abstinent"
+#: src/Core/Installer.php:385
+msgid "Error: PDO or MySQLi PHP module required but not installed."
+msgstr ""
 
-#: src/Content/ContactSelector.php:202
-msgid "Virgin"
-msgstr "Vierge"
+#: src/Core/Installer.php:390
+msgid "Error: The MySQL driver for PDO is not installed."
+msgstr ""
 
-#: src/Content/ContactSelector.php:203
-msgid "Deviant"
-msgstr "Déviant"
+#: src/Core/Installer.php:394
+msgid "PDO or MySQLi PHP module"
+msgstr ""
 
-#: src/Content/ContactSelector.php:204
-msgid "Fetish"
-msgstr "Fétichiste"
+#: src/Core/Installer.php:402
+msgid "Error, XML PHP module required but not installed."
+msgstr "Erreur : le module PHP XML requis est absent."
 
-#: src/Content/ContactSelector.php:205
-msgid "Oodles"
-msgstr "Oodles"
+#: src/Core/Installer.php:406
+msgid "XML PHP module"
+msgstr "Module PHP XML"
 
-#: src/Content/ContactSelector.php:206
-msgid "Nonsexual"
-msgstr "Non-sexuel"
+#: src/Core/Installer.php:409
+msgid "libCurl PHP module"
+msgstr "Module libCurl de PHP"
 
-#: src/Content/ContactSelector.php:232
-msgid "Single"
-msgstr "Célibataire"
+#: src/Core/Installer.php:410
+msgid "Error: libCURL PHP module required but not installed."
+msgstr "Erreur : Le module PHP \"libCURL\" est requis mais pas installé."
 
-#: src/Content/ContactSelector.php:233
-msgid "Lonely"
-msgstr "Esseulé"
+#: src/Core/Installer.php:416
+msgid "GD graphics PHP module"
+msgstr "Module GD (graphiques) de PHP"
 
-#: src/Content/ContactSelector.php:234
-msgid "Available"
-msgstr "Disponible"
+#: src/Core/Installer.php:417
+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/ContactSelector.php:235
-msgid "Unavailable"
-msgstr "Indisponible"
+#: src/Core/Installer.php:423
+msgid "OpenSSL PHP module"
+msgstr "Module OpenSSL de PHP"
 
-#: src/Content/ContactSelector.php:236
-msgid "Has crush"
-msgstr "Attiré par quelqu'un"
+#: src/Core/Installer.php:424
+msgid "Error: openssl PHP module required but not installed."
+msgstr "Erreur : Le module PHP \"openssl\" est requis mais pas installé."
 
-#: src/Content/ContactSelector.php:237
-msgid "Infatuated"
-msgstr "Entiché"
+#: src/Core/Installer.php:430
+msgid "mb_string PHP module"
+msgstr "Module mb_string de PHP"
 
-#: src/Content/ContactSelector.php:238
-msgid "Dating"
-msgstr "Dans une relation"
+#: src/Core/Installer.php:431
+msgid "Error: mb_string PHP module required but not installed."
+msgstr "Erreur : le module PHP mb_string est requis mais pas installé."
 
-#: src/Content/ContactSelector.php:239
-msgid "Unfaithful"
-msgstr "Infidèle"
+#: src/Core/Installer.php:437
+msgid "iconv PHP module"
+msgstr ""
 
-#: src/Content/ContactSelector.php:240
-msgid "Sex Addict"
-msgstr "Accro au sexe"
+#: src/Core/Installer.php:438
+msgid "Error: iconv PHP module required but not installed."
+msgstr "Erreur : Le module PHP iconv requis est absent."
 
-#: src/Content/ContactSelector.php:241 src/Model/User.php:729
-msgid "Friends"
-msgstr "Amis"
+#: src/Core/Installer.php:444
+msgid "POSIX PHP module"
+msgstr ""
 
-#: src/Content/ContactSelector.php:242
-msgid "Friends/Benefits"
-msgstr "Amis par intérêt"
+#: src/Core/Installer.php:445
+msgid "Error: POSIX PHP module required but not installed."
+msgstr ""
 
-#: src/Content/ContactSelector.php:243
-msgid "Casual"
-msgstr "Casual"
+#: src/Core/Installer.php:451
+msgid "JSON PHP module"
+msgstr ""
 
-#: src/Content/ContactSelector.php:244
-msgid "Engaged"
-msgstr "Fiancé"
+#: src/Core/Installer.php:452
+msgid "Error: JSON PHP module required but not installed."
+msgstr ""
 
-#: src/Content/ContactSelector.php:245
-msgid "Married"
-msgstr "Marié"
+#: src/Core/Installer.php:458
+msgid "File Information PHP module"
+msgstr ""
 
-#: src/Content/ContactSelector.php:246
-msgid "Imaginarily married"
-msgstr "Se croit marié"
+#: src/Core/Installer.php:459
+msgid "Error: File Information PHP module required but not installed."
+msgstr ""
 
-#: src/Content/ContactSelector.php:247
-msgid "Partners"
-msgstr "Partenaire"
+#: 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/Content/ContactSelector.php:248
-msgid "Cohabiting"
-msgstr "En cohabitation"
+#: 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 "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/ContactSelector.php:249
-msgid "Common law"
-msgstr "Marié \"de fait\"/\"sui juris\" (concubin)"
+#: 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/Content/ContactSelector.php:250
-msgid "Happy"
-msgstr "Heureux"
+#: 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 "Vous pouvez également sauter cette étape et procéder à une installation manuelle. Pour cela, merci de lire le fichier \"INSTALL.txt\"."
 
-#: src/Content/ContactSelector.php:251
-msgid "Not looking"
-msgstr "Pas intéressé"
+#: src/Core/Installer.php:488
+msgid "config/local.config.php is writable"
+msgstr ""
 
-#: src/Content/ContactSelector.php:252
-msgid "Swinger"
-msgstr "Échangiste"
+#: 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 "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/ContactSelector.php:253
-msgid "Betrayed"
-msgstr "Trahi(e)"
+#: 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 "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/ContactSelector.php:254
-msgid "Separated"
-msgstr "Séparé"
+#: 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 "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/ContactSelector.php:255
-msgid "Unstable"
-msgstr "Instable"
+#: 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 "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/ContactSelector.php:256
-msgid "Divorced"
-msgstr "Divorcé"
+#: src/Core/Installer.php:514
+msgid "view/smarty3 is writable"
+msgstr "view/smarty3 est autorisé à l écriture"
 
-#: src/Content/ContactSelector.php:257
-msgid "Imaginarily divorced"
-msgstr "Se croit divorcé"
+#: 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:545
+msgid "Error message from Curl when fetching"
+msgstr ""
 
-#: src/Content/ContactSelector.php:258
-msgid "Widowed"
-msgstr "Veuf/Veuve"
+#: src/Core/Installer.php:550
+msgid "Url rewrite is working"
+msgstr "La réécriture d'URL fonctionne."
 
-#: src/Content/ContactSelector.php:259
-msgid "Uncertain"
-msgstr "Incertain"
+#: src/Core/Installer.php:579
+msgid "ImageMagick PHP extension is not installed"
+msgstr "L'extension PHP ImageMagick n'est pas installée"
 
-#: src/Content/ContactSelector.php:260
-msgid "It's complicated"
-msgstr "C'est compliqué"
+#: src/Core/Installer.php:581
+msgid "ImageMagick PHP extension is installed"
+msgstr "L’extension PHP ImageMagick est installée"
 
-#: src/Content/ContactSelector.php:261
-msgid "Don't care"
-msgstr "S'en désintéresse"
+#: src/Core/Installer.php:583 tests/src/Core/InstallerTest.php:372
+#: tests/src/Core/InstallerTest.php:400
+msgid "ImageMagick supports GIF"
+msgstr "ImageMagick supporte le format GIF"
 
-#: src/Content/ContactSelector.php:262
-msgid "Ask me"
-msgstr "Me demander"
+#: src/Core/Installer.php:606
+msgid "Database already in use."
+msgstr "Base de données déjà en cours d'utilisation."
 
-#: src/Content/Feature.php:82
-msgid "General Features"
-msgstr "Fonctions générales"
+#: src/Core/Installer.php:611
+msgid "Could not connect to database."
+msgstr "Impossible de se connecter à la base."
 
-#: src/Content/Feature.php:84
-msgid "Multiple Profiles"
-msgstr "Profils multiples"
+#: src/Core/L10n/L10n.php:370 src/Model/Event.php:397
+msgid "Tuesday"
+msgstr "Mardi"
 
-#: src/Content/Feature.php:84
-msgid "Ability to create multiple profiles"
-msgstr "Possibilité de créer plusieurs profils"
+#: src/Core/L10n/L10n.php:370 src/Model/Event.php:398
+msgid "Wednesday"
+msgstr "Mercredi"
 
-#: src/Content/Feature.php:85
-msgid "Photo Location"
-msgstr "Lieu de prise de la photo"
+#: src/Core/L10n/L10n.php:370 src/Model/Event.php:399
+msgid "Thursday"
+msgstr "Jeudi"
 
-#: 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/L10n/L10n.php:370 src/Model/Event.php:400
+msgid "Friday"
+msgstr "Vendredi"
 
-#: src/Content/Feature.php:86
-msgid "Export Public Calendar"
-msgstr "Exporter le Calendrier Public"
+#: src/Core/L10n/L10n.php:370 src/Model/Event.php:401
+msgid "Saturday"
+msgstr "Samedi"
 
-#: 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/L10n/L10n.php:374 src/Model/Event.php:416
+msgid "January"
+msgstr "Janvier"
 
-#: src/Content/Feature.php:91
-msgid "Post Composition Features"
-msgstr "Caractéristiques de composition de publication"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:417
+msgid "February"
+msgstr "Février"
 
-#: src/Content/Feature.php:92
-msgid "Auto-mention Forums"
-msgstr "Mentionner automatiquement les Forums"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:418
+msgid "March"
+msgstr "Mars"
 
-#: 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/L10n/L10n.php:374 src/Model/Event.php:419
+msgid "April"
+msgstr "Avril"
 
-#: src/Content/Feature.php:93
-msgid "Explicit Mentions"
-msgstr ""
+#: src/Core/L10n/L10n.php:374 src/Core/L10n/L10n.php:394
+#: src/Model/Event.php:407
+msgid "May"
+msgstr "Mai"
 
-#: src/Content/Feature.php:93
-msgid ""
-"Add explicit mentions to comment box for manual control over who gets "
-"mentioned in replies."
-msgstr ""
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:420
+msgid "June"
+msgstr "Juin"
 
-#: src/Content/Feature.php:98
-msgid "Network Sidebar"
-msgstr ""
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:421
+msgid "July"
+msgstr "Juillet"
 
-#: 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/L10n/L10n.php:374 src/Model/Event.php:422
+msgid "August"
+msgstr "Août"
 
-#: src/Content/Feature.php:100
-msgid "Protocol Filter"
-msgstr ""
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:423
+msgid "September"
+msgstr "Septembre"
 
-#: src/Content/Feature.php:100
-msgid "Enable widget to display Network posts only from selected protocols"
-msgstr ""
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:424
+msgid "October"
+msgstr "Octobre"
 
-#: src/Content/Feature.php:105
-msgid "Network Tabs"
-msgstr "Onglets Réseau"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:425
+msgid "November"
+msgstr "Novembre"
 
-#: src/Content/Feature.php:106
-msgid "Network New Tab"
-msgstr "Nouvel onglet réseaux"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:426
+msgid "December"
+msgstr "Décembre"
 
-#: 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/L10n/L10n.php:390 src/Model/Event.php:388
+msgid "Mon"
+msgstr "Lun"
 
-#: src/Content/Feature.php:107
-msgid "Network Shared Links Tab"
-msgstr "Onglet réseau partagé"
+#: src/Core/L10n/L10n.php:390 src/Model/Event.php:389
+msgid "Tue"
+msgstr "Mar"
 
-#: 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/L10n/L10n.php:390 src/Model/Event.php:390
+msgid "Wed"
+msgstr "Mer"
 
-#: src/Content/Feature.php:112
-msgid "Post/Comment Tools"
-msgstr "Outils de publication/commentaire"
+#: src/Core/L10n/L10n.php:390 src/Model/Event.php:391
+msgid "Thu"
+msgstr "Jeu"
 
-#: src/Content/Feature.php:113
-msgid "Post Categories"
-msgstr "Catégories des publications"
+#: src/Core/L10n/L10n.php:390 src/Model/Event.php:392
+msgid "Fri"
+msgstr "Ven"
 
-#: src/Content/Feature.php:113
-msgid "Add categories to your posts"
-msgstr "Ajouter des catégories à vos publications"
+#: src/Core/L10n/L10n.php:390 src/Model/Event.php:393
+msgid "Sat"
+msgstr "Sam"
 
-#: src/Content/Feature.php:118
-msgid "Advanced Profile Settings"
-msgstr "Paramètres Avancés du Profil"
+#: src/Core/L10n/L10n.php:390 src/Model/Event.php:387
+msgid "Sun"
+msgstr "Dim"
 
-#: src/Content/Feature.php:119
-msgid "List Forums"
-msgstr "Liste des forums"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:403
+msgid "Jan"
+msgstr "Jan"
 
-#: 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/L10n/L10n.php:394 src/Model/Event.php:404
+msgid "Feb"
+msgstr "Fév"
 
-#: src/Content/Feature.php:120
-msgid "Tag Cloud"
-msgstr ""
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:405
+msgid "Mar"
+msgstr "Mar"
 
-#: src/Content/Feature.php:120
-msgid "Provide a personal tag cloud on your profile page"
-msgstr ""
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:406
+msgid "Apr"
+msgstr "Avr"
 
-#: src/Content/Feature.php:121
-msgid "Display Membership Date"
-msgstr ""
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:408
+msgid "Jun"
+msgstr "Jun"
 
-#: src/Content/Feature.php:121
-msgid "Display membership date in profile"
-msgstr ""
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:409
+msgid "Jul"
+msgstr "Jul"
 
-#: src/Content/ForumManager.php:130 src/Content/Nav.php:206
-#: src/Content/Text/HTML.php:914 view/theme/vier/theme.php:250
-msgid "Forums"
-msgstr "Forums"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:410
+msgid "Aug"
+msgstr "Aoû"
 
-#: src/Content/ForumManager.php:132 view/theme/vier/theme.php:252
-msgid "External link to forum"
-msgstr "Lien sortant vers le forum"
+#: src/Core/L10n/L10n.php:394
+msgid "Sep"
+msgstr ""
 
-#: src/Content/Nav.php:73
-msgid "Nothing new here"
-msgstr "Rien de neuf ici"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:412
+msgid "Oct"
+msgstr "Oct"
 
-#: src/Content/Nav.php:77
-msgid "Clear notifications"
-msgstr "Effacer les notifications"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:413
+msgid "Nov"
+msgstr "Nov"
 
-#: src/Content/Nav.php:78 src/Content/Text/HTML.php:903
-msgid "@name, !forum, #tags, content"
-msgstr "@nom, !forum, #tags, contenu"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:414
+msgid "Dec"
+msgstr "Déc"
 
-#: src/Content/Nav.php:152 src/Module/Login.php:324
-#: view/theme/frio/theme.php:259
-msgid "Logout"
-msgstr "Se déconnecter"
+#: src/Core/L10n/L10n.php:413
+msgid "poke"
+msgstr "titiller"
 
-#: src/Content/Nav.php:152 view/theme/frio/theme.php:259
-msgid "End this session"
-msgstr "Mettre fin à cette session"
+#: src/Core/L10n/L10n.php:413
+msgid "poked"
+msgstr "a titillé"
 
-#: src/Content/Nav.php:155 src/Model/Profile.php:895
-#: src/Module/Contact.php:655 src/Module/Contact.php:856
-#: src/Module/Settings/TwoFactor/Index.php:85 view/theme/frio/theme.php:262
-msgid "Status"
-msgstr "Statut"
+#: src/Core/L10n/L10n.php:414
+msgid "ping"
+msgstr "attirer l'attention"
 
-#: src/Content/Nav.php:155 src/Content/Nav.php:241
-#: view/theme/frio/theme.php:262
-msgid "Your posts and conversations"
-msgstr "Vos publications et conversations"
+#: src/Core/L10n/L10n.php:414
+msgid "pinged"
+msgstr "a attiré l'attention de"
 
-#: src/Content/Nav.php:156 view/theme/frio/theme.php:263
-msgid "Your profile page"
-msgstr "Votre page de profil"
+#: src/Core/L10n/L10n.php:415
+msgid "prod"
+msgstr "aiguillonner"
 
-#: src/Content/Nav.php:157 view/theme/frio/theme.php:264
-msgid "Your photos"
-msgstr "Vos photos"
+#: src/Core/L10n/L10n.php:415
+msgid "prodded"
+msgstr "a aiguillonné"
 
-#: src/Content/Nav.php:158 src/Model/Profile.php:919 src/Model/Profile.php:922
-#: view/theme/frio/theme.php:265
-msgid "Videos"
-msgstr "Vidéos"
+#: src/Core/L10n/L10n.php:416
+msgid "slap"
+msgstr "gifler"
 
-#: src/Content/Nav.php:158 view/theme/frio/theme.php:265
-msgid "Your videos"
-msgstr "Vos vidéos"
+#: src/Core/L10n/L10n.php:416
+msgid "slapped"
+msgstr "a giflé"
 
-#: src/Content/Nav.php:159 view/theme/frio/theme.php:266
-msgid "Your events"
-msgstr "Vos événements"
+#: src/Core/L10n/L10n.php:417
+msgid "finger"
+msgstr "tripoter"
 
-#: src/Content/Nav.php:160
-msgid "Personal notes"
-msgstr "Notes personnelles"
+#: src/Core/L10n/L10n.php:417
+msgid "fingered"
+msgstr "a tripoté"
 
-#: src/Content/Nav.php:160
-msgid "Your personal notes"
-msgstr "Vos notes personnelles"
+#: src/Core/L10n/L10n.php:418
+msgid "rebuff"
+msgstr "rabrouer"
 
-#: src/Content/Nav.php:169 src/Module/Bookmarklet.php:25
-#: src/Module/Login.php:325
-msgid "Login"
-msgstr "Connexion"
+#: src/Core/L10n/L10n.php:418
+msgid "rebuffed"
+msgstr "a rabroué"
 
-#: src/Content/Nav.php:169
-msgid "Sign in"
-msgstr "Se connecter"
+#: src/Core/NotificationsManager.php:144
+msgid "System"
+msgstr "Système"
 
-#: src/Content/Nav.php:179 src/Content/Nav.php:241
-#: src/Core/NotificationsManager.php:165
+#: src/Core/NotificationsManager.php:165 src/Content/Nav.php:182
+#: src/Content/Nav.php:244
 msgid "Home"
 msgstr "Profil"
 
-#: src/Content/Nav.php:179
-msgid "Home Page"
-msgstr "Page d'accueil"
+#: src/Core/NotificationsManager.php:172 src/Content/Nav.php:248
+msgid "Introductions"
+msgstr "Introductions"
+
+#: src/Core/NotificationsManager.php:234 src/Core/NotificationsManager.php:246
+#, php-format
+msgid "%s commented on %s's post"
+msgstr "%s a commenté la publication de %s"
 
-#: src/Content/Nav.php:183 src/Module/Login.php:296
-#: src/Module/Register.php:136
-msgid "Register"
-msgstr "S'inscrire"
+#: src/Core/NotificationsManager.php:245
+#, php-format
+msgid "%s created a new post"
+msgstr "%s a créé une nouvelle publication"
 
-#: src/Content/Nav.php:183
-msgid "Create an account"
-msgstr "Créer un compte"
+#: src/Core/NotificationsManager.php:259
+#, php-format
+msgid "%s liked %s's post"
+msgstr "%s a aimé la publication de %s"
 
-#: src/Content/Nav.php:189 src/Module/Help.php:50
-#: src/Module/Settings/TwoFactor/Index.php:84
-#: src/Module/Settings/TwoFactor/Recovery.php:77
-#: src/Module/Settings/TwoFactor/Verify.php:117 view/theme/vier/theme.php:294
-msgid "Help"
-msgstr "Aide"
+#: src/Core/NotificationsManager.php:272
+#, php-format
+msgid "%s disliked %s's post"
+msgstr "%s n'a pas aimé la publication de %s"
 
-#: src/Content/Nav.php:189
-msgid "Help and documentation"
-msgstr "Aide et documentation"
+#: src/Core/NotificationsManager.php:285
+#, php-format
+msgid "%s is attending %s's event"
+msgstr "%s participe à l'événement de %s"
 
-#: src/Content/Nav.php:193
-msgid "Apps"
-msgstr "Applications"
+#: src/Core/NotificationsManager.php:298
+#, php-format
+msgid "%s is not attending %s's event"
+msgstr "%s ne participe pas à l'événement de %s"
 
-#: src/Content/Nav.php:193
-msgid "Addon applications, utilities, games"
-msgstr "Applications supplémentaires, utilitaires, jeux"
+#: src/Core/NotificationsManager.php:311
+#, php-format
+msgid "%s may attend %s's event"
+msgstr "%s participera peut-être à l'événement de %s"
 
-#: src/Content/Nav.php:197
-msgid "Search site content"
-msgstr "Rechercher dans le contenu du site"
+#: src/Core/NotificationsManager.php:344
+#, php-format
+msgid "%s is now friends with %s"
+msgstr "%s est désormais ami(e) avec %s"
 
-#: src/Content/Nav.php:200 src/Content/Text/HTML.php:909
-msgid "Full Text"
-msgstr "Texte Entier"
+#: src/Core/NotificationsManager.php:622
+msgid "Friend Suggestion"
+msgstr "Suggestion d'amitié/contact"
 
-#: src/Content/Nav.php:201 src/Content/Text/HTML.php:910
-#: src/Content/Widget/TagCloud.php:54
-msgid "Tags"
-msgstr "Tags"
+#: src/Core/NotificationsManager.php:656
+msgid "Friend/Connect Request"
+msgstr "Demande de connexion/relation"
 
-#: src/Content/Nav.php:221
-msgid "Community"
-msgstr "Communauté"
+#: src/Core/NotificationsManager.php:656
+msgid "New Follower"
+msgstr "Nouvel abonné"
 
-#: src/Content/Nav.php:221
-msgid "Conversations on this and other servers"
+#: src/Core/Session.php:188
+#, php-format
+msgid "Welcome %s"
 msgstr ""
 
-#: src/Content/Nav.php:225 src/Model/Profile.php:934 src/Model/Profile.php:945
-#: view/theme/frio/theme.php:270
-msgid "Events and Calendar"
-msgstr "Événements et agenda"
-
-#: src/Content/Nav.php:228
-msgid "Directory"
-msgstr "Annuaire"
+#: src/Core/Session.php:189
+msgid "Please upload a profile photo."
+msgstr "Merci d'illustrer votre profil d'une image."
 
-#: src/Content/Nav.php:228
-msgid "People directory"
-msgstr "Annuaire des utilisateurs"
+#: src/Core/Session.php:192
+#, php-format
+msgid "Welcome back %s"
+msgstr ""
 
-#: src/Content/Nav.php:230 src/Module/BaseAdminModule.php:75
-msgid "Information"
-msgstr "Information"
+#: src/Core/Update.php:193
+#, php-format
+msgid "Update %s failed. See error logs."
+msgstr "Mise-à-jour %s échouée. Voir les journaux d'erreur."
 
-#: src/Content/Nav.php:230
-msgid "Information about this friendica instance"
-msgstr "Information au sujet de cette instance de friendica"
+#: src/Core/Update.php:257
+#, 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/Nav.php:233 src/Module/Admin/Tos.php:43
-#: src/Module/BaseAdminModule.php:85 src/Module/Register.php:144
-#: src/Module/Tos.php:73
-msgid "Terms of Service"
-msgstr "Conditions de service"
+#: src/Core/Update.php:263
+#, php-format
+msgid ""
+"The error message is\n"
+"[pre]%s[/pre]"
+msgstr "Le message d’erreur est\n[pre]%s[/pre]"
 
-#: src/Content/Nav.php:233
-msgid "Terms of Service of this Friendica instance"
+#: src/Core/Update.php:269 src/Core/Update.php:308
+msgid "[Friendica Notify] Database update"
 msgstr ""
 
-#: src/Content/Nav.php:238 src/Core/NotificationsManager.php:151
-#: view/theme/frio/theme.php:269
-msgid "Network"
-msgstr "Réseau"
-
-#: src/Content/Nav.php:238 view/theme/frio/theme.php:269
-msgid "Conversations from your friends"
-msgstr "Conversations de vos amis"
+#: src/Core/Update.php:300
+#, php-format
+msgid ""
+"\n"
+"\t\t\t\t\tThe friendica database was successfully updated from %s to %s."
+msgstr ""
 
-#: src/Content/Nav.php:239
-msgid "Network Reset"
-msgstr "Réinitialiser le réseau"
+#: src/Core/UserImport.php:107
+msgid "Error decoding account file"
+msgstr "Une erreur a été détecté en décodant un fichier utilisateur"
 
-#: src/Content/Nav.php:239
-msgid "Load Network page with no filters"
-msgstr "Chargement des pages du réseau sans filtre"
+#: src/Core/UserImport.php:113
+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/Nav.php:245 src/Core/NotificationsManager.php:172
-msgid "Introductions"
-msgstr "Introductions"
+#: src/Core/UserImport.php:121
+#, php-format
+msgid "User '%s' already exists on this server!"
+msgstr "L'utilisateur '%s' existe déjà sur ce serveur!"
 
-#: src/Content/Nav.php:245
-msgid "Friend Requests"
-msgstr "Demande d'amitié"
+#: src/Core/UserImport.php:157
+msgid "User creation error"
+msgstr "Erreur de création d'utilisateur"
 
-#: src/Content/Nav.php:247
-msgid "See all notifications"
-msgstr "Voir toutes les notifications"
+#: src/Core/UserImport.php:175
+msgid "User profile creation error"
+msgstr "Erreur de création du profil utilisateur"
 
-#: src/Content/Nav.php:248
-msgid "Mark all system notifications seen"
-msgstr "Marquer toutes les notifications système comme 'vues'"
+#: src/Core/UserImport.php:219
+#, 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/Content/Nav.php:251 view/theme/frio/theme.php:271
-msgid "Private mail"
-msgstr "Messages privés"
+#: src/Core/UserImport.php:284
+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/Content/Nav.php:252
-msgid "Inbox"
-msgstr "Messages entrants"
+#: src/Util/Temporal.php:147 src/Model/Profile.php:776
+msgid "Birthday:"
+msgstr "Anniversaire :"
 
-#: src/Content/Nav.php:253
-msgid "Outbox"
-msgstr "Messages sortants"
+#: src/Util/Temporal.php:151
+msgid "YYYY-MM-DD or MM-DD"
+msgstr "AAAA-MM-JJ ou MM-JJ"
 
-#: src/Content/Nav.php:257
-msgid "Manage"
-msgstr "Gérer"
+#: src/Util/Temporal.php:298
+msgid "never"
+msgstr "jamais"
 
-#: src/Content/Nav.php:257
-msgid "Manage other pages"
-msgstr "Gérer les autres pages"
+#: src/Util/Temporal.php:305
+msgid "less than a second ago"
+msgstr "il y a moins d'une seconde"
 
-#: src/Content/Nav.php:262 view/theme/frio/theme.php:272
-msgid "Account settings"
-msgstr "Compte"
+#: src/Util/Temporal.php:313
+msgid "year"
+msgstr "an"
 
-#: src/Content/Nav.php:265
-msgid "Manage/Edit Profiles"
-msgstr "Gérer/Éditer les profiles"
+#: src/Util/Temporal.php:313
+msgid "years"
+msgstr "ans"
 
-#: src/Content/Nav.php:268 view/theme/frio/theme.php:273
-msgid "Manage/edit friends and contacts"
-msgstr "Gérer/éditer les amitiés et contacts"
+#: src/Util/Temporal.php:314
+msgid "months"
+msgstr "mois"
 
-#: src/Content/Nav.php:273 src/Module/BaseAdminModule.php:114
-msgid "Admin"
-msgstr "Admin"
+#: src/Util/Temporal.php:315
+msgid "weeks"
+msgstr "semaines"
 
-#: src/Content/Nav.php:273
-msgid "Site setup and configuration"
-msgstr "Démarrage et configuration du site"
+#: src/Util/Temporal.php:316
+msgid "days"
+msgstr "jours"
 
-#: src/Content/Nav.php:276
-msgid "Navigation"
-msgstr "Navigation"
+#: src/Util/Temporal.php:317
+msgid "hour"
+msgstr "heure"
 
-#: src/Content/Nav.php:276
-msgid "Site map"
-msgstr "Carte du site"
+#: src/Util/Temporal.php:317
+msgid "hours"
+msgstr "heures"
 
-#: src/Content/OEmbed.php:255
-msgid "Embedding disabled"
-msgstr "Incorporation désactivée"
+#: src/Util/Temporal.php:318
+msgid "minute"
+msgstr "minute"
 
-#: src/Content/OEmbed.php:378
-msgid "Embedded content"
-msgstr "Contenu incorporé"
+#: src/Util/Temporal.php:318
+msgid "minutes"
+msgstr "minutes"
 
-#: src/Content/Pager.php:153
-msgid "newer"
-msgstr "Plus récent"
+#: src/Util/Temporal.php:319
+msgid "second"
+msgstr "seconde"
 
-#: src/Content/Pager.php:158
-msgid "older"
-msgstr "Plus ancien"
+#: src/Util/Temporal.php:319
+msgid "seconds"
+msgstr "secondes"
 
-#: src/Content/Pager.php:203
-msgid "prev"
-msgstr "précédent"
+#: src/Util/Temporal.php:329
+#, php-format
+msgid "in %1$d %2$s"
+msgstr ""
 
-#: src/Content/Pager.php:263
-msgid "last"
-msgstr "dernier"
+#: 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:430
+#: src/Content/Text/BBCode.php:457
 msgid "view full size"
 msgstr "voir en pleine taille"
 
-#: src/Content/Text/BBCode.php:864 src/Content/Text/BBCode.php:1591
-#: src/Content/Text/BBCode.php:1592
+#: src/Content/Text/BBCode.php:891 src/Content/Text/BBCode.php:1533
+#: src/Content/Text/BBCode.php:1534
 msgid "Image/photo"
 msgstr "Image/photo"
 
-#: src/Content/Text/BBCode.php:972
+#: src/Content/Text/BBCode.php:1009
 #, 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/Content/Text/BBCode.php:1518 src/Content/Text/BBCode.php:1540
+#: src/Content/Text/BBCode.php:1460 src/Content/Text/BBCode.php:1482
 msgid "$1 wrote:"
 msgstr "$1 a écrit :"
 
-#: src/Content/Text/BBCode.php:1602 src/Content/Text/BBCode.php:1603
+#: src/Content/Text/BBCode.php:1536 src/Content/Text/BBCode.php:1537
 msgid "Encrypted content"
 msgstr "Contenu chiffré"
 
-#: src/Content/Text/BBCode.php:1710
+#: src/Content/Text/BBCode.php:1758
 msgid "Invalid source protocol"
 msgstr ""
 
-#: src/Content/Text/BBCode.php:1721
+#: src/Content/Text/BBCode.php:1769
 msgid "Invalid link protocol"
 msgstr ""
 
-#: src/Content/Text/HTML.php:800
+#: src/Content/Text/HTML.php:789
 msgid "Loading more entries..."
 msgstr "Chargement de résultats supplémentaires..."
 
-#: src/Content/Text/HTML.php:801
+#: src/Content/Text/HTML.php:790
 msgid "The end"
 msgstr "Fin"
 
-#: src/Content/Text/HTML.php:894
+#: src/Content/Text/HTML.php:883 src/Model/Profile.php:536
+#: src/Module/Contact.php:335
 msgid "Follow"
 msgstr "S'abonner"
 
-#: src/Content/Text/HTML.php:951 src/Model/Item.php:3471
-#: src/Model/Item.php:3482
+#: src/Content/Text/HTML.php:892 src/Content/Nav.php:79
+msgid "@name, !forum, #tags, content"
+msgstr "@nom, !forum, #tags, contenu"
+
+#: src/Content/Text/HTML.php:898 src/Content/Nav.php:203
+msgid "Full Text"
+msgstr "Texte Entier"
+
+#: src/Content/Text/HTML.php:899 src/Content/Widget/TagCloud.php:54
+#: src/Content/Nav.php:204
+msgid "Tags"
+msgstr "Tags"
+
+#: src/Content/Text/HTML.php:940 src/Model/Item.php:3518
+#: src/Model/Item.php:3529
 msgid "Click to open/close"
 msgstr "Cliquer pour ouvrir/fermer"
 
@@ -5237,720 +5344,720 @@ msgstr[1] "%d contacts"
 msgid "View Contacts"
 msgstr "Voir les contacts"
 
-#: src/Content/Widget.php:35
-msgid "Add New Contact"
-msgstr "Ajouter un nouveau contact"
+#: src/Content/Widget/TrendingTags.php:34
+#, php-format
+msgid "Trending Tags (last %d hour)"
+msgid_plural "Trending Tags (last %d hours)"
+msgstr[0] ""
+msgstr[1] ""
 
-#: src/Content/Widget.php:36
-msgid "Enter address or web location"
-msgstr "Entrez son adresse ou sa localisation web"
+#: src/Content/Widget/TrendingTags.php:35
+msgid "More Trending Tags"
+msgstr ""
 
-#: src/Content/Widget.php:37
-msgid "Example: bob@example.com, http://example.com/barbara"
-msgstr "Exemple : bob@example.com, http://example.com/barbara"
+#: src/Content/Pager.php:153
+msgid "newer"
+msgstr "Plus récent"
 
-#: 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/Content/Pager.php:158
+msgid "older"
+msgstr "Plus ancien"
 
-#: src/Content/Widget.php:61 view/theme/vier/theme.php:199
-msgid "Find People"
-msgstr "Trouver des personnes"
+#: src/Content/Pager.php:203
+msgid "prev"
+msgstr "précédent"
 
-#: 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/Content/Pager.php:263
+msgid "last"
+msgstr "dernier"
 
-#: src/Content/Widget.php:64 view/theme/vier/theme.php:202
-msgid "Examples: Robert Morgenstein, Fishing"
-msgstr "Exemples : Robert Morgenstein, Pêche"
+#: src/Content/ContactSelector.php:58
+msgid "Frequently"
+msgstr ""
 
-#: src/Content/Widget.php:65 src/Module/Contact.php:820
-#: src/Module/Directory.php:91 view/theme/vier/theme.php:203
-msgid "Find"
-msgstr "Trouver"
+#: src/Content/ContactSelector.php:59
+msgid "Hourly"
+msgstr ""
 
-#: src/Content/Widget.php:67 view/theme/vier/theme.php:205
-msgid "Similar Interests"
-msgstr "Intérêts similaires"
+#: src/Content/ContactSelector.php:60
+msgid "Twice daily"
+msgstr ""
 
-#: src/Content/Widget.php:68 view/theme/vier/theme.php:206
-msgid "Random Profile"
-msgstr "Profil au hasard"
+#: src/Content/ContactSelector.php:61
+msgid "Daily"
+msgstr ""
 
-#: src/Content/Widget.php:69 view/theme/vier/theme.php:207
-msgid "Invite Friends"
-msgstr "Inviter des amis"
+#: src/Content/ContactSelector.php:62
+msgid "Weekly"
+msgstr ""
 
-#: src/Content/Widget.php:70 src/Module/Directory.php:83
-#: view/theme/vier/theme.php:208
-msgid "Global Directory"
-msgstr "Annuaire global"
+#: src/Content/ContactSelector.php:63
+msgid "Monthly"
+msgstr ""
 
-#: src/Content/Widget.php:72 view/theme/vier/theme.php:210
-msgid "Local Directory"
-msgstr "Annuaire local"
+#: src/Content/ContactSelector.php:83
+msgid "DFRN"
+msgstr ""
 
-#: src/Content/Widget.php:158
-msgid "Protocols"
+#: src/Content/ContactSelector.php:84
+msgid "OStatus"
 msgstr ""
 
-#: src/Content/Widget.php:161
-msgid "All Protocols"
+#: src/Content/ContactSelector.php:85
+msgid "RSS/Atom"
 msgstr ""
 
-#: src/Content/Widget.php:198
-msgid "Saved Folders"
-msgstr "Dossiers sauvegardés"
+#: src/Content/ContactSelector.php:86 src/Module/Admin/Users.php:272
+#: src/Module/Admin/Users.php:283 src/Module/Admin/Users.php:297
+#: src/Module/Admin/Users.php:315
+msgid "Email"
+msgstr "Courriel"
 
-#: src/Content/Widget.php:201 src/Content/Widget.php:243
-msgid "Everything"
-msgstr "Tout"
+#: src/Content/ContactSelector.php:88
+msgid "Zot!"
+msgstr ""
 
-#: src/Content/Widget.php:240
-msgid "Categories"
-msgstr "Catégories"
+#: src/Content/ContactSelector.php:89
+msgid "LinkedIn"
+msgstr ""
 
-#: 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/Content/ContactSelector.php:90
+msgid "XMPP/IM"
+msgstr ""
 
-#: src/Core/ACL.php:288
-msgid "Post to Email"
-msgstr "Publier aux courriels"
+#: src/Content/ContactSelector.php:91
+msgid "MySpace"
+msgstr ""
 
-#: src/Core/ACL.php:300
-msgid "Visible to everybody"
-msgstr "Visible par tout le monde"
+#: src/Content/ContactSelector.php:92
+msgid "Google+"
+msgstr ""
 
-#: src/Core/ACL.php:301 view/theme/vier/config.php:116
-msgid "show"
-msgstr "montrer"
+#: src/Content/ContactSelector.php:93
+msgid "pump.io"
+msgstr ""
 
-#: src/Core/ACL.php:302 view/theme/vier/config.php:116
-msgid "don't show"
-msgstr "cacher"
+#: src/Content/ContactSelector.php:94
+msgid "Twitter"
+msgstr ""
 
-#: src/Core/ACL.php:311
-msgid "Connectors"
+#: src/Content/ContactSelector.php:95
+msgid "Diaspora Connector"
 msgstr ""
 
-#: src/Core/ACL.php:313
-msgid "Hide your profile details from unknown viewers?"
-msgstr "Cacher les détails du profil aux visiteurs inconnus?"
+#: src/Content/ContactSelector.php:96
+msgid "GNU Social Connector"
+msgstr ""
 
-#: src/Core/ACL.php:313
-#, php-format
-msgid "Connectors disabled, since \"%s\" is enabled."
-msgstr "Les connecteurs sont désactivés parce que \"%s\" est activé."
+#: src/Content/ContactSelector.php:97
+msgid "ActivityPub"
+msgstr ""
 
-#: src/Core/ACL.php:315
-msgid "Close"
-msgstr "Fermer"
+#: src/Content/ContactSelector.php:98
+msgid "pnut"
+msgstr ""
 
-#: 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."
+#: src/Content/ContactSelector.php:153 src/Content/ContactSelector.php:193
+#: src/Content/ContactSelector.php:231
+msgid "No answer"
 msgstr ""
 
-#: src/Core/Installer.php:183
-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."
+#: src/Content/ContactSelector.php:154
+msgid "Male"
+msgstr ""
 
-#: src/Core/Installer.php:184 src/Module/Install.php:172
-#: src/Module/Install.php:328
-msgid "Please see the file \"INSTALL.txt\"."
-msgstr "Référez-vous au fichier \"INSTALL.txt\"."
+#: src/Content/ContactSelector.php:155
+msgid "Female"
+msgstr ""
 
-#: src/Core/Installer.php:245
-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/ContactSelector.php:156
+msgid "Currently Male"
+msgstr ""
 
-#: 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://github.com/friendica/friendica/blob/master/doc/Install.md#set-"
-"up-the-worker'>'Setup the worker'</a>"
+#: src/Content/ContactSelector.php:157
+msgid "Currently Female"
 msgstr ""
 
-#: src/Core/Installer.php:251
-msgid "PHP executable path"
-msgstr "Chemin vers l'exécutable de PHP"
+#: src/Content/ContactSelector.php:158
+msgid "Mostly Male"
+msgstr ""
+
+#: src/Content/ContactSelector.php:159
+msgid "Mostly Female"
+msgstr ""
+
+#: src/Content/ContactSelector.php:160
+msgid "Transgender"
+msgstr ""
+
+#: src/Content/ContactSelector.php:161
+msgid "Intersex"
+msgstr ""
+
+#: src/Content/ContactSelector.php:162
+msgid "Transsexual"
+msgstr ""
+
+#: src/Content/ContactSelector.php:163
+msgid "Hermaphrodite"
+msgstr ""
+
+#: src/Content/ContactSelector.php:164
+msgid "Neuter"
+msgstr ""
+
+#: src/Content/ContactSelector.php:165
+msgid "Non-specific"
+msgstr "Non-spécifique"
+
+#: src/Content/ContactSelector.php:166
+msgid "Other"
+msgstr "Autre"
+
+#: src/Content/ContactSelector.php:194
+msgid "Males"
+msgstr "Hommes"
+
+#: src/Content/ContactSelector.php:195
+msgid "Females"
+msgstr "Femmes"
+
+#: src/Content/ContactSelector.php:196
+msgid "Gay"
+msgstr "Gay"
+
+#: src/Content/ContactSelector.php:197
+msgid "Lesbian"
+msgstr "Lesbienne"
+
+#: src/Content/ContactSelector.php:198
+msgid "No Preference"
+msgstr "Sans préférence"
+
+#: src/Content/ContactSelector.php:199
+msgid "Bisexual"
+msgstr "Bisexuel"
+
+#: src/Content/ContactSelector.php:200
+msgid "Autosexual"
+msgstr "Auto-sexuel"
+
+#: src/Content/ContactSelector.php:201
+msgid "Abstinent"
+msgstr "Abstinent"
+
+#: src/Content/ContactSelector.php:202
+msgid "Virgin"
+msgstr "Vierge"
+
+#: src/Content/ContactSelector.php:203
+msgid "Deviant"
+msgstr "Déviant"
+
+#: src/Content/ContactSelector.php:204
+msgid "Fetish"
+msgstr "Fétichiste"
 
-#: src/Core/Installer.php:251
-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/ContactSelector.php:205
+msgid "Oodles"
+msgstr "Oodles"
 
-#: src/Core/Installer.php:256
-msgid "Command line PHP"
-msgstr "Version \"ligne de commande\" de PHP"
+#: src/Content/ContactSelector.php:206
+msgid "Nonsexual"
+msgstr "Non-sexuel"
 
-#: src/Core/Installer.php:265
-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/ContactSelector.php:232
+msgid "Single"
+msgstr "Célibataire"
 
-#: src/Core/Installer.php:266
-msgid "Found PHP version: "
-msgstr "Version de PHP :"
+#: src/Content/ContactSelector.php:233
+msgid "Lonely"
+msgstr "Esseulé"
 
-#: src/Core/Installer.php:268
-msgid "PHP cli binary"
-msgstr "PHP cli binary"
+#: src/Content/ContactSelector.php:234
+msgid "In a relation"
+msgstr ""
 
-#: src/Core/Installer.php:281
-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/ContactSelector.php:235
+msgid "Has crush"
+msgstr "Attiré par quelqu'un"
 
-#: src/Core/Installer.php:282
-msgid "This is required for message delivery to work."
-msgstr "Ceci est requis pour que la livraison des messages fonctionne."
+#: src/Content/ContactSelector.php:236
+msgid "Infatuated"
+msgstr "Entiché"
 
-#: src/Core/Installer.php:287
-msgid "PHP register_argc_argv"
-msgstr "PHP register_argc_argv"
+#: src/Content/ContactSelector.php:237
+msgid "Dating"
+msgstr "Dans une relation"
 
-#: src/Core/Installer.php:319
-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/ContactSelector.php:238
+msgid "Unfaithful"
+msgstr "Infidèle"
 
-#: src/Core/Installer.php:320
-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/ContactSelector.php:239
+msgid "Sex Addict"
+msgstr "Accro au sexe"
 
-#: src/Core/Installer.php:323
-msgid "Generate encryption keys"
-msgstr "Générer les clés de chiffrement"
+#: src/Content/ContactSelector.php:240 src/Model/User.php:762
+msgid "Friends"
+msgstr "Amis"
 
-#: src/Core/Installer.php:375
-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/ContactSelector.php:241
+msgid "Friends/Benefits"
+msgstr "Amis par intérêt"
 
-#: src/Core/Installer.php:380
-msgid "Apache mod_rewrite module"
-msgstr "Module mod_rewrite Apache"
+#: src/Content/ContactSelector.php:242
+msgid "Casual"
+msgstr "Casual"
 
-#: src/Core/Installer.php:386
-msgid "Error: PDO or MySQLi PHP module required but not installed."
-msgstr ""
+#: src/Content/ContactSelector.php:243
+msgid "Engaged"
+msgstr "Fiancé"
 
-#: src/Core/Installer.php:391
-msgid "Error: The MySQL driver for PDO is not installed."
-msgstr ""
+#: src/Content/ContactSelector.php:244
+msgid "Married"
+msgstr "Marié"
 
-#: src/Core/Installer.php:395
-msgid "PDO or MySQLi PHP module"
-msgstr ""
+#: src/Content/ContactSelector.php:245
+msgid "Imaginarily married"
+msgstr "Se croit marié"
 
-#: src/Core/Installer.php:403
-msgid "Error, XML PHP module required but not installed."
-msgstr "Erreur : le module PHP XML requis est absent."
+#: src/Content/ContactSelector.php:246
+msgid "Partners"
+msgstr "Partenaire"
 
-#: src/Core/Installer.php:407
-msgid "XML PHP module"
-msgstr "Module PHP XML"
+#: src/Content/ContactSelector.php:247
+msgid "Cohabiting"
+msgstr "En cohabitation"
 
-#: src/Core/Installer.php:410
-msgid "libCurl PHP module"
-msgstr "Module libCurl de PHP"
+#: src/Content/ContactSelector.php:248
+msgid "Common law"
+msgstr "Marié \"de fait\"/\"sui juris\" (concubin)"
 
-#: src/Core/Installer.php:411
-msgid "Error: libCURL PHP module required but not installed."
-msgstr "Erreur : Le module PHP \"libCURL\" est requis mais pas installé."
+#: src/Content/ContactSelector.php:249
+msgid "Happy"
+msgstr "Heureux"
 
-#: src/Core/Installer.php:417
-msgid "GD graphics PHP module"
-msgstr "Module GD (graphiques) de PHP"
+#: src/Content/ContactSelector.php:250
+msgid "Not looking"
+msgstr "Pas intéressé"
 
-#: src/Core/Installer.php:418
-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/ContactSelector.php:251
+msgid "Swinger"
+msgstr "Échangiste"
 
-#: src/Core/Installer.php:424
-msgid "OpenSSL PHP module"
-msgstr "Module OpenSSL de PHP"
+#: src/Content/ContactSelector.php:252
+msgid "Betrayed"
+msgstr "Trahi(e)"
 
-#: src/Core/Installer.php:425
-msgid "Error: openssl PHP module required but not installed."
-msgstr "Erreur : Le module PHP \"openssl\" est requis mais pas installé."
+#: src/Content/ContactSelector.php:253
+msgid "Separated"
+msgstr "Séparé"
 
-#: src/Core/Installer.php:431
-msgid "mb_string PHP module"
-msgstr "Module mb_string de PHP"
+#: src/Content/ContactSelector.php:254
+msgid "Unstable"
+msgstr "Instable"
 
-#: src/Core/Installer.php:432
-msgid "Error: mb_string PHP module required but not installed."
-msgstr "Erreur : le module PHP mb_string est requis mais pas installé."
+#: src/Content/ContactSelector.php:255
+msgid "Divorced"
+msgstr "Divorcé"
 
-#: src/Core/Installer.php:438
-msgid "iconv PHP module"
-msgstr ""
+#: src/Content/ContactSelector.php:256
+msgid "Imaginarily divorced"
+msgstr "Se croit divorcé"
 
-#: src/Core/Installer.php:439
-msgid "Error: iconv PHP module required but not installed."
-msgstr "Erreur : Le module PHP iconv requis est absent."
+#: src/Content/ContactSelector.php:257
+msgid "Widowed"
+msgstr "Veuf/Veuve"
 
-#: src/Core/Installer.php:445
-msgid "POSIX PHP module"
-msgstr ""
+#: src/Content/ContactSelector.php:258
+msgid "Uncertain"
+msgstr "Incertain"
 
-#: src/Core/Installer.php:446
-msgid "Error: POSIX PHP module required but not installed."
-msgstr ""
+#: src/Content/ContactSelector.php:259
+msgid "It's complicated"
+msgstr "C'est compliqué"
 
-#: src/Core/Installer.php:452
-msgid "JSON PHP module"
-msgstr ""
+#: src/Content/ContactSelector.php:260
+msgid "Don't care"
+msgstr "S'en désintéresse"
 
-#: src/Core/Installer.php:453
-msgid "Error: JSON PHP module required but not installed."
-msgstr ""
+#: src/Content/ContactSelector.php:261
+msgid "Ask me"
+msgstr "Me demander"
 
-#: src/Core/Installer.php:459
-msgid "File Information PHP module"
-msgstr ""
+#: src/Content/Feature.php:82
+msgid "General Features"
+msgstr "Fonctions générales"
 
-#: src/Core/Installer.php:460
-msgid "Error: File Information PHP module required but not installed."
-msgstr ""
+#: src/Content/Feature.php:84
+msgid "Multiple Profiles"
+msgstr "Profils multiples"
 
-#: src/Core/Installer.php:483
-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/Feature.php:84
+msgid "Ability to create multiple profiles"
+msgstr "Possibilité de créer plusieurs profils"
 
-#: src/Core/Installer.php:484
-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/Feature.php:85
+msgid "Photo Location"
+msgstr "Lieu de prise de la photo"
 
-#: src/Core/Installer.php:485
+#: src/Content/Feature.php:85
 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 ""
+"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/Installer.php:486
-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/Feature.php:86
+msgid "Export Public Calendar"
+msgstr "Exporter le Calendrier Public"
 
-#: src/Core/Installer.php:489
-msgid "config/local.config.php is writable"
+#: 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/Content/Feature.php:87
+msgid "Trending Tags"
 msgstr ""
 
-#: src/Core/Installer.php:509
+#: src/Content/Feature.php:87
 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."
+"Show a community page widget with a list of the most popular tags in recent "
+"public posts."
+msgstr ""
 
-#: src/Core/Installer.php:510
-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/Feature.php:92
+msgid "Post Composition Features"
+msgstr "Caractéristiques de composition de publication"
 
-#: src/Core/Installer.php:511
-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/Feature.php:93
+msgid "Auto-mention Forums"
+msgstr "Mentionner automatiquement les Forums"
 
-#: src/Core/Installer.php:512
+#: src/Content/Feature.php:93
 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."
+"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/Installer.php:515
-msgid "view/smarty3 is writable"
-msgstr "view/smarty3 est autorisé à l écriture"
+#: src/Content/Feature.php:94
+msgid "Explicit Mentions"
+msgstr ""
 
-#: src/Core/Installer.php:544
+#: src/Content/Feature.php:94
 msgid ""
-"Url rewrite in .htaccess is not working. Make sure you copied .htaccess-dist"
-" to .htaccess."
+"Add explicit mentions to comment box for manual control over who gets "
+"mentioned in replies."
 msgstr ""
 
-#: src/Core/Installer.php:546
-msgid "Error message from Curl when fetching"
+#: src/Content/Feature.php:99
+msgid "Network Sidebar"
 msgstr ""
 
-#: src/Core/Installer.php:551
-msgid "Url rewrite is working"
-msgstr "La réécriture d'URL fonctionne."
-
-#: src/Core/Installer.php:580
-msgid "ImageMagick PHP extension is not installed"
-msgstr "L'extension PHP ImageMagick n'est pas installée"
+#: src/Content/Feature.php:100 src/Content/Widget.php:501
+msgid "Archives"
+msgstr "Archives"
 
-#: src/Core/Installer.php:582
-msgid "ImageMagick PHP extension is installed"
-msgstr "L’extension PHP ImageMagick est installée"
+#: src/Content/Feature.php:100
+msgid "Ability to select posts by date ranges"
+msgstr "Capacité de sélectionner les publications par intervalles de dates"
 
-#: src/Core/Installer.php:584 tests/src/Core/InstallerTest.php:347
-#: tests/src/Core/InstallerTest.php:373
-msgid "ImageMagick supports GIF"
-msgstr "ImageMagick supporte le format GIF"
+#: src/Content/Feature.php:101
+msgid "Protocol Filter"
+msgstr ""
 
-#: src/Core/Installer.php:609
-msgid "Could not connect to database."
-msgstr "Impossible de se connecter à la base."
+#: src/Content/Feature.php:101
+msgid "Enable widget to display Network posts only from selected protocols"
+msgstr ""
 
-#: src/Core/Installer.php:616
-msgid "Database already in use."
-msgstr "Base de données déjà en cours d'utilisation."
+#: src/Content/Feature.php:106
+msgid "Network Tabs"
+msgstr "Onglets Réseau"
 
-#: src/Core/L10n.php:371 src/Model/Event.php:397
-msgid "Tuesday"
-msgstr "Mardi"
+#: src/Content/Feature.php:107
+msgid "Network New Tab"
+msgstr "Nouvel onglet réseaux"
 
-#: src/Core/L10n.php:371 src/Model/Event.php:398
-msgid "Wednesday"
-msgstr "Mercredi"
+#: src/Content/Feature.php:107
+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/L10n.php:371 src/Model/Event.php:399
-msgid "Thursday"
-msgstr "Jeudi"
+#: src/Content/Feature.php:108
+msgid "Network Shared Links Tab"
+msgstr "Onglet réseau partagé"
 
-#: src/Core/L10n.php:371 src/Model/Event.php:400
-msgid "Friday"
-msgstr "Vendredi"
+#: src/Content/Feature.php:108
+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/L10n.php:371 src/Model/Event.php:401
-msgid "Saturday"
-msgstr "Samedi"
+#: src/Content/Feature.php:113
+msgid "Post/Comment Tools"
+msgstr "Outils de publication/commentaire"
 
-#: src/Core/L10n.php:375 src/Model/Event.php:416
-msgid "January"
-msgstr "Janvier"
+#: src/Content/Feature.php:114
+msgid "Post Categories"
+msgstr "Catégories des publications"
 
-#: src/Core/L10n.php:375 src/Model/Event.php:417
-msgid "February"
-msgstr "Février"
+#: src/Content/Feature.php:114
+msgid "Add categories to your posts"
+msgstr "Ajouter des catégories à vos publications"
 
-#: src/Core/L10n.php:375 src/Model/Event.php:418
-msgid "March"
-msgstr "Mars"
+#: src/Content/Feature.php:119
+msgid "Advanced Profile Settings"
+msgstr "Paramètres Avancés du Profil"
 
-#: src/Core/L10n.php:375 src/Model/Event.php:419
-msgid "April"
-msgstr "Avril"
+#: src/Content/Feature.php:120
+msgid "List Forums"
+msgstr "Liste des forums"
 
-#: src/Core/L10n.php:375 src/Core/L10n.php:394 src/Model/Event.php:407
-msgid "May"
-msgstr "Mai"
+#: src/Content/Feature.php:120
+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/L10n.php:375 src/Model/Event.php:420
-msgid "June"
-msgstr "Juin"
+#: src/Content/Feature.php:121
+msgid "Tag Cloud"
+msgstr ""
 
-#: src/Core/L10n.php:375 src/Model/Event.php:421
-msgid "July"
-msgstr "Juillet"
+#: src/Content/Feature.php:121
+msgid "Provide a personal tag cloud on your profile page"
+msgstr ""
 
-#: src/Core/L10n.php:375 src/Model/Event.php:422
-msgid "August"
-msgstr "Août"
+#: src/Content/Feature.php:122
+msgid "Display Membership Date"
+msgstr ""
 
-#: src/Core/L10n.php:375 src/Model/Event.php:423
-msgid "September"
-msgstr "Septembre"
+#: src/Content/Feature.php:122
+msgid "Display membership date in profile"
+msgstr ""
 
-#: src/Core/L10n.php:375 src/Model/Event.php:424
-msgid "October"
-msgstr "Octobre"
+#: src/Content/Nav.php:74
+msgid "Nothing new here"
+msgstr "Rien de neuf ici"
 
-#: src/Core/L10n.php:375 src/Model/Event.php:425
-msgid "November"
-msgstr "Novembre"
+#: src/Content/Nav.php:78
+msgid "Clear notifications"
+msgstr "Effacer les notifications"
 
-#: src/Core/L10n.php:375 src/Model/Event.php:426
-msgid "December"
-msgstr "Décembre"
+#: src/Content/Nav.php:153 src/Module/Login.php:315
+msgid "Logout"
+msgstr "Se déconnecter"
 
-#: src/Core/L10n.php:390 src/Model/Event.php:388
-msgid "Mon"
-msgstr "Lun"
+#: src/Content/Nav.php:153
+msgid "End this session"
+msgstr "Mettre fin à cette session"
 
-#: src/Core/L10n.php:390 src/Model/Event.php:389
-msgid "Tue"
-msgstr "Mar"
+#: src/Content/Nav.php:155 src/Module/Bookmarklet.php:25
+#: src/Module/Login.php:316
+msgid "Login"
+msgstr "Connexion"
 
-#: src/Core/L10n.php:390 src/Model/Event.php:390
-msgid "Wed"
-msgstr "Mer"
+#: src/Content/Nav.php:155
+msgid "Sign in"
+msgstr "Se connecter"
 
-#: src/Core/L10n.php:390 src/Model/Event.php:391
-msgid "Thu"
-msgstr "Jeu"
+#: src/Content/Nav.php:165
+msgid "Personal notes"
+msgstr "Notes personnelles"
 
-#: src/Core/L10n.php:390 src/Model/Event.php:392
-msgid "Fri"
-msgstr "Ven"
+#: src/Content/Nav.php:165
+msgid "Your personal notes"
+msgstr "Vos notes personnelles"
 
-#: src/Core/L10n.php:390 src/Model/Event.php:393
-msgid "Sat"
-msgstr "Sam"
+#: src/Content/Nav.php:182
+msgid "Home Page"
+msgstr "Page d'accueil"
 
-#: src/Core/L10n.php:390 src/Model/Event.php:387
-msgid "Sun"
-msgstr "Dim"
+#: src/Content/Nav.php:186 src/Module/Login.php:287
+#: src/Module/Register.php:136
+msgid "Register"
+msgstr "S'inscrire"
 
-#: src/Core/L10n.php:394 src/Model/Event.php:403
-msgid "Jan"
-msgstr "Jan"
+#: src/Content/Nav.php:186
+msgid "Create an account"
+msgstr "Créer un compte"
 
-#: src/Core/L10n.php:394 src/Model/Event.php:404
-msgid "Feb"
-msgstr "Fév"
+#: src/Content/Nav.php:192
+msgid "Help and documentation"
+msgstr "Aide et documentation"
 
-#: src/Core/L10n.php:394 src/Model/Event.php:405
-msgid "Mar"
-msgstr "Mar"
+#: src/Content/Nav.php:196
+msgid "Apps"
+msgstr "Applications"
 
-#: src/Core/L10n.php:394 src/Model/Event.php:406
-msgid "Apr"
-msgstr "Avr"
+#: src/Content/Nav.php:196
+msgid "Addon applications, utilities, games"
+msgstr "Applications supplémentaires, utilitaires, jeux"
 
-#: src/Core/L10n.php:394 src/Model/Event.php:409
-msgid "Jul"
-msgstr "Jul"
+#: src/Content/Nav.php:200
+msgid "Search site content"
+msgstr "Rechercher dans le contenu du site"
 
-#: src/Core/L10n.php:394 src/Model/Event.php:410
-msgid "Aug"
-msgstr "Aoû"
+#: src/Content/Nav.php:224
+msgid "Community"
+msgstr "Communauté"
 
-#: src/Core/L10n.php:394
-msgid "Sep"
+#: src/Content/Nav.php:224
+msgid "Conversations on this and other servers"
 msgstr ""
 
-#: src/Core/L10n.php:394 src/Model/Event.php:412
-msgid "Oct"
-msgstr "Oct"
-
-#: src/Core/L10n.php:394 src/Model/Event.php:413
-msgid "Nov"
-msgstr "Nov"
-
-#: src/Core/L10n.php:394 src/Model/Event.php:414
-msgid "Dec"
-msgstr "Déc"
-
-#: src/Core/L10n.php:413
-msgid "poke"
-msgstr "titiller"
-
-#: src/Core/L10n.php:413
-msgid "poked"
-msgstr "a titillé"
+#: src/Content/Nav.php:231
+msgid "Directory"
+msgstr "Annuaire"
 
-#: src/Core/L10n.php:414
-msgid "ping"
-msgstr "attirer l'attention"
+#: src/Content/Nav.php:231
+msgid "People directory"
+msgstr "Annuaire des utilisateurs"
 
-#: src/Core/L10n.php:414
-msgid "pinged"
-msgstr "a attiré l'attention de"
+#: src/Content/Nav.php:233 src/Module/BaseAdminModule.php:75
+msgid "Information"
+msgstr "Information"
 
-#: src/Core/L10n.php:415
-msgid "prod"
-msgstr "aiguillonner"
+#: src/Content/Nav.php:233
+msgid "Information about this friendica instance"
+msgstr "Information au sujet de cette instance de friendica"
 
-#: src/Core/L10n.php:415
-msgid "prodded"
-msgstr "a aiguillonné"
+#: src/Content/Nav.php:236 src/Module/Tos.php:73 src/Module/Admin/Tos.php:43
+#: src/Module/BaseAdminModule.php:85 src/Module/Register.php:144
+msgid "Terms of Service"
+msgstr "Conditions de service"
 
-#: src/Core/L10n.php:416
-msgid "slap"
-msgstr "gifler"
+#: src/Content/Nav.php:236
+msgid "Terms of Service of this Friendica instance"
+msgstr ""
 
-#: src/Core/L10n.php:416
-msgid "slapped"
-msgstr "a giflé"
+#: src/Content/Nav.php:242
+msgid "Network Reset"
+msgstr "Réinitialiser le réseau"
 
-#: src/Core/L10n.php:417
-msgid "finger"
-msgstr "tripoter"
+#: src/Content/Nav.php:242
+msgid "Load Network page with no filters"
+msgstr "Chargement des pages du réseau sans filtre"
 
-#: src/Core/L10n.php:417
-msgid "fingered"
-msgstr "a tripoté"
+#: src/Content/Nav.php:248
+msgid "Friend Requests"
+msgstr "Demande d'amitié"
 
-#: src/Core/L10n.php:418
-msgid "rebuff"
-msgstr "rabrouer"
+#: src/Content/Nav.php:250
+msgid "See all notifications"
+msgstr "Voir toutes les notifications"
 
-#: src/Core/L10n.php:418
-msgid "rebuffed"
-msgstr "a rabroué"
+#: src/Content/Nav.php:251
+msgid "Mark all system notifications seen"
+msgstr "Marquer toutes les notifications système comme 'vues'"
 
-#: src/Core/NotificationsManager.php:144
-msgid "System"
-msgstr "Système"
+#: src/Content/Nav.php:255
+msgid "Inbox"
+msgstr "Messages entrants"
 
-#: src/Core/NotificationsManager.php:234 src/Core/NotificationsManager.php:246
-#, php-format
-msgid "%s commented on %s's post"
-msgstr "%s a commenté la publication de %s"
+#: src/Content/Nav.php:256
+msgid "Outbox"
+msgstr "Messages sortants"
 
-#: src/Core/NotificationsManager.php:245
-#, php-format
-msgid "%s created a new post"
-msgstr "%s a créé une nouvelle publication"
+#: src/Content/Nav.php:260
+msgid "Manage"
+msgstr "Gérer"
 
-#: src/Core/NotificationsManager.php:259
-#, php-format
-msgid "%s liked %s's post"
-msgstr "%s a aimé la publication de %s"
+#: src/Content/Nav.php:260
+msgid "Manage other pages"
+msgstr "Gérer les autres pages"
 
-#: src/Core/NotificationsManager.php:272
-#, php-format
-msgid "%s disliked %s's post"
-msgstr "%s n'a pas aimé la publication de %s"
+#: src/Content/Nav.php:268
+msgid "Manage/Edit Profiles"
+msgstr "Gérer/Éditer les profiles"
 
-#: src/Core/NotificationsManager.php:285
-#, php-format
-msgid "%s is attending %s's event"
-msgstr "%s participe à l'événement de %s"
+#: src/Content/Nav.php:276 src/Module/BaseAdminModule.php:114
+msgid "Admin"
+msgstr "Admin"
 
-#: src/Core/NotificationsManager.php:298
-#, php-format
-msgid "%s is not attending %s's event"
-msgstr "%s ne participe pas à l'événement de %s"
+#: src/Content/Nav.php:276
+msgid "Site setup and configuration"
+msgstr "Démarrage et configuration du site"
 
-#: src/Core/NotificationsManager.php:311
-#, php-format
-msgid "%s may attend %s's event"
-msgstr "%s participera peut-être à l'événement de %s"
+#: src/Content/Nav.php:279
+msgid "Navigation"
+msgstr "Navigation"
 
-#: src/Core/NotificationsManager.php:344
-#, php-format
-msgid "%s is now friends with %s"
-msgstr "%s est désormais ami(e) avec %s"
+#: src/Content/Nav.php:279
+msgid "Site map"
+msgstr "Carte du site"
 
-#: src/Core/NotificationsManager.php:622
-msgid "Friend Suggestion"
-msgstr "Suggestion d'amitié/contact"
+#: src/Content/OEmbed.php:254
+msgid "Embedding disabled"
+msgstr "Incorporation désactivée"
 
-#: src/Core/NotificationsManager.php:656
-msgid "Friend/Connect Request"
-msgstr "Demande de connexion/relation"
+#: src/Content/OEmbed.php:377
+msgid "Embedded content"
+msgstr "Contenu incorporé"
 
-#: src/Core/NotificationsManager.php:656
-msgid "New Follower"
-msgstr "Nouvel abonné"
+#: src/Content/Widget.php:38
+msgid "Add New Contact"
+msgstr "Ajouter un nouveau contact"
 
-#: src/Core/Session.php:194
-#, php-format
-msgid "Welcome %s"
-msgstr ""
+#: src/Content/Widget.php:39
+msgid "Enter address or web location"
+msgstr "Entrez son adresse ou sa localisation web"
 
-#: src/Core/Session.php:195
-msgid "Please upload a profile photo."
-msgstr "Merci d'illustrer votre profil d'une image."
+#: src/Content/Widget.php:40
+msgid "Example: bob@example.com, http://example.com/barbara"
+msgstr "Exemple : bob@example.com, http://example.com/barbara"
 
-#: src/Core/Session.php:198
+#: src/Content/Widget.php:58
 #, php-format
-msgid "Welcome back %s"
+msgid "%d invitation available"
+msgid_plural "%d invitations available"
+msgstr[0] "%d invitation disponible"
+msgstr[1] "%d invitations disponibles"
+
+#: src/Content/Widget.php:193 src/Module/Contact.php:798
+#: src/Module/Profile/Contacts.php:127
+msgid "Following"
 msgstr ""
 
-#: src/Core/Update.php:193
-#, php-format
-msgid "Update %s failed. See error logs."
-msgstr "Mise-à-jour %s échouée. Voir les journaux d'erreur."
+#: src/Content/Widget.php:194 src/Module/Contact.php:799
+#: src/Module/Profile/Contacts.php:128
+msgid "Mutual friends"
+msgstr ""
 
-#: src/Core/Update.php:257
-#, 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."
+#: src/Content/Widget.php:199
+msgid "Relationships"
 msgstr ""
 
-#: src/Core/Update.php:263
-#, php-format
-msgid ""
-"The error message is\n"
-"[pre]%s[/pre]"
-msgstr "Le message d’erreur est\n[pre]%s[/pre]"
+#: src/Content/Widget.php:201 src/Module/Contact.php:694
+#: src/Module/Group.php:287
+msgid "All Contacts"
+msgstr "Tous les contacts"
 
-#: src/Core/Update.php:269 src/Core/Update.php:308
-msgid "[Friendica Notify] Database update"
+#: src/Content/Widget.php:244
+msgid "Protocols"
 msgstr ""
 
-#: src/Core/Update.php:300
-#, php-format
-msgid ""
-"\n"
-"\t\t\t\t\tThe friendica database was successfully updated from %s to %s."
+#: src/Content/Widget.php:246
+msgid "All Protocols"
 msgstr ""
 
-#: src/Core/UserImport.php:99
-msgid "Error decoding account file"
-msgstr "Une erreur a été détecté en décodant un fichier utilisateur"
-
-#: src/Core/UserImport.php:105
-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/UserImport.php:113
-#, php-format
-msgid "User '%s' already exists on this server!"
-msgstr "L'utilisateur '%s' existe déjà sur ce serveur!"
+#: src/Content/Widget.php:279
+msgid "Saved Folders"
+msgstr "Dossiers sauvegardés"
 
-#: src/Core/UserImport.php:149
-msgid "User creation error"
-msgstr "Erreur de création d'utilisateur"
+#: src/Content/Widget.php:281 src/Content/Widget.php:320
+msgid "Everything"
+msgstr "Tout"
 
-#: src/Core/UserImport.php:167
-msgid "User profile creation error"
-msgstr "Erreur de création du profil utilisateur"
+#: src/Content/Widget.php:318
+msgid "Categories"
+msgstr "Catégories"
 
-#: src/Core/UserImport.php:211
+#: src/Content/Widget.php:402
 #, 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:276
-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"
+msgid "%d contact in common"
+msgid_plural "%d contacts in common"
+msgstr[0] "%d contact en commun"
+msgstr[1] "%d contacts en commun"
 
-#: src/Database/DBStructure.php:47
+#: src/Database/DBStructure.php:50
 msgid "There are no tables on MyISAM."
 msgstr ""
 
-#: src/Database/DBStructure.php:71
+#: src/Database/DBStructure.php:74
 #, php-format
 msgid ""
 "\n"
@@ -5958,99 +6065,130 @@ msgid ""
 "%s\n"
 msgstr "\nErreur %d survenue durant la mise à jour de la base de données :\n%s\n"
 
-#: src/Database/DBStructure.php:74
+#: src/Database/DBStructure.php:77
 msgid "Errors encountered performing database changes: "
 msgstr ""
 
-#: src/Database/DBStructure.php:263
+#: src/Database/DBStructure.php:266
 #, php-format
 msgid "%s: Database update"
 msgstr ""
 
-#: src/Database/DBStructure.php:524
+#: src/Database/DBStructure.php:527
 #, php-format
 msgid "%s: updating %s table."
 msgstr ""
 
-#: src/LegacyModule.php:30
+#: src/Model/Storage/Filesystem.php:63
 #, php-format
-msgid "Legacy module file not found: %s"
+msgid "Filesystem storage failed to create \"%s\". Check you write permissions."
+msgstr ""
+
+#: src/Model/Storage/Filesystem.php:105
+#, php-format
+msgid ""
+"Filesystem storage failed to save data to \"%s\". Check your write "
+"permissions"
+msgstr ""
+
+#: src/Model/Storage/Filesystem.php:126
+msgid "Storage base path"
+msgstr ""
+
+#: 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/Storage/Filesystem.php:138
+msgid "Enter a valid existing folder"
+msgstr ""
+
+#: src/Model/Storage/Database.php:36
+#, php-format
+msgid "Database storage failed to update %s"
 msgstr ""
 
-#: src/Model/Contact.php:1116
+#: src/Model/Storage/Database.php:43
+msgid "Database storage failed to insert data"
+msgstr ""
+
+#: src/Model/Contact.php:1203
 msgid "Drop Contact"
 msgstr "Supprimer le contact"
 
-#: src/Model/Contact.php:1651
+#: src/Model/Contact.php:1705
 msgid "Organisation"
 msgstr ""
 
-#: src/Model/Contact.php:1655
+#: src/Model/Contact.php:1709
 msgid "News"
 msgstr "Nouvelles"
 
-#: src/Model/Contact.php:1659
+#: src/Model/Contact.php:1713
 msgid "Forum"
 msgstr "Forum"
 
-#: src/Model/Contact.php:1888
+#: src/Model/Contact.php:2109
 msgid "Connect URL missing."
 msgstr "URL de connexion manquante."
 
-#: src/Model/Contact.php:1897
+#: src/Model/Contact.php:2118
 msgid ""
 "The contact could not be added. Please check the relevant network "
 "credentials in your Settings -> Social Networks page."
 msgstr ""
 
-#: src/Model/Contact.php:1938
+#: src/Model/Contact.php:2159
 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/Contact.php:1939 src/Model/Contact.php:1952
+#: src/Model/Contact.php:2160 src/Model/Contact.php:2173
 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/Contact.php:1950
+#: src/Model/Contact.php:2171
 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/Contact.php:1955
+#: src/Model/Contact.php:2176
 msgid "An author or name was not found."
 msgstr "Aucun auteur ou nom d'auteur n'a pu être trouvé."
 
-#: src/Model/Contact.php:1958
+#: src/Model/Contact.php:2179
 msgid "No browser URL could be matched to this address."
 msgstr "Aucune URL de navigation ne correspond à cette adresse."
 
-#: src/Model/Contact.php:1961
+#: src/Model/Contact.php:2182
 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/Contact.php:1962
+#: src/Model/Contact.php:2183
 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/Contact.php:1968
+#: src/Model/Contact.php:2189
 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/Contact.php:1973
+#: src/Model/Contact.php:2194
 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/Contact.php:2027
+#: src/Model/Contact.php:2249
 msgid "Unable to retrieve contact information."
 msgstr "Impossible de récupérer les informations du contact."
 
-#: src/Model/Event.php:34 src/Model/Event.php:847 src/Module/Localtime.php:17
+#: src/Model/Event.php:34 src/Model/Event.php:847
+#: src/Module/Debug/Localtime.php:17
 msgid "l F d, Y \\@ g:i A"
 msgstr "l F d, Y \\@ g:i A"
 
@@ -6068,10 +6206,6 @@ msgstr "Finit :"
 msgid "all-day"
 msgstr "toute la journée"
 
-#: src/Model/Event.php:408
-msgid "Jun"
-msgstr "Jun"
-
 #: src/Model/Event.php:411
 msgid "Sept"
 msgstr "Sep"
@@ -6096,7 +6230,7 @@ msgstr "Dupliquer l'événement"
 msgid "Delete event"
 msgstr "Supprimer l'événement"
 
-#: src/Model/Event.php:626 src/Model/Item.php:3522 src/Model/Item.php:3529
+#: src/Model/Event.php:626 src/Model/Item.php:3569 src/Model/Item.php:3576
 msgid "link to source"
 msgstr "lien original"
 
@@ -6126,397 +6260,363 @@ msgstr "Anniversaire de %s's"
 msgid "Happy Birthday %s"
 msgstr "Joyeux anniversaire, %s !"
 
-#: src/Model/FileTag.php:256
+#: src/Model/FileTag.php:265
 msgid "Item filed"
 msgstr "Élément classé"
 
-#: src/Model/Group.php:63
+#: src/Model/Group.php:77
 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/Group.php:358
+#: src/Model/Group.php:407
 msgid "Default privacy group for new contacts"
 msgstr "Paramètres de confidentialité par défaut pour les nouveaux contacts"
 
-#: src/Model/Group.php:390
+#: src/Model/Group.php:439
 msgid "Everybody"
 msgstr "Tout le monde"
 
-#: src/Model/Group.php:410
+#: src/Model/Group.php:458
 msgid "edit"
 msgstr "éditer"
 
-#: src/Model/Group.php:439
+#: src/Model/Group.php:484 src/Module/Contact.php:734
+#: src/Module/Welcome.php:57
+msgid "Groups"
+msgstr "Groupes"
+
+#: src/Model/Group.php:488
 msgid "Edit group"
 msgstr "Editer groupe"
 
-#: src/Model/Group.php:440 src/Module/Group.php:186
+#: src/Model/Group.php:489 src/Module/Group.php:186
 msgid "Contacts not in any group"
 msgstr "Contacts n'appartenant à aucun groupe"
 
-#: src/Model/Group.php:442
+#: src/Model/Group.php:491
 msgid "Create a new group"
 msgstr "Créer un nouveau groupe"
 
-#: src/Model/Group.php:443 src/Module/Group.php:171 src/Module/Group.php:194
+#: src/Model/Group.php:492 src/Module/Group.php:171 src/Module/Group.php:194
 #: src/Module/Group.php:271
 msgid "Group Name: "
 msgstr "Nom du groupe : "
 
-#: src/Model/Group.php:444
+#: src/Model/Group.php:493
 msgid "Edit groups"
 msgstr "Modifier les groupes"
 
-#: src/Model/Item.php:3257
+#: src/Model/Item.php:3304
 msgid "activity"
 msgstr "activité"
 
-#: src/Model/Item.php:3259 src/Object/Post.php:472
+#: src/Model/Item.php:3306 src/Object/Post.php:473
 msgid "comment"
 msgid_plural "comments"
 msgstr[0] ""
 msgstr[1] "commentaire"
 
-#: src/Model/Item.php:3262
+#: src/Model/Item.php:3309
 msgid "post"
 msgstr "publication"
 
-#: src/Model/Item.php:3361
+#: src/Model/Item.php:3408
 #, php-format
 msgid "Content warning: %s"
 msgstr "Avertissement de contenu: %s"
 
-#: src/Model/Item.php:3438
+#: src/Model/Item.php:3485
 msgid "bytes"
 msgstr "octets"
 
-#: src/Model/Item.php:3516
+#: src/Model/Item.php:3563
 msgid "View on separate page"
 msgstr "Voir dans une nouvelle page"
 
-#: src/Model/Item.php:3517
+#: src/Model/Item.php:3564
 msgid "view on separate page"
 msgstr "voir dans une nouvelle page"
 
-#: src/Model/Mail.php:109 src/Model/Mail.php:244
+#: src/Model/Mail.php:112 src/Model/Mail.php:247
 msgid "[no subject]"
 msgstr "[pas de sujet]"
 
-#: src/Model/Profile.php:177 src/Model/Profile.php:421
-#: src/Model/Profile.php:866
+#: src/Model/Profile.php:212 src/Model/Profile.php:428
+#: src/Model/Profile.php:877
 msgid "Edit profile"
 msgstr "Editer le profil"
 
-#: src/Model/Profile.php:355
-msgid "Atom feed"
-msgstr "Flux Atom"
-
-#: src/Model/Profile.php:394
+#: src/Model/Profile.php:402
 msgid "Manage/edit profiles"
 msgstr "Gérer/éditer les profils"
 
-#: src/Model/Profile.php:443 src/Model/Profile.php:776
-#: src/Module/Directory.php:148
+#: src/Model/Profile.php:451 src/Model/Profile.php:787
+#: src/Module/Directory.php:143
 msgid "Status:"
 msgstr "Statut :"
 
-#: src/Model/Profile.php:444 src/Model/Profile.php:793
-#: src/Module/Directory.php:149
+#: src/Model/Profile.php:452 src/Model/Profile.php:804
+#: src/Module/Directory.php:144
 msgid "Homepage:"
 msgstr "Page personnelle :"
 
-#: src/Model/Profile.php:446 src/Module/Contact.php:648
+#: src/Model/Profile.php:454 src/Module/Contact.php:647
 msgid "XMPP:"
 msgstr "XMPP"
 
-#: src/Model/Profile.php:569 src/Model/Profile.php:666
+#: src/Model/Profile.php:538 src/Module/Contact.php:337
+msgid "Unfollow"
+msgstr ""
+
+#: src/Model/Profile.php:540
+msgid "Atom feed"
+msgstr "Flux Atom"
+
+#: src/Model/Profile.php:580 src/Model/Profile.php:677
 msgid "g A l F d"
 msgstr "g A | F d"
 
-#: src/Model/Profile.php:570
+#: src/Model/Profile.php:581
 msgid "F d"
 msgstr "F d"
 
-#: src/Model/Profile.php:632 src/Model/Profile.php:717
+#: src/Model/Profile.php:643 src/Model/Profile.php:728
 msgid "[today]"
 msgstr "[aujourd'hui]"
 
-#: src/Model/Profile.php:642
+#: src/Model/Profile.php:653
 msgid "Birthday Reminders"
 msgstr "Rappels d'anniversaires"
 
-#: src/Model/Profile.php:643
+#: src/Model/Profile.php:654
 msgid "Birthdays this week:"
 msgstr "Anniversaires cette semaine :"
 
-#: src/Model/Profile.php:704
+#: src/Model/Profile.php:715
 msgid "[No description]"
 msgstr "[Sans description]"
 
-#: src/Model/Profile.php:730
+#: src/Model/Profile.php:741
 msgid "Event Reminders"
 msgstr "Rappels d'événements"
 
-#: src/Model/Profile.php:731
+#: src/Model/Profile.php:742
 msgid "Upcoming events the next 7 days:"
 msgstr ""
 
-#: src/Model/Profile.php:748
+#: src/Model/Profile.php:759
 msgid "Member since:"
 msgstr ""
 
-#: src/Model/Profile.php:756
+#: src/Model/Profile.php:767
 msgid "j F, Y"
 msgstr "j F, Y"
 
-#: src/Model/Profile.php:757
+#: src/Model/Profile.php:768
 msgid "j F"
 msgstr "j F"
 
-#: src/Model/Profile.php:765 src/Util/Temporal.php:147
-msgid "Birthday:"
-msgstr "Anniversaire :"
-
-#: src/Model/Profile.php:772
+#: src/Model/Profile.php:783
 msgid "Age:"
 msgstr "Age :"
 
-#: src/Model/Profile.php:785
+#: src/Model/Profile.php:796
 #, php-format
 msgid "for %1$d %2$s"
 msgstr "depuis %1$d %2$s"
 
-#: src/Model/Profile.php:809
+#: src/Model/Profile.php:820
 msgid "Religion:"
 msgstr "Religion :"
 
-#: src/Model/Profile.php:817
+#: src/Model/Profile.php:828
 msgid "Hobbies/Interests:"
 msgstr "Passe-temps/Centres d'intérêt :"
 
-#: src/Model/Profile.php:829
+#: src/Model/Profile.php:840
 msgid "Contact information and Social Networks:"
 msgstr "Coordonnées/Réseaux sociaux :"
 
-#: src/Model/Profile.php:833
+#: src/Model/Profile.php:844
 msgid "Musical interests:"
 msgstr "Goûts musicaux :"
 
-#: src/Model/Profile.php:837
+#: src/Model/Profile.php:848
 msgid "Books, literature:"
 msgstr "Lectures :"
 
-#: src/Model/Profile.php:841
+#: src/Model/Profile.php:852
 msgid "Television:"
 msgstr "Télévision :"
 
-#: src/Model/Profile.php:845
+#: src/Model/Profile.php:856
 msgid "Film/dance/culture/entertainment:"
 msgstr "Cinéma/Danse/Culture/Divertissement :"
 
-#: src/Model/Profile.php:849
+#: src/Model/Profile.php:860
 msgid "Love/Romance:"
 msgstr "Amour/Romance :"
 
-#: src/Model/Profile.php:853
+#: src/Model/Profile.php:864
 msgid "Work/employment:"
 msgstr "Activité professionnelle/Occupation :"
 
-#: src/Model/Profile.php:857
+#: src/Model/Profile.php:868
 msgid "School/education:"
 msgstr "Études/Formation :"
 
-#: src/Model/Profile.php:862
+#: src/Model/Profile.php:873
 msgid "Forums:"
 msgstr "Forums :"
 
-#: src/Model/Profile.php:906 src/Module/Contact.php:875
+#: src/Model/Profile.php:920 src/Module/Contact.php:875
 msgid "Profile Details"
 msgstr "Détails du profil"
 
-#: src/Model/Profile.php:956
+#: src/Model/Profile.php:970
 msgid "Only You Can See This"
 msgstr "Vous seul pouvez voir ça"
 
-#: src/Model/Profile.php:964 src/Model/Profile.php:967
+#: src/Model/Profile.php:978 src/Model/Profile.php:981
 msgid "Tips for New Members"
 msgstr "Conseils aux nouveaux venus"
 
-#: src/Model/Profile.php:1167
+#: src/Model/Profile.php:1178
 #, php-format
 msgid "OpenWebAuth: %1$s welcomes %2$s"
 msgstr ""
 
-#: src/Model/Storage/Database.php:36
-#, php-format
-msgid "Database storage failed to update %s"
-msgstr ""
-
-#: src/Model/Storage/Database.php:43
-msgid "Database storage failed to insert data"
-msgstr ""
-
-#: src/Model/Storage/Filesystem.php:63
-#, php-format
-msgid "Filesystem storage failed to create \"%s\". Check you write permissions."
-msgstr ""
-
-#: src/Model/Storage/Filesystem.php:105
-#, php-format
-msgid ""
-"Filesystem storage failed to save data to \"%s\". Check your write "
-"permissions"
-msgstr ""
-
-#: src/Model/Storage/Filesystem.php:126
-msgid "Storage base path"
-msgstr ""
-
-#: 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/Storage/Filesystem.php:138
-msgid "Enter a valid existing folder"
-msgstr ""
-
-#: src/Model/User.php:298
+#: src/Model/User.php:331
 msgid "Login failed"
 msgstr ""
 
-#: src/Model/User.php:329
+#: src/Model/User.php:362
 msgid "Not enough information to authenticate"
 msgstr ""
 
-#: src/Model/User.php:407
+#: src/Model/User.php:440
 msgid "Password can't be empty"
 msgstr ""
 
-#: src/Model/User.php:426
+#: src/Model/User.php:459
 msgid "Empty passwords are not allowed."
 msgstr ""
 
-#: src/Model/User.php:430
+#: src/Model/User.php:463
 msgid ""
 "The new password has been exposed in a public data dump, please choose "
 "another."
 msgstr ""
 
-#: src/Model/User.php:436
+#: src/Model/User.php:469
 msgid ""
 "The password can't contain accentuated letters, white spaces or colons (:)"
 msgstr ""
 
-#: src/Model/User.php:536
+#: src/Model/User.php:569
 msgid "Passwords do not match. Password unchanged."
 msgstr "Les mots de passe ne correspondent pas. Aucun changement appliqué."
 
-#: src/Model/User.php:543
+#: src/Model/User.php:576
 msgid "An invitation is required."
 msgstr "Une invitation est requise."
 
-#: src/Model/User.php:547
+#: src/Model/User.php:580
 msgid "Invitation could not be verified."
 msgstr "L'invitation fournie n'a pu être validée."
 
-#: src/Model/User.php:554
+#: src/Model/User.php:587
 msgid "Invalid OpenID url"
 msgstr "Adresse OpenID invalide"
 
-#: src/Model/User.php:567 src/Module/Login.php:107
+#: src/Model/User.php:600 src/Module/Login.php:102
 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/User.php:567 src/Module/Login.php:107
+#: src/Model/User.php:600 src/Module/Login.php:102
 msgid "The error message was:"
 msgstr "Le message d'erreur était :"
 
-#: src/Model/User.php:573
+#: src/Model/User.php:606
 msgid "Please enter the required information."
 msgstr "Entrez les informations requises."
 
-#: src/Model/User.php:587
+#: src/Model/User.php:620
 #, php-format
 msgid ""
 "system.username_min_length (%s) and system.username_max_length (%s) are "
 "excluding each other, swapping values."
 msgstr ""
 
-#: src/Model/User.php:594
+#: src/Model/User.php:627
 #, php-format
 msgid "Username should be at least %s character."
 msgid_plural "Username should be at least %s characters."
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/Model/User.php:598
+#: src/Model/User.php:631
 #, php-format
 msgid "Username should be at most %s character."
 msgid_plural "Username should be at most %s characters."
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/Model/User.php:606
+#: src/Model/User.php:639
 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/User.php:611
+#: src/Model/User.php:644
 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/User.php:615
+#: src/Model/User.php:648
 msgid "Not a valid email address."
 msgstr "Ceci n'est pas une adresse courriel valide."
 
-#: src/Model/User.php:618
+#: src/Model/User.php:651
 msgid "The nickname was blocked from registration by the nodes admin."
 msgstr ""
 
-#: src/Model/User.php:622 src/Model/User.php:630
+#: src/Model/User.php:655 src/Model/User.php:663
 msgid "Cannot use that email."
 msgstr "Impossible d'utiliser ce courriel."
 
-#: src/Model/User.php:637
+#: src/Model/User.php:670
 msgid "Your nickname can only contain a-z, 0-9 and _."
 msgstr ""
 
-#: src/Model/User.php:644 src/Model/User.php:701
+#: src/Model/User.php:677 src/Model/User.php:734
 msgid "Nickname is already registered. Please choose another."
 msgstr "Pseudo déjà utilisé. Merci d'en choisir un autre."
 
-#: src/Model/User.php:654
+#: src/Model/User.php:687
 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/User.php:688 src/Model/User.php:692
+#: src/Model/User.php:721 src/Model/User.php:725
 msgid "An error occurred during registration. Please try again."
 msgstr "Une erreur est survenue lors de l'inscription. Merci de recommencer."
 
-#: src/Model/User.php:712 view/theme/duepuntozero/config.php:55
-msgid "default"
-msgstr "défaut"
-
-#: src/Model/User.php:717
+#: src/Model/User.php:750
 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/User.php:724
+#: src/Model/User.php:757
 msgid "An error occurred creating your self contact. Please try again."
 msgstr ""
 
-#: src/Model/User.php:733
+#: src/Model/User.php:766
 msgid ""
 "An error occurred creating your default contact group. Please try again."
 msgstr ""
 
-#: src/Model/User.php:809
+#: src/Model/User.php:842
 #, php-format
 msgid ""
 "\n"
@@ -6531,12 +6631,12 @@ msgid ""
 "\t\t"
 msgstr ""
 
-#: src/Model/User.php:826
+#: src/Model/User.php:859
 #, php-format
 msgid "Registration at %s"
 msgstr ""
 
-#: src/Model/User.php:845
+#: src/Model/User.php:878
 #, php-format
 msgid ""
 "\n"
@@ -6545,7 +6645,7 @@ msgid ""
 "\t\t"
 msgstr ""
 
-#: src/Model/User.php:851
+#: src/Model/User.php:884
 #, php-format
 msgid ""
 "\n"
@@ -6577,10 +6677,110 @@ msgid ""
 "\t\t\tThank you and welcome to %2$s."
 msgstr ""
 
-#: src/Model/User.php:886 src/Module/Admin/Users.php:88
+#: src/Model/User.php:919 src/Module/Admin/Users.php:88
+#, php-format
+msgid "Registration details for %s"
+msgstr "Détails d'inscription pour %s"
+
+#: src/Protocol/Diaspora.php:2495
+msgid "Sharing notification from Diaspora network"
+msgstr "Notification de partage du réseau Diaspora"
+
+#: src/Protocol/Diaspora.php:3640
+msgid "Attachments:"
+msgstr "Pièces jointes : "
+
+#: src/Protocol/OStatus.php:1300 src/Module/Profile.php:111
+#: src/Module/Profile.php:114
+#, php-format
+msgid "%s's timeline"
+msgstr ""
+
+#: src/Protocol/OStatus.php:1304 src/Module/Profile.php:112
+#, php-format
+msgid "%s's posts"
+msgstr ""
+
+#: src/Protocol/OStatus.php:1307 src/Module/Profile.php:113
+#, php-format
+msgid "%s's comments"
+msgstr ""
+
+#: src/Protocol/OStatus.php:1861
+#, php-format
+msgid "%s is now following %s."
+msgstr "%s suit désormais %s."
+
+#: src/Protocol/OStatus.php:1862
+msgid "following"
+msgstr "following"
+
+#: src/Protocol/OStatus.php:1865
+#, php-format
+msgid "%s stopped following %s."
+msgstr "%s ne suit plus %s."
+
+#: src/Protocol/OStatus.php:1866
+msgid "stopped following"
+msgstr "retiré de la liste de suivi"
+
+#: src/Worker/Delivery.php:461
+msgid "(no subject)"
+msgstr "(sans titre)"
+
+#: 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/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/Tos.php:37 src/Module/Tos.php:79
 #, php-format
-msgid "Registration details for %s"
-msgstr "Détails d'inscription pour %s"
+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/Tos.php:40 src/Module/Tos.php:76
+msgid "Privacy Statement"
+msgstr ""
+
+#: src/Module/Apps.php:29
+msgid "No installed applications."
+msgstr "Pas d'application installée."
+
+#: src/Module/Apps.php:34
+msgid "Applications"
+msgstr "Applications"
+
+#: src/Module/Credits.php:25
+msgid "Credits"
+msgstr "Remerciements"
+
+#: src/Module/Credits.php:26
+msgid ""
+"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!"
+msgstr "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!"
 
 #: src/Module/Admin/Addons/Details.php:51
 msgid "Addon not found."
@@ -6607,12 +6807,12 @@ msgid "Enable"
 msgstr "Activer"
 
 #: src/Module/Admin/Addons/Details.php:99 src/Module/Admin/Addons/Index.php:50
-#: src/Module/Admin/Blocklist/Contact.php:60
+#: src/Module/Admin/Blocklist/Contact.php:61
 #: src/Module/Admin/Blocklist/Server.php:73
-#: src/Module/Admin/Federation.php:185 src/Module/Admin/Item/Delete.php:46
-#: src/Module/Admin/Logs/Settings.php:57 src/Module/Admin/Logs/View.php:46
-#: src/Module/Admin/Queue.php:56 src/Module/Admin/Site.php:568
-#: src/Module/Admin/Summary.php:160 src/Module/Admin/Themes/Details.php:104
+#: src/Module/Admin/Federation.php:187 src/Module/Admin/Item/Delete.php:46
+#: src/Module/Admin/Logs/Settings.php:63 src/Module/Admin/Logs/View.php:46
+#: src/Module/Admin/Queue.php:56 src/Module/Admin/Site.php:567
+#: src/Module/Admin/Summary.php:175 src/Module/Admin/Themes/Details.php:104
 #: src/Module/Admin/Themes/Index.php:93 src/Module/Admin/Tos.php:42
 #: src/Module/Admin/Users.php:277
 msgid "Administration"
@@ -6650,152 +6850,180 @@ msgid ""
 " the open addon registry at %2$s"
 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."
 
-#: src/Module/Admin/Blocklist/Contact.php:37
+#: src/Module/Admin/Blocklist/Contact.php:28
+#: src/Console/GlobalCommunityBlock.php:87
+msgid "The contact has been blocked from the node"
+msgstr "Le profile distant a été bloqué"
+
+#: src/Module/Admin/Blocklist/Contact.php:30
+#: src/Console/GlobalCommunityBlock.php:82
+#, php-format
+msgid "Could not find any contact entry for this URL (%s)"
+msgstr "Aucun profil distant n'a été trouvé à cette URL (%s)"
+
+#: src/Module/Admin/Blocklist/Contact.php:38
 #, php-format
 msgid "%s contact unblocked"
 msgid_plural "%s contacts unblocked"
 msgstr[0] "%s contact débloqué"
 msgstr[1] "%s profiles distants débloqués"
 
-#: src/Module/Admin/Blocklist/Contact.php:61
+#: src/Module/Admin/Blocklist/Contact.php:62
 msgid "Remote Contact Blocklist"
 msgstr "Liste des profiles distants bloqués"
 
-#: src/Module/Admin/Blocklist/Contact.php:62
+#: src/Module/Admin/Blocklist/Contact.php:63
 msgid ""
 "This page allows you to prevent any message from a remote contact to reach "
 "your node."
 msgstr "Cette page vous permet de refuser toutes les publications d'un profile distant sur votre site."
 
-#: src/Module/Admin/Blocklist/Contact.php:63
+#: src/Module/Admin/Blocklist/Contact.php:64
 msgid "Block Remote Contact"
 msgstr "Bloquer le profile distant"
 
-#: src/Module/Admin/Blocklist/Contact.php:64 src/Module/Admin/Users.php:280
+#: src/Module/Admin/Blocklist/Contact.php:65 src/Module/Admin/Users.php:280
 msgid "select all"
 msgstr "tout sélectionner"
 
-#: src/Module/Admin/Blocklist/Contact.php:65
+#: src/Module/Admin/Blocklist/Contact.php:66
 msgid "select none"
 msgstr "Sélectionner tous"
 
-#: src/Module/Admin/Blocklist/Contact.php:67 src/Module/Admin/Users.php:291
-#: src/Module/Contact.php:624 src/Module/Contact.php:827
-#: src/Module/Contact.php:1080
+#: src/Module/Admin/Blocklist/Contact.php:68 src/Module/Admin/Users.php:291
+#: src/Module/Contact.php:623 src/Module/Contact.php:827
+#: src/Module/Contact.php:1076
 msgid "Unblock"
 msgstr "Débloquer"
 
-#: src/Module/Admin/Blocklist/Contact.php:68
+#: src/Module/Admin/Blocklist/Contact.php:69
 msgid "No remote contact is blocked from this node."
 msgstr "Aucun profil distant n'est bloqué"
 
-#: src/Module/Admin/Blocklist/Contact.php:70
+#: src/Module/Admin/Blocklist/Contact.php:71
 msgid "Blocked Remote Contacts"
 msgstr "Profils distants bloqués"
 
-#: src/Module/Admin/Blocklist/Contact.php:71
+#: src/Module/Admin/Blocklist/Contact.php:72
 msgid "Block New Remote Contact"
 msgstr "Bloquer un nouveau profil distant"
 
-#: src/Module/Admin/Blocklist/Contact.php:72
+#: src/Module/Admin/Blocklist/Contact.php:73
 msgid "Photo"
 msgstr "Photo"
 
-#: src/Module/Admin/Blocklist/Contact.php:80
+#: src/Module/Admin/Blocklist/Contact.php:73
+msgid "Reason"
+msgstr ""
+
+#: src/Module/Admin/Blocklist/Contact.php:81
 #, php-format
 msgid "%s total blocked contact"
 msgid_plural "%s total blocked contacts"
 msgstr[0] "%s profil distant bloqué"
 msgstr[1] "%s profils distans bloqués"
 
-#: src/Module/Admin/Blocklist/Contact.php:82
+#: src/Module/Admin/Blocklist/Contact.php:83
 msgid "URL of the remote contact to block."
 msgstr "URL du profil distant à bloquer."
 
+#: src/Module/Admin/Blocklist/Contact.php:84
+msgid "Block Reason"
+msgstr ""
+
 #: src/Module/Admin/Blocklist/Server.php:31
-msgid "Server added to blocklist."
-msgstr "Serveur ajouté à la liste noire."
+msgid "Server domain pattern added to blocklist."
+msgstr ""
 
 #: src/Module/Admin/Blocklist/Server.php:47
 msgid "Site blocklist updated."
 msgstr "Liste noire mise à jour."
 
 #: src/Module/Admin/Blocklist/Server.php:64
-msgid "The blocked domain"
-msgstr "Domaine bloqué"
+#: src/Module/Admin/Blocklist/Server.php:89
+msgid "Blocked server domain pattern"
+msgstr ""
 
 #: src/Module/Admin/Blocklist/Server.php:65
-#: src/Module/Admin/Blocklist/Server.php:84 src/Module/Friendica.php:60
+#: src/Module/Admin/Blocklist/Server.php:90 src/Module/Friendica.php:60
 msgid "Reason for the block"
 msgstr "Raison du blocage."
 
-#: src/Module/Admin/Blocklist/Server.php:65
-#: src/Module/Admin/Blocklist/Server.php:79
-msgid "The reason why you blocked this domain."
-msgstr "Raison pour laquelle vous souhaitez bloquer ce domaine."
-
 #: src/Module/Admin/Blocklist/Server.php:66
-msgid "Delete domain"
-msgstr "Supprimer le domaine."
+msgid "Delete server domain pattern"
+msgstr ""
 
 #: src/Module/Admin/Blocklist/Server.php:66
 msgid "Check to delete this entry from the blocklist"
 msgstr "Cochez la case pour retirer cette entrée de la liste noire"
 
-#: src/Module/Admin/Blocklist/Server.php:74 src/Module/BaseAdminModule.php:94
-msgid "Server Blocklist"
-msgstr "Serveurs bloqués"
+#: src/Module/Admin/Blocklist/Server.php:74
+msgid "Server Domain Pattern Blocklist"
+msgstr ""
 
 #: src/Module/Admin/Blocklist/Server.php:75
 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 "
-"domains you should also give a reason why you have blocked the remote "
-"server."
-msgstr "Cette page permet de créer une liste noire des serveurs de la fédération qui ne sont pas autorisés à interagir avec votre serveur. Pour chaque serveur bloqué, vous devez fournir la raison du blocage."
+"This page can be used to define a blacklist of server domain patterns from "
+"the federated network that are not allowed to interact with your node. For "
+"each domain pattern you should also provide the reason why you block it."
+msgstr ""
 
 #: src/Module/Admin/Blocklist/Server.php:76
 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 "La liste des serveurs bloqués sera publiée sur la page /friendica pour que les utilisateurs rencontrant des problèmes de communication puissent en comprendre la raison."
+"The list of blocked server domain patterns will be made publically available"
+" on the <a href=\"/friendica\">/friendica</a> page so that your users and "
+"people investigating communication problems can find the reason easily."
+msgstr ""
 
 #: src/Module/Admin/Blocklist/Server.php:77
+msgid ""
+"<p>The server domain pattern syntax is case-insensitive shell wildcard, comprising the following special characters:</p>\n"
+"<ul>\n"
+"\t<li><code>*</code>: Any number of characters</li>\n"
+"\t<li><code>?</code>: Any single character</li>\n"
+"\t<li><code>[&lt;char1&gt;&lt;char2&gt;...]</code>: char1 or char2</li>\n"
+"</ul>"
+msgstr ""
+
+#: src/Module/Admin/Blocklist/Server.php:83
 msgid "Add new entry to block list"
 msgstr "Ajouter une nouvelle entrée à la liste noire"
 
-#: src/Module/Admin/Blocklist/Server.php:78
-msgid "Server Domain"
-msgstr "Adresse du serveur"
+#: src/Module/Admin/Blocklist/Server.php:84
+msgid "Server Domain Pattern"
+msgstr ""
 
-#: src/Module/Admin/Blocklist/Server.php:78
+#: src/Module/Admin/Blocklist/Server.php:84
 msgid ""
-"The domain of the new server to add to the block list. Do not include the "
-"protocol."
-msgstr "Adresse du serveur à ajouter à la liste noire. Ne pas mettre le protocole."
+"The domain pattern of the new server to add to the block list. Do not "
+"include the protocol."
+msgstr ""
 
-#: src/Module/Admin/Blocklist/Server.php:79
+#: src/Module/Admin/Blocklist/Server.php:85
 msgid "Block reason"
 msgstr "Raison du blocage."
 
-#: src/Module/Admin/Blocklist/Server.php:80
+#: src/Module/Admin/Blocklist/Server.php:85
+msgid "The reason why you blocked this server domain pattern."
+msgstr ""
+
+#: src/Module/Admin/Blocklist/Server.php:86
 msgid "Add Entry"
 msgstr "Ajouter"
 
-#: src/Module/Admin/Blocklist/Server.php:81
+#: src/Module/Admin/Blocklist/Server.php:87
 msgid "Save changes to the blocklist"
 msgstr "Sauvegarder la liste noire"
 
-#: src/Module/Admin/Blocklist/Server.php:82
+#: src/Module/Admin/Blocklist/Server.php:88
 msgid "Current Entries in the Blocklist"
 msgstr "Entrées de la liste noire"
 
-#: src/Module/Admin/Blocklist/Server.php:85
+#: src/Module/Admin/Blocklist/Server.php:91
 msgid "Delete entry from blocklist"
 msgstr "Supprimer l'entrée de la liste noire"
 
-#: src/Module/Admin/Blocklist/Server.php:88
+#: src/Module/Admin/Blocklist/Server.php:94
 msgid "Delete entry from blocklist?"
 msgstr "Supprimer l'entrée de la liste noire ?"
 
@@ -6871,24 +7099,24 @@ msgstr "Gérer les fonctionnalités avancées"
 msgid "unknown"
 msgstr "inconnu"
 
-#: src/Module/Admin/Federation.php:179
+#: src/Module/Admin/Federation.php:181
 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 "Cette page montre quelques statistiques de la partie connue du réseau social fédéré dont votre instance Friendica fait partie. Ces chiffres sont partiels et ne reflètent que la portion du réseau dont votre instance a connaissance."
 
-#: src/Module/Admin/Federation.php:180
+#: src/Module/Admin/Federation.php:182
 msgid ""
 "The <em>Auto Discovered Contact Directory</em> feature is not enabled, it "
 "will improve the data displayed here."
 msgstr "En activant la fonctionnalité <em>Répertoire de Contacts Découverts Automatiquement</em>, cela améliorera la qualité des chiffres présentés ici."
 
-#: src/Module/Admin/Federation.php:186 src/Module/BaseAdminModule.php:77
+#: src/Module/Admin/Federation.php:188 src/Module/BaseAdminModule.php:77
 msgid "Federation Statistics"
 msgstr "Statistiques Federation"
 
-#: src/Module/Admin/Federation.php:192
+#: src/Module/Admin/Federation.php:194
 #, php-format
 msgid ""
 "Currently this node is aware of %d nodes with %d registered users from the "
@@ -6928,54 +7156,60 @@ msgstr "GUID"
 msgid "The GUID of the item you want to delete."
 msgstr "GUID de l'élément à supprimer."
 
-#: src/Module/Admin/Item/Source.php:46 src/Module/Itemsource.php:46
+#: src/Module/Admin/Item/Source.php:46
 msgid "Item Guid"
 msgstr ""
 
-#: src/Module/Admin/Logs/Settings.php:30
+#: src/Module/Admin/Logs/Settings.php:27 src/Module/Admin/Summary.php:83
+#: src/Module/Admin/Summary.php:90
+#, php-format
+msgid "The logfile '%s' is not writable. No logging possible"
+msgstr ""
+
+#: src/Module/Admin/Logs/Settings.php:36
 msgid "Log settings updated."
 msgstr "Réglages des journaux mis-à-jour."
 
-#: src/Module/Admin/Logs/Settings.php:49
+#: src/Module/Admin/Logs/Settings.php:55
 msgid "PHP log currently enabled."
 msgstr "Log PHP actuellement activé."
 
-#: src/Module/Admin/Logs/Settings.php:51
+#: src/Module/Admin/Logs/Settings.php:57
 msgid "PHP log currently disabled."
 msgstr "Log PHP actuellement desactivé."
 
-#: src/Module/Admin/Logs/Settings.php:58 src/Module/BaseAdminModule.php:97
+#: src/Module/Admin/Logs/Settings.php:64 src/Module/BaseAdminModule.php:97
 #: src/Module/BaseAdminModule.php:98
 msgid "Logs"
 msgstr "Journaux"
 
-#: src/Module/Admin/Logs/Settings.php:60
+#: src/Module/Admin/Logs/Settings.php:66
 msgid "Clear"
 msgstr "Effacer"
 
-#: src/Module/Admin/Logs/Settings.php:64
+#: src/Module/Admin/Logs/Settings.php:70
 msgid "Enable Debugging"
 msgstr "Activer le déboggage"
 
-#: src/Module/Admin/Logs/Settings.php:65
+#: src/Module/Admin/Logs/Settings.php:71
 msgid "Log file"
 msgstr "Fichier de journaux"
 
-#: src/Module/Admin/Logs/Settings.php:65
+#: src/Module/Admin/Logs/Settings.php:71
 msgid ""
 "Must be writable by web server. Relative to your Friendica top-level "
 "directory."
 msgstr "Accès en écriture par le serveur web requis. Relatif à la racine de votre installation de Friendica."
 
-#: src/Module/Admin/Logs/Settings.php:66
+#: src/Module/Admin/Logs/Settings.php:72
 msgid "Log level"
 msgstr "Niveau de journalisaton"
 
-#: src/Module/Admin/Logs/Settings.php:68
+#: src/Module/Admin/Logs/Settings.php:74
 msgid "PHP logging"
 msgstr "Log PHP"
 
-#: src/Module/Admin/Logs/Settings.php:69
+#: src/Module/Admin/Logs/Settings.php:75
 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 "
@@ -7038,7 +7272,7 @@ msgstr "Créé"
 msgid "Priority"
 msgstr "Priorité"
 
-#: src/Module/Admin/Site.php:49
+#: src/Module/Admin/Site.php:50
 msgid "Can not parse base url. Must have at least <scheme>://<domain>"
 msgstr "Impossible d'analyser l'URL de base. Doit contenir au moins <scheme>://<domain>"
 
@@ -7046,260 +7280,260 @@ msgstr "Impossible d'analyser l'URL de base. Doit contenir au moins <scheme>://<
 msgid "Invalid storage backend setting value."
 msgstr ""
 
-#: src/Module/Admin/Site.php:412
+#: src/Module/Admin/Site.php:411
 msgid "Site settings updated."
 msgstr "Réglages du site mis-à-jour."
 
-#: src/Module/Admin/Site.php:464
+#: src/Module/Admin/Site.php:463
 msgid "No community page for local users"
 msgstr "Pas de page communauté pour les utilisateurs enregistrés"
 
-#: src/Module/Admin/Site.php:465
+#: src/Module/Admin/Site.php:464
 msgid "No community page"
 msgstr "Aucune page de communauté"
 
-#: src/Module/Admin/Site.php:466
+#: src/Module/Admin/Site.php:465
 msgid "Public postings from users of this site"
 msgstr "Publications publiques des utilisateurs de ce site"
 
-#: src/Module/Admin/Site.php:467
+#: src/Module/Admin/Site.php:466
 msgid "Public postings from the federated network"
 msgstr "Publications publiques du réseau fédéré"
 
-#: src/Module/Admin/Site.php:468
+#: src/Module/Admin/Site.php:467
 msgid "Public postings from local users and the federated network"
 msgstr "Publications publiques des utilisateurs du site et du réseau fédéré"
 
-#: src/Module/Admin/Site.php:472 src/Module/Admin/Site.php:668
-#: src/Module/Admin/Site.php:678 src/Module/Contact.php:549
-#: src/Module/Settings/TwoFactor/Index.php:91
+#: src/Module/Admin/Site.php:471 src/Module/Admin/Site.php:666
+#: src/Module/Admin/Site.php:676 src/Module/Contact.php:563
+#: src/Module/Settings/TwoFactor/Index.php:97
 msgid "Disabled"
 msgstr "Désactivé"
 
-#: src/Module/Admin/Site.php:473 src/Module/Admin/Users.php:278
+#: src/Module/Admin/Site.php:472 src/Module/Admin/Users.php:278
 #: src/Module/Admin/Users.php:295 src/Module/BaseAdminModule.php:81
 msgid "Users"
 msgstr "Utilisateurs"
 
-#: src/Module/Admin/Site.php:474
+#: src/Module/Admin/Site.php:473
 msgid "Users, Global Contacts"
 msgstr "Utilisateurs, Contacts Globaux"
 
-#: src/Module/Admin/Site.php:475
+#: src/Module/Admin/Site.php:474
 msgid "Users, Global Contacts/fallback"
 msgstr "Utilisateurs, Contacts Globaux/alternative"
 
-#: src/Module/Admin/Site.php:479
+#: src/Module/Admin/Site.php:478
 msgid "One month"
 msgstr "Un mois"
 
-#: src/Module/Admin/Site.php:480
+#: src/Module/Admin/Site.php:479
 msgid "Three months"
 msgstr "Trois mois"
 
-#: src/Module/Admin/Site.php:481
+#: src/Module/Admin/Site.php:480
 msgid "Half a year"
 msgstr "Six mois"
 
-#: src/Module/Admin/Site.php:482
+#: src/Module/Admin/Site.php:481
 msgid "One year"
 msgstr "Un an"
 
-#: src/Module/Admin/Site.php:488
+#: src/Module/Admin/Site.php:487
 msgid "Multi user instance"
 msgstr "Instance multi-utilisateurs"
 
-#: src/Module/Admin/Site.php:510
+#: src/Module/Admin/Site.php:509
 msgid "Closed"
 msgstr "Fermé"
 
-#: src/Module/Admin/Site.php:511
+#: src/Module/Admin/Site.php:510
 msgid "Requires approval"
 msgstr "Demande une apptrobation"
 
-#: src/Module/Admin/Site.php:512
+#: src/Module/Admin/Site.php:511
 msgid "Open"
 msgstr "Ouvert"
 
-#: src/Module/Admin/Site.php:516 src/Module/Install.php:181
+#: src/Module/Admin/Site.php:515 src/Module/Install.php:183
 msgid "No SSL policy, links will track page SSL state"
 msgstr "Pas de politique SSL, le liens conserveront l'état SSL de la page"
 
-#: src/Module/Admin/Site.php:517 src/Module/Install.php:182
+#: src/Module/Admin/Site.php:516 src/Module/Install.php:184
 msgid "Force all links to use SSL"
 msgstr "Forcer tous les liens à utiliser SSL"
 
-#: src/Module/Admin/Site.php:518 src/Module/Install.php:183
+#: src/Module/Admin/Site.php:517 src/Module/Install.php:185
 msgid "Self-signed certificate, use SSL for local links only (discouraged)"
 msgstr "Certificat auto-signé, n'utiliser SSL que pour les liens locaux (non recommandé)"
 
-#: src/Module/Admin/Site.php:522
+#: src/Module/Admin/Site.php:521
 msgid "Don't check"
 msgstr "Ne pas rechercher"
 
-#: src/Module/Admin/Site.php:523
+#: src/Module/Admin/Site.php:522
 msgid "check the stable version"
 msgstr "Rechercher les versions stables"
 
-#: src/Module/Admin/Site.php:524
+#: src/Module/Admin/Site.php:523
 msgid "check the development version"
 msgstr "Rechercher les versions de développement"
 
-#: src/Module/Admin/Site.php:544
+#: src/Module/Admin/Site.php:543
 msgid "Database (legacy)"
 msgstr "Base de donnée (historique)"
 
-#: src/Module/Admin/Site.php:569 src/Module/BaseAdminModule.php:80
+#: src/Module/Admin/Site.php:568 src/Module/BaseAdminModule.php:80
 msgid "Site"
 msgstr "Site"
 
-#: src/Module/Admin/Site.php:571
+#: src/Module/Admin/Site.php:570
 msgid "Republish users to directory"
 msgstr "Republier les utilisateurs sur le répertoire"
 
-#: src/Module/Admin/Site.php:572 src/Module/Register.php:121
+#: src/Module/Admin/Site.php:571 src/Module/Register.php:121
 msgid "Registration"
 msgstr "Inscription"
 
-#: src/Module/Admin/Site.php:573
+#: src/Module/Admin/Site.php:572
 msgid "File upload"
 msgstr "Téléversement de fichier"
 
-#: src/Module/Admin/Site.php:574
+#: src/Module/Admin/Site.php:573
 msgid "Policies"
 msgstr "Politiques"
 
-#: src/Module/Admin/Site.php:576
+#: src/Module/Admin/Site.php:575
 msgid "Auto Discovered Contact Directory"
 msgstr "Répertoire de Contacts Découverts Automatiquement"
 
-#: src/Module/Admin/Site.php:577
+#: src/Module/Admin/Site.php:576
 msgid "Performance"
 msgstr "Performance"
 
-#: src/Module/Admin/Site.php:578
+#: src/Module/Admin/Site.php:577
 msgid "Worker"
 msgstr "Worker"
 
-#: src/Module/Admin/Site.php:579
+#: src/Module/Admin/Site.php:578
 msgid "Message Relay"
 msgstr "Relai de publication"
 
-#: src/Module/Admin/Site.php:580
+#: src/Module/Admin/Site.php:579
 msgid "Relocate Instance"
 msgstr "Déménager le site"
 
-#: src/Module/Admin/Site.php:581
+#: src/Module/Admin/Site.php:580
 msgid "Warning! Advanced function. Could make this server unreachable."
 msgstr "Attention! Cette fonctionnalité avancée peut rendre votre site inaccessible."
 
-#: src/Module/Admin/Site.php:585
+#: src/Module/Admin/Site.php:584
 msgid "Site name"
 msgstr "Nom du site"
 
-#: src/Module/Admin/Site.php:586
+#: src/Module/Admin/Site.php:585
 msgid "Sender Email"
 msgstr "Courriel de l'émetteur"
 
-#: src/Module/Admin/Site.php:586
+#: src/Module/Admin/Site.php:585
 msgid ""
 "The email address your server shall use to send notification emails from."
 msgstr "L'adresse courriel à partir de laquelle votre serveur enverra des courriels."
 
-#: src/Module/Admin/Site.php:587
+#: src/Module/Admin/Site.php:586
 msgid "Banner/Logo"
 msgstr "Bannière/Logo"
 
-#: src/Module/Admin/Site.php:588
+#: src/Module/Admin/Site.php:587
 msgid "Shortcut icon"
 msgstr "Icône de raccourci"
 
-#: src/Module/Admin/Site.php:588
+#: src/Module/Admin/Site.php:587
 msgid "Link to an icon that will be used for browsers."
 msgstr "Lien vers une icône qui sera utilisée pour les navigateurs."
 
-#: src/Module/Admin/Site.php:589
+#: src/Module/Admin/Site.php:588
 msgid "Touch icon"
 msgstr "Icône pour systèmes tactiles"
 
-#: src/Module/Admin/Site.php:589
+#: src/Module/Admin/Site.php:588
 msgid "Link to an icon that will be used for tablets and mobiles."
 msgstr "Lien vers une icône qui sera utilisée pour les tablettes et les mobiles."
 
-#: src/Module/Admin/Site.php:590
+#: src/Module/Admin/Site.php:589
 msgid "Additional Info"
 msgstr "Informations supplémentaires"
 
-#: src/Module/Admin/Site.php:590
+#: src/Module/Admin/Site.php:589
 #, php-format
 msgid ""
 "For public servers: you can add additional information here that will be "
 "listed at %s/servers."
 msgstr "Description publique destinée au <a href=\"%s\">répertoire global de sites Friendica</a>."
 
-#: src/Module/Admin/Site.php:591
+#: src/Module/Admin/Site.php:590
 msgid "System language"
 msgstr "Langue du système"
 
-#: src/Module/Admin/Site.php:592
+#: src/Module/Admin/Site.php:591
 msgid "System theme"
 msgstr "Thème du système"
 
-#: src/Module/Admin/Site.php:592
+#: src/Module/Admin/Site.php:591
 msgid ""
 "Default system theme - may be over-ridden by user profiles - <a "
 "href=\"/admin/themes\" id=\"cnftheme\">Change default theme settings</a>"
 msgstr ""
 
-#: src/Module/Admin/Site.php:593
+#: src/Module/Admin/Site.php:592
 msgid "Mobile system theme"
 msgstr "Thème mobile"
 
-#: src/Module/Admin/Site.php:593
+#: src/Module/Admin/Site.php:592
 msgid "Theme for mobile devices"
 msgstr "Thème pour les terminaux mobiles"
 
-#: src/Module/Admin/Site.php:594 src/Module/Install.php:191
+#: src/Module/Admin/Site.php:593 src/Module/Install.php:193
 msgid "SSL link policy"
 msgstr "Politique SSL pour les liens"
 
-#: src/Module/Admin/Site.php:594 src/Module/Install.php:193
+#: src/Module/Admin/Site.php:593 src/Module/Install.php:195
 msgid "Determines whether generated links should be forced to use SSL"
 msgstr "Détermine si les liens générés doivent forcer l'utilisation de SSL"
 
-#: src/Module/Admin/Site.php:595
+#: src/Module/Admin/Site.php:594
 msgid "Force SSL"
 msgstr "SSL obligatoire"
 
-#: src/Module/Admin/Site.php:595
+#: src/Module/Admin/Site.php:594
 msgid ""
 "Force all Non-SSL requests to SSL - Attention: on some systems it could lead"
 " to endless loops."
 msgstr "Redirige toutes les requêtes en clair vers des requêtes SSL. Attention : sur certains systèmes cela peut conduire à des boucles de redirection infinies."
 
-#: src/Module/Admin/Site.php:596
+#: src/Module/Admin/Site.php:595
 msgid "Hide help entry from navigation menu"
 msgstr "Cacher l'aide du menu de navigation"
 
-#: src/Module/Admin/Site.php:596
+#: src/Module/Admin/Site.php:595
 msgid ""
 "Hides the menu entry for the Help pages from the navigation menu. You can "
 "still access it calling /help directly."
 msgstr "Cacher du menu de navigation l'entrée vers les pages d'aide. Vous pouvez toujours y accéder en tapant directement /help."
 
-#: src/Module/Admin/Site.php:597
+#: src/Module/Admin/Site.php:596
 msgid "Single user instance"
 msgstr "Instance mono-utilisateur"
 
-#: src/Module/Admin/Site.php:597
+#: src/Module/Admin/Site.php:596
 msgid "Make this instance multi-user or single-user for the named user"
 msgstr "Transformer cette en instance en multi-utilisateur ou mono-utilisateur pour cet l'utilisateur."
 
-#: src/Module/Admin/Site.php:599
+#: src/Module/Admin/Site.php:598
 msgid "File storage backend"
 msgstr "Destination du stockage de fichier"
 
-#: src/Module/Admin/Site.php:599
+#: src/Module/Admin/Site.php:598
 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 "
@@ -7308,190 +7542,190 @@ msgid ""
 " for more information about the choices and the moving procedure."
 msgstr "La destination du stockage des fichiers. Si vous changez cette destination, vous pouvez migrer les fichiers existants. Si vous ne le faites pas, ils resteront accessibles à leur emplacement actuel. Veuillez consulter <a href=\"/help/Settings#1_2_3_1\">la page d'aide à la Configuration</a> (en anglais) pour plus d'information sur les choix possibles et la procédure de migration."
 
-#: src/Module/Admin/Site.php:601
+#: src/Module/Admin/Site.php:600
 msgid "Maximum image size"
 msgstr "Taille maximale des images"
 
-#: src/Module/Admin/Site.php:601
+#: src/Module/Admin/Site.php:600
 msgid ""
 "Maximum size in bytes of uploaded images. Default is 0, which means no "
 "limits."
 msgstr "Taille maximale des images envoyées (en octets). 0 par défaut, c'est à dire \"aucune limite\"."
 
-#: src/Module/Admin/Site.php:602
+#: src/Module/Admin/Site.php:601
 msgid "Maximum image length"
 msgstr "Longueur maximale des images"
 
-#: src/Module/Admin/Site.php:602
+#: src/Module/Admin/Site.php:601
 msgid ""
 "Maximum length in pixels of the longest side of uploaded images. Default is "
 "-1, which means no limits."
 msgstr "Longueur maximale en pixels du plus long côté des images téléversées. La valeur par défaut est -1 : absence de limite."
 
-#: src/Module/Admin/Site.php:603
+#: src/Module/Admin/Site.php:602
 msgid "JPEG image quality"
 msgstr "Qualité JPEG des images"
 
-#: src/Module/Admin/Site.php:603
+#: src/Module/Admin/Site.php:602
 msgid ""
 "Uploaded JPEGS will be saved at this quality setting [0-100]. Default is "
 "100, which is full quality."
 msgstr "Les JPEGs téléversés seront sauvegardés avec ce niveau de qualité [0-100]. La valeur par défaut est 100, soit la qualité maximale."
 
-#: src/Module/Admin/Site.php:605
+#: src/Module/Admin/Site.php:604
 msgid "Register policy"
 msgstr "Politique d'inscription"
 
-#: src/Module/Admin/Site.php:606
+#: src/Module/Admin/Site.php:605
 msgid "Maximum Daily Registrations"
 msgstr "Inscriptions maximum par jour"
 
-#: src/Module/Admin/Site.php:606
+#: src/Module/Admin/Site.php:605
 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 "Si les inscriptions sont permises ci-dessus, ceci fixe le nombre maximum d'inscriptions de nouveaux utilisateurs acceptées par jour. Si les inscriptions ne sont pas ouvertes, ce paramètre n'a aucun effet."
 
-#: src/Module/Admin/Site.php:607
+#: src/Module/Admin/Site.php:606
 msgid "Register text"
 msgstr "Texte d'inscription"
 
-#: src/Module/Admin/Site.php:607
+#: src/Module/Admin/Site.php:606
 msgid ""
 "Will be displayed prominently on the registration page. You can use BBCode "
 "here."
 msgstr "Ce texte est affiché sur la page d'inscription. Les BBCodes sont autorisés."
 
-#: src/Module/Admin/Site.php:608
+#: src/Module/Admin/Site.php:607
 msgid "Forbidden Nicknames"
 msgstr "Identifiants réservés"
 
-#: src/Module/Admin/Site.php:608
+#: src/Module/Admin/Site.php:607
 msgid ""
 "Comma separated list of nicknames that are forbidden from registration. "
 "Preset is a list of role names according RFC 2142."
 msgstr "Liste d'identifiants réservés séparés par des virgules. Ces identifiants ne peuvent pas être utilisés pour s'enregistrer. La liste de base provient de la RFC 2142."
 
-#: src/Module/Admin/Site.php:609
+#: src/Module/Admin/Site.php:608
 msgid "Accounts abandoned after x days"
 msgstr "Les comptes sont abandonnés après x jours"
 
-#: src/Module/Admin/Site.php:609
+#: src/Module/Admin/Site.php:608
 msgid ""
 "Will not waste system resources polling external sites for abandonded "
 "accounts. Enter 0 for no time limit."
 msgstr "Pour ne pas gaspiller les ressources système, on cesse d'interroger les sites distants pour les comptes abandonnés. Mettre 0 pour désactiver cette fonction."
 
-#: src/Module/Admin/Site.php:610
+#: src/Module/Admin/Site.php:609
 msgid "Allowed friend domains"
 msgstr "Domaines autorisés"
 
-#: src/Module/Admin/Site.php:610
+#: src/Module/Admin/Site.php:609
 msgid ""
 "Comma separated list of domains which are allowed to establish friendships "
 "with this site. Wildcards are accepted. Empty to allow any domains"
 msgstr "Une liste de domaines, séparés par des virgules, autorisés à établir des relations avec les utilisateurs de ce site. Les '*' sont acceptés. Laissez vide pour autoriser tous les domaines"
 
-#: src/Module/Admin/Site.php:611
+#: src/Module/Admin/Site.php:610
 msgid "Allowed email domains"
 msgstr "Domaines courriel autorisés"
 
-#: src/Module/Admin/Site.php:611
+#: src/Module/Admin/Site.php:610
 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 "Liste de domaines - séparés par des virgules - dont les adresses e-mail sont autorisées à s'inscrire sur ce site. Les '*' sont acceptées. Laissez vide pour autoriser tous les domaines"
 
-#: src/Module/Admin/Site.php:612
+#: src/Module/Admin/Site.php:611
 msgid "No OEmbed rich content"
 msgstr "Désactiver le texte riche avec OEmbed"
 
-#: src/Module/Admin/Site.php:612
+#: src/Module/Admin/Site.php:611
 msgid ""
 "Don't show the rich content (e.g. embedded PDF), except from the domains "
 "listed below."
 msgstr "Evite le contenu riche avec OEmbed (comme un document PDF incrusté), sauf provenant des domaines autorisés listés ci-après."
 
-#: src/Module/Admin/Site.php:613
+#: src/Module/Admin/Site.php:612
 msgid "Allowed OEmbed domains"
 msgstr "Domaines autorisés pour OEmbed"
 
-#: src/Module/Admin/Site.php:613
+#: src/Module/Admin/Site.php:612
 msgid ""
 "Comma separated list of domains which oembed content is allowed to be "
 "displayed. Wildcards are accepted."
 msgstr "Liste de noms de domaine séparés par des virgules. Ces domaines peuvent afficher du contenu riche avec OEmbed."
 
-#: src/Module/Admin/Site.php:614
+#: src/Module/Admin/Site.php:613
 msgid "Block public"
 msgstr "Interdire la publication globale"
 
-#: src/Module/Admin/Site.php:614
+#: src/Module/Admin/Site.php:613
 msgid ""
 "Check to block public access to all otherwise public personal pages on this "
 "site unless you are currently logged in."
 msgstr "Cocher pour bloquer les accès anonymes (non-connectés) à tout sauf aux pages personnelles publiques."
 
-#: src/Module/Admin/Site.php:615
+#: src/Module/Admin/Site.php:614
 msgid "Force publish"
 msgstr "Forcer la publication globale"
 
-#: src/Module/Admin/Site.php:615
+#: src/Module/Admin/Site.php:614
 msgid ""
 "Check to force all profiles on this site to be listed in the site directory."
 msgstr "Cocher pour publier obligatoirement tous les profils locaux dans l'annuaire du site."
 
-#: src/Module/Admin/Site.php:615
+#: src/Module/Admin/Site.php:614
 msgid "Enabling this may violate privacy laws like the GDPR"
 msgstr "Activer cette option peut potentiellement enfreindre les lois sur la protection de la vie privée comme le RGPD."
 
-#: src/Module/Admin/Site.php:616
+#: src/Module/Admin/Site.php:615
 msgid "Global directory URL"
 msgstr "URL de l'annuaire global"
 
-#: src/Module/Admin/Site.php:616
+#: src/Module/Admin/Site.php:615
 msgid ""
 "URL to the global directory. If this is not set, the global directory is "
 "completely unavailable to the application."
 msgstr "URL de l'annuaire global. Si ce champ n'est pas défini, l'annuaire global sera complètement indisponible pour l'application."
 
-#: src/Module/Admin/Site.php:617
+#: src/Module/Admin/Site.php:616
 msgid "Private posts by default for new users"
 msgstr "Publications privées par défaut pour les nouveaux utilisateurs"
 
-#: src/Module/Admin/Site.php:617
+#: src/Module/Admin/Site.php:616
 msgid ""
 "Set default post permissions for all new members to the default privacy "
 "group rather than public."
 msgstr "Rendre les publications de tous les nouveaux utilisateurs accessibles seulement par le groupe de contacts par défaut, et non par tout le monde."
 
-#: src/Module/Admin/Site.php:618
+#: src/Module/Admin/Site.php:617
 msgid "Don't include post content in email notifications"
 msgstr "Ne pas inclure le contenu posté dans l'e-mail de notification"
 
-#: src/Module/Admin/Site.php:618
+#: src/Module/Admin/Site.php:617
 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 "Ne pas inclure le contenu de publication/commentaire/message privé/etc dans l'e-mail de notification qui est envoyé à partir du site, par mesure de confidentialité."
 
-#: src/Module/Admin/Site.php:619
+#: src/Module/Admin/Site.php:618
 msgid "Disallow public access to addons listed in the apps menu."
 msgstr "Interdire l’accès public pour les greffons listées dans le menu apps."
 
-#: src/Module/Admin/Site.php:619
+#: src/Module/Admin/Site.php:618
 msgid ""
 "Checking this box will restrict addons listed in the apps menu to members "
 "only."
 msgstr "Cocher cette case restreint la liste des greffons dans le menu des applications seulement aux membres."
 
-#: src/Module/Admin/Site.php:620
+#: src/Module/Admin/Site.php:619
 msgid "Don't embed private images in posts"
 msgstr "Ne pas miniaturiser les images privées dans les publications"
 
-#: src/Module/Admin/Site.php:620
+#: src/Module/Admin/Site.php:619
 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 "
@@ -7499,11 +7733,11 @@ msgid ""
 "while."
 msgstr "Ne remplacez pas les images privées hébergées localement dans les publications avec une image attaché en copie, car cela signifie que le contact qui reçoit les publications contenant ces photos privées devra s’authentifier pour charger chaque image, ce qui peut prendre du temps."
 
-#: src/Module/Admin/Site.php:621
+#: src/Module/Admin/Site.php:620
 msgid "Explicit Content"
 msgstr "Contenu adulte"
 
-#: src/Module/Admin/Site.php:621
+#: src/Module/Admin/Site.php:620
 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 "
@@ -7512,211 +7746,200 @@ msgid ""
 "will be shown at the user registration page."
 msgstr "Activez cette option si votre site est principalement utilisé pour publier du contenu adulte. Cette information est publique et peut être utilisée pour filtrer votre site dans le répertoire de site global. Elle est également affichée sur la page d'inscription."
 
-#: src/Module/Admin/Site.php:622
+#: src/Module/Admin/Site.php:621
 msgid "Allow Users to set remote_self"
 msgstr "Autoriser les utilisateurs à définir remote_self"
 
-#: src/Module/Admin/Site.php:622
+#: src/Module/Admin/Site.php:621
 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 "Cocher cette case, permet à chaque utilisateur de marquer chaque contact comme un remote_self dans la boîte de dialogue de réparation des contacts. Activer cette fonction à un contact engendre la réplique de toutes les publications d'un contact dans le flux d'activités des utilisateurs."
 
-#: src/Module/Admin/Site.php:623
+#: src/Module/Admin/Site.php:622
 msgid "Block multiple registrations"
 msgstr "Interdire les inscriptions multiples"
 
-#: src/Module/Admin/Site.php:623
+#: src/Module/Admin/Site.php:622
 msgid "Disallow users to register additional accounts for use as pages."
 msgstr "Ne pas permettre l'inscription de comptes multiples comme des pages."
 
-#: src/Module/Admin/Site.php:624
+#: src/Module/Admin/Site.php:623
 msgid "Disable OpenID"
 msgstr "Désactiver OpenID"
 
-#: src/Module/Admin/Site.php:624
+#: src/Module/Admin/Site.php:623
 msgid "Disable OpenID support for registration and logins."
 msgstr "Désactive OpenID pour l'inscription et l'identification."
 
-#: src/Module/Admin/Site.php:625
+#: src/Module/Admin/Site.php:624
 msgid "No Fullname check"
 msgstr "Désactiver l'obligation de nom complet"
 
-#: src/Module/Admin/Site.php:625
+#: src/Module/Admin/Site.php:624
 msgid ""
 "Allow users to register without a space between the first name and the last "
 "name in their full name."
 msgstr "Supprime l'obligation d'avoir au moins un espace dans le nom complet des utilisateurs pour séparer leur prénom et nom de famille."
 
-#: src/Module/Admin/Site.php:626
+#: src/Module/Admin/Site.php:625
 msgid "Community pages for visitors"
 msgstr "Affichage de la page communauté pour les utilisateurs anonymes"
 
-#: src/Module/Admin/Site.php:626
+#: src/Module/Admin/Site.php:625
 msgid ""
 "Which community pages should be available for visitors. Local users always "
 "see both pages."
 msgstr "Quelles pages communauté sont disponibles pour les utilisateurs anonymes."
 
-#: src/Module/Admin/Site.php:627
+#: src/Module/Admin/Site.php:626
 msgid "Posts per user on community page"
 msgstr "Nombre de publications par utilisateur sur la page de la communauté (n'est pas valide pour "
 
-#: src/Module/Admin/Site.php:627
+#: src/Module/Admin/Site.php:626
 msgid ""
 "The maximum number of posts per user on the community page. (Not valid for "
 "\"Global Community\")"
 msgstr ""
 
-#: src/Module/Admin/Site.php:628
+#: src/Module/Admin/Site.php:627
 msgid "Disable OStatus support"
 msgstr "Désactiver OStatus"
 
-#: src/Module/Admin/Site.php:628
+#: src/Module/Admin/Site.php:627
 msgid ""
 "Disable built-in OStatus (StatusNet, GNU Social etc.) compatibility. All "
 "communications in OStatus are public, so privacy warnings will be "
 "occasionally displayed."
 msgstr "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."
 
-#: src/Module/Admin/Site.php:629
-msgid "Only import OStatus/ActivityPub threads from our contacts"
-msgstr "Importer seulement les conversations OStatus/ActivityPub provenant de profils distants connus."
-
-#: src/Module/Admin/Site.php:629
-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 "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."
-
-#: src/Module/Admin/Site.php:630
+#: src/Module/Admin/Site.php:628
 msgid "OStatus support can only be enabled if threading is enabled."
 msgstr "Le support OStatus ne peut être activé que si l'imbrication des commentaires est activée."
 
-#: src/Module/Admin/Site.php:632
+#: src/Module/Admin/Site.php:630
 msgid ""
 "Diaspora support can't be enabled because Friendica was installed into a sub"
 " directory."
 msgstr "Le support de Diaspora ne peut pas être activé parce que Friendica a été installé dans un sous-répertoire."
 
-#: src/Module/Admin/Site.php:633
+#: src/Module/Admin/Site.php:631
 msgid "Enable Diaspora support"
 msgstr "Activer le support de Diaspora"
 
-#: src/Module/Admin/Site.php:633
+#: src/Module/Admin/Site.php:631
 msgid "Provide built-in Diaspora network compatibility."
 msgstr "Fournir une compatibilité Diaspora intégrée."
 
-#: src/Module/Admin/Site.php:634
+#: src/Module/Admin/Site.php:632
 msgid "Only allow Friendica contacts"
 msgstr "N'autoriser que les contacts Friendica"
 
-#: src/Module/Admin/Site.php:634
+#: src/Module/Admin/Site.php:632
 msgid ""
 "All contacts must use Friendica protocols. All other built-in communication "
 "protocols disabled."
 msgstr "Tous les contacts doivent utiliser les protocoles de Friendica. Tous les autres protocoles de communication intégrés sont désactivés."
 
-#: src/Module/Admin/Site.php:635
+#: src/Module/Admin/Site.php:633
 msgid "Verify SSL"
 msgstr "Vérifier SSL"
 
-#: src/Module/Admin/Site.php:635
+#: src/Module/Admin/Site.php:633
 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 "Si vous le souhaitez, vous pouvez activier la vérification stricte des certificats. Cela signifie que vous ne pourrez pas vous connecter (du tout) aux sites SSL munis d'un certificat auto-signé."
 
-#: src/Module/Admin/Site.php:636
+#: src/Module/Admin/Site.php:634
 msgid "Proxy user"
 msgstr "Utilisateur du proxy"
 
-#: src/Module/Admin/Site.php:637
+#: src/Module/Admin/Site.php:635
 msgid "Proxy URL"
 msgstr "URL du proxy"
 
-#: src/Module/Admin/Site.php:638
+#: src/Module/Admin/Site.php:636
 msgid "Network timeout"
 msgstr "Dépassement du délai d'attente du réseau"
 
-#: src/Module/Admin/Site.php:638
+#: src/Module/Admin/Site.php:636
 msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
 msgstr "Valeur en secondes. Mettre à 0 pour 'illimité' (pas recommandé)."
 
-#: src/Module/Admin/Site.php:639
+#: src/Module/Admin/Site.php:637
 msgid "Maximum Load Average"
 msgstr "Plafond de la charge moyenne"
 
-#: src/Module/Admin/Site.php:639
+#: src/Module/Admin/Site.php:637
 #, php-format
 msgid ""
 "Maximum system load before delivery and poll processes are deferred - "
 "default %d."
 msgstr ""
 
-#: src/Module/Admin/Site.php:640
+#: src/Module/Admin/Site.php:638
 msgid "Maximum Load Average (Frontend)"
 msgstr "Plafond de la charge moyenne (frontale)"
 
-#: src/Module/Admin/Site.php:640
+#: src/Module/Admin/Site.php:638
 msgid "Maximum system load before the frontend quits service - default 50."
 msgstr "Limite de charge système pour le rendu des pages - défaut 50."
 
-#: src/Module/Admin/Site.php:641
+#: src/Module/Admin/Site.php:639
 msgid "Minimal Memory"
 msgstr "Mémoire minimum"
 
-#: src/Module/Admin/Site.php:641
+#: src/Module/Admin/Site.php:639
 msgid ""
 "Minimal free memory in MB for the worker. Needs access to /proc/meminfo - "
 "default 0 (deactivated)."
 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é)."
 
-#: src/Module/Admin/Site.php:642
+#: src/Module/Admin/Site.php:640
 msgid "Maximum table size for optimization"
 msgstr "Limite de taille de table pour l'optimisation"
 
-#: src/Module/Admin/Site.php:642
+#: src/Module/Admin/Site.php:640
 msgid ""
 "Maximum table size (in MB) for the automatic optimization. Enter -1 to "
 "disable it."
 msgstr "Limite de taille de table (en Mo) pour l'optimisation automatique. -1 pour désactiver cette limite."
 
-#: src/Module/Admin/Site.php:643
+#: src/Module/Admin/Site.php:641
 msgid "Minimum level of fragmentation"
 msgstr "Seuil de fragmentation"
 
-#: src/Module/Admin/Site.php:643
+#: src/Module/Admin/Site.php:641
 msgid ""
 "Minimum fragmenation level to start the automatic optimization - default "
 "value is 30%."
 msgstr "Seuil de fragmentation pour que l'optimisation automatique se déclenche - défaut 30%."
 
-#: src/Module/Admin/Site.php:645
+#: src/Module/Admin/Site.php:643
 msgid "Periodical check of global contacts"
 msgstr "Vérification périodique des contacts globaux"
 
-#: src/Module/Admin/Site.php:645
+#: src/Module/Admin/Site.php:643
 msgid ""
 "If enabled, the global contacts are checked periodically for missing or "
 "outdated data and the vitality of the contacts and servers."
 msgstr "Si activé, les données manquantes et obsolètes et la vitalité des contacts et des serveurs seront vérifiées périodiquement dans les contacts globaux."
 
-#: src/Module/Admin/Site.php:646
+#: src/Module/Admin/Site.php:644
 msgid "Days between requery"
 msgstr "Nombre de jours entre les requêtes"
 
-#: src/Module/Admin/Site.php:646
+#: src/Module/Admin/Site.php:644
 msgid "Number of days after which a server is requeried for his contacts."
 msgstr "Nombre de jours avant qu'une requête de contacts soient envoyée à nouveau à un serveur."
 
-#: src/Module/Admin/Site.php:647
+#: src/Module/Admin/Site.php:645
 msgid "Discover contacts from other servers"
 msgstr "Découvrir des contacts des autres serveurs"
 
-#: src/Module/Admin/Site.php:647
+#: src/Module/Admin/Site.php:645
 msgid ""
 "Periodically query other servers for contacts. You can choose between "
 "\"Users\": the users on the remote system, \"Global Contacts\": active "
@@ -7726,32 +7949,32 @@ msgid ""
 "setting is \"Users, Global Contacts\"."
 msgstr ""
 
-#: src/Module/Admin/Site.php:648
+#: src/Module/Admin/Site.php:646
 msgid "Timeframe for fetching global contacts"
 msgstr "Fréquence de récupération des contacts globaux"
 
-#: src/Module/Admin/Site.php:648
+#: src/Module/Admin/Site.php:646
 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 "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."
 
-#: src/Module/Admin/Site.php:649
+#: src/Module/Admin/Site.php:647
 msgid "Search the local directory"
 msgstr "Chercher dans le répertoire local"
 
-#: src/Module/Admin/Site.php:649
+#: src/Module/Admin/Site.php:647
 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 "Cherche dans le répertoire local au lieu du répertoire local. Quand une recherche locale est effectuée, la même recherche est effectuée dans le répertoire global en tâche de fond. Cela améliore les résultats de la recherche si elle est réitérée."
 
-#: src/Module/Admin/Site.php:651
+#: src/Module/Admin/Site.php:649
 msgid "Publish server information"
 msgstr "Publier les informations du serveur"
 
-#: src/Module/Admin/Site.php:651
+#: src/Module/Admin/Site.php:649
 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 "
@@ -7759,50 +7982,50 @@ msgid ""
 " href=\"http://the-federation.info/\">the-federation.info</a> for details."
 msgstr ""
 
-#: src/Module/Admin/Site.php:653
+#: src/Module/Admin/Site.php:651
 msgid "Check upstream version"
 msgstr "Mises à jour"
 
-#: src/Module/Admin/Site.php:653
+#: src/Module/Admin/Site.php:651
 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 "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."
 
-#: src/Module/Admin/Site.php:654
+#: src/Module/Admin/Site.php:652
 msgid "Suppress Tags"
 msgstr "Masquer les tags"
 
-#: src/Module/Admin/Site.php:654
+#: src/Module/Admin/Site.php:652
 msgid "Suppress showing a list of hashtags at the end of the posting."
 msgstr "Ne pas afficher la liste des hashtags à la fin d’un message."
 
-#: src/Module/Admin/Site.php:655
+#: src/Module/Admin/Site.php:653
 msgid "Clean database"
 msgstr "Nettoyer la base de données"
 
-#: src/Module/Admin/Site.php:655
+#: src/Module/Admin/Site.php:653
 msgid ""
 "Remove old remote items, orphaned database records and old content from some"
 " other helper tables."
 msgstr "Supprime les conversations distantes anciennes, les enregistrements orphelins et le contenu obsolète de certaines tables de débogage."
 
-#: src/Module/Admin/Site.php:656
+#: src/Module/Admin/Site.php:654
 msgid "Lifespan of remote items"
 msgstr "Durée de vie des conversations distantes"
 
-#: src/Module/Admin/Site.php:656
+#: src/Module/Admin/Site.php:654
 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 "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."
 
-#: src/Module/Admin/Site.php:657
+#: src/Module/Admin/Site.php:655
 msgid "Lifespan of unclaimed items"
 msgstr "Durée de vie des conversations relayées"
 
-#: src/Module/Admin/Site.php:657
+#: src/Module/Admin/Site.php:655
 msgid ""
 "When the database cleanup is enabled, this defines the days after which "
 "unclaimed remote items (mostly content from the relay) will be deleted. "
@@ -7810,130 +8033,130 @@ msgid ""
 "items if set to 0."
 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."
 
-#: src/Module/Admin/Site.php:658
+#: src/Module/Admin/Site.php:656
 msgid "Lifespan of raw conversation data"
 msgstr "Durée de vie des méta-données de conversation"
 
-#: src/Module/Admin/Site.php:658
+#: src/Module/Admin/Site.php:656
 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 "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."
 
-#: src/Module/Admin/Site.php:659
+#: src/Module/Admin/Site.php:657
 msgid "Path to item cache"
 msgstr "Chemin vers le cache des objets."
 
-#: src/Module/Admin/Site.php:659
+#: src/Module/Admin/Site.php:657
 msgid "The item caches buffers generated bbcode and external images."
 msgstr "Le cache de publications contient des textes HTML de BBCode compil's et une copie de chaque image distante."
 
-#: src/Module/Admin/Site.php:660
+#: src/Module/Admin/Site.php:658
 msgid "Cache duration in seconds"
 msgstr "Durée du cache en secondes"
 
-#: src/Module/Admin/Site.php:660
+#: src/Module/Admin/Site.php:658
 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 "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."
 
-#: src/Module/Admin/Site.php:661
+#: src/Module/Admin/Site.php:659
 msgid "Maximum numbers of comments per post"
 msgstr "Nombre maximum de commentaires par publication"
 
-#: src/Module/Admin/Site.php:661
+#: src/Module/Admin/Site.php:659
 msgid "How much comments should be shown for each post? Default value is 100."
 msgstr "Combien de commentaires doivent être affichés pour chaque publication? Valeur par défaut: 100."
 
-#: src/Module/Admin/Site.php:662
+#: src/Module/Admin/Site.php:660
 msgid "Temp path"
 msgstr "Chemin des fichiers temporaires"
 
-#: src/Module/Admin/Site.php:662
+#: src/Module/Admin/Site.php:660
 msgid ""
 "If you have a restricted system where the webserver can't access the system "
 "temp path, enter another path here."
 msgstr "Si vous n'avez pas la possibilité d'avoir accès au répertoire temp, entrez un autre répertoire ici."
 
-#: src/Module/Admin/Site.php:663
+#: src/Module/Admin/Site.php:661
 msgid "Disable picture proxy"
 msgstr "Désactiver le proxy image "
 
-#: src/Module/Admin/Site.php:663
+#: src/Module/Admin/Site.php:661
 msgid ""
 "The picture proxy increases performance and privacy. It shouldn't be used on"
 " systems with very low bandwidth."
 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."
 
-#: src/Module/Admin/Site.php:664
+#: src/Module/Admin/Site.php:662
 msgid "Only search in tags"
 msgstr "Rechercher seulement dans les étiquettes"
 
-#: src/Module/Admin/Site.php:664
+#: src/Module/Admin/Site.php:662
 msgid "On large systems the text search can slow down the system extremely."
 msgstr "La recherche textuelle peut ralentir considérablement les systèmes de grande taille."
 
-#: src/Module/Admin/Site.php:666
+#: src/Module/Admin/Site.php:664
 msgid "New base url"
 msgstr "Nouvelle URL de base"
 
-#: src/Module/Admin/Site.php:666
+#: src/Module/Admin/Site.php:664
 msgid ""
 "Change base url for this server. Sends relocate message to all Friendica and"
 " Diaspora* contacts of all users."
 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."
 
-#: src/Module/Admin/Site.php:668
+#: src/Module/Admin/Site.php:666
 msgid "RINO Encryption"
 msgstr "Chiffrement RINO"
 
-#: src/Module/Admin/Site.php:668
+#: src/Module/Admin/Site.php:666
 msgid "Encryption layer between nodes."
 msgstr "Couche de chiffrement entre les nœuds du réseau."
 
-#: src/Module/Admin/Site.php:668
+#: src/Module/Admin/Site.php:666
 msgid "Enabled"
 msgstr "Activé"
 
-#: src/Module/Admin/Site.php:670
+#: src/Module/Admin/Site.php:668
 msgid "Maximum number of parallel workers"
 msgstr "Nombre maximum de processus simultanés"
 
-#: src/Module/Admin/Site.php:670
+#: src/Module/Admin/Site.php:668
 #, php-format
 msgid ""
 "On shared hosters set this to %d. On larger systems, values of %d are great."
 " Default value is %d."
 msgstr "Sur un hébergement partagé, mettez %d. Sur des serveurs plus puissants, %d est optimal. La valeur par défaut est %d."
 
-#: src/Module/Admin/Site.php:671
+#: src/Module/Admin/Site.php:669
 msgid "Don't use \"proc_open\" with the worker"
 msgstr ""
 
-#: src/Module/Admin/Site.php:671
+#: src/Module/Admin/Site.php:669
 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 ""
 
-#: src/Module/Admin/Site.php:672
+#: src/Module/Admin/Site.php:670
 msgid "Enable fastlane"
 msgstr "Activer la file prioritaire"
 
-#: src/Module/Admin/Site.php:672
+#: src/Module/Admin/Site.php:670
 msgid ""
 "When enabed, the fastlane mechanism starts an additional worker if processes"
 " with higher priority are blocked by processes of lower priority."
 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."
 
-#: src/Module/Admin/Site.php:673
+#: src/Module/Admin/Site.php:671
 msgid "Enable frontend worker"
 msgstr "Activer l'ouvrier manuel"
 
-#: src/Module/Admin/Site.php:673
+#: src/Module/Admin/Site.php:671
 #, php-format
 msgid ""
 "When enabled the Worker process is triggered when backend access is "
@@ -7943,73 +8166,73 @@ msgid ""
 "server."
 msgstr ""
 
-#: src/Module/Admin/Site.php:675
+#: src/Module/Admin/Site.php:673
 msgid "Subscribe to relay"
 msgstr "S'abonner au relai"
 
-#: src/Module/Admin/Site.php:675
+#: src/Module/Admin/Site.php:673
 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 "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."
 
-#: src/Module/Admin/Site.php:676
+#: src/Module/Admin/Site.php:674
 msgid "Relay server"
 msgstr "Serveur relai"
 
-#: src/Module/Admin/Site.php:676
+#: src/Module/Admin/Site.php:674
 msgid ""
 "Address of the relay server where public posts should be send to. For "
 "example https://relay.diasp.org"
 msgstr "URL du serveur relai auquel les conversations publique locales doivent être soumises."
 
-#: src/Module/Admin/Site.php:677
+#: src/Module/Admin/Site.php:675
 msgid "Direct relay transfer"
 msgstr "Relai direct"
 
-#: src/Module/Admin/Site.php:677
+#: src/Module/Admin/Site.php:675
 msgid ""
 "Enables the direct transfer to other servers without using the relay servers"
 msgstr "Soumet les conversations publiques aux serveurs distants sans passer par le serveur relai."
 
-#: src/Module/Admin/Site.php:678
+#: src/Module/Admin/Site.php:676
 msgid "Relay scope"
 msgstr "Filtre du relai"
 
-#: src/Module/Admin/Site.php:678
+#: src/Module/Admin/Site.php:676
 msgid ""
 "Can be \"all\" or \"tags\". \"all\" means that every public post should be "
 "received. \"tags\" means that only posts with selected tags should be "
 "received."
 msgstr ""
 
-#: src/Module/Admin/Site.php:678
+#: src/Module/Admin/Site.php:676
 msgid "all"
 msgstr "Tous"
 
-#: src/Module/Admin/Site.php:678
+#: src/Module/Admin/Site.php:676
 msgid "tags"
 msgstr "Tags"
 
-#: src/Module/Admin/Site.php:679
+#: src/Module/Admin/Site.php:677
 msgid "Server tags"
 msgstr "Tags de filtre du relai"
 
-#: src/Module/Admin/Site.php:679
+#: src/Module/Admin/Site.php:677
 msgid "Comma separated list of tags for the \"tags\" subscription."
 msgstr ""
 
-#: src/Module/Admin/Site.php:680
+#: src/Module/Admin/Site.php:678
 msgid "Allow user tags"
 msgstr "Inclure les tags des utilisateurs"
 
-#: src/Module/Admin/Site.php:680
+#: src/Module/Admin/Site.php:678
 msgid ""
 "If enabled, the tags from the saved searches will used for the \"tags\" "
 "subscription in addition to the \"relay_server_tags\"."
 msgstr ""
 
-#: src/Module/Admin/Site.php:683
+#: src/Module/Admin/Site.php:681
 msgid "Start Relocation"
 msgstr "Démarrer le déménagement"
 
@@ -8082,76 +8305,76 @@ msgid ""
 "href=\"%s\">the installation page</a> for help."
 msgstr "<a href=\"%s\">%s</a> n'est pas accessible sur votre site. C'est un problème de configuration sévère qui empêche toute communication avec les serveurs distants. Veuillez consulter <a href=\"%s\">la page d'aide à l'installation</a> (en anglais) pour plus d'information."
 
-#: src/Module/Admin/Summary.php:89
+#: src/Module/Admin/Summary.php:106
 #, php-format
 msgid ""
 "Friendica's system.basepath was updated from '%s' to '%s'. Please remove the"
 " system.basepath from your db to avoid differences."
 msgstr ""
 
-#: src/Module/Admin/Summary.php:97
+#: src/Module/Admin/Summary.php:114
 #, php-format
 msgid ""
 "Friendica's current system.basepath '%s' is wrong and the config file '%s' "
 "isn't used."
 msgstr ""
 
-#: src/Module/Admin/Summary.php:105
+#: src/Module/Admin/Summary.php:122
 #, php-format
 msgid ""
 "Friendica's current system.basepath '%s' is not equal to the config file "
 "'%s'. Please fix your configuration."
 msgstr ""
 
-#: src/Module/Admin/Summary.php:112
+#: src/Module/Admin/Summary.php:129
 msgid "Normal Account"
 msgstr "Compte normal"
 
-#: src/Module/Admin/Summary.php:113
+#: src/Module/Admin/Summary.php:130
 msgid "Automatic Follower Account"
 msgstr "Profile Resuivant"
 
-#: src/Module/Admin/Summary.php:114
+#: src/Module/Admin/Summary.php:131
 msgid "Public Forum Account"
 msgstr "Forum public"
 
-#: src/Module/Admin/Summary.php:115
+#: src/Module/Admin/Summary.php:132
 msgid "Automatic Friend Account"
 msgstr "Compte auto-amical"
 
-#: src/Module/Admin/Summary.php:116
+#: src/Module/Admin/Summary.php:133
 msgid "Blog Account"
 msgstr "Compte de blog"
 
-#: src/Module/Admin/Summary.php:117
+#: src/Module/Admin/Summary.php:134
 msgid "Private Forum Account"
 msgstr "Forum privé"
 
-#: src/Module/Admin/Summary.php:141
+#: src/Module/Admin/Summary.php:156
 msgid "Message queues"
 msgstr "Files d'attente des messages"
 
-#: src/Module/Admin/Summary.php:147
+#: src/Module/Admin/Summary.php:162
 msgid "Server Settings"
 msgstr "Paramètres du site"
 
-#: src/Module/Admin/Summary.php:161
+#: src/Module/Admin/Summary.php:176
 msgid "Summary"
 msgstr "Résumé"
 
-#: src/Module/Admin/Summary.php:163
+#: src/Module/Admin/Summary.php:178
 msgid "Registered users"
 msgstr "Utilisateurs inscrits"
 
-#: src/Module/Admin/Summary.php:165
+#: src/Module/Admin/Summary.php:180
 msgid "Pending registrations"
 msgstr "Inscriptions en attente"
 
-#: src/Module/Admin/Summary.php:166
+#: src/Module/Admin/Summary.php:181
 msgid "Version"
 msgstr "Version"
 
-#: src/Module/Admin/Summary.php:170
+#: src/Module/Admin/Summary.php:185
 msgid "Active addons"
 msgstr "Add-ons actifs"
 
@@ -8409,139 +8632,33 @@ msgstr "L'utilisateur {0} va être supprimé!\\n\\nTout ce qu'il a posté sur ce
 
 #: src/Module/Admin/Users.php:313
 msgid "Name of the new user."
-msgstr "Nom du nouvel utilisateur."
-
-#: src/Module/Admin/Users.php:314
-msgid "Nickname"
-msgstr "Pseudo"
-
-#: src/Module/Admin/Users.php:314
-msgid "Nickname of the new user."
-msgstr "Pseudo du nouvel utilisateur."
-
-#: src/Module/Admin/Users.php:315
-msgid "Email address of the new user."
-msgstr "Adresse mail du nouvel utilisateur."
-
-#: src/Module/AllFriends.php:55
-msgid "No friends to display."
-msgstr "Pas d'amis à afficher."
-
-#: src/Module/Apps.php:29
-msgid "No installed applications."
-msgstr "Pas d'application installée."
-
-#: src/Module/Apps.php:34
-msgid "Applications"
-msgstr "Applications"
-
-#: src/Module/Attach.php:36 src/Module/Attach.php:48
-msgid "Item was not found."
-msgstr "Element introuvable."
-
-#: src/Module/Babel.php:31
-msgid "Source input"
-msgstr "Saisie source"
-
-#: src/Module/Babel.php:37
-msgid "BBCode::toPlaintext"
-msgstr "BBCode::toPlaintext"
-
-#: src/Module/Babel.php:43
-msgid "BBCode::convert (raw HTML)"
-msgstr "BBCode::convert (code HTML)"
-
-#: src/Module/Babel.php:48
-msgid "BBCode::convert"
-msgstr "BBCode::convert"
-
-#: src/Module/Babel.php:54
-msgid "BBCode::convert => HTML::toBBCode"
-msgstr "BBCode::convert => HTML::toBBCode"
-
-#: src/Module/Babel.php:60
-msgid "BBCode::toMarkdown"
-msgstr "BBCode::toMarkdown"
-
-#: src/Module/Babel.php:66
-msgid "BBCode::toMarkdown => Markdown::convert"
-msgstr "BBCode::toMarkdown => Markdown::convert"
-
-#: src/Module/Babel.php:72
-msgid "BBCode::toMarkdown => Markdown::toBBCode"
-msgstr "BBCode::toMarkdown => Markdown::toBBCode"
-
-#: src/Module/Babel.php:78
-msgid "BBCode::toMarkdown =>  Markdown::convert => HTML::toBBCode"
-msgstr "BBCode::toMarkdown =>  Markdown::convert => HTML::toBBCode"
-
-#: src/Module/Babel.php:89
-msgid "Item Body"
-msgstr "Corps du message"
-
-#: src/Module/Babel.php:93
-msgid "Item Tags"
-msgstr "Tags du messages"
-
-#: src/Module/Babel.php:100
-msgid "Source input (Diaspora format)"
-msgstr "Saisie source (format Diaspora)"
-
-#: src/Module/Babel.php:106
-msgid "Markdown::convert (raw HTML)"
-msgstr "Markdown::convert (code HTML)"
-
-#: src/Module/Babel.php:111
-msgid "Markdown::convert"
-msgstr "Markdown::convert"
-
-#: src/Module/Babel.php:117
-msgid "Markdown::toBBCode"
-msgstr "Markdown::toBBCode"
-
-#: src/Module/Babel.php:124
-msgid "Raw HTML input"
-msgstr "Saisie code HTML"
-
-#: src/Module/Babel.php:129
-msgid "HTML Input"
-msgstr "Code HTML"
-
-#: src/Module/Babel.php:135
-msgid "HTML::toBBCode"
-msgstr "HTML::toBBCode"
-
-#: src/Module/Babel.php:141
-msgid "HTML::toBBCode => BBCode::convert"
-msgstr "HTML::toBBCode => BBCode::convert"
-
-#: src/Module/Babel.php:146
-msgid "HTML::toBBCode => BBCode::convert (raw HTML)"
-msgstr "HTML::toBBCode => BBCode::convert (code HTML)"
+msgstr "Nom du nouvel utilisateur."
 
-#: src/Module/Babel.php:152
-msgid "HTML::toMarkdown"
-msgstr "HTML::toMarkdown"
+#: src/Module/Admin/Users.php:314
+msgid "Nickname"
+msgstr "Pseudo"
 
-#: src/Module/Babel.php:158
-msgid "HTML::toPlaintext"
-msgstr "HTML::toPlaintext"
+#: src/Module/Admin/Users.php:314
+msgid "Nickname of the new user."
+msgstr "Pseudo du nouvel utilisateur."
 
-#: src/Module/Babel.php:166
-msgid "Source text"
-msgstr "Texte source"
+#: src/Module/Admin/Users.php:315
+msgid "Email address of the new user."
+msgstr "Adresse mail du nouvel utilisateur."
 
-#: src/Module/Babel.php:167
-msgid "BBCode"
-msgstr "BBCode"
+#: src/Module/AllFriends.php:55
+msgid "No friends to display."
+msgstr "Pas d'amis à afficher."
 
-#: src/Module/Babel.php:168
-msgid "Markdown"
-msgstr "Markdown"
+#: src/Module/Attach.php:36 src/Module/Attach.php:48
+msgid "Item was not found."
+msgstr "Element introuvable."
 
-#: src/Module/Babel.php:169
-msgid "HTML"
-msgstr "HTML"
+#: src/Module/BaseAdminModule.php:62
+msgid ""
+"Submanaged account can't access the administation pages. Please log back in "
+"as the master account."
+msgstr ""
 
 #: src/Module/BaseAdminModule.php:76
 msgid "Overview"
@@ -8575,6 +8692,10 @@ msgstr "Outils"
 msgid "Contact Blocklist"
 msgstr "Liste de contacts bloqués"
 
+#: src/Module/BaseAdminModule.php:94
+msgid "Server Blocklist"
+msgstr "Serveurs bloqués"
+
 #: src/Module/BaseAdminModule.php:101
 msgid "Diagnostics"
 msgstr "Diagnostics"
@@ -8607,6 +8728,16 @@ msgstr "Fonctionnalités des addons"
 msgid "User registrations waiting for confirmation"
 msgstr "Inscriptions en attente de confirmation"
 
+#: src/Module/BaseSearchModule.php:52
+#, php-format
+msgid "People Search - %s"
+msgstr "Recherche de personne - %s"
+
+#: src/Module/BaseSearchModule.php:62
+#, php-format
+msgid "Forum Search - %s"
+msgstr "Recherche de Forum - %s"
+
 #: src/Module/Bookmarklet.php:35
 msgid "This page is missing a url parameter."
 msgstr ""
@@ -8615,292 +8746,282 @@ msgstr ""
 msgid "The post was created"
 msgstr "La publication a été créée"
 
-#: src/Module/Contact.php:166
+#: src/Module/Contact.php:72
 #, 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:193 src/Module/Contact.php:377
+#: src/Module/Contact.php:99
 msgid "Could not access contact record."
 msgstr "Impossible d'accéder à l'enregistrement du contact."
 
-#: src/Module/Contact.php:203
+#: src/Module/Contact.php:109
 msgid "Could not locate selected profile."
 msgstr "Impossible de localiser le profil séléctionné."
 
-#: src/Module/Contact.php:235
+#: src/Module/Contact.php:141
 msgid "Contact updated."
 msgstr "Contact mis à jour."
 
-#: src/Module/Contact.php:398
+#: src/Module/Contact.php:393
+msgid "Contact not found"
+msgstr ""
+
+#: src/Module/Contact.php:412
 msgid "Contact has been blocked"
 msgstr "Le contact a été bloqué"
 
-#: src/Module/Contact.php:398
+#: src/Module/Contact.php:412
 msgid "Contact has been unblocked"
 msgstr "Le contact n'est plus bloqué"
 
-#: src/Module/Contact.php:408
+#: src/Module/Contact.php:422
 msgid "Contact has been ignored"
 msgstr "Le contact a été ignoré"
 
-#: src/Module/Contact.php:408
+#: src/Module/Contact.php:422
 msgid "Contact has been unignored"
 msgstr "Le contact n'est plus ignoré"
 
-#: src/Module/Contact.php:418
+#: src/Module/Contact.php:432
 msgid "Contact has been archived"
 msgstr "Contact archivé"
 
-#: src/Module/Contact.php:418
+#: src/Module/Contact.php:432
 msgid "Contact has been unarchived"
 msgstr "Contact désarchivé"
 
-#: src/Module/Contact.php:442
+#: src/Module/Contact.php:456
 msgid "Drop contact"
 msgstr "Supprimer contact"
 
-#: src/Module/Contact.php:445 src/Module/Contact.php:823
+#: src/Module/Contact.php:459 src/Module/Contact.php:823
 msgid "Do you really want to delete this contact?"
 msgstr "Voulez-vous vraiment supprimer ce contact?"
 
-#: src/Module/Contact.php:459
+#: src/Module/Contact.php:473
 msgid "Contact has been removed."
 msgstr "Ce contact a été retiré."
 
-#: src/Module/Contact.php:489
+#: src/Module/Contact.php:503
 #, php-format
 msgid "You are mutual friends with %s"
 msgstr "Vous êtes ami (et réciproquement) avec %s"
 
-#: src/Module/Contact.php:494
+#: src/Module/Contact.php:508
 #, php-format
 msgid "You are sharing with %s"
 msgstr "Vous partagez avec %s"
 
-#: src/Module/Contact.php:499
+#: src/Module/Contact.php:513
 #, php-format
 msgid "%s is sharing with you"
 msgstr "%s partage avec vous"
 
-#: src/Module/Contact.php:523
+#: src/Module/Contact.php:537
 msgid "Private communications are not available for this contact."
 msgstr "Les communications privées ne sont pas disponibles pour ce contact."
 
-#: src/Module/Contact.php:525
+#: src/Module/Contact.php:539
 msgid "Never"
 msgstr "Jamais"
 
-#: src/Module/Contact.php:528
+#: src/Module/Contact.php:542
 msgid "(Update was successful)"
 msgstr "(Mise à jour effectuée avec succès)"
 
-#: src/Module/Contact.php:528
+#: src/Module/Contact.php:542
 msgid "(Update was not successful)"
 msgstr "(Échec de la mise à jour)"
 
-#: src/Module/Contact.php:530 src/Module/Contact.php:1061
+#: src/Module/Contact.php:544 src/Module/Contact.php:1057
 msgid "Suggest friends"
 msgstr "Suggérer amitié/contact"
 
-#: src/Module/Contact.php:534
+#: src/Module/Contact.php:548
 #, php-format
 msgid "Network type: %s"
 msgstr "Type de réseau %s"
 
-#: src/Module/Contact.php:539
+#: src/Module/Contact.php:553
 msgid "Communications lost with this contact!"
 msgstr "Communications perdues avec ce contact !"
 
-#: src/Module/Contact.php:545
+#: src/Module/Contact.php:559
 msgid "Fetch further information for feeds"
 msgstr "Chercher plus d'informations pour les flux"
 
-#: src/Module/Contact.php:547
+#: src/Module/Contact.php:561
 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 ""
 
-#: src/Module/Contact.php:550
+#: src/Module/Contact.php:564
 msgid "Fetch information"
 msgstr "Récupérer informations"
 
-#: src/Module/Contact.php:551
+#: src/Module/Contact.php:565
 msgid "Fetch keywords"
 msgstr ""
 
-#: src/Module/Contact.php:552
+#: src/Module/Contact.php:566
 msgid "Fetch information and keywords"
 msgstr "Récupérer informations"
 
-#: src/Module/Contact.php:584
+#: src/Module/Contact.php:585
 msgid "Profile Visibility"
 msgstr "Visibilité du profil"
 
-#: src/Module/Contact.php:585
+#: src/Module/Contact.php:586
 msgid "Contact Information / Notes"
 msgstr "Informations de contact / Notes"
 
-#: src/Module/Contact.php:586
+#: src/Module/Contact.php:587
 msgid "Contact Settings"
 msgstr "Paramètres du Contact"
 
-#: src/Module/Contact.php:595
+#: src/Module/Contact.php:596
 msgid "Contact"
 msgstr "Contact"
 
-#: src/Module/Contact.php:599
+#: src/Module/Contact.php:600
 #, php-format
 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."
 
-#: src/Module/Contact.php:601
+#: src/Module/Contact.php:602
 msgid "Their personal note"
 msgstr ""
 
-#: src/Module/Contact.php:603
+#: src/Module/Contact.php:604
 msgid "Edit contact notes"
 msgstr "Éditer les notes des contacts"
 
-#: src/Module/Contact.php:607
+#: src/Module/Contact.php:607 src/Module/Contact.php:1023
+#: src/Module/Profile/Contacts.php:93
+#, php-format
+msgid "Visit %s's profile [%s]"
+msgstr "Visiter le profil de %s [%s]"
+
+#: src/Module/Contact.php:608
 msgid "Block/Unblock contact"
 msgstr "Bloquer/débloquer ce contact"
 
-#: src/Module/Contact.php:608
+#: src/Module/Contact.php:609
 msgid "Ignore contact"
 msgstr "Ignorer ce contact"
 
-#: src/Module/Contact.php:609
+#: src/Module/Contact.php:610
 msgid "Repair URL settings"
 msgstr "Réglages de réparation des URL"
 
-#: src/Module/Contact.php:610
+#: src/Module/Contact.php:611
 msgid "View conversations"
 msgstr "Voir les conversations"
 
-#: src/Module/Contact.php:615
+#: src/Module/Contact.php:616
 msgid "Last update:"
 msgstr "Dernière mise-à-jour :"
 
-#: src/Module/Contact.php:617
+#: src/Module/Contact.php:618
 msgid "Update public posts"
 msgstr "Mettre à jour les publications publiques:"
 
-#: src/Module/Contact.php:619 src/Module/Contact.php:1071
+#: src/Module/Contact.php:620 src/Module/Contact.php:1067
 msgid "Update now"
 msgstr "Mettre à jour"
 
-#: src/Module/Contact.php:625 src/Module/Contact.php:828
-#: src/Module/Contact.php:1088
+#: src/Module/Contact.php:624 src/Module/Contact.php:828
+#: src/Module/Contact.php:1084
 msgid "Unignore"
 msgstr "Ne plus ignorer"
 
-#: src/Module/Contact.php:629
+#: src/Module/Contact.php:628
 msgid "Currently blocked"
 msgstr "Actuellement bloqué"
 
-#: src/Module/Contact.php:630
+#: src/Module/Contact.php:629
 msgid "Currently ignored"
 msgstr "Actuellement ignoré"
 
-#: src/Module/Contact.php:631
+#: src/Module/Contact.php:630
 msgid "Currently archived"
 msgstr "Actuellement archivé"
 
-#: src/Module/Contact.php:632
+#: src/Module/Contact.php:631
 msgid "Awaiting connection acknowledge"
 msgstr ""
 
-#: src/Module/Contact.php:633
+#: src/Module/Contact.php:632
 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:634
+#: src/Module/Contact.php:633
 msgid "Notification for new posts"
 msgstr "Notification des nouvelles publications"
 
-#: src/Module/Contact.php:634
+#: src/Module/Contact.php:633
 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/Contact.php:636
+#: src/Module/Contact.php:635
 msgid "Blacklisted keywords"
 msgstr "Mots-clés sur la liste noire"
 
-#: src/Module/Contact.php:636
+#: src/Module/Contact.php:635
 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:653 src/Module/Settings/TwoFactor/Index.php:100
+#: src/Module/Contact.php:652 src/Module/Settings/TwoFactor/Index.php:111
 msgid "Actions"
 msgstr "Actions"
 
-#: src/Module/Contact.php:700
-msgid "Suggestions"
-msgstr "Suggestions"
-
-#: src/Module/Contact.php:703
-msgid "Suggest potential friends"
-msgstr "Suggérer des amis potentiels"
-
-#: src/Module/Contact.php:708 src/Module/Group.php:287
-msgid "All Contacts"
-msgstr "Tous les contacts"
-
-#: src/Module/Contact.php:711
+#: src/Module/Contact.php:697
 msgid "Show all contacts"
 msgstr "Montrer tous les contacts"
 
-#: src/Module/Contact.php:716
-msgid "Unblocked"
-msgstr "Non-bloqués"
-
-#: src/Module/Contact.php:719
-msgid "Only show unblocked contacts"
-msgstr "Ne montrer que les contacts non-bloqués"
-
-#: src/Module/Contact.php:724
+#: src/Module/Contact.php:702 src/Module/Contact.php:804
 msgid "Blocked"
 msgstr "Bloqués"
 
-#: src/Module/Contact.php:727
+#: src/Module/Contact.php:705
 msgid "Only show blocked contacts"
 msgstr "Ne montrer que les contacts bloqués"
 
-#: src/Module/Contact.php:732
+#: src/Module/Contact.php:710 src/Module/Contact.php:806
 msgid "Ignored"
 msgstr "Ignorés"
 
-#: src/Module/Contact.php:735
+#: src/Module/Contact.php:713
 msgid "Only show ignored contacts"
 msgstr "Ne montrer que les contacts ignorés"
 
-#: src/Module/Contact.php:740
+#: src/Module/Contact.php:718 src/Module/Contact.php:807
 msgid "Archived"
 msgstr "Archivés"
 
-#: src/Module/Contact.php:743
+#: src/Module/Contact.php:721
 msgid "Only show archived contacts"
 msgstr "Ne montrer que les contacts archivés"
 
-#: src/Module/Contact.php:748
+#: src/Module/Contact.php:726 src/Module/Contact.php:805
 msgid "Hidden"
 msgstr "Cachés"
 
-#: src/Module/Contact.php:751
+#: src/Module/Contact.php:729
 msgid "Only show hidden contacts"
 msgstr "Ne montrer que les contacts masqués"
 
-#: src/Module/Contact.php:759
+#: src/Module/Contact.php:737
 msgid "Organize your contact groups"
 msgstr ""
 
@@ -8908,11 +9029,11 @@ msgstr ""
 msgid "Search your contacts"
 msgstr "Rechercher dans vos contacts"
 
-#: src/Module/Contact.php:829 src/Module/Contact.php:1097
+#: src/Module/Contact.php:829 src/Module/Contact.php:1093
 msgid "Archive"
 msgstr "Archiver"
 
-#: src/Module/Contact.php:829 src/Module/Contact.php:1097
+#: src/Module/Contact.php:829 src/Module/Contact.php:1093
 msgid "Unarchive"
 msgstr "Désarchiver"
 
@@ -8940,79 +9061,217 @@ msgstr "Voir tous les amis communs"
 msgid "Advanced Contact Settings"
 msgstr "Réglages avancés du contact"
 
-#: src/Module/Contact.php:994
+#: src/Module/Contact.php:990
 msgid "Mutual Friendship"
 msgstr "Relation réciproque"
 
-#: src/Module/Contact.php:999
+#: src/Module/Contact.php:995
 msgid "is a fan of yours"
 msgstr "Vous suit"
 
-#: src/Module/Contact.php:1004
+#: src/Module/Contact.php:1000
 msgid "you are a fan of"
 msgstr "Vous le/la suivez"
 
-#: src/Module/Contact.php:1028
+#: src/Module/Contact.php:1024
 msgid "Edit contact"
 msgstr "Éditer le contact"
 
-#: src/Module/Contact.php:1082
+#: src/Module/Contact.php:1078
 msgid "Toggle Blocked status"
 msgstr "(dés)activer l'état \"bloqué\""
 
-#: src/Module/Contact.php:1090
+#: src/Module/Contact.php:1086
 msgid "Toggle Ignored status"
 msgstr "(dés)activer l'état \"ignoré\""
 
-#: src/Module/Contact.php:1099
+#: src/Module/Contact.php:1095
 msgid "Toggle Archive status"
 msgstr "(dés)activer l'état \"archivé\""
 
-#: src/Module/Contact.php:1107
+#: src/Module/Contact.php:1103
 msgid "Delete contact"
 msgstr "Effacer ce contact"
 
-#: src/Module/Credits.php:25
-msgid "Credits"
-msgstr "Remerciements"
+#: src/Module/Debug/Babel.php:32
+msgid "Source input"
+msgstr "Saisie source"
 
-#: src/Module/Credits.php:26
+#: src/Module/Debug/Babel.php:38
+msgid "BBCode::toPlaintext"
+msgstr "BBCode::toPlaintext"
+
+#: src/Module/Debug/Babel.php:44
+msgid "BBCode::convert (raw HTML)"
+msgstr "BBCode::convert (code HTML)"
+
+#: src/Module/Debug/Babel.php:49
+msgid "BBCode::convert"
+msgstr "BBCode::convert"
+
+#: src/Module/Debug/Babel.php:55
+msgid "BBCode::convert => HTML::toBBCode"
+msgstr "BBCode::convert => HTML::toBBCode"
+
+#: src/Module/Debug/Babel.php:61
+msgid "BBCode::toMarkdown"
+msgstr "BBCode::toMarkdown"
+
+#: src/Module/Debug/Babel.php:67
+msgid "BBCode::toMarkdown => Markdown::convert"
+msgstr "BBCode::toMarkdown => Markdown::convert"
+
+#: src/Module/Debug/Babel.php:73
+msgid "BBCode::toMarkdown => Markdown::toBBCode"
+msgstr "BBCode::toMarkdown => Markdown::toBBCode"
+
+#: src/Module/Debug/Babel.php:79
+msgid "BBCode::toMarkdown =>  Markdown::convert => HTML::toBBCode"
+msgstr "BBCode::toMarkdown =>  Markdown::convert => HTML::toBBCode"
+
+#: src/Module/Debug/Babel.php:90
+msgid "Item Body"
+msgstr "Corps du message"
+
+#: src/Module/Debug/Babel.php:94
+msgid "Item Tags"
+msgstr "Tags du messages"
+
+#: src/Module/Debug/Babel.php:101
+msgid "Source input (Diaspora format)"
+msgstr "Saisie source (format Diaspora)"
+
+#: src/Module/Debug/Babel.php:107
+msgid "Markdown::convert (raw HTML)"
+msgstr "Markdown::convert (code HTML)"
+
+#: src/Module/Debug/Babel.php:112
+msgid "Markdown::convert"
+msgstr "Markdown::convert"
+
+#: src/Module/Debug/Babel.php:118
+msgid "Markdown::toBBCode"
+msgstr "Markdown::toBBCode"
+
+#: src/Module/Debug/Babel.php:125
+msgid "Raw HTML input"
+msgstr "Saisie code HTML"
+
+#: src/Module/Debug/Babel.php:130
+msgid "HTML Input"
+msgstr "Code HTML"
+
+#: src/Module/Debug/Babel.php:136
+msgid "HTML::toBBCode"
+msgstr "HTML::toBBCode"
+
+#: src/Module/Debug/Babel.php:142
+msgid "HTML::toBBCode => BBCode::convert"
+msgstr "HTML::toBBCode => BBCode::convert"
+
+#: src/Module/Debug/Babel.php:147
+msgid "HTML::toBBCode => BBCode::convert (raw HTML)"
+msgstr "HTML::toBBCode => BBCode::convert (code HTML)"
+
+#: src/Module/Debug/Babel.php:153
+msgid "HTML::toBBCode => BBCode::toPlaintext"
+msgstr ""
+
+#: src/Module/Debug/Babel.php:159
+msgid "HTML::toMarkdown"
+msgstr "HTML::toMarkdown"
+
+#: src/Module/Debug/Babel.php:165
+msgid "HTML::toPlaintext"
+msgstr "HTML::toPlaintext"
+
+#: src/Module/Debug/Babel.php:171
+msgid "HTML::toPlaintext (compact)"
+msgstr ""
+
+#: src/Module/Debug/Babel.php:179
+msgid "Source text"
+msgstr "Texte source"
+
+#: src/Module/Debug/Babel.php:180
+msgid "BBCode"
+msgstr "BBCode"
+
+#: src/Module/Debug/Babel.php:181
+msgid "Markdown"
+msgstr "Markdown"
+
+#: src/Module/Debug/Babel.php:182
+msgid "HTML"
+msgstr "HTML"
+
+#: src/Module/Debug/Feed.php:20 src/Module/Filer/SaveTag.php:20
+msgid "You must be logged in to use this module"
+msgstr "Vous devez être identifié pour accéder à cette fonctionnalité"
+
+#: src/Module/Debug/Feed.php:49
+msgid "Source URL"
+msgstr "URL Source"
+
+#: src/Module/Debug/Localtime.php:30
+msgid "Time Conversion"
+msgstr "Conversion temporelle"
+
+#: src/Module/Debug/Localtime.php:31
 msgid ""
-"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!"
-msgstr "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!"
+"Friendica provides this service for sharing events with other networks and "
+"friends in unknown timezones."
+msgstr "Friendica fournit ce service pour partager des événements avec d'autres réseaux et amis indépendament de leur fuseau horaire."
+
+#: src/Module/Debug/Localtime.php:32
+#, php-format
+msgid "UTC time: %s"
+msgstr "Temps UTC : %s"
+
+#: src/Module/Debug/Localtime.php:35
+#, php-format
+msgid "Current timezone: %s"
+msgstr "Zone de temps courante : %s"
+
+#: src/Module/Debug/Localtime.php:39
+#, php-format
+msgid "Converted localtime: %s"
+msgstr "Temps local converti : %s"
+
+#: src/Module/Debug/Localtime.php:43
+msgid "Please select your timezone:"
+msgstr "Sélectionner votre zone :"
+
+#: src/Module/Debug/Probe.php:19 src/Module/Debug/WebFinger.php:18
+msgid "Only logged in users are permitted to perform a probing."
+msgstr ""
 
-#: src/Module/Directory.php:66
+#: src/Module/Debug/Probe.php:35
+msgid "Lookup address"
+msgstr ""
+
+#: src/Module/Directory.php:61
 msgid "No entries (some entries may be hidden)."
 msgstr "Aucune entrée (certaines peuvent être cachées)."
 
-#: src/Module/Directory.php:85
+#: src/Module/Directory.php:80
 msgid "Find on this site"
 msgstr "Trouver sur ce site"
 
-#: src/Module/Directory.php:87
+#: src/Module/Directory.php:82
 msgid "Results for:"
 msgstr "Résultats pour :"
 
-#: src/Module/Directory.php:89
+#: src/Module/Directory.php:84
 msgid "Site Directory"
 msgstr "Annuaire local"
 
-#: src/Module/Feedtest.php:20 src/Module/Filer/SaveTag.php:20
-msgid "You must be logged in to use this module"
-msgstr "Vous devez être identifié pour accéder à cette fonctionnalité"
-
-#: src/Module/Feedtest.php:49
-msgid "Source URL"
-msgstr "URL Source"
-
 #: src/Module/Filer/SaveTag.php:39
 #, php-format
 msgid "Filetag %s saved to item"
 msgstr ""
 
-#: src/Module/Filer/SaveTag.php:49
+#: src/Module/Filer/SaveTag.php:48
 msgid "- select -"
 msgstr "- choisir -"
 
@@ -9167,143 +9426,143 @@ msgstr "Aide :"
 msgid "Welcome to %s"
 msgstr "Bienvenue sur %s"
 
-#: src/Module/Install.php:158
+#: src/Module/Install.php:160
 msgid "Friendica Communications Server - Setup"
 msgstr ""
 
-#: src/Module/Install.php:169
+#: src/Module/Install.php:171
 msgid "System check"
 msgstr "Vérifications système"
 
-#: src/Module/Install.php:174
+#: src/Module/Install.php:176
 msgid "Check again"
 msgstr "Vérifier à nouveau"
 
-#: src/Module/Install.php:189
+#: src/Module/Install.php:191
 msgid "Base settings"
 msgstr ""
 
-#: src/Module/Install.php:196
+#: src/Module/Install.php:198
 msgid "Host name"
 msgstr "Nom de la machine hôte"
 
-#: src/Module/Install.php:198
+#: src/Module/Install.php:200
 msgid ""
 "Overwrite this field in case the determinated hostname isn't right, "
 "otherweise leave it as is."
 msgstr ""
 
-#: src/Module/Install.php:201
+#: src/Module/Install.php:203
 msgid "Base path to installation"
 msgstr "Chemin de base de l'installation"
 
-#: src/Module/Install.php:203
+#: src/Module/Install.php:205
 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 "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."
 
-#: src/Module/Install.php:206
+#: src/Module/Install.php:208
 msgid "Sub path of the URL"
 msgstr ""
 
-#: src/Module/Install.php:208
+#: src/Module/Install.php:210
 msgid ""
 "Overwrite this field in case the sub path determination isn't right, "
 "otherwise leave it as is. Leaving this field blank means the installation is"
 " at the base URL without sub path."
 msgstr ""
 
-#: src/Module/Install.php:219
+#: src/Module/Install.php:221
 msgid "Database connection"
 msgstr "Connexion à la base de données"
 
-#: src/Module/Install.php:220
+#: src/Module/Install.php:222
 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/Install.php:221
+#: src/Module/Install.php:223
 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/Install.php:222
+#: src/Module/Install.php:224
 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/Install.php:229
+#: src/Module/Install.php:231
 msgid "Database Server Name"
 msgstr "Serveur de base de données"
 
-#: src/Module/Install.php:234
+#: src/Module/Install.php:236
 msgid "Database Login Name"
 msgstr "Nom d'utilisateur de la base"
 
-#: src/Module/Install.php:240
+#: src/Module/Install.php:242
 msgid "Database Login Password"
 msgstr "Mot de passe de la base"
 
-#: src/Module/Install.php:242
+#: src/Module/Install.php:244
 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/Install.php:245
+#: src/Module/Install.php:247
 msgid "Database Name"
 msgstr "Nom de la base"
 
-#: src/Module/Install.php:249 src/Module/Install.php:278
+#: src/Module/Install.php:251 src/Module/Install.php:280
 msgid "Please select a default timezone for your website"
 msgstr "Sélectionner un fuseau horaire par défaut pour votre site"
 
-#: src/Module/Install.php:263
+#: src/Module/Install.php:265
 msgid "Site settings"
 msgstr "Réglages du site"
 
-#: src/Module/Install.php:273
+#: src/Module/Install.php:275
 msgid "Site administrator email address"
 msgstr "Adresse électronique de l'administrateur du site"
 
-#: src/Module/Install.php:275
+#: src/Module/Install.php:277
 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/Module/Install.php:282
+#: src/Module/Install.php:284
 msgid "System Language:"
 msgstr "Langue système :"
 
-#: src/Module/Install.php:284
+#: src/Module/Install.php:286
 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/Install.php:296
+#: src/Module/Install.php:298
 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/Install.php:304
+#: src/Module/Install.php:306
 msgid "Installation finished"
 msgstr ""
 
-#: src/Module/Install.php:326
+#: src/Module/Install.php:328
 msgid "<h1>What next</h1>"
 msgstr "<h1>Ensuite</h1>"
 
-#: src/Module/Install.php:327
+#: src/Module/Install.php:329
 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/Module/Install.php:330
+#: src/Module/Install.php:332
 #, php-format
 msgid ""
 "Go to your new Friendica node <a href=\"%s/register\">registration page</a> "
@@ -9415,72 +9674,93 @@ msgid ""
 "important, please visit http://friendi.ca"
 msgstr ""
 
-#: src/Module/Localtime.php:30
-msgid "Time Conversion"
-msgstr "Conversion temporelle"
+#: src/Module/Item/Compose.php:30
+msgid "Please enter a post body."
+msgstr ""
 
-#: src/Module/Localtime.php:31
-msgid ""
-"Friendica provides this service for sharing events with other networks and "
-"friends in unknown timezones."
-msgstr "Friendica fournit ce service pour partager des événements avec d'autres réseaux et amis indépendament de leur fuseau horaire."
+#: src/Module/Item/Compose.php:43
+msgid "This feature is only available with the frio theme."
+msgstr ""
 
-#: src/Module/Localtime.php:32
-#, php-format
-msgid "UTC time: %s"
-msgstr "Temps UTC : %s"
+#: src/Module/Item/Compose.php:63
+msgid "Compose new personal note"
+msgstr ""
 
-#: src/Module/Localtime.php:35
-#, php-format
-msgid "Current timezone: %s"
-msgstr "Zone de temps courante : %s"
+#: src/Module/Item/Compose.php:70
+msgid "Compose new post"
+msgstr ""
 
-#: src/Module/Localtime.php:39
-#, php-format
-msgid "Converted localtime: %s"
-msgstr "Temps local converti : %s"
+#: src/Module/Item/Compose.php:190
+msgid "Clear the location"
+msgstr ""
 
-#: src/Module/Localtime.php:43
-msgid "Please select your timezone:"
-msgstr "Sélectionner votre zone :"
+#: src/Module/Item/Compose.php:191
+msgid "Location services are unavailable on your device"
+msgstr ""
+
+#: src/Module/Item/Compose.php:192
+msgid ""
+"Location services are disabled. Please check the website's permissions on "
+"your device"
+msgstr ""
+
+#: src/Module/Item/Compose.php:196
+msgid "Public"
+msgstr ""
+
+#: src/Module/Item/Compose.php:197
+msgid ""
+"This post will be sent to all your followers and can be seen in the "
+"community pages and by anyone with its link."
+msgstr ""
+
+#: src/Module/Item/Compose.php:198
+msgid "Limited/Private"
+msgstr ""
 
-#: src/Module/Login.php:295
+#: src/Module/Item/Compose.php:199
+msgid ""
+"This post will be sent only to the people in the first box, to the exception"
+" of the people mentioned in the second box. It won't appear anywhere public."
+msgstr ""
+
+#: src/Module/Login.php:286
 msgid "Create a New Account"
 msgstr "Créer un nouveau compte"
 
-#: src/Module/Login.php:328
+#: src/Module/Login.php:319
 msgid "Password: "
 msgstr "Mot de passe : "
 
-#: src/Module/Login.php:329
+#: src/Module/Login.php:320
 msgid "Remember me"
 msgstr "Se souvenir de moi"
 
-#: src/Module/Login.php:332
+#: src/Module/Login.php:323
 msgid "Or login using OpenID: "
 msgstr "Ou connectez-vous via OpenID : "
 
-#: src/Module/Login.php:338
+#: src/Module/Login.php:329
 msgid "Forgot your password?"
 msgstr "Mot de passe oublié?"
 
-#: src/Module/Login.php:341
+#: src/Module/Login.php:332
 msgid "Website Terms of Service"
 msgstr "Conditions d'utilisation du site internet"
 
-#: src/Module/Login.php:342
+#: src/Module/Login.php:333
 msgid "terms of service"
 msgstr "conditions d'utilisation"
 
-#: src/Module/Login.php:344
+#: src/Module/Login.php:335
 msgid "Website Privacy Policy"
 msgstr "Politique de confidentialité du site internet"
 
-#: src/Module/Login.php:345
+#: src/Module/Login.php:336
 msgid "privacy policy"
 msgstr "politique de confidentialité"
 
-#: src/Module/Logout.php:27
+#: src/Module/Logout.php:38
 msgid "Logged out."
 msgstr "Déconnecté."
 
@@ -9497,20 +9777,44 @@ msgstr "Page introuvable."
 msgid "Invalid photo with id %s."
 msgstr ""
 
-#: src/Module/Profile.php:110 src/Module/Profile.php:113
-#: src/Protocol/OStatus.php:1302
-#, php-format
-msgid "%s's timeline"
+#: src/Module/Profile/Contacts.php:23 src/Module/Profile/Contacts.php:36
+msgid "User not found."
 msgstr ""
 
-#: src/Module/Profile.php:111 src/Protocol/OStatus.php:1306
+#: src/Module/Profile/Contacts.php:78
+msgid "No contacts."
+msgstr "Aucun contact."
+
+#: src/Module/Profile/Contacts.php:112
 #, php-format
-msgid "%s's posts"
-msgstr ""
+msgid "Follower (%s)"
+msgid_plural "Followers (%s)"
+msgstr[0] ""
+msgstr[1] ""
 
-#: src/Module/Profile.php:112 src/Protocol/OStatus.php:1309
+#: src/Module/Profile/Contacts.php:113
 #, php-format
-msgid "%s's comments"
+msgid "Following (%s)"
+msgid_plural "Following (%s)"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Module/Profile/Contacts.php:114
+#, php-format
+msgid "Mutual friend (%s)"
+msgid_plural "Mutual friends (%s)"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Module/Profile/Contacts.php:116
+#, php-format
+msgid "Contact (%s)"
+msgid_plural "Contacts (%s)"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Module/Profile/Contacts.php:125
+msgid "All contacts"
 msgstr ""
 
 #: src/Module/Register.php:83
@@ -9606,79 +9910,170 @@ msgstr "Votre inscription ne peut être traitée."
 msgid "Your registration is pending approval by the site owner."
 msgstr "Votre inscription attend une validation du propriétaire du site."
 
-#: src/Module/Settings/TwoFactor/Index.php:50
+#: src/Module/Settings/TwoFactor/AppSpecific.php:36
+#: src/Module/Settings/TwoFactor/Recovery.php:34
+#: src/Module/Settings/TwoFactor/Verify.php:41
+msgid "Please enter your password to access this page."
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:54
+msgid "App-specific password generation failed: The description is empty."
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:57
+msgid ""
+"App-specific password generation failed: This description already exists."
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:61
+msgid "New app-specific password generated."
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:67
+msgid "App-specific passwords successfully revoked."
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:77
+msgid "App-specific password successfully revoked."
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:98
+msgid "Two-factor app-specific passwords"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:100
+msgid ""
+"<p>App-specific passwords are randomly generated passwords used instead your"
+" regular password to authenticate your account on third-party applications "
+"that don't support two-factor authentication.</p>"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:101
+msgid ""
+"Make sure to copy your new app-specific password now. You won’t be able to "
+"see it again!"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:104
+msgid "Description"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:105
+msgid "Last Used"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:106
+msgid "Revoke"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:107
+msgid "Revoke All"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:110
+msgid ""
+"When you generate a new app-specific password, you must use it right away, "
+"it will be shown to you once after you generate it."
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:111
+msgid "Generate new app-specific password"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:112
+msgid "Friendiqa on my Fairphone 2..."
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:113
+msgid "Generate"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/Index.php:51
 msgid "Two-factor authentication successfully disabled."
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:86
+#: src/Module/Settings/TwoFactor/Index.php:92
 msgid ""
 "<p>Use an application on a mobile device to get two-factor authentication "
 "codes when prompted on login.</p>"
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:90
+#: src/Module/Settings/TwoFactor/Index.php:96
 msgid "Authenticator app"
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:91
+#: src/Module/Settings/TwoFactor/Index.php:97
 msgid "Configured"
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:91
+#: src/Module/Settings/TwoFactor/Index.php:97
 msgid "Not Configured"
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:92
+#: src/Module/Settings/TwoFactor/Index.php:98
 msgid "<p>You haven't finished configuring your authenticator app.</p>"
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:93
+#: src/Module/Settings/TwoFactor/Index.php:99
 msgid "<p>Your authenticator app is correctly configured.</p>"
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:95
+#: src/Module/Settings/TwoFactor/Index.php:101
 msgid "Recovery codes"
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:96
+#: src/Module/Settings/TwoFactor/Index.php:102
 msgid "Remaining valid codes"
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:98
+#: src/Module/Settings/TwoFactor/Index.php:104
 msgid ""
 "<p>These one-use codes can replace an authenticator app code in case you "
 "have lost access to it.</p>"
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:101
+#: src/Module/Settings/TwoFactor/Index.php:106
+msgid "App-specific passwords"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/Index.php:107
+msgid "Generated app-specific passwords"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/Index.php:109
+msgid ""
+"<p>These randomly generated passwords allow you to authenticate on apps not "
+"supporting two-factor authentication.</p>"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/Index.php:112
 msgid "Current password:"
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:101
+#: src/Module/Settings/TwoFactor/Index.php:112
 msgid ""
 "You need to provide your current password to change two-factor "
 "authentication settings."
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:102
+#: src/Module/Settings/TwoFactor/Index.php:113
 msgid "Enable two-factor authentication"
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:103
+#: src/Module/Settings/TwoFactor/Index.php:114
 msgid "Disable two-factor authentication"
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:104
+#: src/Module/Settings/TwoFactor/Index.php:115
 msgid "Show recovery codes"
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:105
-msgid "Finish app configuration"
+#: src/Module/Settings/TwoFactor/Index.php:116
+msgid "Manage app-specific passwords"
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Recovery.php:34
-#: src/Module/Settings/TwoFactor/Verify.php:41
-msgid "Please enter your password to access this page."
+#: src/Module/Settings/TwoFactor/Index.php:117
+msgid "Finish app configuration"
 msgstr ""
 
 #: src/Module/Settings/TwoFactor/Recovery.php:50
@@ -9717,7 +10112,7 @@ msgid "Two-factor authentication successfully activated."
 msgstr ""
 
 #: src/Module/Settings/TwoFactor/Verify.php:67
-#: src/Module/TwoFactor/Recovery.php:46 src/Module/TwoFactor/Verify.php:41
+#: src/Module/TwoFactor/Recovery.php:46 src/Module/TwoFactor/Verify.php:43
 msgid "Invalid code, please retry."
 msgstr ""
 
@@ -9759,7 +10154,7 @@ msgid ""
 msgstr ""
 
 #: src/Module/Settings/TwoFactor/Verify.php:126
-#: src/Module/TwoFactor/Verify.php:63
+#: src/Module/TwoFactor/Verify.php:67
 msgid "Please enter a code from your authentication app"
 msgstr ""
 
@@ -9815,534 +10210,431 @@ msgid ""
 msgstr ""
 
 #: src/Module/Special/HTTPException.php:48
-msgid ""
-"An unexpected condition was encountered and no more specific message is "
-"suitable."
-msgstr ""
-
-#: src/Module/Special/HTTPException.php:49
-msgid ""
-"The server is currently unavailable (because it is overloaded or down for "
-"maintenance). Please try again later."
-msgstr ""
-
-#: src/Module/Special/HTTPException.php:55
-msgid "Go back"
-msgstr ""
-
-#: 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/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/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/Tos.php:40 src/Module/Tos.php:76
-msgid "Privacy Statement"
-msgstr ""
-
-#: src/Module/TwoFactor/Recovery.php:41
-#, php-format
-msgid "Remaining recovery codes: %d"
-msgstr ""
-
-#: src/Module/TwoFactor/Recovery.php:65
-msgid "Two-factor recovery"
-msgstr ""
-
-#: src/Module/TwoFactor/Recovery.php:66
-msgid ""
-"<p>You can enter one of your one-time recovery codes in case you lost access"
-" to your mobile device.</p>"
-msgstr ""
-
-#: src/Module/TwoFactor/Recovery.php:67 src/Module/TwoFactor/Verify.php:62
-#, php-format
-msgid "Don’t have your phone? <a href=\"%s\">Enter a two-factor recovery code</a>"
-msgstr ""
-
-#: src/Module/TwoFactor/Recovery.php:68
-msgid "Please enter a recovery code"
-msgstr ""
-
-#: src/Module/TwoFactor/Recovery.php:69
-msgid "Submit recovery code and complete login"
-msgstr ""
-
-#: src/Module/TwoFactor/Verify.php:61
-msgid ""
-"<p>Open the two-factor authentication app on your device to get an "
-"authentication code and verify your identity.</p>"
-msgstr ""
-
-#: src/Module/TwoFactor/Verify.php:64
-msgid "Verify code and complete login"
-msgstr ""
-
-#: src/Object/Post.php:137
-msgid "This entry was edited"
-msgstr "Cette entrée a été éditée"
-
-#: src/Object/Post.php:157
-msgid "Private Message"
-msgstr "Message privé"
-
-#: src/Object/Post.php:199
-msgid "Delete locally"
-msgstr ""
-
-#: src/Object/Post.php:202
-msgid "Delete globally"
-msgstr ""
-
-#: src/Object/Post.php:202
-msgid "Remove locally"
-msgstr ""
-
-#: src/Object/Post.php:216
-msgid "save to folder"
-msgstr "sauver vers dossier"
-
-#: src/Object/Post.php:251
-msgid "I will attend"
-msgstr "Je vais participer"
-
-#: src/Object/Post.php:251
-msgid "I will not attend"
-msgstr "Je ne vais pas participer"
-
-#: src/Object/Post.php:251
-msgid "I might attend"
-msgstr "Je vais peut-être participer"
-
-#: src/Object/Post.php:279
-msgid "ignore thread"
-msgstr "ignorer le fil"
-
-#: src/Object/Post.php:280
-msgid "unignore thread"
-msgstr "Ne plus ignorer le fil"
-
-#: src/Object/Post.php:281
-msgid "toggle ignore status"
-msgstr "Ignorer le statut"
-
-#: src/Object/Post.php:292
-msgid "add star"
-msgstr "mettre en avant"
-
-#: src/Object/Post.php:293
-msgid "remove star"
-msgstr "ne plus mettre en avant"
-
-#: src/Object/Post.php:294
-msgid "toggle star status"
-msgstr "mettre en avant"
-
-#: src/Object/Post.php:297
-msgid "starred"
-msgstr "mis en avant"
-
-#: src/Object/Post.php:301
-msgid "add tag"
-msgstr "ajouter une étiquette"
-
-#: src/Object/Post.php:312
-msgid "like"
-msgstr "aime"
-
-#: src/Object/Post.php:313
-msgid "dislike"
-msgstr "n'aime pas"
-
-#: src/Object/Post.php:316
-msgid "Share this"
-msgstr "Partager"
-
-#: src/Object/Post.php:316
-msgid "share"
-msgstr "partager"
-
-#: src/Object/Post.php:384
-msgid "to"
-msgstr "à"
-
-#: src/Object/Post.php:385
-msgid "via"
-msgstr "via"
+msgid ""
+"An unexpected condition was encountered and no more specific message is "
+"suitable."
+msgstr ""
 
-#: src/Object/Post.php:386
-msgid "Wall-to-Wall"
-msgstr "Inter-mur"
+#: src/Module/Special/HTTPException.php:49
+msgid ""
+"The server is currently unavailable (because it is overloaded or down for "
+"maintenance). Please try again later."
+msgstr ""
 
-#: src/Object/Post.php:387
-msgid "via Wall-To-Wall:"
-msgstr "en Inter-mur :"
+#: src/Module/Special/HTTPException.php:55
+msgid "Go back"
+msgstr ""
 
-#: src/Object/Post.php:420
+#: src/Module/TwoFactor/Recovery.php:41
 #, php-format
-msgid "Reply to %s"
+msgid "Remaining recovery codes: %d"
 msgstr ""
 
-#: src/Object/Post.php:435
-msgid "Notifier task is pending"
+#: src/Module/TwoFactor/Recovery.php:65
+msgid "Two-factor recovery"
 msgstr ""
 
-#: src/Object/Post.php:436
-msgid "Delivery to remote servers is pending"
+#: src/Module/TwoFactor/Recovery.php:66
+msgid ""
+"<p>You can enter one of your one-time recovery codes in case you lost access"
+" to your mobile device.</p>"
 msgstr ""
 
-#: src/Object/Post.php:437
-msgid "Delivery to remote servers is underway"
+#: src/Module/TwoFactor/Recovery.php:67 src/Module/TwoFactor/Verify.php:66
+#, php-format
+msgid "Don’t have your phone? <a href=\"%s\">Enter a two-factor recovery code</a>"
 msgstr ""
 
-#: src/Object/Post.php:438
-msgid "Delivery to remote servers is mostly done"
+#: src/Module/TwoFactor/Recovery.php:68
+msgid "Please enter a recovery code"
 msgstr ""
 
-#: src/Object/Post.php:439
-msgid "Delivery to remote servers is done"
+#: src/Module/TwoFactor/Recovery.php:69
+msgid "Submit recovery code and complete login"
 msgstr ""
 
-#: src/Object/Post.php:459
-#, php-format
-msgid "%d comment"
-msgid_plural "%d comments"
-msgstr[0] "%d commentaire"
-msgstr[1] "%d commentaires"
-
-#: src/Object/Post.php:460
-msgid "Show more"
+#: src/Module/TwoFactor/Verify.php:63
+msgid ""
+"<p>Open the two-factor authentication app on your device to get an "
+"authentication code and verify your identity.</p>"
 msgstr ""
 
-#: src/Object/Post.php:461
-msgid "Show fewer"
+#: src/Module/TwoFactor/Verify.php:68
+msgid "Verify code and complete login"
 msgstr ""
 
-#: src/Protocol/Diaspora.php:2438
-msgid "Sharing notification from Diaspora network"
-msgstr "Notification de partage du réseau Diaspora"
+#: src/Module/Welcome.php:25
+msgid "Welcome to Friendica"
+msgstr "Bienvenue sur Friendica"
 
-#: src/Protocol/Diaspora.php:3598
-msgid "Attachments:"
-msgstr "Pièces jointes : "
+#: src/Module/Welcome.php:26
+msgid "New Member Checklist"
+msgstr "Checklist du nouvel utilisateur"
 
-#: src/Protocol/OStatus.php:1863
-#, php-format
-msgid "%s is now following %s."
-msgstr "%s suit désormais %s."
+#: src/Module/Welcome.php:27
+msgid ""
+"We would like to offer some tips and links to help make your experience "
+"enjoyable. Click any item to visit the relevant page. A link to this page "
+"will be visible from your home page for two weeks after your initial "
+"registration and then will quietly disappear."
+msgstr "Nous souhaiterions vous donner quelques astuces et ressources pour rendre votre expérience la plus agréable possible. Cliquez sur n'importe lequel de ces éléments pour visiter la page correspondante. Un lien vers cette page restera visible sur votre page d'accueil pendant les deux semaines qui suivent votre inscription initiale, puis disparaîtra silencieusement."
 
-#: src/Protocol/OStatus.php:1864
-msgid "following"
-msgstr "following"
+#: src/Module/Welcome.php:29
+msgid "Getting Started"
+msgstr "Bien démarrer"
 
-#: src/Protocol/OStatus.php:1867
-#, php-format
-msgid "%s stopped following %s."
-msgstr "%s ne suit plus %s."
+#: src/Module/Welcome.php:30
+msgid "Friendica Walk-Through"
+msgstr "Friendica pas-à-pas"
 
-#: src/Protocol/OStatus.php:1868
-msgid "stopped following"
-msgstr "retiré de la liste de suivi"
+#: src/Module/Welcome.php:31
+msgid ""
+"On your <em>Quick Start</em> page - find a brief introduction to your "
+"profile and network tabs, make some new connections, and find some groups to"
+" join."
+msgstr "Sur votre page d'accueil, dans <em>Conseils aux nouveaux venus</em> - vous trouverez une rapide introduction aux onglets Profil et Réseau, pourrez vous connecter à Facebook, établir de nouvelles relations, et choisir des groupes à rejoindre."
 
-#: src/Util/Temporal.php:151
-msgid "YYYY-MM-DD or MM-DD"
-msgstr "AAAA-MM-JJ ou MM-JJ"
+#: src/Module/Welcome.php:34
+msgid "Go to Your Settings"
+msgstr "Éditer vos Réglages"
 
-#: src/Util/Temporal.php:298
-msgid "never"
-msgstr "jamais"
+#: src/Module/Welcome.php:35
+msgid ""
+"On your <em>Settings</em> page -  change your initial password. Also make a "
+"note of your Identity Address. This looks just like an email address - and "
+"will be useful in making friends on the free social web."
+msgstr "Sur la page des <em>Réglages</em> -     changez votre mot de passe initial. Notez bien votre Identité. Elle ressemble à une adresse de courriel - et vous sera utile pour vous faire des amis dans le web social libre."
 
-#: src/Util/Temporal.php:305
-msgid "less than a second ago"
-msgstr "il y a moins d'une seconde"
+#: src/Module/Welcome.php:36
+msgid ""
+"Review the other settings, particularly the privacy settings. An unpublished"
+" directory listing is like having an unlisted phone number. In general, you "
+"should probably publish your listing - unless all of your friends and "
+"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."
 
-#: src/Util/Temporal.php:313
-msgid "year"
-msgstr "an"
+#: src/Module/Welcome.php:40
+msgid ""
+"Upload a profile photo if you have not done so already. Studies have shown "
+"that people with real photos of themselves are ten times more likely to make"
+" friends than people who do not."
+msgstr "Téléversez (envoyez) une photo de profil si vous n'en avez pas déjà une. Les études montrent que les gens qui affichent de vraies photos d'eux sont dix fois plus susceptibles de se faire des amis."
 
-#: src/Util/Temporal.php:313
-msgid "years"
-msgstr "ans"
+#: src/Module/Welcome.php:41
+msgid "Edit Your Profile"
+msgstr "Éditer votre Profil"
 
-#: src/Util/Temporal.php:314
-msgid "months"
-msgstr "mois"
+#: src/Module/Welcome.php:42
+msgid ""
+"Edit your <strong>default</strong> profile to your liking. Review the "
+"settings for hiding your list of friends and hiding the profile from unknown"
+" visitors."
+msgstr "Éditez votre profil <strong>par défaut</strong> à votre convenance. Vérifiez les réglages concernant la visibilité de votre liste d'amis par les visiteurs inconnus."
 
-#: src/Util/Temporal.php:315
-msgid "weeks"
-msgstr "semaines"
+#: src/Module/Welcome.php:43
+msgid "Profile Keywords"
+msgstr "Mots-clés du profil"
 
-#: src/Util/Temporal.php:316
-msgid "days"
-msgstr "jours"
+#: src/Module/Welcome.php:44
+msgid ""
+"Set some public keywords for your default profile which describe your "
+"interests. We may be able to find other people with similar interests and "
+"suggest friendships."
+msgstr "Choisissez quelques mots-clé publics pour votre profil par défaut. Ils pourront ainsi décrire vos centres d'intérêt, et nous pourrons vous proposer des contacts qui les partagent."
 
-#: src/Util/Temporal.php:317
-msgid "hour"
-msgstr "heure"
+#: src/Module/Welcome.php:46
+msgid "Connecting"
+msgstr "Connexions"
 
-#: src/Util/Temporal.php:317
-msgid "hours"
-msgstr "heures"
+#: src/Module/Welcome.php:48
+msgid "Importing Emails"
+msgstr "Importer courriels"
 
-#: src/Util/Temporal.php:318
-msgid "minute"
-msgstr "minute"
+#: src/Module/Welcome.php:49
+msgid ""
+"Enter your email access information on your Connector Settings page if you "
+"wish to import and interact with friends or mailing lists from your email "
+"INBOX"
+msgstr "Entrez vos paramètres de courriel dans les Réglages des connecteurs si vous souhaitez importer et interagir avec des amis ou des listes venant de votre Boîte de Réception."
 
-#: src/Util/Temporal.php:318
-msgid "minutes"
-msgstr "minutes"
+#: src/Module/Welcome.php:50
+msgid "Go to Your Contacts Page"
+msgstr "Consulter vos Contacts"
 
-#: src/Util/Temporal.php:319
-msgid "second"
-msgstr "seconde"
+#: src/Module/Welcome.php:51
+msgid ""
+"Your Contacts page is your gateway to managing friendships and connecting "
+"with friends on other networks. Typically you enter their address or site "
+"URL in the <em>Add New Contact</em> dialog."
+msgstr "Votre page Contacts est le point d'entrée vers la gestion de vos amitiés/relations et la connexion à des amis venant d'autres réseaux. Typiquement, vous pourrez y rentrer leur adresse d'Identité ou l'URL de leur site dans le formulaire <em>Ajouter un nouveau contact</em>."
 
-#: src/Util/Temporal.php:319
-msgid "seconds"
-msgstr "secondes"
+#: src/Module/Welcome.php:52
+msgid "Go to Your Site's Directory"
+msgstr "Consulter l'Annuaire de votre Site"
 
-#: src/Util/Temporal.php:329
-#, php-format
-msgid "in %1$d %2$s"
-msgstr ""
+#: src/Module/Welcome.php:53
+msgid ""
+"The Directory page lets you find other people in this network or other "
+"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
+"their profile page. Provide your own Identity Address if requested."
+msgstr "La page Annuaire vous permet de trouver d'autres personnes au sein de ce réseaux ou parmi d'autres sites fédérés. Cherchez un lien <em>Relier</em> ou <em>Suivre</em> sur leur profil. Vous pourrez avoir besoin d'indiquer votre adresse d'identité."
 
-#: src/Util/Temporal.php:332
-#, php-format
-msgid "%1$d %2$s ago"
-msgstr "il y a %1$d %2$s "
+#: src/Module/Welcome.php:54
+msgid "Finding New People"
+msgstr "Trouver de nouvelles personnes"
 
-#: src/Worker/Delivery.php:450
-msgid "(no subject)"
-msgstr "(sans titre)"
+#: src/Module/Welcome.php:55
+msgid ""
+"On the side panel of the Contacts page are several tools to find new "
+"friends. We can match people by interest, look up people by name or "
+"interest, and provide suggestions based on network relationships. On a brand"
+" new site, friend suggestions will usually begin to be populated within 24 "
+"hours."
+msgstr "Sur le panneau latéral de la page Contacts, il y a plusieurs moyens de trouver de nouveaux amis. Nous pouvons mettre les gens en relation selon leurs intérêts, rechercher des amis par nom ou intérêt, et fournir des suggestions en fonction de la topologie du réseau. Sur un site tout neuf, les suggestions d'amitié devraient commencer à apparaître au bout de 24 heures."
 
-#: update.php:218
-#, php-format
-msgid "%s: Updating author-id and owner-id in item and thread table. "
-msgstr ""
+#: src/Module/Welcome.php:58
+msgid "Group Your Contacts"
+msgstr "Grouper vos contacts"
 
-#: update.php:273
-#, php-format
-msgid "%s: Updating post-type."
-msgstr ""
+#: src/Module/Welcome.php:59
+msgid ""
+"Once you have made some friends, organize them into private conversation "
+"groups from the sidebar of your Contacts page and then you can interact with"
+" each group privately on your Network page."
+msgstr "Une fois que vous avez trouvé quelques amis, organisez-les en groupes de conversation privés depuis le panneau latéral de la page Contacts. Vous pourrez ensuite interagir avec chaque groupe de manière privée depuis la page Réseau."
 
-#: view/theme/duepuntozero/config.php:56
-msgid "greenzero"
-msgstr "greenzero"
+#: src/Module/Welcome.php:61
+msgid "Why Aren't My Posts Public?"
+msgstr "Pourquoi mes éléments ne sont pas publics ?"
 
-#: view/theme/duepuntozero/config.php:57
-msgid "purplezero"
-msgstr "purplezero"
+#: src/Module/Welcome.php:62
+msgid ""
+"Friendica respects your privacy. By default, your posts will only show up to"
+" people you've added as friends. For more information, see the help section "
+"from the link above."
+msgstr "Friendica respecte votre vie privée. Par défaut, toutes vos publications seront seulement montrés à vos amis. Pour plus d'information, consultez la section \"aide\" du lien ci-dessus."
+
+#: src/Module/Welcome.php:64
+msgid "Getting Help"
+msgstr "Obtenir de l'aide"
+
+#: src/Module/Welcome.php:65
+msgid "Go to the Help Section"
+msgstr "Aller à la section Aide"
+
+#: src/Module/Welcome.php:66
+msgid ""
+"Our <strong>help</strong> pages may be consulted for detail on other program"
+" features and resources."
+msgstr "Nos pages d'<strong>aide</strong> peuvent être consultées pour davantage de détails sur les fonctionnalités ou les ressources."
+
+#: src/Object/Post.php:138
+msgid "This entry was edited"
+msgstr "Cette entrée a été éditée"
+
+#: src/Object/Post.php:158
+msgid "Private Message"
+msgstr "Message privé"
+
+#: src/Object/Post.php:200
+msgid "Delete locally"
+msgstr ""
+
+#: src/Object/Post.php:203
+msgid "Delete globally"
+msgstr ""
 
-#: view/theme/duepuntozero/config.php:58
-msgid "easterbunny"
-msgstr "easterbunny"
+#: src/Object/Post.php:203
+msgid "Remove locally"
+msgstr ""
 
-#: view/theme/duepuntozero/config.php:59
-msgid "darkzero"
-msgstr "darkzero"
+#: src/Object/Post.php:217
+msgid "save to folder"
+msgstr "sauver vers dossier"
 
-#: view/theme/duepuntozero/config.php:60
-msgid "comix"
-msgstr "comix"
+#: src/Object/Post.php:252
+msgid "I will attend"
+msgstr "Je vais participer"
 
-#: view/theme/duepuntozero/config.php:61
-msgid "slackr"
-msgstr "slackr"
+#: src/Object/Post.php:252
+msgid "I will not attend"
+msgstr "Je ne vais pas participer"
 
-#: view/theme/duepuntozero/config.php:74
-msgid "Variations"
-msgstr "Variations"
+#: src/Object/Post.php:252
+msgid "I might attend"
+msgstr "Je vais peut-être participer"
 
-#: view/theme/frio/config.php:105
-msgid "Custom"
-msgstr "Personnalisé"
+#: src/Object/Post.php:280
+msgid "ignore thread"
+msgstr "ignorer le fil"
 
-#: view/theme/frio/config.php:117
-msgid "Note"
-msgstr "Remarque"
+#: src/Object/Post.php:281
+msgid "unignore thread"
+msgstr "Ne plus ignorer le fil"
 
-#: view/theme/frio/config.php:117
-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:282
+msgid "toggle ignore status"
+msgstr "Ignorer le statut"
 
-#: view/theme/frio/config.php:123
-msgid "Select color scheme"
-msgstr "Choisir le schéma de couleurs"
+#: src/Object/Post.php:293
+msgid "add star"
+msgstr "mettre en avant"
 
-#: view/theme/frio/config.php:124
-msgid "Copy or paste schemestring"
-msgstr ""
+#: src/Object/Post.php:294
+msgid "remove star"
+msgstr "ne plus mettre en avant"
 
-#: view/theme/frio/config.php:124
-msgid ""
-"You can copy this string to share your theme with others. Pasting here "
-"applies the schemestring"
-msgstr ""
+#: src/Object/Post.php:295
+msgid "toggle star status"
+msgstr "mettre en avant"
 
-#: view/theme/frio/config.php:125
-msgid "Navigation bar background color"
-msgstr "Couleur d'arrière-plan de la barre de navigation"
+#: src/Object/Post.php:298
+msgid "starred"
+msgstr "mis en avant"
 
-#: view/theme/frio/config.php:126
-msgid "Navigation bar icon color "
-msgstr "Couleur des icônes de la barre de navigation"
+#: src/Object/Post.php:302
+msgid "add tag"
+msgstr "ajouter une étiquette"
 
-#: view/theme/frio/config.php:127
-msgid "Link color"
-msgstr "Couleur des liens"
+#: src/Object/Post.php:313
+msgid "like"
+msgstr "aime"
 
-#: view/theme/frio/config.php:128
-msgid "Set the background color"
-msgstr "Couleur d'arrière-plan"
+#: src/Object/Post.php:314
+msgid "dislike"
+msgstr "n'aime pas"
 
-#: view/theme/frio/config.php:129
-msgid "Content background opacity"
-msgstr "Opacité du contenu d'arrière-plan"
+#: src/Object/Post.php:317
+msgid "Share this"
+msgstr "Partager"
 
-#: view/theme/frio/config.php:130
-msgid "Set the background image"
-msgstr "Image d'arrière-plan"
+#: src/Object/Post.php:317
+msgid "share"
+msgstr "partager"
 
-#: view/theme/frio/config.php:131
-msgid "Background image style"
-msgstr "Style de l'image de fond"
+#: src/Object/Post.php:385
+msgid "to"
+msgstr "à"
 
-#: view/theme/frio/config.php:136
-msgid "Login page background image"
-msgstr "Image de fond de la page de login"
+#: src/Object/Post.php:386
+msgid "via"
+msgstr "via"
 
-#: view/theme/frio/config.php:140
-msgid "Login page background color"
-msgstr "Couleur d'arrière-plan de la page de login"
+#: src/Object/Post.php:387
+msgid "Wall-to-Wall"
+msgstr "Inter-mur"
 
-#: view/theme/frio/config.php:140
-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:388
+msgid "via Wall-To-Wall:"
+msgstr "en Inter-mur :"
 
-#: view/theme/frio/php/Image.php:24
-msgid "Top Banner"
-msgstr "Bannière du haut"
+#: src/Object/Post.php:421
+#, php-format
+msgid "Reply to %s"
+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/Object/Post.php:436
+msgid "Notifier task is pending"
+msgstr ""
 
-#: view/theme/frio/php/Image.php:25
-msgid "Full screen"
-msgstr "Plein écran"
+#: src/Object/Post.php:437
+msgid "Delivery to remote servers is pending"
+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/Object/Post.php:438
+msgid "Delivery to remote servers is underway"
+msgstr ""
 
-#: view/theme/frio/php/Image.php:26
-msgid "Single row mosaic"
-msgstr "Mosaïque sur un rang"
+#: src/Object/Post.php:439
+msgid "Delivery to remote servers is mostly done"
+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/Object/Post.php:440
+msgid "Delivery to remote servers is done"
+msgstr ""
 
-#: view/theme/frio/php/Image.php:27
-msgid "Mosaic"
-msgstr "Mosaïque"
+#: src/Object/Post.php:460
+#, php-format
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] "%d commentaire"
+msgstr[1] "%d commentaires"
 
-#: 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:461
+msgid "Show more"
+msgstr ""
 
-#: view/theme/frio/theme.php:239
-msgid "Guest"
-msgstr "Invité"
+#: src/Object/Post.php:462
+msgid "Show fewer"
+msgstr ""
 
-#: view/theme/frio/theme.php:244
-msgid "Visitor"
-msgstr "Visiteur"
+#: src/LegacyModule.php:30
+#, php-format
+msgid "Legacy module file not found: %s"
+msgstr ""
 
-#: view/theme/quattro/config.php:76
-msgid "Alignment"
-msgstr "Alignement"
+#: src/App.php:505
+msgid "Delete this item?"
+msgstr "Effacer cet élément?"
 
-#: view/theme/quattro/config.php:76
-msgid "Left"
-msgstr "Gauche"
+#: src/App.php:547
+msgid "toggle mobile"
+msgstr "activ. mobile"
 
-#: view/theme/quattro/config.php:76
-msgid "Center"
-msgstr "Centre"
+#: src/App.php:863
+msgid "No system theme config value set."
+msgstr ""
 
-#: view/theme/quattro/config.php:77
-msgid "Color scheme"
-msgstr "Palette de couleurs"
+#: src/App.php:1151
+msgid "You must be logged in to use addons. "
+msgstr "Vous devez être connecté pour utiliser les greffons."
 
-#: view/theme/quattro/config.php:78
-msgid "Posts font size"
-msgstr "Taille de texte des publications"
+#: src/BaseModule.php:135
+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/quattro/config.php:79
-msgid "Textareas font size"
-msgstr "Taille de police des zones de texte"
+#: src/Console/ArchiveContact.php:86
+#, php-format
+msgid "Could not find any unarchived contact entry for this URL (%s)"
+msgstr ""
 
-#: 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/Console/ArchiveContact.php:89
+msgid "The contact entries have been archived"
+msgstr ""
 
-#: view/theme/vier/config.php:122
-msgid "Set style"
-msgstr "Définir le style"
+#: src/Console/NewPassword.php:93
+msgid "Enter new password: "
+msgstr ""
 
-#: view/theme/vier/config.php:123
-msgid "Community Pages"
-msgstr "Pages de Communauté"
+#: src/Console/PostUpdate.php:73
+#, php-format
+msgid "Post update version number has been set to %s."
+msgstr ""
 
-#: view/theme/vier/config.php:124 view/theme/vier/theme.php:151
-msgid "Community Profiles"
-msgstr "Profils communautaires"
+#: src/Console/PostUpdate.php:81
+msgid "Check for pending update actions."
+msgstr ""
 
-#: view/theme/vier/config.php:125
-msgid "Help or @NewHere ?"
-msgstr "Aide ou @NewHere?"
+#: src/Console/PostUpdate.php:83
+msgid "Done."
+msgstr ""
 
-#: view/theme/vier/config.php:126 view/theme/vier/theme.php:373
-msgid "Connect Services"
-msgstr "Connecter des services"
+#: src/Console/PostUpdate.php:85
+msgid "Execute pending post updates."
+msgstr ""
 
-#: view/theme/vier/config.php:127
-msgid "Find Friends"
-msgstr "Trouver des amis"
+#: src/Console/PostUpdate.php:91
+msgid "All pending post updates are done."
+msgstr ""
 
-#: view/theme/vier/config.php:128 view/theme/vier/theme.php:181
-msgid "Last users"
-msgstr "Derniers utilisateurs"
+#: update.php:218
+#, php-format
+msgid "%s: Updating author-id and owner-id in item and thread table. "
+msgstr ""
 
-#: view/theme/vier/theme.php:288
-msgid "Quick Start"
-msgstr "Démarrage rapide"
+#: update.php:273
+#, php-format
+msgid "%s: Updating post-type."
+msgstr ""
index 128fdd04b0e741c2dd5434fc7656bbd5c42baf34..8621ea0fb518368d8042b396f0916589d6ed8a98 100644 (file)
@@ -6,6 +6,69 @@ function string_plural_select_fr($n){
        return ($n > 1);;
 }}
 ;
+$a->strings["Friendica Notification"] = "Notification Friendica";
+$a->strings["Thank You,"] = "Merci, ";
+$a->strings["%1\$s, %2\$s Administrator"] = "%1\$s,, l'administrateur de %2\$s";
+$a->strings["%s Administrator"] = "L'administrateur de %s";
+$a->strings["[Friendica:Notify] New mail received at %s"] = "[Friendica:Notification] Nouveau courriel reçu sur %s";
+$a->strings["%1\$s sent you a new private message at %2\$s."] = "%1\$s vous a envoyé un nouveau message privé sur %2\$s.";
+$a->strings["a private message"] = "un message privé";
+$a->strings["%1\$s sent you %2\$s."] = "%1\$s vous a envoyé %2\$s.";
+$a->strings["Please visit %s to view and/or reply to your private messages."] = "Merci de visiter %s pour voir vos messages privés et/ou y répondre.";
+$a->strings["%1\$s tagged you on [url=%2\$s]a %3\$s[/url]"] = "%1\$s vous a mentionné•e sur [url=%2\$s]un•e %3\$s[/url]";
+$a->strings["%1\$s commented on [url=%2\$s]a %3\$s[/url]"] = "%1\$s a commenté sur [url=%2\$s]un %3\$s[/url]";
+$a->strings["%1\$s tagged you on [url=%2\$s]%3\$s's %4\$s[/url]"] = "%1\$s vous a mentionné•e sur [url=%2\$s]un•e %4\$s de %3\$s [/url]";
+$a->strings["%1\$s commented on [url=%2\$s]%3\$s's %4\$s[/url]"] = "%1\$s a commenté sur [url=%2\$s]le %4\$s de %3\$s[/url]";
+$a->strings["%1\$s tagged you on [url=%2\$s]your %3\$s[/url]"] = "%1\$s vous a mentionné•e sur [url=%2\$s]votre %3\$s[/url]";
+$a->strings["%1\$s commented on [url=%2\$s]your %3\$s[/url]"] = "%1\$s commented on [url=%2\$s]your %3\$s[/url]";
+$a->strings["%1\$s tagged you on [url=%2\$s]their %3\$s[/url]"] = "%1\$s vous a mentionné•e sur [url=%2\$s]leur %3\$s[/url]";
+$a->strings["%1\$s commented on [url=%2\$s]their %3\$s[/url]"] = "%1\$s a commenté sur [url=%2\$s]leur %3\$s[/url]";
+$a->strings["[Friendica:Notify] %s tagged you"] = "[Friendica:Notification] %s vous a étiqueté";
+$a->strings["%1\$s tagged you at %2\$s"] = "%1\$s vous a étiqueté sur %2\$s";
+$a->strings["[Friendica:Notify] Comment to conversation #%1\$d by %2\$s"] = "[Friendica:Notification] Commentaire de %2\$s sur la conversation #%1\$d";
+$a->strings["%s commented on an item/conversation you have been following."] = "%s a commenté un élément que vous suivez.";
+$a->strings["Please visit %s to view and/or reply to the conversation."] = "Merci de visiter %s pour voir la conversation et/ou y répondre.";
+$a->strings["[Friendica:Notify] %s posted to your profile wall"] = "[Friendica:Notification] %s a posté sur votre mur";
+$a->strings["%1\$s posted to your profile wall at %2\$s"] = "%1\$s a publié sur votre mur à %2\$s";
+$a->strings["%1\$s posted to [url=%2\$s]your wall[/url]"] = "%1\$s a posté sur [url=%2\$s]votre mur[/url]";
+$a->strings["[Friendica:Notify] %s shared a new post"] = "[Friendica:Notification] %s partage une nouvelle publication";
+$a->strings["%1\$s shared a new post at %2\$s"] = "%1\$s a partagé une nouvelle publication sur %2\$s";
+$a->strings["%1\$s [url=%2\$s]shared a post[/url]."] = "%1\$s [url=%2\$s]partage une publication[/url].";
+$a->strings["[Friendica:Notify] %1\$s poked you"] = "[Friendica:Notify] %1\$s vous a sollicité";
+$a->strings["%1\$s poked you at %2\$s"] = "%1\$s vous a sollicité via %2\$s";
+$a->strings["%1\$s [url=%2\$s]poked you[/url]."] = "%1\$s vous a [url=%2\$s]sollicité[/url].";
+$a->strings["[Friendica:Notify] %s tagged your post"] = "[Friendica:Notification] %s a étiqueté votre publication";
+$a->strings["%1\$s tagged your post at %2\$s"] = "%1\$s a étiqueté votre publication sur %2\$s";
+$a->strings["%1\$s tagged [url=%2\$s]your post[/url]"] = "%1\$s a étiqueté [url=%2\$s]votre publication[/url]";
+$a->strings["[Friendica:Notify] Introduction received"] = "[Friendica:Notification] Introduction reçue";
+$a->strings["You've received an introduction from '%1\$s' at %2\$s"] = "Vous avez reçu une introduction de '%1\$s' sur %2\$s";
+$a->strings["You've received [url=%1\$s]an introduction[/url] from %2\$s."] = "Vous avez reçu [url=%1\$s]une introduction[/url] de %2\$s.";
+$a->strings["You may visit their profile at %s"] = "Vous pouvez visiter son profil sur %s";
+$a->strings["Please visit %s to approve or reject the introduction."] = "Merci de visiter %s pour approuver ou rejeter l'introduction.";
+$a->strings["[Friendica:Notify] A new person is sharing with you"] = "[Notification Friendica] Une nouvelle personne partage avec vous";
+$a->strings["%1\$s is sharing with you at %2\$s"] = "%1\$s partage avec vous sur %2\$s";
+$a->strings["[Friendica:Notify] You have a new follower"] = "[Friendica:Notification] Vous avez un nouvel abonné";
+$a->strings["You have a new follower at %2\$s : %1\$s"] = "Vous avez un nouvel abonné à %2\$s : %1\$s";
+$a->strings["[Friendica:Notify] Friend suggestion received"] = "[Friendica:Notification] Nouvelle suggestion d'amitié";
+$a->strings["You've received a friend suggestion from '%1\$s' at %2\$s"] = "Vous avez reçu une suggestion de '%1\$s' sur %2\$s";
+$a->strings["You've received [url=%1\$s]a friend suggestion[/url] for %2\$s from %3\$s."] = "Vous avez reçu [url=%1\$s]une suggestion[/url] de %3\$s pour %2\$s.";
+$a->strings["Name:"] = "Nom :";
+$a->strings["Photo:"] = "Photo :";
+$a->strings["Please visit %s to approve or reject the suggestion."] = "Merci de visiter %s pour approuver ou rejeter la suggestion.";
+$a->strings["[Friendica:Notify] Connection accepted"] = "[Friendica:Notification] Connexion acceptée";
+$a->strings["'%1\$s' has accepted your connection request at %2\$s"] = "'%1\$s' a accepté votre demande de connexion à %2\$s";
+$a->strings["%2\$s has accepted your [url=%1\$s]connection request[/url]."] = "%2\$s a accepté votre [url=%1\$s]demande de connexion[/url].";
+$a->strings["You are now mutual friends and may exchange status updates, photos, and email without restriction."] = "Vous êtes désormais mutuellement amis, et pouvez échanger des mises-à-jour d'état, des photos, et des messages sans restriction.";
+$a->strings["Please visit %s if you wish to make any changes to this relationship."] = "Veuillez visiter %s si vous souhaitez modifier cette relation.";
+$a->strings["'%1\$s' has chosen to accept you a fan, which restricts some forms of communication - such as private messaging and some profile interactions. If this is a celebrity or community page, these settings were applied automatically."] = "'%1\$s' a choisi de vous accepter comme fan ce qui empêche certains canaux de communication tel les messages privés et certaines interactions de profil. Ceci est une page de célébrité ou de communauté, ces paramètres ont été appliqués automatiquement.";
+$a->strings["'%1\$s' may choose to extend this into a two-way or more permissive relationship in the future."] = "%1\$s peut choisir à l'avenir de rendre cette relation réciproque ou au moins plus permissive.";
+$a->strings["Please visit %s  if you wish to make any changes to this relationship."] = "Veuillez visiter %s si vous souhaitez modifier cette relation.";
+$a->strings["[Friendica System Notify]"] = "[Friendica Notification Sytème]";
+$a->strings["registration request"] = "demande d'inscription";
+$a->strings["You've received a registration request from '%1\$s' at %2\$s"] = "Vous avez reçu une demande d'inscription de %1\$s sur %2\$s";
+$a->strings["You've received a [url=%1\$s]registration request[/url] from %2\$s."] = "%2\$s vous a envoyé une [url=%1\$s]demande de création de compte[/url].";
+$a->strings["Full Name:\t%s\nSite Location:\t%s\nLogin Name:\t%s (%s)"] = "Nom complet :\t%s\nAdresse du site :\t%s\nIdentifiant :\t%s (%s)";
+$a->strings["Please visit %s to approve or reject the request."] = "Veuillez visiter %s pour approuver ou rejeter la demande.";
 $a->strings["Daily posting limit of %d post reached. The post was rejected."] = [
        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.",
@@ -131,80 +194,197 @@ $a->strings["Undecided"] = [
        0 => "Indécis",
        1 => "Indécis",
 ];
-$a->strings["Friendica Notification"] = "Notification Friendica";
-$a->strings["Thank You,"] = "Merci, ";
-$a->strings["%1\$s, %2\$s Administrator"] = "%1\$s,, l'administrateur de %2\$s";
-$a->strings["%s Administrator"] = "L'administrateur de %s";
-$a->strings["[Friendica:Notify] New mail received at %s"] = "[Friendica:Notification] Nouveau courriel reçu sur %s";
-$a->strings["%1\$s sent you a new private message at %2\$s."] = "%1\$s vous a envoyé un nouveau message privé sur %2\$s.";
-$a->strings["a private message"] = "un message privé";
-$a->strings["%1\$s sent you %2\$s."] = "%1\$s vous a envoyé %2\$s.";
-$a->strings["Please visit %s to view and/or reply to your private messages."] = "Merci de visiter %s pour voir vos messages privés et/ou y répondre.";
-$a->strings["%1\$s tagged you on [url=%2\$s]a %3\$s[/url]"] = "%1\$s vous a mentionné•e sur [url=%2\$s]un•e %3\$s[/url]";
-$a->strings["%1\$s commented on [url=%2\$s]a %3\$s[/url]"] = "%1\$s a commenté sur [url=%2\$s]un %3\$s[/url]";
-$a->strings["%1\$s tagged you on [url=%2\$s]%3\$s's %4\$s[/url]"] = "%1\$s vous a mentionné•e sur [url=%2\$s]un•e %4\$s de %3\$s [/url]";
-$a->strings["%1\$s commented on [url=%2\$s]%3\$s's %4\$s[/url]"] = "%1\$s a commenté sur [url=%2\$s]le %4\$s de %3\$s[/url]";
-$a->strings["%1\$s tagged you on [url=%2\$s]your %3\$s[/url]"] = "%1\$s vous a mentionné•e sur [url=%2\$s]votre %3\$s[/url]";
-$a->strings["%1\$s commented on [url=%2\$s]your %3\$s[/url]"] = "%1\$s commented on [url=%2\$s]your %3\$s[/url]";
-$a->strings["%1\$s tagged you on [url=%2\$s]their %3\$s[/url]"] = "%1\$s vous a mentionné•e sur [url=%2\$s]leur %3\$s[/url]";
-$a->strings["%1\$s commented on [url=%2\$s]their %3\$s[/url]"] = "%1\$s a commenté sur [url=%2\$s]leur %3\$s[/url]";
-$a->strings["[Friendica:Notify] %s tagged you"] = "[Friendica:Notification] %s vous a étiqueté";
-$a->strings["%1\$s tagged you at %2\$s"] = "%1\$s vous a étiqueté sur %2\$s";
-$a->strings["[Friendica:Notify] Comment to conversation #%1\$d by %2\$s"] = "[Friendica:Notification] Commentaire de %2\$s sur la conversation #%1\$d";
-$a->strings["%s commented on an item/conversation you have been following."] = "%s a commenté un élément que vous suivez.";
-$a->strings["Please visit %s to view and/or reply to the conversation."] = "Merci de visiter %s pour voir la conversation et/ou y répondre.";
-$a->strings["[Friendica:Notify] %s posted to your profile wall"] = "[Friendica:Notification] %s a posté sur votre mur";
-$a->strings["%1\$s posted to your profile wall at %2\$s"] = "%1\$s a publié sur votre mur à %2\$s";
-$a->strings["%1\$s posted to [url=%2\$s]your wall[/url]"] = "%1\$s a posté sur [url=%2\$s]votre mur[/url]";
-$a->strings["[Friendica:Notify] %s shared a new post"] = "[Friendica:Notification] %s partage une nouvelle publication";
-$a->strings["%1\$s shared a new post at %2\$s"] = "%1\$s a partagé une nouvelle publication sur %2\$s";
-$a->strings["%1\$s [url=%2\$s]shared a post[/url]."] = "%1\$s [url=%2\$s]partage une publication[/url].";
-$a->strings["[Friendica:Notify] %1\$s poked you"] = "[Friendica:Notify] %1\$s vous a sollicité";
-$a->strings["%1\$s poked you at %2\$s"] = "%1\$s vous a sollicité via %2\$s";
-$a->strings["%1\$s [url=%2\$s]poked you[/url]."] = "%1\$s vous a [url=%2\$s]sollicité[/url].";
-$a->strings["[Friendica:Notify] %s tagged your post"] = "[Friendica:Notification] %s a étiqueté votre publication";
-$a->strings["%1\$s tagged your post at %2\$s"] = "%1\$s a étiqueté votre publication sur %2\$s";
-$a->strings["%1\$s tagged [url=%2\$s]your post[/url]"] = "%1\$s a étiqueté [url=%2\$s]votre publication[/url]";
-$a->strings["[Friendica:Notify] Introduction received"] = "[Friendica:Notification] Introduction reçue";
-$a->strings["You've received an introduction from '%1\$s' at %2\$s"] = "Vous avez reçu une introduction de '%1\$s' sur %2\$s";
-$a->strings["You've received [url=%1\$s]an introduction[/url] from %2\$s."] = "Vous avez reçu [url=%1\$s]une introduction[/url] de %2\$s.";
-$a->strings["You may visit their profile at %s"] = "Vous pouvez visiter son profil sur %s";
-$a->strings["Please visit %s to approve or reject the introduction."] = "Merci de visiter %s pour approuver ou rejeter l'introduction.";
-$a->strings["[Friendica:Notify] A new person is sharing with you"] = "[Notification Friendica] Une nouvelle personne partage avec vous";
-$a->strings["%1\$s is sharing with you at %2\$s"] = "%1\$s partage avec vous sur %2\$s";
-$a->strings["[Friendica:Notify] You have a new follower"] = "[Friendica:Notification] Vous avez un nouvel abonné";
-$a->strings["You have a new follower at %2\$s : %1\$s"] = "Vous avez un nouvel abonné à %2\$s : %1\$s";
-$a->strings["[Friendica:Notify] Friend suggestion received"] = "[Friendica:Notification] Nouvelle suggestion d'amitié";
-$a->strings["You've received a friend suggestion from '%1\$s' at %2\$s"] = "Vous avez reçu une suggestion de '%1\$s' sur %2\$s";
-$a->strings["You've received [url=%1\$s]a friend suggestion[/url] for %2\$s from %3\$s."] = "Vous avez reçu [url=%1\$s]une suggestion[/url] de %3\$s pour %2\$s.";
-$a->strings["Name:"] = "Nom :";
-$a->strings["Photo:"] = "Photo :";
-$a->strings["Please visit %s to approve or reject the suggestion."] = "Merci de visiter %s pour approuver ou rejeter la suggestion.";
-$a->strings["[Friendica:Notify] Connection accepted"] = "[Friendica:Notification] Connexion acceptée";
-$a->strings["'%1\$s' has accepted your connection request at %2\$s"] = "'%1\$s' a accepté votre demande de connexion à %2\$s";
-$a->strings["%2\$s has accepted your [url=%1\$s]connection request[/url]."] = "%2\$s a accepté votre [url=%1\$s]demande de connexion[/url].";
-$a->strings["You are now mutual friends and may exchange status updates, photos, and email without restriction."] = "Vous êtes désormais mutuellement amis, et pouvez échanger des mises-à-jour d'état, des photos, et des messages sans restriction.";
-$a->strings["Please visit %s if you wish to make any changes to this relationship."] = "Veuillez visiter %s si vous souhaitez modifier cette relation.";
-$a->strings["'%1\$s' has chosen to accept you a fan, which restricts some forms of communication - such as private messaging and some profile interactions. If this is a celebrity or community page, these settings were applied automatically."] = "'%1\$s' a choisi de vous accepter comme fan ce qui empêche certains canaux de communication tel les messages privés et certaines interactions de profil. Ceci est une page de célébrité ou de communauté, ces paramètres ont été appliqués automatiquement.";
-$a->strings["'%1\$s' may choose to extend this into a two-way or more permissive relationship in the future."] = "%1\$s peut choisir à l'avenir de rendre cette relation réciproque ou au moins plus permissive.";
-$a->strings["Please visit %s  if you wish to make any changes to this relationship."] = "Veuillez visiter %s si vous souhaitez modifier cette relation.";
-$a->strings["[Friendica System Notify]"] = "[Friendica Notification Sytème]";
-$a->strings["registration request"] = "demande d'inscription";
-$a->strings["You've received a registration request from '%1\$s' at %2\$s"] = "Vous avez reçu une demande d'inscription de %1\$s sur %2\$s";
-$a->strings["You've received a [url=%1\$s]registration request[/url] from %2\$s."] = "%2\$s vous a envoyé une [url=%1\$s]demande de création de compte[/url].";
-$a->strings["Full Name:\t%s\nSite Location:\t%s\nLogin Name:\t%s (%s)"] = "Nom complet :\t%s\nAdresse du site :\t%s\nIdentifiant :\t%s (%s)";
-$a->strings["Please visit %s to approve or reject the request."] = "Veuillez visiter %s pour approuver ou rejeter la demande.";
 $a->strings["Item not found."] = "Élément introuvable.";
 $a->strings["Do you really want to delete this item?"] = "Voulez-vous vraiment supprimer cet élément ?";
 $a->strings["Yes"] = "Oui";
 $a->strings["Permission denied."] = "Permission refusée.";
-$a->strings["Archives"] = "Archives";
-$a->strings["show more"] = "montrer plus";
 $a->strings["Authorize application connection"] = "Autoriser l'application à se connecter";
 $a->strings["Return to your app and insert this Securty Code:"] = "Retournez à votre application et saisissez ce Code de Sécurité : ";
 $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["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["Save Settings"] = "Sauvegarder les paramètres";
+$a->strings["Delegate Page Management"] = "Déléguer la gestion de la page";
+$a->strings["Delegates"] = "Délégataires";
+$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.";
+$a->strings["Existing Page Delegates"] = "Délégataires existants";
+$a->strings["Potential Delegates"] = "Délégataires potentiels";
+$a->strings["Remove"] = "Utiliser comme photo de profil";
+$a->strings["Add"] = "Ajouter";
+$a->strings["No entries."] = "Aucune entrée.";
+$a->strings["Post successful."] = "Publication réussie.";
+$a->strings["Subscribing to OStatus contacts"] = "Inscription aux contacts OStatus";
+$a->strings["No contact provided."] = "Pas de contact fourni.";
+$a->strings["Couldn't fetch information for contact."] = "Impossible de récupérer les informations pour ce contact.";
+$a->strings["Couldn't fetch friends for contact."] = "Impossible de récupérer les amis de ce contact.";
+$a->strings["Done"] = "Terminé";
+$a->strings["success"] = "réussite";
+$a->strings["failed"] = "échec";
+$a->strings["ignored"] = "ignoré";
+$a->strings["Keep this window open until done."] = "Veuillez garder cette fenêtre ouverte jusqu'à la fin.";
+$a->strings["Permission denied"] = "Permission refusée";
+$a->strings["Invalid profile identifier."] = "Identifiant de profil invalide.";
+$a->strings["Profile Visibility Editor"] = "Éditer la visibilité du profil";
+$a->strings["Profile"] = "Profil";
+$a->strings["Click on a contact to add or remove."] = "Cliquez sur un contact pour l'ajouter ou le supprimer.";
+$a->strings["Visible To"] = "Visible par";
+$a->strings["All Contacts (with secure profile access)"] = "Tous les contacts (ayant un accès sécurisé)";
+$a->strings["Account approved."] = "Inscription validée.";
+$a->strings["Registration revoked for %s"] = "Inscription révoquée pour %s";
+$a->strings["Please login."] = "Merci de vous connecter.";
+$a->strings["User deleted their account"] = "L'utilisateur a supprimé son compte";
+$a->strings["On your Friendica node an user deleted their account. Please ensure that their data is removed from the backups."] = "Sur votre nœud Friendica, un utilisateur a supprimé son compte. Veuillez vous assurer que ses données sont supprimées des sauvegardes.";
+$a->strings["The user id is %d"] = "L'identifiant d'utilisateur est %d";
+$a->strings["Remove My Account"] = "Supprimer mon compte";
+$a->strings["This will completely remove your account. Once this has been done it is not recoverable."] = "Ceci supprimera totalement votre compte. Cette opération est irréversible.";
+$a->strings["Please enter your password for verification:"] = "Merci de saisir votre mot de passe pour vérification :";
+$a->strings["Resubscribing to OStatus contacts"] = "Réinscription aux contacts OStatus";
+$a->strings["Error"] = [
+       0 => "Erreur",
+       1 => "Erreurs",
+];
+$a->strings["Tag(s) removed"] = "Étiquette(s) supprimée(s)";
+$a->strings["Remove Item Tag"] = "Enlever l'étiquette de l'élément";
+$a->strings["Select a tag to remove: "] = "Sélectionner une étiquette à supprimer :";
+$a->strings["User imports on closed servers can only be done by an administrator."] = "L'import d'utilisateur sur un serveur fermé ne peut être effectué que par un administrateur.";
+$a->strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Le nombre d'inscriptions quotidiennes pour ce site a été dépassé. Merci de réessayer demain.";
+$a->strings["Import"] = "Importer";
+$a->strings["Move account"] = "Migrer le compte";
+$a->strings["You can import an account from another Friendica server."] = "Vous pouvez importer un compte d'un autre serveur Friendica.";
+$a->strings["You need to export your account from the old server and upload it here. We will recreate your old account here with all your contacts. We will try also to inform your friends that you moved here."] = "Vous devez exporter votre compte à partir de l'ancien serveur et le téléverser ici. Nous recréerons votre ancien compte ici avec tous vos contacts. Nous tenterons également d'informer vos amis que vous avez déménagé ici.";
+$a->strings["This feature is experimental. We can't import contacts from the OStatus network (GNU Social/Statusnet) or from Diaspora"] = "Cette fonctionalité est expérimentale. Il n'est pas possible d'importer des contacts depuis le réseau OStatus (GNU Social/Statusnet) ou depuis Diaspora.";
+$a->strings["Account file"] = "Fichier du compte";
+$a->strings["To export your account, go to \"Settings->Export your personal data\" and select \"Export account\""] = "Pour exporter votre compte, allez dans \"Paramètres> Exporter vos données personnelles\" et sélectionnez \"exportation de compte\"";
+$a->strings["You aren't following this contact."] = "Vous ne suivez pas ce contact.";
+$a->strings["Unfollowing is currently not supported by your network."] = "Le désabonnement n'est actuellement pas supporté par votre réseau.";
+$a->strings["Contact unfollowed"] = "Contact désabonné";
+$a->strings["Disconnect/Unfollow"] = "Se déconnecter/Ne plus suivre";
+$a->strings["Your Identity Address:"] = "Votre adresse d'identité :";
+$a->strings["Submit Request"] = "Envoyer la requête";
+$a->strings["Profile URL"] = "URL du Profil";
+$a->strings["Status Messages and Posts"] = "Messages d'état et publications";
+$a->strings["[Embedded content - reload page to view]"] = "[Ccontenu incorporé - rechargez la page pour le voir]";
+$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["Image exceeds size limit of %s"] = "L'image dépasse la taille limite de %s";
+$a->strings["Unable to process image."] = "Impossible de traiter l'image.";
+$a->strings["Wall Photos"] = "Photos du mur";
+$a->strings["Image upload failed."] = "Le téléversement de l'image a échoué.";
+$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["No recipient selected."] = "Pas de destinataire sélectionné.";
+$a->strings["Unable to check your home location."] = "Impossible de vérifier votre localisation.";
+$a->strings["Message could not be sent."] = "Impossible d'envoyer le message.";
+$a->strings["Message collection failure."] = "Récupération des messages infructueuse.";
+$a->strings["Message sent."] = "Message envoyé.";
+$a->strings["No recipient."] = "Pas de destinataire.";
+$a->strings["Please enter a link URL:"] = "Entrez un lien web :";
+$a->strings["Send Private Message"] = "Envoyer un message privé";
+$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["To:"] = "À:";
+$a->strings["Subject:"] = "Sujet:";
+$a->strings["Your message:"] = "Votre message :";
+$a->strings["Insert web link"] = "Insérer lien web";
+$a->strings["No keywords to match. Please add keywords to your default profile."] = "Aucun mot-clé en correspondance. Merci d'ajouter des mots-clés à votre profil par défaut.";
+$a->strings["Connect"] = "Se connecter";
+$a->strings["first"] = "premier";
+$a->strings["next"] = "suivant";
+$a->strings["No matches"] = "Aucune correspondance";
+$a->strings["Profile Match"] = "Correpondance de profils";
+$a->strings["Profile not found."] = "Profil introuvable.";
+$a->strings["Profile deleted."] = "Profil supprimé.";
+$a->strings["Profile-"] = "Profil-";
+$a->strings["New profile created."] = "Nouveau profil créé.";
+$a->strings["Profile unavailable to clone."] = "Ce profil ne peut être cloné.";
+$a->strings["Profile Name is required."] = "Le nom du profil est requis.";
+$a->strings["Marital Status"] = "Statut marital";
+$a->strings["Romantic Partner"] = "Partenaire / conjoint";
+$a->strings["Work/Employment"] = "Travail / Occupation";
+$a->strings["Religion"] = "Religion";
+$a->strings["Political Views"] = "Tendance politique";
+$a->strings["Gender"] = "Sexe";
+$a->strings["Sexual Preference"] = "Préférence sexuelle";
+$a->strings["XMPP"] = "XMPP";
+$a->strings["Homepage"] = "Site internet";
+$a->strings["Interests"] = "Centres d'intérêt";
+$a->strings["Address"] = "Adresse";
+$a->strings["Location"] = "Localisation";
+$a->strings["Profile updated."] = "Profil mis à jour.";
+$a->strings["Hide contacts and friends:"] = "Cacher mes contacts et amis :";
+$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Cacher ma liste d'amis / contacts des visiteurs de ce profil ?";
+$a->strings["Show more profile fields:"] = "Afficher plus d'infos de profil :";
+$a->strings["Profile Actions"] = "Actions de Profil";
+$a->strings["Edit Profile Details"] = "Éditer les détails du profil";
+$a->strings["Submit"] = "Envoyer";
+$a->strings["Change Profile Photo"] = "Changer la photo du profil";
+$a->strings["View this profile"] = "Voir ce profil";
+$a->strings["View all profiles"] = "Voir tous les profils";
+$a->strings["Edit visibility"] = "Changer la visibilité";
+$a->strings["Create a new profile using these settings"] = "Créer un nouveau profil en utilisant ces réglages";
+$a->strings["Clone this profile"] = "Cloner ce profil";
+$a->strings["Delete this profile"] = "Supprimer ce profil";
+$a->strings["Basic information"] = "Information de base";
+$a->strings["Profile picture"] = "Image de profil";
+$a->strings["Preferences"] = "Préférences";
+$a->strings["Status information"] = "Information sur le statut";
+$a->strings["Additional information"] = "Information additionnelle";
+$a->strings["Personal"] = "Personnel";
+$a->strings["Relation"] = "Relation";
+$a->strings["Miscellaneous"] = "Divers";
+$a->strings["Upload Profile Photo"] = "Téléverser une photo de profil";
+$a->strings["Your Gender:"] = "Votre genre :";
+$a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "<span class=\"heart\">&hearts;</span> Statut marital :";
+$a->strings["Sexual Preference:"] = "Préférence sexuelle :";
+$a->strings["Example: fishing photography software"] = "Exemple : football dessin programmation";
+$a->strings["Profile Name:"] = "Nom du profil :";
+$a->strings["Required"] = "Requis";
+$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "Ceci est votre profil <strong>public</strong>.<br />Il <strong>peut</strong> être visible par n'importe quel utilisateur d'Internet.";
+$a->strings["Your Full Name:"] = "Votre nom complet :";
+$a->strings["Title/Description:"] = "Titre / Description :";
+$a->strings["Street Address:"] = "Adresse postale :";
+$a->strings["Locality/City:"] = "Ville :";
+$a->strings["Region/State:"] = "Région / État :";
+$a->strings["Postal/Zip Code:"] = "Code postal :";
+$a->strings["Country:"] = "Pays :";
+$a->strings["Age: "] = "Age : ";
+$a->strings["Who: (if applicable)"] = "Qui : (si pertinent)";
+$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Exemples: cathy123, Cathy Williams, cathy@example.com";
+$a->strings["Since [date]:"] = "Depuis [date]  :";
+$a->strings["Tell us about yourself..."] = "Parlez-nous de vous...";
+$a->strings["XMPP (Jabber) address:"] = "Adresse XMPP (Jabber) :";
+$a->strings["The XMPP address will be propagated to your contacts so that they can follow you."] = "Votre adresse XMPP sera transmise à vos contacts pour qu'ils puissent vous suivre.";
+$a->strings["Homepage URL:"] = "Page personnelle :";
+$a->strings["Hometown:"] = " Ville d'origine :";
+$a->strings["Political Views:"] = "Opinions politiques :";
+$a->strings["Religious Views:"] = "Opinions religieuses :";
+$a->strings["Public Keywords:"] = "Mots-clés publics :";
+$a->strings["(Used for suggesting potential friends, can be seen by others)"] = "(Utilisés pour vous suggérer des amis potentiels. Ils peuvent être vus par autrui)";
+$a->strings["Private Keywords:"] = "Mots-clés privés :";
+$a->strings["(Used for searching profiles, never shown to others)"] = "(Utilisés pour rechercher des profils. Ils ne seront jamais montrés à autrui)";
+$a->strings["Likes:"] = "J'aime :";
+$a->strings["Dislikes:"] = "Je n'aime pas :";
+$a->strings["Musical interests"] = "Goûts musicaux";
+$a->strings["Books, literature"] = "Lectures";
+$a->strings["Television"] = "Télévision";
+$a->strings["Film/dance/culture/entertainment"] = "Cinéma / Danse / Culture / Divertissement";
+$a->strings["Hobbies/Interests"] = "Passe-temps / Centres d'intérêt";
+$a->strings["Love/romance"] = "Amour / Romance";
+$a->strings["Work/employment"] = "Activité professionnelle / Occupation";
+$a->strings["School/education"] = "Études / Formation";
+$a->strings["Contact information and Social Networks"] = "Coordonnées / Réseaux sociaux";
+$a->strings["Profile Image"] = "Image du profil";
+$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["Access denied."] = "Accès refusé.";
 $a->strings["Access to this profile has been restricted."] = "L'accès au profil a été restreint.";
 $a->strings["Events"] = "Événements";
@@ -241,7 +421,6 @@ $a->strings["Mirror as forwarded posting"] = "Refléter les publications de ce p
 $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";
 $a->strings["Remote Self"] = "Identité à distance";
 $a->strings["Mirror postings from this contact"] = "Copier les publications de ce contact";
 $a->strings["Mark this contact as remote_self, this will cause friendica to repost new entries from this contact."] = "Marquer ce contact comme étant remote_self, friendica republiera alors les nouvelles entrées de ce contact.";
@@ -255,22 +434,6 @@ $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."] = "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["Save Settings"] = "Sauvegarder les paramètres";
-$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.";
-$a->strings["Existing Page Delegates"] = "Délégataires existants";
-$a->strings["Potential Delegates"] = "Délégataires potentiels";
-$a->strings["Remove"] = "Utiliser comme photo de profil";
-$a->strings["Add"] = "Ajouter";
-$a->strings["No entries."] = "Aucune entrée.";
-$a->strings["Profile not found."] = "Profil introuvable.";
 $a->strings["This may occasionally happen if contact was requested by both persons and it has already been approved."] = "Ceci peut se produire lorsque le contact a été requis par les deux personnes et a déjà été approuvé.";
 $a->strings["Response from remote site was not understood."] = "Réponse du site distant incomprise.";
 $a->strings["Unexpected response from remote site: "] = "Réponse inattendue du site distant : ";
@@ -328,18 +491,11 @@ $a->strings["Friendica"] = "Friendica";
 $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";
-$a->strings["People Search - %s"] = "Recherche de personne - %s";
-$a->strings["Forum Search - %s"] = "Recherche de Forum - %s";
-$a->strings["Connect"] = "Se connecter";
-$a->strings["No matches"] = "Aucune correspondance";
 $a->strings["The requested item doesn't exist or has been deleted."] = "L'objet recherché n'existe pas ou a été supprimé.";
 $a->strings["The feed for this item is unavailable."] = "Le flux pour cet objet n'est pas disponible.";
 $a->strings["Item not found"] = "Élément introuvable";
 $a->strings["Edit post"] = "Éditer la publication";
 $a->strings["Save"] = "Sauver";
-$a->strings["Insert web link"] = "Insérer lien web";
 $a->strings["web link"] = "lien web";
 $a->strings["Insert video link"] = "Insérer un lien video";
 $a->strings["video link"] = "lien vidéo";
@@ -353,7 +509,6 @@ $a->strings["Create New Event"] = "Créer un nouvel événement";
 $a->strings["Event details"] = "Détails de l'événement";
 $a->strings["Starting date and Title are required."] = "La date de début et le titre sont requis.";
 $a->strings["Event Starts:"] = "Début de l'événement :";
-$a->strings["Required"] = "Requis";
 $a->strings["Finish date/time is not known or not relevant"] = "Date / heure de fin inconnue ou sans objet";
 $a->strings["Event Finishes:"] = "Fin de l'événement :";
 $a->strings["Adjust for viewer timezone"] = "Ajuster à la zone horaire du visiteur";
@@ -375,9 +530,8 @@ $a->strings["You already added this contact."] = "Vous avez déjà ajouté ce co
 $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é.";
 $a->strings["The network type couldn't be detected. Contact can't be added."] = "Impossible de détecter le type de réseau. Le contact ne peut pas être ajouté.";
-$a->strings["Profile URL"] = "URL du Profil";
 $a->strings["Tags:"] = "Étiquette :";
-$a->strings["Status Messages and Posts"] = "Messages d'état et publications";
+$a->strings["Suggested contact not found."] = "Contact suggéré non trouvé";
 $a->strings["Friend suggestion sent."] = "Suggestion d'amitié/contact envoyée.";
 $a->strings["Suggest Friends"] = "Suggérer des amis/contacts";
 $a->strings["Suggest a friend for %s"] = "Suggérer un ami/contact pour %s";
@@ -390,10 +544,12 @@ $a->strings["Please contact the sender by replying to this post if you do not wi
 $a->strings["%s posted an update."] = "%s a publié une mise à jour.";
 $a->strings["Remote privacy information not available."] = "Informations de confidentialité indisponibles.";
 $a->strings["Visible to:"] = "Visible par :";
+$a->strings["Followers"] = "Abonnés";
+$a->strings["Mutuals"] = "Mutuels";
 $a->strings["No valid account found."] = "Impossible de trouver un compte valide.";
 $a->strings["Password reset request issued. Check your email."] = "Réinitialisation du mot de passe en cours. Vérifiez votre courriel.";
 $a->strings["\n\t\tDear %1\$s,\n\t\t\tA request was recently received at \"%2\$s\" to reset your account\n\t\tpassword. In order to confirm this request, please select the verification link\n\t\tbelow or paste it into your web browser address bar.\n\n\t\tIf you did NOT request this change, please DO NOT follow the link\n\t\tprovided and ignore and/or delete this email, the request will expire shortly.\n\n\t\tYour password will not be changed unless we can verify that you\n\t\tissued this request."] = "\n\t\tCher(e) %1\$s,\n\t\t\tUne demande vient d'être faite à \"%2\$s\" pour réinitialiser votre mot de passe. \n\t\tAfin de confirmer cette demande, merci de sélectionner le lien ci-dessous \n\t\tet de le coller dans la barre d'adresse de votre navigateur.\n\n\t\tSi vous n'avez PAS fait cette demande de changement, merci de NE PAS suivre le lien\n\t\tfourni et d'ignorer et/ou supprimer ce message. La demande expirera rapidement.\n\n\t\tVotre mot de passe ne changera pas tant que nous n'avons pas vérifier que vous êtes à l'origine de la demande.";
-$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["\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"] = "\n\t\tSuivez ce lien pour confirmer votre identité :\n\n\t\t%1\$s\n\n\t\tVous recevrez alors un message contenant votre nouveau mot de passe.\n\t\tVous pourrez changer ce mot de passe depuis les paramètres de votre compte une fois connecté.\n\n\t\tInformations de connexion :\n\n\t\tAdresse :\t%2\$s\n\t\tIdentifiant :\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."] = "La requête a expiré, veuillez la renouveler.";
@@ -407,33 +563,20 @@ $a->strings["Your new password is"] = "Votre nouveau mot de passe est ";
 $a->strings["Save or copy your new password - and then"] = "Sauvez ou copiez ce nouveau mot de passe - puis";
 $a->strings["click here to login"] = "cliquez ici pour vous connecter";
 $a->strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Votre mot de passe peut être changé depuis la page &lt;em&gt;Réglages&lt;/em&gt;, une fois que vous serez connecté.";
-$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["\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"] = "\n\t\t\t\tChère/Cher %1\$s,\n\t\t\t\t\tVotre mot de passe a été changé ainsi que vous l’avez demandé. Veuillez conserver cette informations dans vos archives (ou changer immédiatement votre mot de passe pour un autre dont vous vous souviendrez).\n\t\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"] = "\n\t\t\t\tVoici vos informations de connexion :\n\n\t\t\t\tAdresse :\t%1\$s\n\t\t\t\tIdentifiant :\t%2\$s\n\t\t\t\tMot de passe :\t%3\$s\n\n\t\t\t\tVous pourrez changer votre mot de passe dans les paramètres de votre compte une fois connecté.\n\t\t\t";
 $a->strings["Your password has been changed at %s"] = "Votre mot de passe a été modifié à %s";
 $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: ";
-$a->strings["No keywords to match. Please add keywords to your default profile."] = "Aucun mot-clé en correspondance. Merci d'ajouter des mots-clés à votre profil par défaut.";
-$a->strings["first"] = "premier";
-$a->strings["next"] = "suivant";
-$a->strings["Profile Match"] = "Correpondance de profils";
 $a->strings["New Message"] = "Nouveau message";
-$a->strings["No recipient selected."] = "Pas de destinataire sélectionné.";
 $a->strings["Unable to locate contact information."] = "Impossible de localiser les informations du contact.";
-$a->strings["Message could not be sent."] = "Impossible d'envoyer le message.";
-$a->strings["Message collection failure."] = "Récupération des messages infructueuse.";
-$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."] = "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 :";
-$a->strings["Send Private Message"] = "Envoyer un message privé";
-$a->strings["To:"] = "À:";
-$a->strings["Subject:"] = "Sujet:";
-$a->strings["Your message:"] = "Votre message :";
 $a->strings["No messages."] = "Aucun message.";
 $a->strings["Message not available."] = "Message indisponible.";
 $a->strings["Delete message"] = "Effacer message";
@@ -452,8 +595,8 @@ $a->strings["Remove term"] = "Retirer le terme";
 $a->strings["Saved Searches"] = "Recherches";
 $a->strings["add"] = "ajouter";
 $a->strings["Warning: This group contains %s member from a network that doesn't allow non public messages."] = [
-       0 => "",
-       1 => "",
+       0 => "Attention : Ce groupe contient %s membre d'un réseau qui n'autorise pas les messages non publics.",
+       1 => "Attention : Ce groupe contient %s membres d'un réseau qui n'autorise pas les messages non publics.",
 ];
 $a->strings["Messages in this group won't be send to these receivers."] = "Les messages dans ce groupe ne seront pas envoyés à ces destinataires.";
 $a->strings["No such group"] = "Groupe inexistant";
@@ -465,7 +608,6 @@ $a->strings["Commented Order"] = "Tri par commentaires";
 $a->strings["Sort by Comment Date"] = "Trier par date de commentaire";
 $a->strings["Posted Order"] = "Tri des publications";
 $a->strings["Sort by Post Date"] = "Trier par date de publication";
-$a->strings["Personal"] = "Personnel";
 $a->strings["Posts that mention or involve you"] = "Publications qui vous concernent";
 $a->strings["New"] = "Nouveau";
 $a->strings["Activity Stream - by date"] = "Flux d'activités - par date";
@@ -473,40 +615,6 @@ $a->strings["Shared Links"] = "Liens partagés";
 $a->strings["Interesting Links"] = "Liens intéressants";
 $a->strings["Starred"] = "Mis en avant";
 $a->strings["Favourite Posts"] = "Publications favorites";
-$a->strings["Welcome to Friendica"] = "Bienvenue sur Friendica";
-$a->strings["New Member Checklist"] = "Checklist du nouvel utilisateur";
-$a->strings["We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page. A link to this page will be visible from your home page for two weeks after your initial registration and then will quietly disappear."] = "Nous souhaiterions vous donner quelques astuces et ressources pour rendre votre expérience la plus agréable possible. Cliquez sur n'importe lequel de ces éléments pour visiter la page correspondante. Un lien vers cette page restera visible sur votre page d'accueil pendant les deux semaines qui suivent votre inscription initiale, puis disparaîtra silencieusement.";
-$a->strings["Getting Started"] = "Bien démarrer";
-$a->strings["Friendica Walk-Through"] = "Friendica pas-à-pas";
-$a->strings["On your <em>Quick Start</em> page - find a brief introduction to your profile and network tabs, make some new connections, and find some groups to join."] = "Sur votre page d'accueil, dans <em>Conseils aux nouveaux venus</em> - vous trouverez une rapide introduction aux onglets Profil et Réseau, pourrez vous connecter à Facebook, établir de nouvelles relations, et choisir des groupes à rejoindre.";
-$a->strings["Settings"] = "Réglages";
-$a->strings["Go to Your Settings"] = "Éditer vos Réglages";
-$a->strings["On your <em>Settings</em> page -  change your initial password. Also make a note of your Identity Address. This looks just like an email address - and will be useful in making friends on the free social web."] = "Sur la page des <em>Réglages</em> -     changez votre mot de passe initial. Notez bien votre Identité. Elle ressemble à une adresse de courriel - et vous sera utile pour vous faire des amis dans le web social libre.";
-$a->strings["Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you."] = "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.";
-$a->strings["Profile"] = "Profil";
-$a->strings["Upload Profile Photo"] = "Téléverser une photo de profil";
-$a->strings["Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not."] = "Téléversez (envoyez) une photo de profil si vous n'en avez pas déjà une. Les études montrent que les gens qui affichent de vraies photos d'eux sont dix fois plus susceptibles de se faire des amis.";
-$a->strings["Edit Your Profile"] = "Éditer votre Profil";
-$a->strings["Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors."] = "Éditez votre profil <strong>par défaut</strong> à votre convenance. Vérifiez les réglages concernant la visibilité de votre liste d'amis par les visiteurs inconnus.";
-$a->strings["Profile Keywords"] = "Mots-clés du profil";
-$a->strings["Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships."] = "Choisissez quelques mots-clé publics pour votre profil par défaut. Ils pourront ainsi décrire vos centres d'intérêt, et nous pourrons vous proposer des contacts qui les partagent.";
-$a->strings["Connecting"] = "Connexions";
-$a->strings["Importing Emails"] = "Importer courriels";
-$a->strings["Enter your email access information on your Connector Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = "Entrez vos paramètres de courriel dans les Réglages des connecteurs si vous souhaitez importer et interagir avec des amis ou des listes venant de votre Boîte de Réception.";
-$a->strings["Go to Your Contacts Page"] = "Consulter vos Contacts";
-$a->strings["Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Add New Contact</em> dialog."] = "Votre page Contacts est le point d'entrée vers la gestion de vos amitiés/relations et la connexion à des amis venant d'autres réseaux. Typiquement, vous pourrez y rentrer leur adresse d'Identité ou l'URL de leur site dans le formulaire <em>Ajouter un nouveau contact</em>.";
-$a->strings["Go to Your Site's Directory"] = "Consulter l'Annuaire de votre Site";
-$a->strings["The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested."] = "La page Annuaire vous permet de trouver d'autres personnes au sein de ce réseaux ou parmi d'autres sites fédérés. Cherchez un lien <em>Relier</em> ou <em>Suivre</em> sur leur profil. Vous pourrez avoir besoin d'indiquer votre adresse d'identité.";
-$a->strings["Finding New People"] = "Trouver de nouvelles personnes";
-$a->strings["On the side panel of the Contacts page are several tools to find new friends. We can match people by interest, look up people by name or interest, and provide suggestions based on network relationships. On a brand new site, friend suggestions will usually begin to be populated within 24 hours."] = "Sur le panneau latéral de la page Contacts, il y a plusieurs moyens de trouver de nouveaux amis. Nous pouvons mettre les gens en relation selon leurs intérêts, rechercher des amis par nom ou intérêt, et fournir des suggestions en fonction de la topologie du réseau. Sur un site tout neuf, les suggestions d'amitié devraient commencer à apparaître au bout de 24 heures.";
-$a->strings["Groups"] = "Groupes";
-$a->strings["Group Your Contacts"] = "Grouper vos contacts";
-$a->strings["Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page."] = "Une fois que vous avez trouvé quelques amis, organisez-les en groupes de conversation privés depuis le panneau latéral de la page Contacts. Vous pourrez ensuite interagir avec chaque groupe de manière privée depuis la page Réseau.";
-$a->strings["Why Aren't My Posts Public?"] = "Pourquoi mes éléments ne sont pas publics ?";
-$a->strings["Friendica respects your privacy. By default, your posts will only show up to people you've added as friends. For more information, see the help section from the link above."] = "Friendica respecte votre vie privée. Par défaut, toutes vos publications seront seulement montrés à vos amis. Pour plus d'information, consultez la section \"aide\" du lien ci-dessus.";
-$a->strings["Getting Help"] = "Obtenir de l'aide";
-$a->strings["Go to the Help Section"] = "Aller à la section Aide";
-$a->strings["Our <strong>help</strong> pages may be consulted for detail on other program features and resources."] = "Nos pages d'<strong>aide</strong> peuvent être consultées pour davantage de détails sur les fonctionnalités ou les ressources.";
 $a->strings["Personal Notes"] = "Notes personnelles";
 $a->strings["Invalid request identifier."] = "Identifiant de demande invalide.";
 $a->strings["Notifications"] = "Notifications";
@@ -526,8 +634,8 @@ $a->strings["Claims to be known to you: "] = "Prétend que vous le connaissez :
 $a->strings["yes"] = "oui";
 $a->strings["no"] = "non";
 $a->strings["Shall your connection be bidirectional or not?"] = "Souhaitez vous que votre connexion soit bi-directionnelle ?";
-$a->strings["Accepting %s as a friend allows %s to subscribe to your posts, and you will also receive updates from them in your news feed."] = "";
-$a->strings["Accepting %s as a subscriber allows them to subscribe to your posts, but you will not receive updates from them in your news feed."] = "";
+$a->strings["Accepting %s as a friend allows %s to subscribe to your posts, and you will also receive updates from them in your news feed."] = "Accepter %s comme ami autorise %s à s'abonner à vos publications, et vous recevrez également des nouvelles d'eux dans votre fil d'actualités.";
+$a->strings["Accepting %s as a subscriber allows them to subscribe to your posts, but you will not receive updates from them in your news feed."] = "Accepter %s comme ami les autorise à s'abonner à vos publications, mais vous ne recevrez pas de nouvelles d'eux dans votre fil d'actualités.";
 $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";
@@ -537,42 +645,28 @@ $a->strings["Gender:"] = "Genre :";
 $a->strings["Network:"] = "Réseau";
 $a->strings["No introductions."] = "Aucune demande d'introduction.";
 $a->strings["No more %s notifications."] = "Aucune notification de %s";
-$a->strings["No more system notifications."] = "Pas plus de notifications système.";
-$a->strings["Post successful."] = "Publication réussie.";
 $a->strings["OpenID protocol error. No ID returned."] = "Erreur de protocole OpenID. Pas d'ID en retour.";
 $a->strings["Account not found and OpenID registration is not permitted on this site."] = "Compte introuvable, et l'inscription OpenID n'est pas autorisée sur ce site.";
 $a->strings["Login failed."] = "Échec de connexion.";
-$a->strings["Subscribing to OStatus contacts"] = "Inscription aux contacts OStatus";
-$a->strings["No contact provided."] = "Pas de contact fourni.";
-$a->strings["Couldn't fetch information for contact."] = "Impossible de récupérer les informations pour ce contact.";
-$a->strings["Couldn't fetch friends for contact."] = "Impossible de récupérer les amis de ce contact.";
-$a->strings["Done"] = "Terminé";
-$a->strings["success"] = "réussite";
-$a->strings["failed"] = "échec";
-$a->strings["ignored"] = "ignoré";
-$a->strings["Keep this window open until done."] = "Veuillez garder cette fenêtre ouverte jusqu'à la fin.";
 $a->strings["Photo Albums"] = "Albums photo";
 $a->strings["Recent Photos"] = "Photos récentes";
 $a->strings["Upload New Photos"] = "Téléverser de nouvelles photos";
 $a->strings["everybody"] = "tout le monde";
 $a->strings["Contact information unavailable"] = "Informations de contact indisponibles";
 $a->strings["Album not found."] = "Album introuvable.";
-$a->strings["Album successfully deleted"] = "";
-$a->strings["Album was empty."] = "";
+$a->strings["Album successfully deleted"] = "Album bien supprimé";
+$a->strings["Album was empty."] = "L'album était vide";
 $a->strings["a photo"] = "une photo";
 $a->strings["%1\$s was tagged in %2\$s by %3\$s"] = "%1\$s a été étiqueté dans %2\$s par %3\$s";
-$a->strings["Image exceeds size limit of %s"] = "L'image dépasse la taille limite de %s";
-$a->strings["Image upload didn't complete, please try again"] = "";
-$a->strings["Image file is missing"] = "";
-$a->strings["Server can't accept new file upload at this time, please contact your administrator"] = "";
+$a->strings["Image upload didn't complete, please try again"] = "La mise en ligne de l'image ne s'est pas terminée, veuillez réessayer";
+$a->strings["Image file is missing"] = "Fichier image manquant";
+$a->strings["Server can't accept new file upload at this time, please contact your administrator"] = "Le serveur ne peut pas accepter la mise en ligne d'un nouveau fichier en ce moment, veuillez contacter un administrateur";
 $a->strings["Image file is empty."] = "Fichier image vide.";
-$a->strings["Unable to process image."] = "Impossible de traiter l'image.";
-$a->strings["Image upload failed."] = "Le téléversement de l'image a échoué.";
 $a->strings["No photos selected"] = "Aucune photo sélectionnée";
 $a->strings["Access to this item is restricted."] = "Accès restreint à cet élément.";
 $a->strings["Upload Photos"] = "Téléverser des photos";
 $a->strings["New album name: "] = "Nom du nouvel album : ";
-$a->strings["or select existing album:"] = "";
+$a->strings["or select existing album:"] = "ou sélectionner un album existant";
 $a->strings["Do not show a status post for this upload"] = "Ne pas publier de notice de statut pour cet envoi";
 $a->strings["Show to Groups"] = "Montrer aux groupes";
 $a->strings["Show to Contacts"] = "Montrer aux Contacts";
@@ -589,12 +683,12 @@ $a->strings["Do you really want to delete this photo?"] = "Voulez-vous vraiment
 $a->strings["Delete Photo"] = "Effacer la photo";
 $a->strings["View photo"] = "Voir photo";
 $a->strings["Edit photo"] = "Éditer la photo";
-$a->strings["Delete photo"] = "";
+$a->strings["Delete photo"] = "Effacer la photo";
 $a->strings["Use as profile photo"] = "Utiliser comme photo de profil";
-$a->strings["Private Photo"] = "";
+$a->strings["Private Photo"] = "Photo privée";
 $a->strings["View Full Size"] = "Voir en taille réelle";
 $a->strings["Tags: "] = "Étiquettes :";
-$a->strings["[Select tags to remove]"] = "";
+$a->strings["[Select tags to remove]"] = "[Sélectionner les étiquettes à supprimer]";
 $a->strings["New album name"] = "Nom du nouvel album";
 $a->strings["Caption"] = "Titre";
 $a->strings["Add a Tag"] = "Ajouter une étiquette";
@@ -615,88 +709,6 @@ $a->strings["poke, prod or do other things to somebody"] = "solliciter (poke/...
 $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["Profile deleted."] = "Profil supprimé.";
-$a->strings["Profile-"] = "Profil-";
-$a->strings["New profile created."] = "Nouveau profil créé.";
-$a->strings["Profile unavailable to clone."] = "Ce profil ne peut être cloné.";
-$a->strings["Profile Name is required."] = "Le nom du profil est requis.";
-$a->strings["Marital Status"] = "Statut marital";
-$a->strings["Romantic Partner"] = "Partenaire / conjoint";
-$a->strings["Work/Employment"] = "Travail / Occupation";
-$a->strings["Religion"] = "Religion";
-$a->strings["Political Views"] = "Tendance politique";
-$a->strings["Gender"] = "Sexe";
-$a->strings["Sexual Preference"] = "Préférence sexuelle";
-$a->strings["XMPP"] = "XMPP";
-$a->strings["Homepage"] = "Site internet";
-$a->strings["Interests"] = "Centres d'intérêt";
-$a->strings["Address"] = "Adresse";
-$a->strings["Location"] = "Localisation";
-$a->strings["Profile updated."] = "Profil mis à jour.";
-$a->strings["Hide contacts and friends:"] = "Cacher mes contacts et amis :";
-$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Cacher ma liste d'amis / contacts des visiteurs de ce profil ?";
-$a->strings["Show more profile fields:"] = "Afficher plus d'infos de profil :";
-$a->strings["Profile Actions"] = "Actions de Profil";
-$a->strings["Edit Profile Details"] = "Éditer les détails du profil";
-$a->strings["Change Profile Photo"] = "Changer la photo du profil";
-$a->strings["View this profile"] = "Voir ce profil";
-$a->strings["View all profiles"] = "";
-$a->strings["Edit visibility"] = "Changer la visibilité";
-$a->strings["Create a new profile using these settings"] = "Créer un nouveau profil en utilisant ces réglages";
-$a->strings["Clone this profile"] = "Cloner ce profil";
-$a->strings["Delete this profile"] = "Supprimer ce profil";
-$a->strings["Basic information"] = "Information de base";
-$a->strings["Profile picture"] = "Image de profil";
-$a->strings["Preferences"] = "Préférences";
-$a->strings["Status information"] = "Information sur le statut";
-$a->strings["Additional information"] = "Information additionnelle";
-$a->strings["Relation"] = "Relation";
-$a->strings["Miscellaneous"] = "Divers";
-$a->strings["Your Gender:"] = "Votre genre :";
-$a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "<span class=\"heart\">&hearts;</span> Statut marital :";
-$a->strings["Sexual Preference:"] = "Préférence sexuelle :";
-$a->strings["Example: fishing photography software"] = "Exemple : football dessin programmation";
-$a->strings["Profile Name:"] = "Nom du profil :";
-$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "Ceci est votre profil <strong>public</strong>.<br />Il <strong>peut</strong> être visible par n'importe quel utilisateur d'Internet.";
-$a->strings["Your Full Name:"] = "Votre nom complet :";
-$a->strings["Title/Description:"] = "Titre / Description :";
-$a->strings["Street Address:"] = "Adresse postale :";
-$a->strings["Locality/City:"] = "Ville :";
-$a->strings["Region/State:"] = "Région / État :";
-$a->strings["Postal/Zip Code:"] = "Code postal :";
-$a->strings["Country:"] = "Pays :";
-$a->strings["Age: "] = "Age : ";
-$a->strings["Who: (if applicable)"] = "Qui : (si pertinent)";
-$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Exemples: cathy123, Cathy Williams, cathy@example.com";
-$a->strings["Since [date]:"] = "Depuis [date]  :";
-$a->strings["Tell us about yourself..."] = "Parlez-nous de vous...";
-$a->strings["XMPP (Jabber) address:"] = "Adresse XMPP (Jabber) :";
-$a->strings["The XMPP address will be propagated to your contacts so that they can follow you."] = "Votre adresse XMPP sera transmise à vos contacts pour qu'ils puissent vous suivre.";
-$a->strings["Homepage URL:"] = "Page personnelle :";
-$a->strings["Hometown:"] = " Ville d'origine :";
-$a->strings["Political Views:"] = "Opinions politiques :";
-$a->strings["Religious Views:"] = "Opinions religieuses :";
-$a->strings["Public Keywords:"] = "Mots-clés publics :";
-$a->strings["(Used for suggesting potential friends, can be seen by others)"] = "(Utilisés pour vous suggérer des amis potentiels. Ils peuvent être vus par autrui)";
-$a->strings["Private Keywords:"] = "Mots-clés privés :";
-$a->strings["(Used for searching profiles, never shown to others)"] = "(Utilisés pour rechercher des profils. Ils ne seront jamais montrés à autrui)";
-$a->strings["Likes:"] = "J'aime :";
-$a->strings["Dislikes:"] = "Je n'aime pas :";
-$a->strings["Musical interests"] = "Goûts musicaux";
-$a->strings["Books, literature"] = "Lectures";
-$a->strings["Television"] = "Télévision";
-$a->strings["Film/dance/culture/entertainment"] = "Cinéma / Danse / Culture / Divertissement";
-$a->strings["Hobbies/Interests"] = "Passe-temps / Centres d'intérêt";
-$a->strings["Love/romance"] = "Amour / Romance";
-$a->strings["Work/employment"] = "Activité professionnelle / Occupation";
-$a->strings["School/education"] = "Études / Formation";
-$a->strings["Contact information and Social Networks"] = "Coordonnées / Réseaux sociaux";
-$a->strings["Profile Image"] = "Image du profil";
-$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.";
@@ -708,25 +720,8 @@ $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["Permission denied"] = "Permission refusée";
-$a->strings["Invalid profile identifier."] = "Identifiant de profil invalide.";
-$a->strings["Profile Visibility Editor"] = "Éditer la visibilité du profil";
-$a->strings["Click on a contact to add or remove."] = "Cliquez sur un contact pour l'ajouter ou le supprimer.";
-$a->strings["Visible To"] = "Visible par";
-$a->strings["All Contacts (with secure profile access)"] = "Tous les contacts (ayant un accès sécurisé)";
-$a->strings["Account approved."] = "Inscription validée.";
-$a->strings["Registration revoked for %s"] = "Inscription révoquée pour %s";
-$a->strings["Please login."] = "Merci de vous connecter.";
-$a->strings["User deleted their account"] = "";
-$a->strings["On your Friendica node an user deleted their account. Please ensure that their data is removed from the backups."] = "";
-$a->strings["The user id is %d"] = "L'identifiant d'utilisateur est %d";
-$a->strings["Remove My Account"] = "Supprimer mon compte";
-$a->strings["This will completely remove your account. Once this has been done it is not recoverable."] = "Ceci supprimera totalement votre compte. Cette opération est irréversible.";
-$a->strings["Please enter your password for verification:"] = "Merci de saisir votre mot de passe pour vérification :";
-$a->strings["Resubscribing to OStatus contacts"] = "Réinscription aux contacts OStatus";
-$a->strings["Error"] = "Erreur";
+$a->strings["Done Editing"] = "Édition terminée";
+$a->strings["Image uploaded successfully."] = "Image téléversée avec succès.";
 $a->strings["Only logged in users are permitted to perform a search."] = "Seuls les utilisateurs inscrits sont autorisés à lancer une recherche.";
 $a->strings["Only one search per minute is permitted for not logged in users."] = "Une seule recherche par minute pour les utilisateurs qui ne sont pas connectés.";
 $a->strings["Search"] = "Recherche";
@@ -743,11 +738,13 @@ $a->strings["Delegations"] = "Délégations";
 $a->strings["Connected apps"] = "Applications connectées";
 $a->strings["Export personal data"] = "Exporter";
 $a->strings["Remove account"] = "Supprimer le compte";
+$a->strings["Settings"] = "Réglages";
 $a->strings["Missing some important data!"] = "Il manque certaines informations importantes !";
 $a->strings["Update"] = "Mises à jour";
 $a->strings["Failed to connect with email account using the settings provided."] = "Impossible de se connecter au compte courriel configuré.";
 $a->strings["Email settings updated."] = "Réglages de courriel mis à jour.";
 $a->strings["Features updated"] = "Fonctionnalités mises à jour";
+$a->strings["The theme you chose isn't available."] = "Le thème que vous avez choisi n'est pas disponible.";
 $a->strings["Relocate message has been send to your contacts"] = "Un message de relocalisation a été envoyé à vos contacts.";
 $a->strings["Passwords do not match."] = "Les mots de passe ne correspondent pas.";
 $a->strings["Password update failed. Please try again."] = "Le changement de mot de passe a échoué. Merci de recommencer.";
@@ -784,6 +781,8 @@ $a->strings["Built-in support for %s connectivity is %s"] = "Le support natif po
 $a->strings["GNU Social (OStatus)"] = "GNU Social (OStatus)";
 $a->strings["Email access is disabled on this site."] = "L'accès courriel est désactivé sur ce site.";
 $a->strings["General Social Media Settings"] = "Paramètres généraux des réseaux sociaux";
+$a->strings["Accept only top level posts by contacts you follow"] = "";
+$a->strings["The system does an auto completion of threads when a comment arrives. This has got the side effect that you can receive posts that had been started by a non-follower but had been commented by someone you follow. This setting deactivates this behaviour. When activated, you strictly only will receive posts from people you really do follow."] = "Le système effectue une auto-complétion des fils quand un commentaire arrive. Ceci a l'effet secondaire que vous pouvez recevoir des publications qui ont été démarrées par un non-abonné mais qui a été commenté par quelqu'un que vous suivez. Ce paramètre désactive ce comportement. Quand activé, vous ne recevrez strictement que les publications des personnes que vous suivez vraiment.";
 $a->strings["Disable Content Warning"] = "Désactiver les avertissements de contenus (CW)";
 $a->strings["Users on networks like Mastodon or Pleroma are able to set a content warning field which collapse their post by default. This disables the automatic collapsing and sets the content warning as the post title. Doesn't affect any other content filtering you eventually set up."] = "Les utilisateurs sur les réseaux comme Mastodon ou Pleroma sont en mesure de mettre un champs d'avertissement de contenu qui cache leur message par défaut. Cela désactive la fermeture automatique et met le message d'avertissement de contenu comme titre de la publication. ";
 $a->strings["Disable intelligent shortening"] = "Désactiver la réduction d'URL";
@@ -870,7 +869,7 @@ $a->strings["Your profile will be published in the global friendica directories
 $a->strings["Hide your contact/friend list from viewers of your default profile?"] = "Cacher votre liste de contacts/amis des visiteurs de votre profil par défaut?";
 $a->strings["Your contact list won't be shown in your default profile page. You can decide to show your contact list separately for each additional profile you create"] = "Votre liste de contacts ne sera pas affiché sur la page de votre profil par défaut. Vous pouvez choisir d'afficher votre liste de contact séparément pour chaque profil que vous créez.";
 $a->strings["Hide your profile details from anonymous viewers?"] = "Cacher les détails de votre profil pour les lecteurs anonymes.";
-$a->strings["Anonymous visitors will only see your profile picture, your display name and the nickname you are using on your profile page. Your public posts and replies will still be accessible by other means."] = "";
+$a->strings["Anonymous visitors will only see your profile picture, your display name and the nickname you are using on your profile page. Your public posts and replies will still be accessible by other means."] = "Les visiteurs anonymes ne verront que votre image de profil, votre nom affiché, et le surnom que vous utilisez sur votre page de profil. Vos publications publics et réponses seront toujours accessibles par d'autres moyens.";
 $a->strings["Allow friends to post to your profile page?"] = "Autoriser vos amis à publier sur votre profil ?";
 $a->strings["Your contacts may write posts on your profile wall. These posts will be distributed to your contacts"] = "";
 $a->strings["Allow friends to tag your posts?"] = "Autoriser vos amis à étiqueter vos publications?";
@@ -943,59 +942,286 @@ $a->strings["No suggestions available. If this is a new site, please try again i
 $a->strings["Do you really want to delete this suggestion?"] = "Voulez-vous vraiment supprimer cette suggestion ?";
 $a->strings["Ignore/Hide"] = "Ignorer/cacher";
 $a->strings["Friend Suggestions"] = "Suggestions d'amitiés/contacts";
-$a->strings["Tag(s) removed"] = "";
-$a->strings["Remove Item Tag"] = "Enlever l'étiquette de l'élément";
-$a->strings["Select a tag to remove: "] = "Sélectionner une étiquette à supprimer :";
 $a->strings["Export account"] = "Exporter le compte";
 $a->strings["Export your account info and contacts. Use this to make a backup of your account and/or to move it to another server."] = "Exportez votre compte, vos infos et vos contacts. Vous pourrez utiliser le résultat comme sauvegarde et/ou pour le ré-importer sur un autre serveur.";
 $a->strings["Export all"] = "Tout exporter";
 $a->strings["Export your accout info, contacts and all your items as json. Could be a very big file, and could take a lot of time. Use this to make a full backup of your account (photos are not exported)"] = "Exportez votre compte, vos infos, vos contacts et toutes vos publications (en JSON). Le fichier résultant peut être extrêmement volumineux, et sa production peut durer longtemps. Vous pourrez l'utiliser pour faire une sauvegarde complète (à part les photos).";
-$a->strings["User imports on closed servers can only be done by an administrator."] = "";
-$a->strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Le nombre d'inscriptions quotidiennes pour ce site a été dépassé. Merci de réessayer demain.";
-$a->strings["Import"] = "Importer";
-$a->strings["Move account"] = "Migrer le compte";
-$a->strings["You can import an account from another Friendica server."] = "Vous pouvez importer un compte d'un autre serveur Friendica.";
-$a->strings["You need to export your account from the old server and upload it here. We will recreate your old account here with all your contacts. We will try also to inform your friends that you moved here."] = "Vous devez exporter votre compte à partir de l'ancien serveur et le téléverser ici. Nous recréerons votre ancien compte ici avec tous vos contacts. Nous tenterons également d'informer vos amis que vous avez déménagé ici.";
-$a->strings["This feature is experimental. We can't import contacts from the OStatus network (GNU Social/Statusnet) or from Diaspora"] = "Cette fonctionalité est expérimentale. Il n'est pas possible d'importer des contacts depuis le réseau OStatus (GNU Social/Statusnet) ou depuis Diaspora.";
-$a->strings["Account file"] = "Fichier du compte";
-$a->strings["To export your account, go to \"Settings->Export your personal data\" and select \"Export account\""] = "Pour exporter votre compte, allez dans \"Paramètres> Exporter vos données personnelles\" et sélectionnez \"exportation de compte\"";
-$a->strings["You aren't following this contact."] = "";
-$a->strings["Unfollowing is currently not supported by your network."] = "";
-$a->strings["Contact unfollowed"] = "";
-$a->strings["Disconnect/Unfollow"] = "Se déconnecter/Ne plus suivre";
-$a->strings["[Embedded content - reload page to view]"] = "[Ccontenu incorporé - rechargez la page pour le voir]";
 $a->strings["No videos selected"] = "Pas de vidéo sélectionné";
 $a->strings["View Video"] = "Regarder la vidéo";
 $a->strings["Recent Videos"] = "Vidéos récente";
 $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["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["Copy or paste schemestring"] = "";
+$a->strings["You can copy this string to share your theme with others. Pasting here applies the schemestring"] = "";
+$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["Enable Compose page"] = "";
+$a->strings["This replaces the jot modal window for writing new posts with a link to <a href=\"compose\">the new Compose page</a>."] = "";
+$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["Status"] = "Statut";
+$a->strings["Your posts and conversations"] = "Vos publications et conversations";
+$a->strings["Your profile page"] = "Votre page de profil";
+$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["Network"] = "Réseau";
+$a->strings["Conversations from your friends"] = "Conversations de vos amis";
+$a->strings["Events and Calendar"] = "Événements et agenda";
+$a->strings["Private mail"] = "Messages privés";
+$a->strings["Account settings"] = "Compte";
 $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["Delete this item?"] = "Effacer cet élément?";
-$a->strings["toggle mobile"] = "activ. mobile";
-$a->strings["No system theme config value set."] = "";
-$a->strings["You must be logged in to use addons. "] = "Vous devez être connecté pour utiliser les greffons.";
-$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["Could not find any unarchived contact entry for this URL (%s)"] = "";
-$a->strings["The contact entries have been archived"] = "";
-$a->strings["Could not find any contact entry for this URL (%s)"] = "Aucun profil distant n'a été trouvé à cette URL (%s)";
-$a->strings["The contact has been blocked from the node"] = "Le profile distant a été bloqué";
-$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["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["Find"] = "Trouver";
+$a->strings["Similar Interests"] = "Intérêts similaires";
+$a->strings["Random Profile"] = "Profil au hasard";
+$a->strings["Invite Friends"] = "Inviter des amis";
+$a->strings["Global Directory"] = "Annuaire global";
+$a->strings["Local Directory"] = "Annuaire local";
+$a->strings["Forums"] = "Forums";
+$a->strings["External link to forum"] = "Lien sortant vers le forum";
+$a->strings["show more"] = "montrer plus";
+$a->strings["Quick Start"] = "Démarrage rapide";
+$a->strings["Help"] = "Aide";
+$a->strings["Post to Email"] = "Publier aux courriels";
+$a->strings["Visible to everybody"] = "Visible par tout le monde";
+$a->strings["Connectors"] = "";
+$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["Close"] = "Fermer";
+$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\".";
+$a->strings["Could not find a command line version of PHP in the web server PATH."] = "Impossible de trouver la version \"ligne de commande\" de PHP dans le PATH du serveur web.";
+$a->strings["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>"] = "";
+$a->strings["PHP executable path"] = "Chemin vers l'exécutable de PHP";
+$a->strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "Entrez le chemin (absolu) vers l'exécutable 'php'. Vous pouvez laisser cette ligne vide pour continuer l'installation.";
+$a->strings["Command line PHP"] = "Version \"ligne de commande\" de PHP";
+$a->strings["PHP executable is not the php cli binary (could be cgi-fgci version)"] = "L'executable PHP n'est pas le binaire php client (c'est peut être la version cgi-fcgi)";
+$a->strings["Found PHP version: "] = "Version de PHP :";
+$a->strings["PHP cli binary"] = "PHP cli binary";
+$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "La version \"ligne de commande\" de PHP de votre système n'a pas \"register_argc_argv\" d'activé.";
+$a->strings["This is required for message delivery to work."] = "Ceci est requis pour que la livraison des messages fonctionne.";
+$a->strings["PHP register_argc_argv"] = "PHP register_argc_argv";
+$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Erreur: la fonction \"openssl_pkey_new\" de ce système ne permet pas de générer des clés de chiffrement";
+$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Si vous utilisez Windows, merci de vous réferer à \"http://www.php.net/manual/en/openssl.installation.php\".";
+$a->strings["Generate encryption keys"] = "Générer les clés de chiffrement";
+$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Erreur : Le module \"rewrite\" du serveur web Apache est requis mais pas installé.";
+$a->strings["Apache mod_rewrite module"] = "Module mod_rewrite Apache";
+$a->strings["Error: PDO or MySQLi PHP module required but not installed."] = "";
+$a->strings["Error: The MySQL driver for PDO is not installed."] = "";
+$a->strings["PDO or MySQLi PHP module"] = "";
+$a->strings["Error, XML PHP module required but not installed."] = "Erreur : le module PHP XML requis est absent.";
+$a->strings["XML PHP module"] = "Module PHP XML";
+$a->strings["libCurl PHP module"] = "Module libCurl de PHP";
+$a->strings["Error: libCURL PHP module required but not installed."] = "Erreur : Le module PHP \"libCURL\" est requis mais pas installé.";
+$a->strings["GD graphics PHP module"] = "Module GD (graphiques) de PHP";
+$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Erreur : Le module PHP \"GD\" disposant du support JPEG est requis mais pas installé.";
+$a->strings["OpenSSL PHP module"] = "Module OpenSSL de PHP";
+$a->strings["Error: openssl PHP module required but not installed."] = "Erreur : Le module PHP \"openssl\" est requis mais pas installé.";
+$a->strings["mb_string PHP module"] = "Module mb_string de PHP";
+$a->strings["Error: mb_string PHP module required but not installed."] = "Erreur : le module PHP mb_string est requis mais pas installé.";
+$a->strings["iconv PHP module"] = "";
+$a->strings["Error: iconv PHP module required but not installed."] = "Erreur : Le module PHP iconv requis est absent.";
+$a->strings["POSIX PHP module"] = "";
+$a->strings["Error: POSIX PHP module required but not installed."] = "";
+$a->strings["JSON PHP module"] = "";
+$a->strings["Error: JSON PHP module required but not installed."] = "";
+$a->strings["File Information PHP module"] = "";
+$a->strings["Error: File Information PHP module required but not installed."] = "";
+$a->strings["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."] = "";
+$a->strings["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."] = "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.";
+$a->strings["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."] = "";
+$a->strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"INSTALL.txt\" for instructions."] = "Vous pouvez également sauter cette étape et procéder à une installation manuelle. Pour cela, merci de lire le fichier \"INSTALL.txt\".";
+$a->strings["config/local.config.php is writable"] = "";
+$a->strings["Friendica uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "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.";
+$a->strings["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."] = "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.";
+$a->strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "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.";
+$a->strings["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."] = "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.";
+$a->strings["view/smarty3 is writable"] = "view/smarty3 est autorisé à l écriture";
+$a->strings["Url rewrite in .htaccess is not working. Make sure you copied .htaccess-dist to .htaccess."] = "";
+$a->strings["Error message from Curl when fetching"] = "";
+$a->strings["Url rewrite is working"] = "La réécriture d'URL fonctionne.";
+$a->strings["ImageMagick PHP extension is not installed"] = "L'extension PHP ImageMagick n'est pas installée";
+$a->strings["ImageMagick PHP extension is installed"] = "L’extension PHP ImageMagick est installée";
+$a->strings["ImageMagick supports GIF"] = "ImageMagick supporte le format GIF";
+$a->strings["Database already in use."] = "Base de données déjà en cours d'utilisation.";
+$a->strings["Could not connect to database."] = "Impossible de se connecter à la base.";
+$a->strings["Tuesday"] = "Mardi";
+$a->strings["Wednesday"] = "Mercredi";
+$a->strings["Thursday"] = "Jeudi";
+$a->strings["Friday"] = "Vendredi";
+$a->strings["Saturday"] = "Samedi";
+$a->strings["January"] = "Janvier";
+$a->strings["February"] = "Février";
+$a->strings["March"] = "Mars";
+$a->strings["April"] = "Avril";
+$a->strings["May"] = "Mai";
+$a->strings["June"] = "Juin";
+$a->strings["July"] = "Juillet";
+$a->strings["August"] = "Août";
+$a->strings["September"] = "Septembre";
+$a->strings["October"] = "Octobre";
+$a->strings["November"] = "Novembre";
+$a->strings["December"] = "Décembre";
+$a->strings["Mon"] = "Lun";
+$a->strings["Tue"] = "Mar";
+$a->strings["Wed"] = "Mer";
+$a->strings["Thu"] = "Jeu";
+$a->strings["Fri"] = "Ven";
+$a->strings["Sat"] = "Sam";
+$a->strings["Sun"] = "Dim";
+$a->strings["Jan"] = "Jan";
+$a->strings["Feb"] = "Fév";
+$a->strings["Mar"] = "Mar";
+$a->strings["Apr"] = "Avr";
+$a->strings["Jun"] = "Jun";
+$a->strings["Jul"] = "Jul";
+$a->strings["Aug"] = "Aoû";
+$a->strings["Sep"] = "";
+$a->strings["Oct"] = "Oct";
+$a->strings["Nov"] = "Nov";
+$a->strings["Dec"] = "Déc";
+$a->strings["poke"] = "titiller";
+$a->strings["poked"] = "a titillé";
+$a->strings["ping"] = "attirer l'attention";
+$a->strings["pinged"] = "a attiré l'attention de";
+$a->strings["prod"] = "aiguillonner";
+$a->strings["prodded"] = "a aiguillonné";
+$a->strings["slap"] = "gifler";
+$a->strings["slapped"] = "a giflé";
+$a->strings["finger"] = "tripoter";
+$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";
+$a->strings["%s disliked %s's post"] = "%s n'a pas aimé la publication de %s";
+$a->strings["%s is attending %s's event"] = "%s participe à l'événement de %s";
+$a->strings["%s is not attending %s's event"] = "%s ne participe pas à l'événement de %s";
+$a->strings["%s may attend %s's event"] = "%s participera peut-être à l'événement de %s";
+$a->strings["%s is now friends with %s"] = "%s est désormais ami(e) avec %s";
+$a->strings["Friend Suggestion"] = "Suggestion d'amitié/contact";
+$a->strings["Friend/Connect Request"] = "Demande de connexion/relation";
+$a->strings["New Follower"] = "Nouvel abonné";
+$a->strings["Welcome %s"] = "";
+$a->strings["Please upload a profile photo."] = "Merci d'illustrer votre profil d'une image.";
+$a->strings["Welcome back %s"] = "";
+$a->strings["Update %s failed. See error logs."] = "Mise-à-jour %s échouée. Voir les journaux d'erreur.";
+$a->strings["\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."] = "";
+$a->strings["The error message is\n[pre]%s[/pre]"] = "Le message d’erreur est\n[pre]%s[/pre]";
+$a->strings["[Friendica Notify] Database update"] = "";
+$a->strings["\n\t\t\t\t\tThe friendica database was successfully updated from %s to %s."] = "";
+$a->strings["Error decoding account file"] = "Une erreur a été détecté en décodant un fichier utilisateur";
+$a->strings["Error! No version data in file! This is not a Friendica account file?"] = "Erreur ! Pas de ficher de version existant ! Êtes vous sur un compte Friendica ?";
+$a->strings["User '%s' already exists on this server!"] = "L'utilisateur '%s' existe déjà sur ce serveur!";
+$a->strings["User creation error"] = "Erreur de création d'utilisateur";
+$a->strings["User profile creation error"] = "Erreur de création du profil utilisateur";
+$a->strings["%d contact not imported"] = [
+       0 => "%d contacts non importés",
+       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["Trending Tags (last %d hour)"] = [
+       0 => "",
+       1 => "",
+];
+$a->strings["More Trending Tags"] = "";
+$a->strings["newer"] = "Plus récent";
+$a->strings["older"] = "Plus ancien";
+$a->strings["prev"] = "précédent";
+$a->strings["last"] = "dernier";
 $a->strings["Frequently"] = "";
 $a->strings["Hourly"] = "";
 $a->strings["Twice daily"] = "";
@@ -1046,8 +1272,7 @@ $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["In a relation"] = "";
 $a->strings["Has crush"] = "Attiré par quelqu'un";
 $a->strings["Infatuated"] = "Entiché";
 $a->strings["Dating"] = "Dans une relation";
@@ -1082,12 +1307,15 @@ $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["Trending Tags"] = "";
+$a->strings["Show a community page widget with a list of the most popular tags in recent public posts."] = "";
 $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["Archives"] = "Archives";
 $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"] = "";
@@ -1106,90 +1334,45 @@ $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";
-$a->strings["Your posts and conversations"] = "Vos publications et conversations";
-$a->strings["Your profile page"] = "Votre page de profil";
-$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["Personal notes"] = "Notes personnelles";
-$a->strings["Your personal notes"] = "Vos notes personnelles";
 $a->strings["Login"] = "Connexion";
 $a->strings["Sign in"] = "Se connecter";
-$a->strings["Home"] = "Profil";
+$a->strings["Personal notes"] = "Notes personnelles";
+$a->strings["Your personal notes"] = "Vos notes personnelles";
 $a->strings["Home Page"] = "Page d'accueil";
 $a->strings["Register"] = "S'inscrire";
 $a->strings["Create an account"] = "Créer un compte";
-$a->strings["Help"] = "Aide";
 $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"] = "Information";
 $a->strings["Information about this friendica instance"] = "Information au sujet de cette instance de friendica";
 $a->strings["Terms of Service"] = "Conditions de service";
 $a->strings["Terms of Service of this Friendica instance"] = "";
-$a->strings["Network"] = "Réseau";
-$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["Admin"] = "Admin";
 $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";
@@ -1197,15 +1380,10 @@ $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["Find"] = "Trouver";
-$a->strings["Similar Interests"] = "Intérêts similaires";
-$a->strings["Random Profile"] = "Profil au hasard";
-$a->strings["Invite Friends"] = "Inviter des amis";
-$a->strings["Global Directory"] = "Annuaire global";
-$a->strings["Local Directory"] = "Annuaire local";
+$a->strings["Following"] = "";
+$a->strings["Mutual friends"] = "";
+$a->strings["Relationships"] = "";
+$a->strings["All Contacts"] = "Tous les contacts";
 $a->strings["Protocols"] = "";
 $a->strings["All Protocols"] = "";
 $a->strings["Saved Folders"] = "Dossiers sauvegardés";
@@ -1215,154 +1393,18 @@ $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["Visible to everybody"] = "Visible par tout le monde";
-$a->strings["show"] = "montrer";
-$a->strings["don't show"] = "cacher";
-$a->strings["Connectors"] = "";
-$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["Close"] = "Fermer";
-$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\".";
-$a->strings["Could not find a command line version of PHP in the web server PATH."] = "Impossible de trouver la version \"ligne de commande\" de PHP dans le PATH du serveur web.";
-$a->strings["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>"] = "";
-$a->strings["PHP executable path"] = "Chemin vers l'exécutable de PHP";
-$a->strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "Entrez le chemin (absolu) vers l'exécutable 'php'. Vous pouvez laisser cette ligne vide pour continuer l'installation.";
-$a->strings["Command line PHP"] = "Version \"ligne de commande\" de PHP";
-$a->strings["PHP executable is not the php cli binary (could be cgi-fgci version)"] = "L'executable PHP n'est pas le binaire php client (c'est peut être la version cgi-fcgi)";
-$a->strings["Found PHP version: "] = "Version de PHP :";
-$a->strings["PHP cli binary"] = "PHP cli binary";
-$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "La version \"ligne de commande\" de PHP de votre système n'a pas \"register_argc_argv\" d'activé.";
-$a->strings["This is required for message delivery to work."] = "Ceci est requis pour que la livraison des messages fonctionne.";
-$a->strings["PHP register_argc_argv"] = "PHP register_argc_argv";
-$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Erreur: la fonction \"openssl_pkey_new\" de ce système ne permet pas de générer des clés de chiffrement";
-$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Si vous utilisez Windows, merci de vous réferer à \"http://www.php.net/manual/en/openssl.installation.php\".";
-$a->strings["Generate encryption keys"] = "Générer les clés de chiffrement";
-$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Erreur : Le module \"rewrite\" du serveur web Apache est requis mais pas installé.";
-$a->strings["Apache mod_rewrite module"] = "Module mod_rewrite Apache";
-$a->strings["Error: PDO or MySQLi PHP module required but not installed."] = "";
-$a->strings["Error: The MySQL driver for PDO is not installed."] = "";
-$a->strings["PDO or MySQLi PHP module"] = "";
-$a->strings["Error, XML PHP module required but not installed."] = "Erreur : le module PHP XML requis est absent.";
-$a->strings["XML PHP module"] = "Module PHP XML";
-$a->strings["libCurl PHP module"] = "Module libCurl de PHP";
-$a->strings["Error: libCURL PHP module required but not installed."] = "Erreur : Le module PHP \"libCURL\" est requis mais pas installé.";
-$a->strings["GD graphics PHP module"] = "Module GD (graphiques) de PHP";
-$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Erreur : Le module PHP \"GD\" disposant du support JPEG est requis mais pas installé.";
-$a->strings["OpenSSL PHP module"] = "Module OpenSSL de PHP";
-$a->strings["Error: openssl PHP module required but not installed."] = "Erreur : Le module PHP \"openssl\" est requis mais pas installé.";
-$a->strings["mb_string PHP module"] = "Module mb_string de PHP";
-$a->strings["Error: mb_string PHP module required but not installed."] = "Erreur : le module PHP mb_string est requis mais pas installé.";
-$a->strings["iconv PHP module"] = "";
-$a->strings["Error: iconv PHP module required but not installed."] = "Erreur : Le module PHP iconv requis est absent.";
-$a->strings["POSIX PHP module"] = "";
-$a->strings["Error: POSIX PHP module required but not installed."] = "";
-$a->strings["JSON PHP module"] = "";
-$a->strings["Error: JSON PHP module required but not installed."] = "";
-$a->strings["File Information PHP module"] = "";
-$a->strings["Error: File Information PHP module required but not installed."] = "";
-$a->strings["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."] = "";
-$a->strings["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."] = "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.";
-$a->strings["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."] = "";
-$a->strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"INSTALL.txt\" for instructions."] = "Vous pouvez également sauter cette étape et procéder à une installation manuelle. Pour cela, merci de lire le fichier \"INSTALL.txt\".";
-$a->strings["config/local.config.php is writable"] = "";
-$a->strings["Friendica uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "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.";
-$a->strings["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."] = "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.";
-$a->strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "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.";
-$a->strings["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."] = "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.";
-$a->strings["view/smarty3 is writable"] = "view/smarty3 est autorisé à l écriture";
-$a->strings["Url rewrite in .htaccess is not working. Make sure you copied .htaccess-dist to .htaccess."] = "";
-$a->strings["Error message from Curl when fetching"] = "";
-$a->strings["Url rewrite is working"] = "La réécriture d'URL fonctionne.";
-$a->strings["ImageMagick PHP extension is not installed"] = "L'extension PHP ImageMagick n'est pas installée";
-$a->strings["ImageMagick PHP extension is installed"] = "L’extension PHP ImageMagick est installée";
-$a->strings["ImageMagick supports GIF"] = "ImageMagick supporte le format GIF";
-$a->strings["Could not connect to database."] = "Impossible de se connecter à la base.";
-$a->strings["Database already in use."] = "Base de données déjà en cours d'utilisation.";
-$a->strings["Tuesday"] = "Mardi";
-$a->strings["Wednesday"] = "Mercredi";
-$a->strings["Thursday"] = "Jeudi";
-$a->strings["Friday"] = "Vendredi";
-$a->strings["Saturday"] = "Samedi";
-$a->strings["January"] = "Janvier";
-$a->strings["February"] = "Février";
-$a->strings["March"] = "Mars";
-$a->strings["April"] = "Avril";
-$a->strings["May"] = "Mai";
-$a->strings["June"] = "Juin";
-$a->strings["July"] = "Juillet";
-$a->strings["August"] = "Août";
-$a->strings["September"] = "Septembre";
-$a->strings["October"] = "Octobre";
-$a->strings["November"] = "Novembre";
-$a->strings["December"] = "Décembre";
-$a->strings["Mon"] = "Lun";
-$a->strings["Tue"] = "Mar";
-$a->strings["Wed"] = "Mer";
-$a->strings["Thu"] = "Jeu";
-$a->strings["Fri"] = "Ven";
-$a->strings["Sat"] = "Sam";
-$a->strings["Sun"] = "Dim";
-$a->strings["Jan"] = "Jan";
-$a->strings["Feb"] = "Fév";
-$a->strings["Mar"] = "Mar";
-$a->strings["Apr"] = "Avr";
-$a->strings["Jul"] = "Jul";
-$a->strings["Aug"] = "Aoû";
-$a->strings["Sep"] = "";
-$a->strings["Oct"] = "Oct";
-$a->strings["Nov"] = "Nov";
-$a->strings["Dec"] = "Déc";
-$a->strings["poke"] = "titiller";
-$a->strings["poked"] = "a titillé";
-$a->strings["ping"] = "attirer l'attention";
-$a->strings["pinged"] = "a attiré l'attention de";
-$a->strings["prod"] = "aiguillonner";
-$a->strings["prodded"] = "a aiguillonné";
-$a->strings["slap"] = "gifler";
-$a->strings["slapped"] = "a giflé";
-$a->strings["finger"] = "tripoter";
-$a->strings["fingered"] = "a tripoté";
-$a->strings["rebuff"] = "rabrouer";
-$a->strings["rebuffed"] = "a rabroué";
-$a->strings["System"] = "Système";
-$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";
-$a->strings["%s disliked %s's post"] = "%s n'a pas aimé la publication de %s";
-$a->strings["%s is attending %s's event"] = "%s participe à l'événement de %s";
-$a->strings["%s is not attending %s's event"] = "%s ne participe pas à l'événement de %s";
-$a->strings["%s may attend %s's event"] = "%s participera peut-être à l'événement de %s";
-$a->strings["%s is now friends with %s"] = "%s est désormais ami(e) avec %s";
-$a->strings["Friend Suggestion"] = "Suggestion d'amitié/contact";
-$a->strings["Friend/Connect Request"] = "Demande de connexion/relation";
-$a->strings["New Follower"] = "Nouvel abonné";
-$a->strings["Welcome %s"] = "";
-$a->strings["Please upload a profile photo."] = "Merci d'illustrer votre profil d'une image.";
-$a->strings["Welcome back %s"] = "";
-$a->strings["Update %s failed. See error logs."] = "Mise-à-jour %s échouée. Voir les journaux d'erreur.";
-$a->strings["\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."] = "";
-$a->strings["The error message is\n[pre]%s[/pre]"] = "Le message d’erreur est\n[pre]%s[/pre]";
-$a->strings["[Friendica Notify] Database update"] = "";
-$a->strings["\n\t\t\t\t\tThe friendica database was successfully updated from %s to %s."] = "";
-$a->strings["Error decoding account file"] = "Une erreur a été détecté en décodant un fichier utilisateur";
-$a->strings["Error! No version data in file! This is not a Friendica account file?"] = "Erreur ! Pas de ficher de version existant ! Êtes vous sur un compte Friendica ?";
-$a->strings["User '%s' already exists on this server!"] = "L'utilisateur '%s' existe déjà sur ce serveur!";
-$a->strings["User creation error"] = "Erreur de création d'utilisateur";
-$a->strings["User profile creation error"] = "Erreur de création du profil utilisateur";
-$a->strings["%d contact not imported"] = [
-       0 => "%d contacts non importés",
-       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["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["Filesystem storage failed to create \"%s\". Check you write permissions."] = "";
+$a->strings["Filesystem storage failed to save data to \"%s\". Check your write permissions"] = "";
+$a->strings["Storage base path"] = "";
+$a->strings["Folder where uploaded files are saved. For maximum security, This should be a path outside web server folder tree"] = "";
+$a->strings["Enter a valid existing folder"] = "";
+$a->strings["Database storage failed to update %s"] = "";
+$a->strings["Database storage failed to insert data"] = "";
 $a->strings["Drop Contact"] = "Supprimer le contact";
 $a->strings["Organisation"] = "";
 $a->strings["News"] = "Nouvelles";
@@ -1383,7 +1425,6 @@ $a->strings["l F d, Y \\@ g:i A"] = "l F d, Y \\@ g:i A";
 $a->strings["Starts:"] = "Débute :";
 $a->strings["Finishes:"] = "Finit :";
 $a->strings["all-day"] = "toute la journée";
-$a->strings["Jun"] = "Jun";
 $a->strings["Sept"] = "Sep";
 $a->strings["No events to display"] = "Pas d'événement à afficher";
 $a->strings["l, F j"] = "l, F j";
@@ -1402,6 +1443,7 @@ $a->strings["A deleted group with this name was revived. Existing item permissio
 $a->strings["Default privacy group for new contacts"] = "Paramètres de confidentialité par défaut pour les nouveaux contacts";
 $a->strings["Everybody"] = "Tout le monde";
 $a->strings["edit"] = "éditer";
+$a->strings["Groups"] = "Groupes";
 $a->strings["Edit group"] = "Editer groupe";
 $a->strings["Contacts not in any group"] = "Contacts n'appartenant à aucun groupe";
 $a->strings["Create a new group"] = "Créer un nouveau groupe";
@@ -1419,11 +1461,12 @@ $a->strings["View on separate page"] = "Voir dans une nouvelle page";
 $a->strings["view on separate page"] = "voir dans une nouvelle page";
 $a->strings["[no subject]"] = "[pas de sujet]";
 $a->strings["Edit profile"] = "Editer le profil";
-$a->strings["Atom feed"] = "Flux Atom";
 $a->strings["Manage/edit profiles"] = "Gérer/éditer les profils";
 $a->strings["Status:"] = "Statut :";
 $a->strings["Homepage:"] = "Page personnelle :";
 $a->strings["XMPP:"] = "XMPP";
+$a->strings["Unfollow"] = "";
+$a->strings["Atom feed"] = "Flux Atom";
 $a->strings["g A l F d"] = "g A | F d";
 $a->strings["F d"] = "F d";
 $a->strings["[today]"] = "[aujourd'hui]";
@@ -1435,7 +1478,6 @@ $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 :";
@@ -1453,13 +1495,6 @@ $a->strings["Profile Details"] = "Détails du profil";
 $a->strings["Only You Can See This"] = "Vous seul pouvez voir ça";
 $a->strings["Tips for New Members"] = "Conseils aux nouveaux venus";
 $a->strings["OpenWebAuth: %1\$s welcomes %2\$s"] = "";
-$a->strings["Database storage failed to update %s"] = "";
-$a->strings["Database storage failed to insert data"] = "";
-$a->strings["Filesystem storage failed to create \"%s\". Check you write permissions."] = "";
-$a->strings["Filesystem storage failed to save data to \"%s\". Check your write permissions"] = "";
-$a->strings["Storage base path"] = "";
-$a->strings["Folder where uploaded files are saved. For maximum security, This should be a path outside web server folder tree"] = "";
-$a->strings["Enter a valid existing folder"] = "";
 $a->strings["Login failed"] = "";
 $a->strings["Not enough information to authenticate"] = "";
 $a->strings["Password can't be empty"] = "";
@@ -1491,7 +1526,6 @@ $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."] = "";
@@ -1500,6 +1534,24 @@ $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["Registration details for %s"] = "Détails d'inscription pour %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["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."] = "";
+$a->strings["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."] = "";
+$a->strings["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."] = "";
+$a->strings["Privacy Statement"] = "";
+$a->strings["No installed applications."] = "Pas d'application installée.";
+$a->strings["Applications"] = "Applications";
+$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["Addon not found."] = "";
 $a->strings["Addon %s disabled."] = "Add-on %s désactivé.";
 $a->strings["Addon %s enabled."] = "Add-on %s activé.";
@@ -1512,6 +1564,8 @@ $a->strings["Maintainer: "] = "Mainteneur : ";
 $a->strings["Addon %s failed to install."] = "";
 $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["The contact has been blocked from the node"] = "Le profile distant a été bloqué";
+$a->strings["Could not find any contact entry for this URL (%s)"] = "Aucun profil distant n'a été trouvé à cette URL (%s)";
 $a->strings["%s contact unblocked"] = [
        0 => "%s contact débloqué",
        1 => "%s profiles distants débloqués",
@@ -1526,25 +1580,28 @@ $a->strings["No remote contact is blocked from this node."] = "Aucun profil dist
 $a->strings["Blocked Remote Contacts"] = "Profils distants bloqués";
 $a->strings["Block New Remote Contact"] = "Bloquer un nouveau profil distant";
 $a->strings["Photo"] = "Photo";
+$a->strings["Reason"] = "";
 $a->strings["%s total blocked contact"] = [
        0 => "%s profil distant bloqué",
        1 => "%s profils distans bloqués",
 ];
 $a->strings["URL of the remote contact to block."] = "URL du profil distant à bloquer.";
-$a->strings["Server added to blocklist."] = "Serveur ajouté à la liste noire.";
+$a->strings["Block Reason"] = "";
+$a->strings["Server domain pattern added to blocklist."] = "";
 $a->strings["Site blocklist updated."] = "Liste noire mise à jour.";
-$a->strings["The blocked domain"] = "Domaine bloqué";
+$a->strings["Blocked server domain pattern"] = "";
 $a->strings["Reason for the block"] = "Raison du blocage.";
-$a->strings["The reason why you blocked this domain."] = "Raison pour laquelle vous souhaitez bloquer ce domaine.";
-$a->strings["Delete domain"] = "Supprimer le domaine.";
+$a->strings["Delete server domain pattern"] = "";
 $a->strings["Check to delete this entry from the blocklist"] = "Cochez la case pour retirer cette entrée de la liste noire";
-$a->strings["Server Blocklist"] = "Serveurs bloqués";
-$a->strings["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 domains you should also give a reason why you have blocked the remote server."] = "Cette page permet de créer une liste noire des serveurs de la fédération qui ne sont pas autorisés à interagir avec votre serveur. Pour chaque serveur bloqué, vous devez fournir la raison du blocage.";
-$a->strings["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."] = "La liste des serveurs bloqués sera publiée sur la page /friendica pour que les utilisateurs rencontrant des problèmes de communication puissent en comprendre la raison.";
+$a->strings["Server Domain Pattern Blocklist"] = "";
+$a->strings["This page can be used to define a blacklist of server domain patterns from the federated network that are not allowed to interact with your node. For each domain pattern you should also provide the reason why you block it."] = "";
+$a->strings["The list of blocked server domain patterns will be made publically available on the <a href=\"/friendica\">/friendica</a> page so that your users and people investigating communication problems can find the reason easily."] = "";
+$a->strings["<p>The server domain pattern syntax is case-insensitive shell wildcard, comprising the following special characters:</p>\n<ul>\n\t<li><code>*</code>: Any number of characters</li>\n\t<li><code>?</code>: Any single character</li>\n\t<li><code>[&lt;char1&gt;&lt;char2&gt;...]</code>: char1 or char2</li>\n</ul>"] = "";
 $a->strings["Add new entry to block list"] = "Ajouter une nouvelle entrée à la liste noire";
-$a->strings["Server Domain"] = "Adresse du serveur";
-$a->strings["The domain of the new server to add to the block list. Do not include the protocol."] = "Adresse du serveur à ajouter à la liste noire. Ne pas mettre le protocole.";
+$a->strings["Server Domain Pattern"] = "";
+$a->strings["The domain pattern of the new server to add to the block list. Do not include the protocol."] = "";
 $a->strings["Block reason"] = "Raison du blocage.";
+$a->strings["The reason why you blocked this server domain pattern."] = "";
 $a->strings["Add Entry"] = "Ajouter";
 $a->strings["Save changes to the blocklist"] = "Sauvegarder la liste noire";
 $a->strings["Current Entries in the Blocklist"] = "Entrées de la liste noire";
@@ -1578,6 +1635,7 @@ $a->strings["You need to know the GUID of the item. You can find it e.g. by look
 $a->strings["GUID"] = "GUID";
 $a->strings["The GUID of the item you want to delete."] = "GUID de l'élément à supprimer.";
 $a->strings["Item Guid"] = "";
+$a->strings["The logfile '%s' is not writable. No logging possible"] = "";
 $a->strings["Log settings updated."] = "Réglages des journaux mis-à-jour.";
 $a->strings["PHP log currently enabled."] = "Log PHP actuellement activé.";
 $a->strings["PHP log currently disabled."] = "Log PHP actuellement desactivé.";
@@ -1717,8 +1775,6 @@ $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\")"] = "";
 $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"] = "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";
@@ -1892,35 +1948,8 @@ $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["No friends to display."] = "Pas d'amis à afficher.";
-$a->strings["No installed applications."] = "Pas d'application installée.";
-$a->strings["Applications"] = "Applications";
 $a->strings["Item was not found."] = "Element introuvable.";
-$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["Submanaged account can't access the administation pages. Please log back in as the master account."] = "";
 $a->strings["Overview"] = "Synthèse";
 $a->strings["Configuration"] = "Configuration";
 $a->strings["Database"] = "Base de données";
@@ -1929,6 +1958,7 @@ $a->strings["Inspect Deferred Workers"] = "Tâches de fond reportées";
 $a->strings["Inspect worker Queue"] = "Tâches de fond en attente";
 $a->strings["Tools"] = "Outils";
 $a->strings["Contact Blocklist"] = "Liste de contacts bloqués";
+$a->strings["Server Blocklist"] = "Serveurs bloqués";
 $a->strings["Diagnostics"] = "Diagnostics";
 $a->strings["PHP Info"] = "PHP Info";
 $a->strings["probe address"] = "Tester une adresse";
@@ -1937,6 +1967,8 @@ $a->strings["Item Source"] = "";
 $a->strings["Babel"] = "";
 $a->strings["Addon Features"] = "Fonctionnalités des addons";
 $a->strings["User registrations waiting for confirmation"] = "Inscriptions en attente de confirmation";
+$a->strings["People Search - %s"] = "Recherche de personne - %s";
+$a->strings["Forum Search - %s"] = "Recherche de Forum - %s";
 $a->strings["This page is missing a url parameter."] = "";
 $a->strings["The post was created"] = "La publication a été créée";
 $a->strings["%d contact edited."] = [
@@ -1946,6 +1978,7 @@ $a->strings["%d contact edited."] = [
 $a->strings["Could not access contact record."] = "Impossible d'accéder à l'enregistrement du contact.";
 $a->strings["Could not locate selected profile."] = "Impossible de localiser le profil séléctionné.";
 $a->strings["Contact updated."] = "Contact mis à jour.";
+$a->strings["Contact not found"] = "";
 $a->strings["Contact has been blocked"] = "Le contact a été bloqué";
 $a->strings["Contact has been unblocked"] = "Le contact n'est plus bloqué";
 $a->strings["Contact has been ignored"] = "Le contact a été ignoré";
@@ -1977,6 +2010,7 @@ $a->strings["Contact"] = "Contact";
 $a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Merci de choisir le profil que vous souhaitez montrer à %s lorsqu'il vous rend visite de manière sécurisée.";
 $a->strings["Their personal note"] = "";
 $a->strings["Edit contact notes"] = "Éditer les notes des contacts";
+$a->strings["Visit %s's profile [%s]"] = "Visiter le profil de %s [%s]";
 $a->strings["Block/Unblock contact"] = "Bloquer/débloquer ce contact";
 $a->strings["Ignore contact"] = "Ignorer ce contact";
 $a->strings["Repair URL settings"] = "Réglages de réparation des URL";
@@ -1995,12 +2029,7 @@ $a->strings["Send a notification of every new post of this contact"] = "Envoyer
 $a->strings["Blacklisted keywords"] = "Mots-clés sur la liste noire";
 $a->strings["Comma separated list of keywords that should not be converted to hashtags, when \"Fetch information and keywords\" is selected"] = "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é.";
 $a->strings["Actions"] = "Actions";
-$a->strings["Suggestions"] = "Suggestions";
-$a->strings["Suggest potential friends"] = "Suggérer des amis potentiels";
-$a->strings["All Contacts"] = "Tous les contacts";
 $a->strings["Show all contacts"] = "Montrer tous les contacts";
-$a->strings["Unblocked"] = "Non-bloqués";
-$a->strings["Only show unblocked contacts"] = "Ne montrer que les contacts non-bloqués";
 $a->strings["Blocked"] = "Bloqués";
 $a->strings["Only show blocked contacts"] = "Ne montrer que les contacts bloqués";
 $a->strings["Ignored"] = "Ignorés";
@@ -2027,14 +2056,48 @@ $a->strings["Toggle Blocked status"] = "(dés)activer l'état \"bloqué\"";
 $a->strings["Toggle Ignored status"] = "(dés)activer l'état \"ignoré\"";
 $a->strings["Toggle Archive status"] = "(dés)activer l'état \"archivé\"";
 $a->strings["Delete contact"] = "Effacer ce contact";
-$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["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::toBBCode => BBCode::toPlaintext"] = "";
+$a->strings["HTML::toMarkdown"] = "HTML::toMarkdown";
+$a->strings["HTML::toPlaintext"] = "HTML::toPlaintext";
+$a->strings["HTML::toPlaintext (compact)"] = "";
+$a->strings["Source text"] = "Texte source";
+$a->strings["BBCode"] = "BBCode";
+$a->strings["Markdown"] = "Markdown";
+$a->strings["HTML"] = "HTML";
+$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["Time Conversion"] = "Conversion temporelle";
+$a->strings["Friendica provides this service for sharing events with other networks and friends in unknown timezones."] = "Friendica fournit ce service pour partager des événements avec d'autres réseaux et amis indépendament de leur fuseau horaire.";
+$a->strings["UTC time: %s"] = "Temps UTC : %s";
+$a->strings["Current timezone: %s"] = "Zone de temps courante : %s";
+$a->strings["Converted localtime: %s"] = "Temps local converti : %s";
+$a->strings["Please select your timezone:"] = "Sélectionner votre zone :";
+$a->strings["Only logged in users are permitted to perform a probing."] = "";
+$a->strings["Lookup address"] = "";
 $a->strings["No entries (some entries may be hidden)."] = "Aucune entrée (certaines peuvent être cachées).";
 $a->strings["Find on this site"] = "Trouver sur ce site";
 $a->strings["Results for:"] = "Résultats pour :";
 $a->strings["Site Directory"] = "Annuaire local";
-$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["Filetag %s saved to item"] = "";
 $a->strings["- select -"] = "- choisir -";
 $a->strings["No given contact."] = "";
@@ -2125,12 +2188,17 @@ $a->strings["You are cordially invited to join me and other close friends on Fri
 $a->strings["You will need to supply this invitation code: \$invite_code"] = "Vous devrez fournir ce code d'invitation : \$invite_code";
 $a->strings["Once you have registered, please connect with me via my profile page at:"] = "Une fois inscrit, connectez-vous à la page de mon profil sur :";
 $a->strings["For more information about the Friendica project and why we feel it is important, please visit http://friendi.ca"] = "";
-$a->strings["Time Conversion"] = "Conversion temporelle";
-$a->strings["Friendica provides this service for sharing events with other networks and friends in unknown timezones."] = "Friendica fournit ce service pour partager des événements avec d'autres réseaux et amis indépendament de leur fuseau horaire.";
-$a->strings["UTC time: %s"] = "Temps UTC : %s";
-$a->strings["Current timezone: %s"] = "Zone de temps courante : %s";
-$a->strings["Converted localtime: %s"] = "Temps local converti : %s";
-$a->strings["Please select your timezone:"] = "Sélectionner votre zone :";
+$a->strings["Please enter a post body."] = "";
+$a->strings["This feature is only available with the frio theme."] = "";
+$a->strings["Compose new personal note"] = "";
+$a->strings["Compose new post"] = "";
+$a->strings["Clear the location"] = "";
+$a->strings["Location services are unavailable on your device"] = "";
+$a->strings["Location services are disabled. Please check the website's permissions on your device"] = "";
+$a->strings["Public"] = "";
+$a->strings["This post will be sent to all your followers and can be seen in the community pages and by anyone with its link."] = "";
+$a->strings["Limited/Private"] = "";
+$a->strings["This post will be sent only to the people in the first box, to the exception of the people mentioned in the second box. It won't appear anywhere public."] = "";
 $a->strings["Create a New Account"] = "Créer un nouveau compte";
 $a->strings["Password: "] = "Mot de passe : ";
 $a->strings["Remember me"] = "Se souvenir de moi";
@@ -2144,9 +2212,25 @@ $a->strings["Logged out."] = "Déconnecté.";
 $a->strings["System down for maintenance"] = "Système indisponible pour cause de maintenance";
 $a->strings["Page not found."] = "Page introuvable.";
 $a->strings["Invalid photo with id %s."] = "";
-$a->strings["%s's timeline"] = "";
-$a->strings["%s's posts"] = "";
-$a->strings["%s's comments"] = "";
+$a->strings["User not found."] = "";
+$a->strings["No contacts."] = "Aucun contact.";
+$a->strings["Follower (%s)"] = [
+       0 => "",
+       1 => "",
+];
+$a->strings["Following (%s)"] = [
+       0 => "",
+       1 => "",
+];
+$a->strings["Mutual friend (%s)"] = [
+       0 => "",
+       1 => "",
+];
+$a->strings["Contact (%s)"] = [
+       0 => "",
+       1 => "",
+];
+$a->strings["All contacts"] = "";
 $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.";
 $a->strings["Your OpenID (optional): "] = "Votre OpenID (facultatif): ";
@@ -2167,6 +2251,23 @@ $a->strings["Failed to send email message. Here your accout details:<br> login:
 $a->strings["Registration successful."] = "Inscription réussie.";
 $a->strings["Your registration can not be processed."] = "Votre inscription ne peut être traitée.";
 $a->strings["Your registration is pending approval by the site owner."] = "Votre inscription attend une validation du propriétaire du site.";
+$a->strings["Please enter your password to access this page."] = "";
+$a->strings["App-specific password generation failed: The description is empty."] = "";
+$a->strings["App-specific password generation failed: This description already exists."] = "";
+$a->strings["New app-specific password generated."] = "";
+$a->strings["App-specific passwords successfully revoked."] = "";
+$a->strings["App-specific password successfully revoked."] = "";
+$a->strings["Two-factor app-specific passwords"] = "";
+$a->strings["<p>App-specific passwords are randomly generated passwords used instead your regular password to authenticate your account on third-party applications that don't support two-factor authentication.</p>"] = "";
+$a->strings["Make sure to copy your new app-specific password now. You won’t be able to see it again!"] = "";
+$a->strings["Description"] = "";
+$a->strings["Last Used"] = "";
+$a->strings["Revoke"] = "";
+$a->strings["Revoke All"] = "";
+$a->strings["When you generate a new app-specific password, you must use it right away, it will be shown to you once after you generate it."] = "";
+$a->strings["Generate new app-specific password"] = "";
+$a->strings["Friendiqa on my Fairphone 2..."] = "";
+$a->strings["Generate"] = "";
 $a->strings["Two-factor authentication successfully disabled."] = "";
 $a->strings["<p>Use an application on a mobile device to get two-factor authentication codes when prompted on login.</p>"] = "";
 $a->strings["Authenticator app"] = "";
@@ -2177,13 +2278,16 @@ $a->strings["<p>Your authenticator app is correctly configured.</p>"] = "";
 $a->strings["Recovery codes"] = "";
 $a->strings["Remaining valid codes"] = "";
 $a->strings["<p>These one-use codes can replace an authenticator app code in case you have lost access to it.</p>"] = "";
+$a->strings["App-specific passwords"] = "";
+$a->strings["Generated app-specific passwords"] = "";
+$a->strings["<p>These randomly generated passwords allow you to authenticate on apps not supporting two-factor authentication.</p>"] = "";
 $a->strings["Current password:"] = "";
 $a->strings["You need to provide your current password to change two-factor authentication settings."] = "";
 $a->strings["Enable two-factor authentication"] = "";
 $a->strings["Disable two-factor authentication"] = "";
 $a->strings["Show recovery codes"] = "";
+$a->strings["Manage app-specific passwords"] = "";
 $a->strings["Finish app configuration"] = "";
-$a->strings["Please enter your password to access this page."] = "";
 $a->strings["New recovery codes successfully generated."] = "";
 $a->strings["Two-factor recovery codes"] = "";
 $a->strings["<p>Recovery codes can be used to access your account in the event you lose access to your device and cannot receive two-factor authentication codes.</p><p><strong>Put these in a safe spot!</strong> If you lose your device and don’t have the recovery codes you will lose access to your account.</p>"] = "";
@@ -2211,10 +2315,6 @@ $a->strings["The requested resource could not be found but may be available in t
 $a->strings["An unexpected condition was encountered and no more specific message is suitable."] = "";
 $a->strings["The server is currently unavailable (because it is overloaded or down for maintenance). Please try again later."] = "";
 $a->strings["Go back"] = "";
-$a->strings["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."] = "";
-$a->strings["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."] = "";
-$a->strings["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."] = "";
-$a->strings["Privacy Statement"] = "";
 $a->strings["Remaining recovery codes: %d"] = "";
 $a->strings["Two-factor recovery"] = "";
 $a->strings["<p>You can enter one of your one-time recovery codes in case you lost access to your mobile device.</p>"] = "";
@@ -2223,6 +2323,36 @@ $a->strings["Please enter a recovery code"] = "";
 $a->strings["Submit recovery code and complete login"] = "";
 $a->strings["<p>Open the two-factor authentication app on your device to get an authentication code and verify your identity.</p>"] = "";
 $a->strings["Verify code and complete login"] = "";
+$a->strings["Welcome to Friendica"] = "Bienvenue sur Friendica";
+$a->strings["New Member Checklist"] = "Checklist du nouvel utilisateur";
+$a->strings["We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page. A link to this page will be visible from your home page for two weeks after your initial registration and then will quietly disappear."] = "Nous souhaiterions vous donner quelques astuces et ressources pour rendre votre expérience la plus agréable possible. Cliquez sur n'importe lequel de ces éléments pour visiter la page correspondante. Un lien vers cette page restera visible sur votre page d'accueil pendant les deux semaines qui suivent votre inscription initiale, puis disparaîtra silencieusement.";
+$a->strings["Getting Started"] = "Bien démarrer";
+$a->strings["Friendica Walk-Through"] = "Friendica pas-à-pas";
+$a->strings["On your <em>Quick Start</em> page - find a brief introduction to your profile and network tabs, make some new connections, and find some groups to join."] = "Sur votre page d'accueil, dans <em>Conseils aux nouveaux venus</em> - vous trouverez une rapide introduction aux onglets Profil et Réseau, pourrez vous connecter à Facebook, établir de nouvelles relations, et choisir des groupes à rejoindre.";
+$a->strings["Go to Your Settings"] = "Éditer vos Réglages";
+$a->strings["On your <em>Settings</em> page -  change your initial password. Also make a note of your Identity Address. This looks just like an email address - and will be useful in making friends on the free social web."] = "Sur la page des <em>Réglages</em> -     changez votre mot de passe initial. Notez bien votre Identité. Elle ressemble à une adresse de courriel - et vous sera utile pour vous faire des amis dans le web social libre.";
+$a->strings["Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you."] = "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.";
+$a->strings["Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not."] = "Téléversez (envoyez) une photo de profil si vous n'en avez pas déjà une. Les études montrent que les gens qui affichent de vraies photos d'eux sont dix fois plus susceptibles de se faire des amis.";
+$a->strings["Edit Your Profile"] = "Éditer votre Profil";
+$a->strings["Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors."] = "Éditez votre profil <strong>par défaut</strong> à votre convenance. Vérifiez les réglages concernant la visibilité de votre liste d'amis par les visiteurs inconnus.";
+$a->strings["Profile Keywords"] = "Mots-clés du profil";
+$a->strings["Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships."] = "Choisissez quelques mots-clé publics pour votre profil par défaut. Ils pourront ainsi décrire vos centres d'intérêt, et nous pourrons vous proposer des contacts qui les partagent.";
+$a->strings["Connecting"] = "Connexions";
+$a->strings["Importing Emails"] = "Importer courriels";
+$a->strings["Enter your email access information on your Connector Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = "Entrez vos paramètres de courriel dans les Réglages des connecteurs si vous souhaitez importer et interagir avec des amis ou des listes venant de votre Boîte de Réception.";
+$a->strings["Go to Your Contacts Page"] = "Consulter vos Contacts";
+$a->strings["Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Add New Contact</em> dialog."] = "Votre page Contacts est le point d'entrée vers la gestion de vos amitiés/relations et la connexion à des amis venant d'autres réseaux. Typiquement, vous pourrez y rentrer leur adresse d'Identité ou l'URL de leur site dans le formulaire <em>Ajouter un nouveau contact</em>.";
+$a->strings["Go to Your Site's Directory"] = "Consulter l'Annuaire de votre Site";
+$a->strings["The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested."] = "La page Annuaire vous permet de trouver d'autres personnes au sein de ce réseaux ou parmi d'autres sites fédérés. Cherchez un lien <em>Relier</em> ou <em>Suivre</em> sur leur profil. Vous pourrez avoir besoin d'indiquer votre adresse d'identité.";
+$a->strings["Finding New People"] = "Trouver de nouvelles personnes";
+$a->strings["On the side panel of the Contacts page are several tools to find new friends. We can match people by interest, look up people by name or interest, and provide suggestions based on network relationships. On a brand new site, friend suggestions will usually begin to be populated within 24 hours."] = "Sur le panneau latéral de la page Contacts, il y a plusieurs moyens de trouver de nouveaux amis. Nous pouvons mettre les gens en relation selon leurs intérêts, rechercher des amis par nom ou intérêt, et fournir des suggestions en fonction de la topologie du réseau. Sur un site tout neuf, les suggestions d'amitié devraient commencer à apparaître au bout de 24 heures.";
+$a->strings["Group Your Contacts"] = "Grouper vos contacts";
+$a->strings["Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page."] = "Une fois que vous avez trouvé quelques amis, organisez-les en groupes de conversation privés depuis le panneau latéral de la page Contacts. Vous pourrez ensuite interagir avec chaque groupe de manière privée depuis la page Réseau.";
+$a->strings["Why Aren't My Posts Public?"] = "Pourquoi mes éléments ne sont pas publics ?";
+$a->strings["Friendica respects your privacy. By default, your posts will only show up to people you've added as friends. For more information, see the help section from the link above."] = "Friendica respecte votre vie privée. Par défaut, toutes vos publications seront seulement montrés à vos amis. Pour plus d'information, consultez la section \"aide\" du lien ci-dessus.";
+$a->strings["Getting Help"] = "Obtenir de l'aide";
+$a->strings["Go to the Help Section"] = "Aller à la section Aide";
+$a->strings["Our <strong>help</strong> pages may be consulted for detail on other program features and resources."] = "Nos pages d'<strong>aide</strong> peuvent être consultées pour davantage de détails sur les fonctionnalités ou les ressources.";
 $a->strings["This entry was edited"] = "Cette entrée a été éditée";
 $a->strings["Private Message"] = "Message privé";
 $a->strings["Delete locally"] = "";
@@ -2260,76 +2390,19 @@ $a->strings["%d comment"] = [
 ];
 $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["Legacy module file not found: %s"] = "";
+$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["You must be logged in to use addons. "] = "Vous devez être connecté pour utiliser les greffons.";
+$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["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["%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["Copy or paste schemestring"] = "";
-$a->strings["You can copy this string to share your theme with others. Pasting here applies the schemestring"] = "";
-$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 807d4c1a9c0ba519adc3e12b7d9b0f7ae0d360bb..eba77ceaecddb37b02df7edc3a5493c5051fa56b 100644 (file)
@@ -7,7 +7,7 @@
 # eddy2508 <eddy@naasthetnet.nl>, 2013
 # Gert Cauwenberg <gcauwenberg@gmail.com>, 2013
 # Gert Cauwenberg <gcauwenberg@gmail.com>, 2013
-# Jeroen De Meerleer <me@jeroened.be>, 2018
+# Jeroen De Meerleer <me@jeroened.be>, 2018-2019
 # jeroenpraat <jeroenpraat@disroot.org>, 2012-2014
 # jeroenpraat <jeroenpraat@disroot.org>, 2012
 # Karel <karel@dasrakel.eu>, 2018
@@ -19,8 +19,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-11-27 02:39-0500\n"
-"PO-Revision-Date: 2018-12-31 13:55+0000\n"
+"POT-Creation-Date: 2019-08-06 16:52+0200\n"
+"PO-Revision-Date: 2019-08-08 09:50+0000\n"
 "Last-Translator: Jeroen De Meerleer <me@jeroened.be>\n"
 "Language-Team: Dutch (http://www.transifex.com/Friendica/friendica/language/nl/)\n"
 "MIME-Version: 1.0\n"
@@ -29,14 +29,329 @@ msgstr ""
 "Language: nl\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: include/api.php:1142
+#: include/enotify.php:57
+msgid "Friendica Notification"
+msgstr "Friendica Notificatie"
+
+#: include/enotify.php:60
+msgid "Thank You,"
+msgstr "Bedankt"
+
+#: include/enotify.php:63
+#, php-format
+msgid "%1$s, %2$s Administrator"
+msgstr "%1$s, %2$s Beheerder"
+
+#: include/enotify.php:65
+#, php-format
+msgid "%s Administrator"
+msgstr "%s Beheerder"
+
+#: include/enotify.php:134
+#, php-format
+msgid "[Friendica:Notify] New mail received at %s"
+msgstr "[Friendica:Notificatie] Nieuw bericht ontvangen op %s"
+
+#: include/enotify.php:136
+#, php-format
+msgid "%1$s sent you a new private message at %2$s."
+msgstr "%1$s sent you a new private message at %2$s."
+
+#: include/enotify.php:137
+msgid "a private message"
+msgstr "een prive bericht"
+
+#: include/enotify.php:137
+#, php-format
+msgid "%1$s sent you %2$s."
+msgstr "%1$s stuurde jou %2$s."
+
+#: include/enotify.php:139
+#, php-format
+msgid "Please visit %s to view and/or reply to your private messages."
+msgstr "Bezoek %s om je privé-berichten te bekijken en/of te beantwoorden."
+
+#: include/enotify.php:172
+#, php-format
+msgid "%1$s tagged you on [url=%2$s]a %3$s[/url]"
+msgstr "%1$s heeft je getagd op [url=%2$s]een %3$s[/url]"
+
+#: include/enotify.php:178
+#, php-format
+msgid "%1$s commented on [url=%2$s]a %3$s[/url]"
+msgstr "%1$s gaf een reactie op [url=%2$s]a %3$s[/url]"
+
+#: include/enotify.php:188
+#, php-format
+msgid "%1$s tagged you on [url=%2$s]%3$s's %4$s[/url]"
+msgstr "%1$s heeft je getagd op [url=%2$s]%3$s's %4$s[/url]"
+
+#: include/enotify.php:195
+#, php-format
+msgid "%1$s commented on [url=%2$s]%3$s's %4$s[/url]"
+msgstr "%1$s gaf een reactie op [url=%2$s]%3$s's %4$s[/url]"
+
+#: include/enotify.php:207
+#, php-format
+msgid "%1$s tagged you on [url=%2$s]your %3$s[/url]"
+msgstr "%1$s heeft je getagd op [url=%2$s]jouw %3$s[/url]"
+
+#: include/enotify.php:213
+#, php-format
+msgid "%1$s commented on [url=%2$s]your %3$s[/url]"
+msgstr "%1$s gaf een reactie op [url=%2$s]jouw %3$s[/url]"
+
+#: include/enotify.php:224
+#, php-format
+msgid "%1$s tagged you on [url=%2$s]their %3$s[/url]"
+msgstr "%1$s heeft je getagd op [url=%2$s]zijn %3$s[/url]"
+
+#: include/enotify.php:230
+#, php-format
+msgid "%1$s commented on [url=%2$s]their %3$s[/url]"
+msgstr "%1$s heeft gereageerd op [url=%2$s]zijn %3$s[/url]"
+
+#: include/enotify.php:243
+#, php-format
+msgid "[Friendica:Notify] %s tagged you"
+msgstr "[Friendica:Notificatie] %s heeft jou genoemd"
+
+#: include/enotify.php:245
+#, php-format
+msgid "%1$s tagged you at %2$s"
+msgstr "%1$s heeft jou in %2$s genoemd"
+
+#: include/enotify.php:247
+#, php-format
+msgid "[Friendica:Notify] Comment to conversation #%1$d by %2$s"
+msgstr "[Friendica:Notificatie] Reactie op gesprek #%1$d door %2$s"
+
+#: include/enotify.php:249
+#, php-format
+msgid "%s commented on an item/conversation you have been following."
+msgstr "%s gaf een reactie op een bericht/gesprek die jij volgt."
+
+#: include/enotify.php:254 include/enotify.php:269 include/enotify.php:284
+#: include/enotify.php:303 include/enotify.php:319
+#, php-format
+msgid "Please visit %s to view and/or reply to the conversation."
+msgstr "Bezoek %s om het gesprek te bekijken en/of te beantwoorden."
+
+#: include/enotify.php:261
+#, php-format
+msgid "[Friendica:Notify] %s posted to your profile wall"
+msgstr "[Friendica:Melding] %s plaatste een bericht op je tijdlijn"
+
+#: include/enotify.php:263
+#, php-format
+msgid "%1$s posted to your profile wall at %2$s"
+msgstr "%1$splaatste een bericht op je tijdlijn op %2$s"
+
+#: include/enotify.php:264
+#, php-format
+msgid "%1$s posted to [url=%2$s]your wall[/url]"
+msgstr "%1$s schreef op [url=%2$s]jouw tijdlijn[/url]"
+
+#: include/enotify.php:276
+#, php-format
+msgid "[Friendica:Notify] %s shared a new post"
+msgstr "[Friendica:Melding] %s deelde een nieuw bericht"
+
+#: include/enotify.php:278
+#, php-format
+msgid "%1$s shared a new post at %2$s"
+msgstr "%1$s deelde een nieuw bericht op %2$s"
+
+#: include/enotify.php:279
+#, php-format
+msgid "%1$s [url=%2$s]shared a post[/url]."
+msgstr "%1$s [url=%2$s]deelde een bericht[/url]."
+
+#: include/enotify.php:291
+#, php-format
+msgid "[Friendica:Notify] %1$s poked you"
+msgstr "[Friendica:Melding] %1$s heeft jou gepord"
+
+#: include/enotify.php:293
+#, php-format
+msgid "%1$s poked you at %2$s"
+msgstr "%1$s heeft jou gepord op %2$s"
+
+#: include/enotify.php:294
+#, php-format
+msgid "%1$s [url=%2$s]poked you[/url]."
+msgstr "%1$s [url=%2$s]porde jou[/url]"
+
+#: include/enotify.php:311
+#, php-format
+msgid "[Friendica:Notify] %s tagged your post"
+msgstr "[Friendica:Notificatie] %s heeft jouw bericht gelabeld"
+
+#: include/enotify.php:313
+#, php-format
+msgid "%1$s tagged your post at %2$s"
+msgstr "%1$s heeft jouw bericht gelabeld in %2$s"
+
+#: include/enotify.php:314
+#, php-format
+msgid "%1$s tagged [url=%2$s]your post[/url]"
+msgstr "%1$s labelde [url=%2$s]jouw bericht[/url]"
+
+#: include/enotify.php:326
+msgid "[Friendica:Notify] Introduction received"
+msgstr "[Friendica:Notificatie] Vriendschaps-/connectieverzoek ontvangen"
+
+#: include/enotify.php:328
+#, php-format
+msgid "You've received an introduction from '%1$s' at %2$s"
+msgstr "Je hebt een vriendschaps- of connectieverzoek ontvangen van '%1$s' om %2$s"
+
+#: include/enotify.php:329
+#, php-format
+msgid "You've received [url=%1$s]an introduction[/url] from %2$s."
+msgstr "Je ontving [url=%1$s]een vriendschaps- of connectieverzoek[/url] van %2$s."
+
+#: include/enotify.php:334 include/enotify.php:380
+#, php-format
+msgid "You may visit their profile at %s"
+msgstr "Je kunt hun profiel bezoeken op %s"
+
+#: include/enotify.php:336
+#, php-format
+msgid "Please visit %s to approve or reject the introduction."
+msgstr "Bezoek %s om het verzoek goed of af te keuren."
+
+#: include/enotify.php:343
+msgid "[Friendica:Notify] A new person is sharing with you"
+msgstr "[Friendica:Melding]  Iemand nieuw deelt met jou."
+
+#: include/enotify.php:345 include/enotify.php:346
+#, php-format
+msgid "%1$s is sharing with you at %2$s"
+msgstr "%1$s deelt met jou in %2$s"
+
+#: include/enotify.php:353
+msgid "[Friendica:Notify] You have a new follower"
+msgstr "[Friendica:Melding] Je hebt een nieuwe volger"
+
+#: include/enotify.php:355 include/enotify.php:356
+#, php-format
+msgid "You have a new follower at %2$s : %1$s"
+msgstr "Je hebt een nieuwe volger op %2$s: %1$s"
+
+#: include/enotify.php:369
+msgid "[Friendica:Notify] Friend suggestion received"
+msgstr "[Friendica:Melding] Vriendschapsvoorstel ontvangen"
+
+#: include/enotify.php:371
+#, php-format
+msgid "You've received a friend suggestion from '%1$s' at %2$s"
+msgstr "Je kreeg een vriendschapssuggestie van '%1$s' op %2$s"
+
+#: include/enotify.php:372
+#, php-format
+msgid ""
+"You've received [url=%1$s]a friend suggestion[/url] for %2$s from %3$s."
+msgstr "Je kreeg een [url=%1$s]vriendschapssuggestie[/url] voor %2$s op %3$s."
+
+#: include/enotify.php:378
+msgid "Name:"
+msgstr "Naam:"
+
+#: include/enotify.php:379
+msgid "Photo:"
+msgstr "Foto: "
+
+#: include/enotify.php:382
+#, php-format
+msgid "Please visit %s to approve or reject the suggestion."
+msgstr "Bezoek %s om de suggestie goed of af te keuren."
+
+#: include/enotify.php:390 include/enotify.php:405
+msgid "[Friendica:Notify] Connection accepted"
+msgstr "[Friendica:Melding] Verbinding aanvaard"
+
+#: include/enotify.php:392 include/enotify.php:407
+#, php-format
+msgid "'%1$s' has accepted your connection request at %2$s"
+msgstr "'%1$s' aanvaarde je contactaanvraag op %2$s"
+
+#: include/enotify.php:393 include/enotify.php:408
+#, php-format
+msgid "%2$s has accepted your [url=%1$s]connection request[/url]."
+msgstr "%2$saanvaardde jouw [url=%1$s]contactaanvraag[/url]."
+
+#: include/enotify.php:398
+msgid ""
+"You are now mutual friends and may exchange status updates, photos, and "
+"email without restriction."
+msgstr "Jullie zijn nu in contact met elkaar en kunnen statusberichten, foto's en email delen zonder beperkingen."
+
+#: include/enotify.php:400
+#, php-format
+msgid "Please visit %s if you wish to make any changes to this relationship."
+msgstr "Bezoek alstublieft %s als je deze relatie wil wijzigen."
+
+#: include/enotify.php:413
+#, php-format
+msgid ""
+"'%1$s' has chosen to accept you a fan, which restricts some forms of "
+"communication - such as private messaging and some profile interactions. If "
+"this is a celebrity or community page, these settings were applied "
+"automatically."
+msgstr "'%1$s' koos om je te accepteren als fan, wat sommige communicatievormen beperkt - zoals privéberichten en sommige profielfuncties.  Als dit een beroemdheid- of groepspagina is, werd dit automatisch toegepast."
+
+#: include/enotify.php:415
+#, php-format
+msgid ""
+"'%1$s' may choose to extend this into a two-way or more permissive "
+"relationship in the future."
+msgstr "'%1$s' kan er later voor kiezen om deze beperkingen aan te passen."
+
+#: include/enotify.php:417
+#, php-format
+msgid "Please visit %s  if you wish to make any changes to this relationship."
+msgstr "Bezoek %s wanneer je deze relatie wil wijzigen."
+
+#: include/enotify.php:427 mod/removeme.php:46
+msgid "[Friendica System Notify]"
+msgstr "[Friendica systeem notificatie]"
+
+#: include/enotify.php:427
+msgid "registration request"
+msgstr "registratie verzoek"
+
+#: include/enotify.php:429
+#, php-format
+msgid "You've received a registration request from '%1$s' at %2$s"
+msgstr "Je kreeg een registratieaanvraag van '%1$s' op %2$s"
+
+#: include/enotify.php:430
+#, php-format
+msgid "You've received a [url=%1$s]registration request[/url] from %2$s."
+msgstr "Je kreeg een [url=%1$s]registratieaanvraag[/url] van %2$s."
+
+#: include/enotify.php:435
+#, php-format
+msgid ""
+"Full Name:\t%s\n"
+"Site Location:\t%s\n"
+"Login Name:\t%s (%s)"
+msgstr "Volledige naam:\t%s\nAdres van de site:\t%s\nLoginnaam:\t%s (%s)"
+
+#: include/enotify.php:441
+#, php-format
+msgid "Please visit %s to approve or reject the request."
+msgstr "Bezoek %s om de aanvraag goed of af te keuren."
+
+#: include/api.php:1119
 #, 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] "De dagelijkse limiet van %d bericht is bereikt. Dit bericht werd niet aanvaard."
 msgstr[1] "De dagelijkse limiet van %d berichten is bereikt.  Dit bericht werd niet aanvaard."
 
-#: include/api.php:1156
+#: include/api.php:1133
 #, php-format
 msgid "Weekly posting limit of %d post reached. The post was rejected."
 msgid_plural ""
@@ -44,9657 +359,10271 @@ msgid_plural ""
 msgstr[0] "De wekelijkse limiet van %d bericht is bereikt.  Dit bericht werd niet aanvaard."
 msgstr[1] "De wekelijkse limiet van %d berichten is bereikt.  Dit bericht werd niet aanvaard."
 
-#: include/api.php:1170
+#: include/api.php:1147
 #, php-format
 msgid "Monthly posting limit of %d post reached. The post was rejected."
 msgstr "De maandelijkse limiet van %d berichten is bereikt.  Dit bericht werd niet aanvaard."
 
-#: include/api.php:4335 mod/photos.php:96 mod/photos.php:204
-#: mod/photos.php:737 mod/photos.php:1170 mod/photos.php:1187
-#: mod/photos.php:1680 mod/profile_photo.php:88 mod/profile_photo.php:97
-#: mod/profile_photo.php:106 mod/profile_photo.php:215
-#: mod/profile_photo.php:304 mod/profile_photo.php:314 src/Model/User.php:652
-#: src/Model/User.php:660 src/Model/User.php:668
+#: include/api.php:4587 mod/photos.php:91 mod/photos.php:196
+#: mod/photos.php:640 mod/photos.php:1090 mod/photos.php:1107
+#: mod/photos.php:1610 mod/profile_photo.php:85 mod/profile_photo.php:94
+#: mod/profile_photo.php:103 mod/profile_photo.php:210
+#: mod/profile_photo.php:298 mod/profile_photo.php:308 src/Model/User.php:796
+#: src/Model/User.php:804 src/Model/User.php:812
 msgid "Profile Photos"
 msgstr "Profielfoto's"
 
-#: include/conversation.php:156 include/conversation.php:292
-#: src/Model/Item.php:3263
+#: include/conversation.php:161 include/conversation.php:298
+#: src/Model/Item.php:3300
 msgid "event"
 msgstr "gebeurtenis"
 
-#: include/conversation.php:159 include/conversation.php:169
-#: include/conversation.php:295 include/conversation.php:304
-#: mod/subthread.php:90 mod/tagger.php:72
+#: include/conversation.php:164 include/conversation.php:174
+#: include/conversation.php:301 include/conversation.php:310
+#: mod/subthread.php:88 mod/tagger.php:69
 msgid "status"
 msgstr "status"
 
-#: include/conversation.php:164 include/conversation.php:300
-#: mod/subthread.php:90 mod/tagger.php:72 src/Model/Item.php:3265
+#: include/conversation.php:169 include/conversation.php:306
+#: mod/subthread.php:88 mod/tagger.php:69 src/Model/Item.php:3302
 msgid "photo"
 msgstr "foto"
 
-#: include/conversation.php:176
+#: include/conversation.php:182
 #, php-format
 msgid "%1$s likes %2$s's %3$s"
 msgstr "%1$s vindt het %3$s van %2$s leuk"
 
-#: include/conversation.php:178
+#: include/conversation.php:184
 #, php-format
 msgid "%1$s doesn't like %2$s's %3$s"
 msgstr "%1$s vindt het %3$s van %2$s niet leuk"
 
-#: include/conversation.php:180
+#: include/conversation.php:186
 #, php-format
 msgid "%1$s attends %2$s's %3$s"
 msgstr "%1$s neemt deel aan %2$ss %3$s deel"
 
-#: include/conversation.php:182
+#: include/conversation.php:188
 #, php-format
 msgid "%1$s doesn't attend %2$s's %3$s"
 msgstr "%1$s neemt niet deel aan %2$ss %3$s"
 
-#: include/conversation.php:184
+#: include/conversation.php:190
 #, php-format
 msgid "%1$s attends maybe %2$s's %3$s"
 msgstr "%1$s neemt misschien deel aan %2$ss %3$s"
 
-#: include/conversation.php:219
+#: include/conversation.php:225
 #, php-format
 msgid "%1$s is now friends with %2$s"
 msgstr "%1$s is nu bevriend met %2$s"
 
-#: include/conversation.php:260
+#: include/conversation.php:266
 #, php-format
 msgid "%1$s poked %2$s"
 msgstr "%1$s porde %2$s aan"
 
-#: include/conversation.php:314 mod/tagger.php:110
+#: include/conversation.php:320 mod/tagger.php:102
 #, php-format
 msgid "%1$s tagged %2$s's %3$s with %4$s"
 msgstr "%1$s labelde %3$s van %2$s met %4$s"
 
-#: include/conversation.php:336
+#: include/conversation.php:342
 msgid "post/item"
 msgstr "bericht/item"
 
-#: include/conversation.php:337
+#: include/conversation.php:343
 #, php-format
 msgid "%1$s marked %2$s's %3$s as favorite"
 msgstr "%1$s markeerde %2$s's %3$s als favoriet"
 
-#: include/conversation.php:551 mod/photos.php:1511 mod/profiles.php:356
+#: include/conversation.php:569 mod/profiles.php:352 mod/photos.php:1442
 msgid "Likes"
 msgstr "Houdt van"
 
-#: include/conversation.php:551 mod/photos.php:1511 mod/profiles.php:360
+#: include/conversation.php:570 mod/profiles.php:355 mod/photos.php:1442
 msgid "Dislikes"
 msgstr "Houdt niet van"
 
-#: include/conversation.php:552 include/conversation.php:1483
-#: mod/photos.php:1512
+#: include/conversation.php:571 include/conversation.php:1565
+#: mod/photos.php:1443
 msgid "Attending"
 msgid_plural "Attending"
 msgstr[0] "Neemt deel"
 msgstr[1] "Nemen deel"
 
-#: include/conversation.php:552 mod/photos.php:1512
+#: include/conversation.php:572 mod/photos.php:1443
 msgid "Not attending"
 msgstr "Nemen niet deel"
 
-#: include/conversation.php:552 mod/photos.php:1512
+#: include/conversation.php:573 mod/photos.php:1443
 msgid "Might attend"
 msgstr "Nemen misschien deel"
 
-#: include/conversation.php:632 mod/photos.php:1568 src/Object/Post.php:206
+#: include/conversation.php:574
+msgid "Reshares"
+msgstr "Delingen"
+
+#: include/conversation.php:654 mod/photos.php:1499 src/Object/Post.php:209
 msgid "Select"
 msgstr "Kies"
 
-#: include/conversation.php:633 mod/admin.php:1971 mod/photos.php:1569
-#: mod/settings.php:741 src/Module/Contact.php:832 src/Module/Contact.php:1107
+#: include/conversation.php:655 mod/photos.php:1500 mod/settings.php:738
+#: src/Module/Admin/Users.php:288 src/Module/Contact.php:830
+#: src/Module/Contact.php:1101
 msgid "Delete"
 msgstr "Verwijder"
 
-#: include/conversation.php:667 src/Object/Post.php:379
-#: src/Object/Post.php:380
+#: include/conversation.php:680 src/Object/Post.php:383
+#: src/Object/Post.php:384
 #, php-format
 msgid "View %s's profile @ %s"
 msgstr "Bekijk het profiel van %s @ %s"
 
-#: include/conversation.php:679 src/Object/Post.php:367
+#: include/conversation.php:693 src/Object/Post.php:371
 msgid "Categories:"
 msgstr "Categorieën:"
 
-#: include/conversation.php:680 src/Object/Post.php:368
+#: include/conversation.php:694 src/Object/Post.php:372
 msgid "Filed under:"
 msgstr "Bewaard onder:"
 
-#: include/conversation.php:687 src/Object/Post.php:393
+#: include/conversation.php:701 src/Object/Post.php:397
 #, php-format
 msgid "%s from %s"
 msgstr "%s van %s"
 
-#: include/conversation.php:702
+#: include/conversation.php:716
 msgid "View in context"
 msgstr "In context bekijken"
 
-#: include/conversation.php:704 include/conversation.php:1151
-#: mod/editpost.php:109 mod/message.php:264 mod/message.php:427
-#: mod/photos.php:1484 mod/wallmessage.php:141 src/Object/Post.php:418
+#: include/conversation.php:718 include/conversation.php:1231
+#: mod/wallmessage.php:141 mod/editpost.php:86 mod/message.php:260
+#: mod/message.php:442 mod/photos.php:1415 src/Module/Item/Compose.php:193
+#: src/Object/Post.php:424
 msgid "Please wait"
 msgstr "Even geduld"
 
-#: include/conversation.php:768
+#: include/conversation.php:782
 msgid "remove"
 msgstr "verwijder"
 
-#: include/conversation.php:772
+#: include/conversation.php:786
 msgid "Delete Selected Items"
 msgstr "Geselecteerde items verwijderen"
 
-#: include/conversation.php:872 view/theme/frio/theme.php:369
+#: include/conversation.php:941 view/theme/frio/theme.php:363
 msgid "Follow Thread"
 msgstr "Gesprek volgen"
 
-#: include/conversation.php:873 src/Model/Contact.php:950
+#: include/conversation.php:942 src/Model/Contact.php:1198
 msgid "View Status"
 msgstr "Bekijk status"
 
-#: include/conversation.php:874 include/conversation.php:890
-#: mod/allfriends.php:76 mod/directory.php:167 mod/dirfind.php:228
-#: mod/match.php:91 mod/suggest.php:86 src/Model/Contact.php:890
-#: src/Model/Contact.php:943 src/Model/Contact.php:951
+#: include/conversation.php:943 include/conversation.php:961 mod/match.php:87
+#: mod/suggest.php:87 src/Model/Contact.php:1138 src/Model/Contact.php:1191
+#: src/Model/Contact.php:1199 src/Module/AllFriends.php:74
+#: src/Module/BaseSearchModule.php:133 src/Module/Directory.php:150
 msgid "View Profile"
 msgstr "Bekijk profiel"
 
-#: include/conversation.php:875 src/Model/Contact.php:952
+#: include/conversation.php:944 src/Model/Contact.php:1200
 msgid "View Photos"
 msgstr "Bekijk foto's"
 
-#: include/conversation.php:876 src/Model/Contact.php:944
-#: src/Model/Contact.php:953
+#: include/conversation.php:945 src/Model/Contact.php:1192
+#: src/Model/Contact.php:1201
 msgid "Network Posts"
 msgstr "Netwerkberichten"
 
-#: include/conversation.php:877 src/Model/Contact.php:945
-#: src/Model/Contact.php:954
+#: include/conversation.php:946 src/Model/Contact.php:1193
+#: src/Model/Contact.php:1202
 msgid "View Contact"
 msgstr "Bekijk contact"
 
-#: include/conversation.php:878 src/Model/Contact.php:956
+#: include/conversation.php:947 src/Model/Contact.php:1204
 msgid "Send PM"
 msgstr "Stuur een privébericht"
 
-#: include/conversation.php:882 src/Model/Contact.php:957
+#: include/conversation.php:948 src/Module/Admin/Blocklist/Contact.php:67
+#: src/Module/Admin/Users.php:289 src/Module/Contact.php:623
+#: src/Module/Contact.php:827 src/Module/Contact.php:1076
+msgid "Block"
+msgstr "Blokkeren"
+
+#: include/conversation.php:949 mod/notifications.php:60
+#: mod/notifications.php:189 mod/notifications.php:282
+#: src/Module/Contact.php:624 src/Module/Contact.php:828
+#: src/Module/Contact.php:1084
+msgid "Ignore"
+msgstr "Negeren"
+
+#: include/conversation.php:953 src/Model/Contact.php:1205
 msgid "Poke"
 msgstr "Porren"
 
-#: include/conversation.php:887 mod/allfriends.php:77 mod/dirfind.php:229
-#: mod/follow.php:147 mod/match.php:92 mod/suggest.php:87
-#: src/Content/Widget.php:65 src/Model/Contact.php:946
-#: src/Module/Contact.php:580 view/theme/vier/theme.php:201
+#: include/conversation.php:958 mod/match.php:88 mod/follow.php:160
+#: mod/suggest.php:88 view/theme/vier/theme.php:201 src/Content/Widget.php:66
+#: src/Model/Contact.php:1194 src/Module/AllFriends.php:75
+#: src/Module/BaseSearchModule.php:134
 msgid "Connect/Follow"
 msgstr "Verbind/Volg"
 
-#: include/conversation.php:1005
+#: include/conversation.php:1083
 #, php-format
 msgid "%s likes this."
 msgstr "%s vindt dit leuk."
 
-#: include/conversation.php:1008
+#: include/conversation.php:1086
 #, php-format
 msgid "%s doesn't like this."
 msgstr "%s vindt dit niet leuk."
 
-#: include/conversation.php:1011
+#: include/conversation.php:1089
 #, php-format
 msgid "%s attends."
 msgstr "%s neemt deel"
 
-#: include/conversation.php:1014
+#: include/conversation.php:1092
 #, php-format
 msgid "%s doesn't attend."
 msgstr "%s neemt niet deel"
 
-#: include/conversation.php:1017
+#: include/conversation.php:1095
 #, php-format
 msgid "%s attends maybe."
 msgstr "%s neemt misschien deel"
 
-#: include/conversation.php:1028
+#: include/conversation.php:1098 include/conversation.php:1141
+#, php-format
+msgid "%s reshared this."
+msgstr "%s heeft dit gedeeld"
+
+#: include/conversation.php:1106
 msgid "and"
 msgstr "en"
 
-#: include/conversation.php:1034
+#: include/conversation.php:1112
 #, php-format
 msgid "and %d other people"
 msgstr "en %d anderen"
 
-#: include/conversation.php:1043
+#: include/conversation.php:1120
 #, php-format
 msgid "<span  %1$s>%2$d people</span> like this"
 msgstr "<span  %1$s>%2$d mensen</span> vinden dit leuk"
 
-#: include/conversation.php:1044
+#: include/conversation.php:1121
 #, php-format
 msgid "%s like this."
 msgstr "%s vinden dit leuk."
 
-#: include/conversation.php:1047
+#: include/conversation.php:1124
 #, php-format
 msgid "<span  %1$s>%2$d people</span> don't like this"
 msgstr "<span  %1$s>%2$d people</span> vinden dit niet leuk"
 
-#: include/conversation.php:1048
+#: include/conversation.php:1125
 #, php-format
 msgid "%s don't like this."
 msgstr "%s vinden dit niet leuk."
 
-#: include/conversation.php:1051
+#: include/conversation.php:1128
 #, php-format
 msgid "<span  %1$s>%2$d people</span> attend"
 msgstr "<span %1$s>%2$d mensen</span> nemen deel"
 
-#: include/conversation.php:1052
+#: include/conversation.php:1129
 #, php-format
 msgid "%s attend."
 msgstr "%s nemen deel."
 
-#: include/conversation.php:1055
+#: include/conversation.php:1132
 #, php-format
 msgid "<span  %1$s>%2$d people</span> don't attend"
 msgstr "<span %1$s>%2$d mensen</span> nemen niet deel"
 
-#: include/conversation.php:1056
+#: include/conversation.php:1133
 #, php-format
 msgid "%s don't attend."
 msgstr "%s nemen niet deel."
 
-#: include/conversation.php:1059
+#: include/conversation.php:1136
 #, php-format
 msgid "<span  %1$s>%2$d people</span> attend maybe"
 msgstr "<span %1$s>%2$d mensen</span> nemen misschien deel"
 
-#: include/conversation.php:1060
+#: include/conversation.php:1137
 #, php-format
 msgid "%s attend maybe."
 msgstr "%s neemt misschien deel."
 
-#: include/conversation.php:1090
+#: include/conversation.php:1140
+#, php-format
+msgid "<span  %1$s>%2$d people</span> reshared this"
+msgstr "<span  %1$s>%2$d mensen</span> hebben dit gedeeld"
+
+#: include/conversation.php:1170
 msgid "Visible to <strong>everybody</strong>"
 msgstr "Zichtbaar voor <strong>iedereen</strong>"
 
-#: include/conversation.php:1091 src/Object/Post.php:822
+#: include/conversation.php:1171 src/Module/Item/Compose.php:187
+#: src/Object/Post.php:887
 msgid "Please enter a image/video/audio/webpage URL:"
 msgstr "Geef een afbeelding/video/audio/webpagina in:"
 
-#: include/conversation.php:1092
+#: include/conversation.php:1172
 msgid "Tag term:"
 msgstr "Label:"
 
-#: include/conversation.php:1093 mod/filer.php:37
+#: include/conversation.php:1173 src/Module/Filer/SaveTag.php:48
 msgid "Save to Folder:"
 msgstr "Bewaren in map:"
 
-#: include/conversation.php:1094
+#: include/conversation.php:1174
 msgid "Where are you right now?"
 msgstr "Waar ben je nu?"
 
-#: include/conversation.php:1095
+#: include/conversation.php:1175
 msgid "Delete item(s)?"
 msgstr "Item(s) verwijderen?"
 
-#: include/conversation.php:1127
+#: include/conversation.php:1207
 msgid "New Post"
 msgstr "Nieuw bericht"
 
-#: include/conversation.php:1130
+#: include/conversation.php:1210
 msgid "Share"
 msgstr "Delen"
 
-#: include/conversation.php:1131 mod/editpost.php:95 mod/message.php:262
-#: mod/message.php:424 mod/wallmessage.php:139
+#: include/conversation.php:1211 mod/wallmessage.php:139 mod/editpost.php:72
+#: mod/message.php:258 mod/message.php:439
 msgid "Upload photo"
 msgstr "Foto uploaden"
 
-#: include/conversation.php:1132 mod/editpost.php:96
+#: include/conversation.php:1212 mod/editpost.php:73
 msgid "upload photo"
 msgstr "Foto uploaden"
 
-#: include/conversation.php:1133 mod/editpost.php:97
+#: include/conversation.php:1213 mod/editpost.php:74
 msgid "Attach file"
 msgstr "Bestand bijvoegen"
 
-#: include/conversation.php:1134 mod/editpost.php:98
+#: include/conversation.php:1214 mod/editpost.php:75
 msgid "attach file"
 msgstr "bestand bijvoegen"
 
-#: include/conversation.php:1135 src/Object/Post.php:814
+#: include/conversation.php:1215 src/Module/Item/Compose.php:179
+#: src/Object/Post.php:879
 msgid "Bold"
 msgstr "Vet"
 
-#: include/conversation.php:1136 src/Object/Post.php:815
+#: include/conversation.php:1216 src/Module/Item/Compose.php:180
+#: src/Object/Post.php:880
 msgid "Italic"
 msgstr "Cursief"
 
-#: include/conversation.php:1137 src/Object/Post.php:816
+#: include/conversation.php:1217 src/Module/Item/Compose.php:181
+#: src/Object/Post.php:881
 msgid "Underline"
 msgstr "Onderstrepen"
 
-#: include/conversation.php:1138 src/Object/Post.php:817
+#: include/conversation.php:1218 src/Module/Item/Compose.php:182
+#: src/Object/Post.php:882
 msgid "Quote"
 msgstr "Citeren"
 
-#: include/conversation.php:1139 src/Object/Post.php:818
+#: include/conversation.php:1219 src/Module/Item/Compose.php:183
+#: src/Object/Post.php:883
 msgid "Code"
 msgstr "Broncode"
 
-#: include/conversation.php:1140 src/Object/Post.php:819
+#: include/conversation.php:1220 src/Module/Item/Compose.php:184
+#: src/Object/Post.php:884
 msgid "Image"
 msgstr "Afbeelding"
 
-#: include/conversation.php:1141 src/Object/Post.php:820
+#: include/conversation.php:1221 src/Module/Item/Compose.php:185
+#: src/Object/Post.php:885
 msgid "Link"
 msgstr "Link"
 
-#: include/conversation.php:1142 src/Object/Post.php:821
+#: include/conversation.php:1222 src/Module/Item/Compose.php:186
+#: src/Object/Post.php:886
 msgid "Link or Media"
 msgstr "Link of media"
 
-#: include/conversation.php:1143 mod/editpost.php:105
+#: include/conversation.php:1223 mod/editpost.php:82
+#: src/Module/Item/Compose.php:189
 msgid "Set your location"
 msgstr "Stel je locatie in"
 
-#: include/conversation.php:1144 mod/editpost.php:106
+#: include/conversation.php:1224 mod/editpost.php:83
 msgid "set location"
 msgstr "Stel uw locatie in"
 
-#: include/conversation.php:1145 mod/editpost.php:107
+#: include/conversation.php:1225 mod/editpost.php:84
 msgid "Clear browser location"
 msgstr "Verwijder locatie uit uw webbrowser"
 
-#: include/conversation.php:1146 mod/editpost.php:108
+#: include/conversation.php:1226 mod/editpost.php:85
 msgid "clear location"
 msgstr "Verwijder locatie uit uw webbrowser"
 
-#: include/conversation.php:1148 mod/editpost.php:123
+#: include/conversation.php:1228 mod/editpost.php:99
+#: src/Module/Item/Compose.php:194
 msgid "Set title"
 msgstr "Titel plaatsen"
 
-#: include/conversation.php:1150 mod/editpost.php:125
+#: include/conversation.php:1230 mod/editpost.php:101
+#: src/Module/Item/Compose.php:195
 msgid "Categories (comma-separated list)"
 msgstr "Categorieën (komma-gescheiden lijst)"
 
-#: include/conversation.php:1152 mod/editpost.php:110
+#: include/conversation.php:1232 mod/editpost.php:87
 msgid "Permission settings"
 msgstr "Instellingen van rechten"
 
-#: include/conversation.php:1153 mod/editpost.php:140
+#: include/conversation.php:1233 mod/editpost.php:116
 msgid "permissions"
 msgstr "rechten"
 
-#: include/conversation.php:1162 mod/editpost.php:120
+#: include/conversation.php:1242 mod/editpost.php:96
 msgid "Public post"
 msgstr "Openbare post"
 
-#: include/conversation.php:1166 mod/editpost.php:131 mod/events.php:557
-#: mod/photos.php:1502 mod/photos.php:1541 mod/photos.php:1601
-#: src/Object/Post.php:823
+#: include/conversation.php:1246 mod/editpost.php:107 mod/events.php:550
+#: mod/photos.php:1433 mod/photos.php:1472 mod/photos.php:1532
+#: src/Module/Item/Compose.php:188 src/Object/Post.php:888
 msgid "Preview"
 msgstr "Voorvertoning"
 
-#: include/conversation.php:1170 include/items.php:402
-#: mod/dfrn_request.php:658 mod/editpost.php:134 mod/fbrowser.php:105
-#: mod/fbrowser.php:136 mod/follow.php:165 mod/message.php:155
-#: mod/photos.php:260 mod/photos.php:332 mod/settings.php:681
-#: mod/settings.php:707 mod/suggest.php:44 mod/tagrm.php:20 mod/tagrm.php:113
-#: mod/unfollow.php:134 mod/videos.php:142 src/Module/Contact.php:452
+#: include/conversation.php:1250 include/items.php:397 mod/tagrm.php:20
+#: mod/tagrm.php:115 mod/unfollow.php:132 mod/dfrn_request.php:650
+#: mod/editpost.php:110 mod/fbrowser.php:110 mod/fbrowser.php:139
+#: mod/follow.php:174 mod/message.php:153 mod/photos.php:1084
+#: mod/photos.php:1191 mod/settings.php:678 mod/settings.php:704
+#: mod/suggest.php:76 src/Module/Contact.php:464
 msgid "Cancel"
 msgstr "Annuleren"
 
-#: include/conversation.php:1175
+#: include/conversation.php:1255
 msgid "Post to Groups"
 msgstr "Verzenden naar Groepen"
 
-#: include/conversation.php:1176
+#: include/conversation.php:1256
 msgid "Post to Contacts"
 msgstr "Verzenden naar Contacten"
 
-#: include/conversation.php:1177
+#: include/conversation.php:1257
 msgid "Private post"
 msgstr "Privé verzending"
 
-#: include/conversation.php:1182 mod/editpost.php:138
-#: src/Model/Profile.php:361
+#: include/conversation.php:1262 mod/editpost.php:114
+#: src/Model/Profile.php:542 src/Module/Contact.php:339
 msgid "Message"
 msgstr "Bericht"
 
-#: include/conversation.php:1183 mod/editpost.php:139
+#: include/conversation.php:1263 mod/editpost.php:115
 msgid "Browser"
 msgstr "Browser"
 
-#: include/conversation.php:1454
+#: include/conversation.php:1535
 msgid "View all"
 msgstr "Toon alles"
 
-#: include/conversation.php:1477
+#: include/conversation.php:1559
 msgid "Like"
 msgid_plural "Likes"
 msgstr[0] "Houdt van"
 msgstr[1] "Houdt van"
 
-#: include/conversation.php:1480
+#: include/conversation.php:1562
 msgid "Dislike"
 msgid_plural "Dislikes"
 msgstr[0] "Houdt niet van"
 msgstr[1] "Houdt niet van"
 
-#: include/conversation.php:1486
+#: include/conversation.php:1568
 msgid "Not Attending"
 msgid_plural "Not Attending"
 msgstr[0] "Neemt niet deel"
 msgstr[1] "Nemen niet deel"
 
-#: include/conversation.php:1489 src/Content/ContactSelector.php:148
+#: include/conversation.php:1571 src/Content/ContactSelector.php:167
 msgid "Undecided"
 msgid_plural "Undecided"
 msgstr[0] "Onbeslist"
 msgstr[1] "Onbeslist"
 
-#: include/enotify.php:55
-msgid "Friendica Notification"
-msgstr "Friendica Notificatie"
+#: include/items.php:354 src/Module/Admin/Themes/Details.php:53
+#: src/Module/Admin/Themes/Index.php:41 src/Module/Debug/ItemBody.php:27
+#: src/Module/Debug/ItemBody.php:40
+msgid "Item not found."
+msgstr "Item niet gevonden."
 
-#: include/enotify.php:58
-msgid "Thank You,"
-msgstr "Bedankt"
+#: include/items.php:392
+msgid "Do you really want to delete this item?"
+msgstr "Wil je echt dit item verwijderen?"
 
-#: include/enotify.php:61
-#, php-format
-msgid "%1$s, %2$s Administrator"
-msgstr "%1$s, %2$s Beheerder"
+#: include/items.php:394 mod/api.php:109 mod/profiles.php:526
+#: mod/profiles.php:529 mod/profiles.php:551 mod/dfrn_request.php:640
+#: mod/follow.php:163 mod/message.php:150 mod/settings.php:1089
+#: mod/settings.php:1095 mod/settings.php:1102 mod/settings.php:1106
+#: mod/settings.php:1110 mod/settings.php:1114 mod/settings.php:1118
+#: mod/settings.php:1122 mod/settings.php:1142 mod/settings.php:1143
+#: mod/settings.php:1144 mod/settings.php:1145 mod/settings.php:1146
+#: mod/suggest.php:73 src/Module/Contact.php:461 src/Module/Register.php:97
+msgid "Yes"
+msgstr "Ja"
 
-#: include/enotify.php:63
-#, php-format
-msgid "%s Administrator"
-msgstr "%s Beheerder"
+#: include/items.php:444 mod/api.php:34 mod/api.php:39 mod/delegate.php:30
+#: mod/delegate.php:48 mod/delegate.php:59 mod/ostatus_subscribe.php:18
+#: mod/regmod.php:89 mod/repair_ostatus.php:16 mod/uimport.php:17
+#: mod/unfollow.php:22 mod/unfollow.php:77 mod/unfollow.php:109
+#: 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 mod/profiles.php:182
+#: mod/profiles.php:499 mod/cal.php:301 mod/common.php:27 mod/crepair.php:90
+#: mod/dfrn_confirm.php:64 mod/editpost.php:21 mod/events.php:208
+#: mod/follow.php:57 mod/follow.php:134 mod/fsuggest.php:63 mod/item.php:170
+#: mod/manage.php:130 mod/message.php:56 mod/message.php:101
+#: mod/network.php:37 mod/notes.php:27 mod/notifications.php:70
+#: mod/photos.php:178 mod/photos.php:962 mod/poke.php:141
+#: mod/profile_photo.php:32 mod/profile_photo.php:177
+#: mod/profile_photo.php:197 mod/settings.php:52 mod/settings.php:165
+#: mod/settings.php:667 mod/suggest.php:39 src/Module/Attach.php:42
+#: src/Module/Contact.php:378 src/Module/FollowConfirm.php:27
+#: src/Module/Group.php:31 src/Module/Group.php:77 src/Module/Invite.php:22
+#: src/Module/Invite.php:110 src/Module/Notifications/Notify.php:19
+#: src/Module/Profile/Contacts.php:50 src/Module/Register.php:192
+#: src/Module/Search/Directory.php:17
+msgid "Permission denied."
+msgstr "Toegang geweigerd"
 
-#: include/enotify.php:126
-#, php-format
-msgid "[Friendica:Notify] New mail received at %s"
-msgstr "[Friendica:Notificatie] Nieuw bericht ontvangen op %s"
+#: mod/api.php:84 mod/api.php:106
+msgid "Authorize application connection"
+msgstr "Verbinding met de applicatie goedkeuren"
 
-#: include/enotify.php:128
-#, php-format
-msgid "%1$s sent you a new private message at %2$s."
-msgstr "%1$s sent you a new private message at %2$s."
+#: mod/api.php:85
+msgid "Return to your app and insert this Securty Code:"
+msgstr "Keer terug naar jouw app en voeg deze beveiligingscode in:"
 
-#: include/enotify.php:129
-msgid "a private message"
-msgstr "een prive bericht"
+#: mod/api.php:94 src/Module/BaseAdminModule.php:56
+msgid "Please login to continue."
+msgstr "Log in om verder te gaan."
 
-#: include/enotify.php:129
-#, php-format
-msgid "%1$s sent you %2$s."
-msgstr "%1$s stuurde jou %2$s."
+#: mod/api.php:108
+msgid ""
+"Do you want to authorize this application to access your posts and contacts,"
+" and/or create new posts for you?"
+msgstr "Wil je deze toepassing toestemming geven om jouw berichten en contacten in te kijken, en/of nieuwe berichten in jouw plaats aan te maken?"
 
-#: include/enotify.php:131
-#, php-format
-msgid "Please visit %s to view and/or reply to your private messages."
-msgstr "Bezoek %s om je privé-berichten te bekijken en/of te beantwoorden."
+#: mod/api.php:110 mod/profiles.php:526 mod/profiles.php:530
+#: mod/profiles.php:551 mod/dfrn_request.php:640 mod/follow.php:163
+#: mod/settings.php:1089 mod/settings.php:1095 mod/settings.php:1102
+#: mod/settings.php:1106 mod/settings.php:1110 mod/settings.php:1114
+#: mod/settings.php:1118 mod/settings.php:1122 mod/settings.php:1142
+#: mod/settings.php:1143 mod/settings.php:1144 mod/settings.php:1145
+#: mod/settings.php:1146 src/Module/Register.php:98
+msgid "No"
+msgstr "Nee"
 
-#: include/enotify.php:165
-#, php-format
-msgid "%1$s commented on [url=%2$s]a %3$s[/url]"
-msgstr "%1$s gaf een reactie op [url=%2$s]a %3$s[/url]"
+#: mod/delegate.php:42
+msgid "Parent user not found."
+msgstr "Ouderlijke gebruiker niet gevonden."
 
-#: include/enotify.php:173
-#, php-format
-msgid "%1$s commented on [url=%2$s]%3$s's %4$s[/url]"
-msgstr "%1$s gaf een reactie op [url=%2$s]%3$s's %4$s[/url]"
+#: mod/delegate.php:149
+msgid "No parent user"
+msgstr "Ouderlijke gebruiker ontbreekt"
 
-#: include/enotify.php:183
-#, php-format
-msgid "%1$s commented on [url=%2$s]your %3$s[/url]"
-msgstr "%1$s gaf een reactie op [url=%2$s]jouw %3$s[/url]"
+#: mod/delegate.php:164
+msgid "Parent Password:"
+msgstr "Ouderlijk paswoord:"
 
-#: include/enotify.php:195
-#, php-format
-msgid "[Friendica:Notify] Comment to conversation #%1$d by %2$s"
-msgstr "[Friendica:Notificatie] Reactie op gesprek #%1$d door %2$s"
+#: mod/delegate.php:164
+msgid ""
+"Please enter the password of the parent account to legitimize your request."
+msgstr "Geef alstublieft het paswoord van het ouderlijke account om je verzoek te legitimeren."
 
-#: include/enotify.php:197
-#, php-format
-msgid "%s commented on an item/conversation you have been following."
-msgstr "%s gaf een reactie op een bericht/gesprek die jij volgt."
+#: mod/delegate.php:171
+msgid "Parent User"
+msgstr "Ouderlijke gebruiker"
 
-#: include/enotify.php:200 include/enotify.php:215 include/enotify.php:230
-#: include/enotify.php:245 include/enotify.php:264 include/enotify.php:280
-#, php-format
-msgid "Please visit %s to view and/or reply to the conversation."
-msgstr "Bezoek %s om het gesprek te bekijken en/of te beantwoorden."
+#: 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 "Ouderlijke gebruikers hebben totale controle over dit account, de account instellingen inbegrepen. Dubbel check dus alstublieft aan wie je deze toegang geeft."
 
-#: include/enotify.php:207
-#, php-format
-msgid "[Friendica:Notify] %s posted to your profile wall"
-msgstr "[Friendica:Melding] %s plaatste een bericht op je tijdlijn"
+#: mod/delegate.php:175 mod/settings.php:677 mod/settings.php:784
+#: mod/settings.php:874 mod/settings.php:953 mod/settings.php:1178
+#: src/Module/Admin/Addons/Index.php:52 src/Module/Admin/Features.php:69
+#: src/Module/Admin/Logs/Settings.php:65 src/Module/Admin/Site.php:569
+#: src/Module/Admin/Themes/Index.php:95 src/Module/Admin/Tos.php:50
+msgid "Save Settings"
+msgstr "Instellingen opslaan"
 
-#: include/enotify.php:209
-#, php-format
-msgid "%1$s posted to your profile wall at %2$s"
-msgstr "%1$splaatste een bericht op je tijdlijn op %2$s"
+#: mod/delegate.php:176 src/Content/Nav.php:263
+msgid "Delegate Page Management"
+msgstr "Paginabeheer uitbesteden"
 
-#: include/enotify.php:210
-#, php-format
-msgid "%1$s posted to [url=%2$s]your wall[/url]"
-msgstr "%1$s schreef op [url=%2$s]jouw tijdlijn[/url]"
+#: mod/delegate.php:177
+msgid "Delegates"
+msgstr "Gemachtigden"
 
-#: include/enotify.php:222
-#, php-format
-msgid "[Friendica:Notify] %s tagged you"
-msgstr "[Friendica:Notificatie] %s heeft jou genoemd"
+#: mod/delegate.php:179
+msgid ""
+"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."
+msgstr "Personen waaraan het beheer is uitbesteed kunnen alle onderdelen van een account/pagina beheren, behalve de basisinstellingen van een account. Besteed je persoonlijke account daarom niet uit aan personen die je niet volledig vertrouwt."
 
-#: include/enotify.php:224
-#, php-format
-msgid "%1$s tagged you at %2$s"
-msgstr "%1$s heeft jou in %2$s genoemd"
+#: mod/delegate.php:180
+msgid "Existing Page Delegates"
+msgstr "Bestaande personen waaraan het paginabeheer is uitbesteed"
 
-#: include/enotify.php:225
-#, php-format
-msgid "%1$s [url=%2$s]tagged you[/url]."
-msgstr "%1$s [url=%2$s]heeft jou genoemd[/url]."
+#: mod/delegate.php:182
+msgid "Potential Delegates"
+msgstr "Mogelijke personen waaraan het paginabeheer kan worden uitbesteed "
 
-#: include/enotify.php:237
-#, php-format
-msgid "[Friendica:Notify] %s shared a new post"
-msgstr "[Friendica:Melding] %s deelde een nieuw bericht"
+#: mod/delegate.php:184 mod/tagrm.php:114
+msgid "Remove"
+msgstr "Verwijderen"
 
-#: include/enotify.php:239
-#, php-format
-msgid "%1$s shared a new post at %2$s"
-msgstr "%1$s deelde een nieuw bericht op %2$s"
+#: mod/delegate.php:185
+msgid "Add"
+msgstr "Toevoegen"
 
-#: include/enotify.php:240
-#, php-format
-msgid "%1$s [url=%2$s]shared a post[/url]."
-msgstr "%1$s [url=%2$s]deelde een bericht[/url]."
+#: mod/delegate.php:186
+msgid "No entries."
+msgstr "Geen gegevens."
 
-#: include/enotify.php:252
-#, php-format
-msgid "[Friendica:Notify] %1$s poked you"
-msgstr "[Friendica:Melding] %1$s heeft jou gepord"
+#: mod/oexchange.php:32
+msgid "Post successful."
+msgstr "Bericht succesvol geplaatst."
 
-#: include/enotify.php:254
-#, php-format
-msgid "%1$s poked you at %2$s"
-msgstr "%1$s heeft jou gepord op %2$s"
+#: mod/ostatus_subscribe.php:23
+msgid "Subscribing to OStatus contacts"
+msgstr "Inschrijven bij OStatus contacten"
 
-#: include/enotify.php:255
-#, php-format
-msgid "%1$s [url=%2$s]poked you[/url]."
-msgstr "%1$s [url=%2$s]porde jou[/url]"
+#: mod/ostatus_subscribe.php:35
+msgid "No contact provided."
+msgstr "Geen contact opgegeven."
 
-#: include/enotify.php:272
-#, php-format
-msgid "[Friendica:Notify] %s tagged your post"
-msgstr "[Friendica:Notificatie] %s heeft jouw bericht gelabeld"
+#: mod/ostatus_subscribe.php:42
+msgid "Couldn't fetch information for contact."
+msgstr "Kon de informatie voor het contact niet ophalen."
 
-#: include/enotify.php:274
-#, php-format
-msgid "%1$s tagged your post at %2$s"
-msgstr "%1$s heeft jouw bericht gelabeld in %2$s"
+#: mod/ostatus_subscribe.php:52
+msgid "Couldn't fetch friends for contact."
+msgstr "Kon de vrienden van contact niet ophalen."
 
-#: include/enotify.php:275
-#, php-format
-msgid "%1$s tagged [url=%2$s]your post[/url]"
-msgstr "%1$s labelde [url=%2$s]jouw bericht[/url]"
+#: mod/ostatus_subscribe.php:70 mod/repair_ostatus.php:52
+msgid "Done"
+msgstr "Klaar"
 
-#: include/enotify.php:287
-msgid "[Friendica:Notify] Introduction received"
-msgstr "[Friendica:Notificatie] Vriendschaps-/connectieverzoek ontvangen"
+#: mod/ostatus_subscribe.php:84
+msgid "success"
+msgstr "Succesvol"
 
-#: include/enotify.php:289
-#, php-format
-msgid "You've received an introduction from '%1$s' at %2$s"
-msgstr "Je hebt een vriendschaps- of connectieverzoek ontvangen van '%1$s' om %2$s"
+#: mod/ostatus_subscribe.php:86
+msgid "failed"
+msgstr "Mislukt"
 
-#: include/enotify.php:290
-#, php-format
-msgid "You've received [url=%1$s]an introduction[/url] from %2$s."
-msgstr "Je ontving [url=%1$s]een vriendschaps- of connectieverzoek[/url] van %2$s."
+#: mod/ostatus_subscribe.php:89 src/Object/Post.php:285
+msgid "ignored"
+msgstr "Verboden"
 
-#: include/enotify.php:295 include/enotify.php:341
-#, php-format
-msgid "You may visit their profile at %s"
-msgstr "Je kunt hun profiel bezoeken op %s"
+#: mod/ostatus_subscribe.php:94 mod/repair_ostatus.php:58
+msgid "Keep this window open until done."
+msgstr "Houd dit scherm open tot het klaar is"
 
-#: include/enotify.php:297
-#, php-format
-msgid "Please visit %s to approve or reject the introduction."
-msgstr "Bezoek %s om het verzoek goed of af te keuren."
+#: mod/profperm.php:30
+msgid "Permission denied"
+msgstr "Toegang geweigerd"
 
-#: include/enotify.php:304
-msgid "[Friendica:Notify] A new person is sharing with you"
-msgstr "[Friendica:Melding]  Iemand nieuw deelt met jou."
+#: mod/profperm.php:36 mod/profperm.php:69
+msgid "Invalid profile identifier."
+msgstr "Ongeldige profiel-identificatie."
 
-#: include/enotify.php:306 include/enotify.php:307
-#, php-format
-msgid "%1$s is sharing with you at %2$s"
-msgstr "%1$s deelt met jou in %2$s"
+#: mod/profperm.php:115
+msgid "Profile Visibility Editor"
+msgstr "Profiel Zichtbaarheid Editor"
 
-#: include/enotify.php:314
-msgid "[Friendica:Notify] You have a new follower"
-msgstr "[Friendica:Melding] Je hebt een nieuwe volger"
+#: mod/profperm.php:117 view/theme/frio/theme.php:268 src/Content/Nav.php:161
+#: src/Model/Profile.php:881 src/Model/Profile.php:917
+#: src/Module/Contact.php:656 src/Module/Contact.php:872
+#: src/Module/Welcome.php:38
+msgid "Profile"
+msgstr "Profiel"
 
-#: include/enotify.php:316 include/enotify.php:317
-#, php-format
-msgid "You have a new follower at %2$s : %1$s"
-msgstr "Je hebt een nieuwe volger op %2$s: %1$s"
+#: mod/profperm.php:119 src/Module/Group.php:321
+msgid "Click on a contact to add or remove."
+msgstr "Klik op een contact om het toe te voegen of te verwijderen."
 
-#: include/enotify.php:330
-msgid "[Friendica:Notify] Friend suggestion received"
-msgstr "[Friendica:Melding] Vriendschapsvoorstel ontvangen"
+#: mod/profperm.php:128
+msgid "Visible To"
+msgstr "Zichtbaar voor"
 
-#: include/enotify.php:332
-#, php-format
-msgid "You've received a friend suggestion from '%1$s' at %2$s"
-msgstr "Je kreeg een vriendschapssuggestie van '%1$s' op %2$s"
+#: mod/profperm.php:144
+msgid "All Contacts (with secure profile access)"
+msgstr "Alle contacten (met veilige profieltoegang)"
+
+#: mod/regmod.php:53
+msgid "Account approved."
+msgstr "Account goedgekeurd."
 
-#: include/enotify.php:333
+#: mod/regmod.php:77
 #, php-format
-msgid ""
-"You've received [url=%1$s]a friend suggestion[/url] for %2$s from %3$s."
-msgstr "Je kreeg een [url=%1$s]vriendschapssuggestie[/url] voor %2$s op %3$s."
+msgid "Registration revoked for %s"
+msgstr "Registratie ingetrokken voor %s"
 
-#: include/enotify.php:339
-msgid "Name:"
-msgstr "Naam:"
+#: mod/regmod.php:84
+msgid "Please login."
+msgstr "Inloggen."
 
-#: include/enotify.php:340
-msgid "Photo:"
-msgstr "Foto: "
-
-#: include/enotify.php:343
-#, php-format
-msgid "Please visit %s to approve or reject the suggestion."
-msgstr "Bezoek %s om de suggestie goed of af te keuren."
+#: mod/removeme.php:46
+msgid "User deleted their account"
+msgstr "Gebruiker verwijderde zijn of haar account"
 
-#: include/enotify.php:351 include/enotify.php:366
-msgid "[Friendica:Notify] Connection accepted"
-msgstr "[Friendica:Melding] Verbinding aanvaard"
+#: mod/removeme.php:47
+msgid ""
+"On your Friendica node an user deleted their account. Please ensure that "
+"their data is removed from the backups."
+msgstr "Een gebruiker heeft zijn of haar account verwijderd op je Friendica node. Zorg er zeker voor dat zijn of haar data verwijderd is uit de backups."
 
-#: include/enotify.php:353 include/enotify.php:368
+#: mod/removeme.php:48
 #, php-format
-msgid "'%1$s' has accepted your connection request at %2$s"
-msgstr "'%1$s' aanvaarde je contactaanvraag op %2$s"
+msgid "The user id is %d"
+msgstr "De gebruikers id is %d"
 
-#: include/enotify.php:354 include/enotify.php:369
-#, php-format
-msgid "%2$s has accepted your [url=%1$s]connection request[/url]."
-msgstr "%2$saanvaardde jouw [url=%1$s]contactaanvraag[/url]."
+#: mod/removeme.php:84 mod/removeme.php:87
+msgid "Remove My Account"
+msgstr "Verwijder mijn account"
 
-#: include/enotify.php:359
+#: mod/removeme.php:85
 msgid ""
-"You are now mutual friends and may exchange status updates, photos, and "
-"email without restriction."
-msgstr "Jullie zijn nu in contact met elkaar en kunnen statusberichten, foto's en email delen zonder beperkingen."
-
-#: include/enotify.php:361
-#, php-format
-msgid "Please visit %s if you wish to make any changes to this relationship."
-msgstr "Bezoek alstublieft %s als je deze relatie wil wijzigen."
+"This will completely remove your account. Once this has been done it is not "
+"recoverable."
+msgstr "Dit zal je account volledig verwijderen. Dit kan niet hersteld worden als het eenmaal uitgevoerd is."
 
-#: include/enotify.php:374
-#, php-format
-msgid ""
-"'%1$s' has chosen to accept you a fan, which restricts some forms of "
-"communication - such as private messaging and some profile interactions. If "
-"this is a celebrity or community page, these settings were applied "
-"automatically."
-msgstr "'%1$s' koos om je te accepteren als fan, wat sommige communicatievormen beperkt - zoals privéberichten en sommige profielfuncties.  Als dit een beroemdheid- of groepspagina is, werd dit automatisch toegepast."
+#: mod/removeme.php:86
+msgid "Please enter your password for verification:"
+msgstr "Voer je wachtwoord in voor verificatie:"
 
-#: include/enotify.php:376
-#, php-format
-msgid ""
-"'%1$s' may choose to extend this into a two-way or more permissive "
-"relationship in the future."
-msgstr "'%1$s' kan er later voor kiezen om deze beperkingen aan te passen."
+#: mod/repair_ostatus.php:21
+msgid "Resubscribing to OStatus contacts"
+msgstr "Opnieuw inschrijven bij OStatus contacten"
 
-#: include/enotify.php:378
-#, php-format
-msgid "Please visit %s  if you wish to make any changes to this relationship."
-msgstr "Bezoek %s wanneer je deze relatie wil wijzigen."
+#: mod/repair_ostatus.php:37 src/Module/TwoFactor/Verify.php:64
+msgid "Error"
+msgid_plural "Errors"
+msgstr[0] "Fout"
+msgstr[1] "Fouten"
 
-#: include/enotify.php:388 mod/removeme.php:49
-msgid "[Friendica System Notify]"
-msgstr "[Friendica systeem notificatie]"
+#: mod/tagrm.php:31
+msgid "Tag(s) removed"
+msgstr "Tag(s) verwijderd"
 
-#: include/enotify.php:388
-msgid "registration request"
-msgstr "registratie verzoek"
+#: mod/tagrm.php:101
+msgid "Remove Item Tag"
+msgstr "Verwijder label van item"
 
-#: include/enotify.php:390
-#, php-format
-msgid "You've received a registration request from '%1$s' at %2$s"
-msgstr "Je kreeg een registratieaanvraag van '%1$s' op %2$s"
+#: mod/tagrm.php:103
+msgid "Select a tag to remove: "
+msgstr "Selecteer een label om te verwijderen: "
 
-#: include/enotify.php:391
-#, php-format
-msgid "You've received a [url=%1$s]registration request[/url] from %2$s."
-msgstr "Je kreeg een [url=%1$s]registratieaanvraag[/url] van %2$s."
+#: mod/uimport.php:30
+msgid "User imports on closed servers can only be done by an administrator."
+msgstr "Importen van een gebruiker op een gesloten node kan enkel gedaan worden door een administrator"
 
-#: include/enotify.php:396
-#, php-format
+#: mod/uimport.php:39 src/Module/Register.php:59
 msgid ""
-"Full Name:\t%s\n"
-"Site Location:\t%s\n"
-"Login Name:\t%s (%s)"
-msgstr "Volledige naam:\t%s\nAdres van de site:\t%s\nLoginnaam:\t%s (%s)"
+"This site has exceeded the number of allowed daily account registrations. "
+"Please try again tomorrow."
+msgstr "Deze website heeft het toegelaten dagelijkse aantal registraties overschreden. Probeer morgen opnieuw."
 
-#: include/enotify.php:402
-#, php-format
-msgid "Please visit %s to approve or reject the request."
-msgstr "Bezoek %s om de aanvraag goed of af te keuren."
+#: mod/uimport.php:54 src/Module/Register.php:141
+msgid "Import"
+msgstr "Importeren"
 
-#: include/items.php:359 mod/admin.php:295 mod/admin.php:2029
-#: mod/admin.php:2275 mod/display.php:75 mod/display.php:253
-#: mod/display.php:349 mod/notice.php:21 mod/viewsrc.php:22
-msgid "Item not found."
-msgstr "Item niet gevonden."
+#: mod/uimport.php:56
+msgid "Move account"
+msgstr "Account verplaatsen"
 
-#: include/items.php:397
-msgid "Do you really want to delete this item?"
-msgstr "Wil je echt dit item verwijderen?"
+#: mod/uimport.php:57
+msgid "You can import an account from another Friendica server."
+msgstr "Je kunt een account van een andere Friendica server importeren."
 
-#: include/items.php:399 mod/api.php:112 mod/dfrn_request.php:648
-#: mod/follow.php:154 mod/message.php:152 mod/profiles.php:542
-#: mod/profiles.php:545 mod/profiles.php:567 mod/register.php:239
-#: mod/settings.php:1100 mod/settings.php:1106 mod/settings.php:1113
-#: mod/settings.php:1117 mod/settings.php:1121 mod/settings.php:1125
-#: mod/settings.php:1129 mod/settings.php:1133 mod/settings.php:1153
-#: mod/settings.php:1154 mod/settings.php:1155 mod/settings.php:1156
-#: mod/settings.php:1157 mod/suggest.php:41 src/Module/Contact.php:449
-msgid "Yes"
-msgstr "Ja"
+#: mod/uimport.php:58
+msgid ""
+"You need to export your account from the old server and upload it here. We "
+"will recreate your old account here with all your contacts. We will try also"
+" to inform your friends that you moved here."
+msgstr "Je moet je account bij de oude server exporteren, en hier uploaden. We zullen je oude account hier opnieuw aanmaken, met al je contacten. We zullen ook proberen om je vrienden in te lichten dat je naar hier verhuisd bent."
 
-#: include/items.php:449 mod/allfriends.php:24 mod/api.php:37 mod/api.php:42
-#: mod/attach.php:39 mod/cal.php:304 mod/common.php:29 mod/crepair.php:101
-#: mod/delegate.php:31 mod/delegate.php:49 mod/delegate.php:60
-#: mod/dfrn_confirm.php:69 mod/dirfind.php:29 mod/editpost.php:22
-#: mod/events.php:199 mod/follow.php:58 mod/follow.php:122 mod/fsuggest.php:81
-#: mod/group.php:30 mod/invite.php:25 mod/invite.php:111 mod/item.php:169
-#: mod/manage.php:132 mod/message.php:58 mod/message.php:103
-#: mod/network.php:39 mod/nogroup.php:23 mod/notes.php:33
-#: mod/notifications.php:70 mod/ostatus_subscribe.php:18 mod/photos.php:189
-#: mod/photos.php:1064 mod/poke.php:144 mod/profiles.php:183
-#: mod/profiles.php:515 mod/profile_photo.php:33 mod/profile_photo.php:180
-#: mod/profile_photo.php:202 mod/register.php:55 mod/regmod.php:91
-#: mod/repair_ostatus.php:16 mod/settings.php:48 mod/settings.php:154
-#: mod/settings.php:670 mod/suggest.php:62 mod/uimport.php:17
-#: mod/unfollow.php:22 mod/unfollow.php:77 mod/unfollow.php:109
-#: mod/viewcontacts.php:63 mod/wallmessage.php:19 mod/wallmessage.php:43
-#: mod/wallmessage.php:82 mod/wallmessage.php:106 mod/wall_attach.php:81
-#: mod/wall_attach.php:84 mod/wall_upload.php:106 mod/wall_upload.php:109
-#: src/App.php:1786 src/Module/Contact.php:365
-msgid "Permission denied."
-msgstr "Toegang geweigerd"
+#: mod/uimport.php:59
+msgid ""
+"This feature is experimental. We can't import contacts from the OStatus "
+"network (GNU Social/Statusnet) or from Diaspora"
+msgstr "Dit feature is experimenteel. We kunnen contacten van het OStatus netwerk (GNU Social/Statusnet) of van Diaspora niet importeren."
 
-#: include/items.php:520 src/Content/Feature.php:95
-msgid "Archives"
-msgstr "Archieven"
+#: mod/uimport.php:60
+msgid "Account file"
+msgstr "Account bestand"
 
-#: include/items.php:526 src/App.php:791 src/Content/ForumManager.php:133
-#: src/Content/Widget.php:308 src/Object/Post.php:447
-#: view/theme/vier/theme.php:258
-msgid "show more"
-msgstr "toon meer"
+#: mod/uimport.php:60
+msgid ""
+"To export your account, go to \"Settings->Export your personal data\" and "
+"select \"Export account\""
+msgstr "Om je account te exporteren, ga naar \"Instellingen->Exporteer je persoonlijke data\" en selecteer \"Exporteer account\""
 
-#: mod/admin.php:116
-msgid "Theme settings updated."
-msgstr "Thema-instellingen opgeslagen"
+#: mod/unfollow.php:36 mod/unfollow.php:92
+msgid "You aren't following this contact."
+msgstr "Je volgt dit contact niet."
 
-#: mod/admin.php:189 src/Content/Nav.php:228
-msgid "Information"
-msgstr "Informatie"
+#: mod/unfollow.php:46 mod/unfollow.php:98
+msgid "Unfollowing is currently not supported by your network."
+msgstr "Ontvolgen is momenteel niet gesupporteerd door je netwerk."
 
-#: mod/admin.php:190
-msgid "Overview"
-msgstr "Overzicht"
+#: mod/unfollow.php:67
+msgid "Contact unfollowed"
+msgstr "Contact ontvolgd."
 
-#: mod/admin.php:191 mod/admin.php:761
-msgid "Federation Statistics"
-msgstr "Federatie Statistieken"
+#: mod/unfollow.php:118
+msgid "Disconnect/Unfollow"
+msgstr "Disconnecteer/stop met volgen"
 
-#: mod/admin.php:192
-msgid "Configuration"
-msgstr "Configuratie"
+#: mod/unfollow.php:128 mod/dfrn_request.php:647 mod/follow.php:170
+msgid "Your Identity Address:"
+msgstr "Adres van je identiteit:"
 
-#: mod/admin.php:193 mod/admin.php:1488
-msgid "Site"
-msgstr "Website"
+#: mod/unfollow.php:131 mod/dfrn_request.php:649 mod/follow.php:76
+msgid "Submit Request"
+msgstr "Aanvraag indienen"
 
-#: mod/admin.php:194 mod/admin.php:1417 mod/admin.php:1961 mod/admin.php:1978
-msgid "Users"
-msgstr "Gebruiker"
+#: mod/unfollow.php:137 mod/follow.php:179 mod/notifications.php:182
+#: mod/notifications.php:274 src/Module/Admin/Blocklist/Contact.php:83
+#: src/Module/Contact.php:641
+msgid "Profile URL"
+msgstr "Profiel url"
 
-#: mod/admin.php:195 mod/admin.php:2077 mod/admin.php:2137 mod/settings.php:99
-msgid "Addons"
-msgstr "Addons"
+#: mod/unfollow.php:147 mod/follow.php:195 src/Model/Profile.php:912
+#: src/Module/Contact.php:867
+msgid "Status Messages and Posts"
+msgstr "Berichten op jouw tijdlijn"
 
-#: mod/admin.php:196 mod/admin.php:2347 mod/admin.php:2391
-msgid "Themes"
-msgstr "Thema's"
+#: mod/update_community.php:23 mod/update_contact.php:23
+#: mod/update_display.php:24 mod/update_network.php:33 mod/update_notes.php:36
+#: mod/update_profile.php:34
+msgid "[Embedded content - reload page to view]"
+msgstr "[Ingebedde inhoud - herlaad pagina om het te bekijken]"
 
-#: mod/admin.php:197 mod/settings.php:77
-msgid "Additional features"
-msgstr "Extra functies"
+#: 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
+msgid "Invalid request."
+msgstr "Ongeldige aanvraag."
 
-#: mod/admin.php:198 mod/admin.php:322 mod/register.php:292
-#: src/Content/Nav.php:231 src/Module/Tos.php:71
-msgid "Terms of Service"
-msgstr "Gebruiksvoorwaarden"
+#: mod/wall_attach.php:103
+msgid "Sorry, maybe your upload is bigger than the PHP configuration allows"
+msgstr "Sorry, je op te laden bestand is groter dan deze PHP configuratie toelaat"
 
-#: mod/admin.php:199
-msgid "Database"
-msgstr "Database"
+#: mod/wall_attach.php:103
+msgid "Or - did you try to upload an empty file?"
+msgstr "Of - probeerde je een lege file op te laden?"
 
-#: mod/admin.php:200
-msgid "DB updates"
-msgstr "DB aanpassingen"
+#: mod/wall_attach.php:114
+#, php-format
+msgid "File exceeds size limit of %s"
+msgstr "Bestand is groter dan de limiet ( %s )"
 
-#: mod/admin.php:201 mod/admin.php:804
-msgid "Inspect Queue"
-msgstr "Wachtrij Inspecteren"
+#: mod/wall_attach.php:129
+msgid "File upload failed."
+msgstr "Uploaden van bestand mislukt."
 
-#: mod/admin.php:202
-msgid "Inspect Deferred Workers"
-msgstr "Inspecteer uitgestelde workers"
+#: mod/wall_upload.php:198 mod/photos.php:683 mod/photos.php:686
+#: mod/photos.php:715 mod/profile_photo.php:152
+#, php-format
+msgid "Image exceeds size limit of %s"
+msgstr "Beeld is groter dan de limiet ( %s )"
 
-#: mod/admin.php:203
-msgid "Inspect worker Queue"
-msgstr "Taakwachtrij inspecteren"
+#: mod/wall_upload.php:212 mod/photos.php:738 mod/profile_photo.php:161
+msgid "Unable to process image."
+msgstr "Niet in staat om de afbeelding te verwerken"
 
-#: mod/admin.php:204
-msgid "Tools"
-msgstr "Hulpmiddelen"
+#: mod/wall_upload.php:243
+msgid "Wall Photos"
+msgstr "Tijdlijn foto's"
 
-#: mod/admin.php:205
-msgid "Contact Blocklist"
-msgstr "Contact Blokkeerlijst"
+#: mod/wall_upload.php:251 mod/photos.php:767 mod/profile_photo.php:303
+msgid "Image upload failed."
+msgstr "Uploaden van afbeelding mislukt."
 
-#: mod/admin.php:206 mod/admin.php:384
-msgid "Server Blocklist"
-msgstr "Server Blokkeerlijst"
+#: mod/wallmessage.php:52 mod/wallmessage.php:115
+#, php-format
+msgid "Number of daily wall messages for %s exceeded. Message failed."
+msgstr "Maximum aantal dagelijkse tijdlijn boodschappen van %s overschreden. Kon boodschap niet plaatsen."
 
-#: mod/admin.php:207 mod/admin.php:542
-msgid "Delete Item"
-msgstr "Verwijder Item"
+#: mod/wallmessage.php:60 mod/message.php:70
+msgid "No recipient selected."
+msgstr "Geen ontvanger geselecteerd."
 
-#: mod/admin.php:208 mod/admin.php:209 mod/admin.php:2466
-msgid "Logs"
-msgstr "Logs"
+#: mod/wallmessage.php:63
+msgid "Unable to check your home location."
+msgstr "Niet in staat om je tijdlijn-locatie vast te stellen"
 
-#: mod/admin.php:210 mod/admin.php:2533
-msgid "View Logs"
-msgstr "Bekijk Logs"
+#: mod/wallmessage.php:66 mod/message.php:77
+msgid "Message could not be sent."
+msgstr "Bericht kon niet verzonden worden."
 
-#: mod/admin.php:212
-msgid "Diagnostics"
-msgstr "Diagnostiek"
+#: mod/wallmessage.php:69 mod/message.php:80
+msgid "Message collection failure."
+msgstr "Fout bij het verzamelen van berichten."
 
-#: mod/admin.php:213
-msgid "PHP Info"
-msgstr "PHP Info"
+#: mod/wallmessage.php:72 mod/message.php:83
+msgid "Message sent."
+msgstr "Bericht verzonden."
 
-#: mod/admin.php:214
-msgid "probe address"
-msgstr "probe adres"
+#: mod/wallmessage.php:89 mod/wallmessage.php:98
+msgid "No recipient."
+msgstr "Geen ontvanger."
 
-#: mod/admin.php:215
-msgid "check webfinger"
-msgstr "check webfinger"
+#: mod/wallmessage.php:123 mod/message.php:204 mod/message.php:360
+msgid "Please enter a link URL:"
+msgstr "Vul een internetadres/URL in:"
 
-#: mod/admin.php:235 src/Content/Nav.php:271
-msgid "Admin"
-msgstr "Beheer"
+#: mod/wallmessage.php:128 mod/message.php:246
+msgid "Send Private Message"
+msgstr "Verstuur privébericht"
 
-#: mod/admin.php:236
-msgid "Addon Features"
-msgstr "Addon Features"
+#: 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 "Als je wilt dat %s antwoordt moet je nakijken dat de privacy-instellingen op jouw website privéberichten van onbekende afzenders toelaat."
 
-#: mod/admin.php:237
-msgid "User registrations waiting for confirmation"
-msgstr "Gebruikersregistraties wachten op bevestiging"
+#: mod/wallmessage.php:130 mod/message.php:247 mod/message.php:430
+msgid "To:"
+msgstr "Aan:"
 
-#: mod/admin.php:321 mod/admin.php:383 mod/admin.php:499 mod/admin.php:541
-#: mod/admin.php:760 mod/admin.php:803 mod/admin.php:854 mod/admin.php:972
-#: mod/admin.php:1487 mod/admin.php:1960 mod/admin.php:2076 mod/admin.php:2136
-#: mod/admin.php:2346 mod/admin.php:2390 mod/admin.php:2465 mod/admin.php:2532
-msgid "Administration"
-msgstr "Beheer"
+#: mod/wallmessage.php:131 mod/message.php:251 mod/message.php:432
+msgid "Subject:"
+msgstr "Onderwerp:"
 
-#: mod/admin.php:323
-msgid "Display Terms of Service"
-msgstr "Toon Gebruiksvoorwaarden"
+#: mod/wallmessage.php:137 mod/message.php:255 mod/message.php:435
+#: src/Module/Invite.php:150
+msgid "Your message:"
+msgstr "Jouw bericht:"
 
-#: mod/admin.php:323
-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 "Activeer de Gebruiksvoorwaarden pagina. Als deze geactiveerd is, dan zal er een link naar de voorwaarden toegevoegd worden aan het registratie formulier en de algemene informatie pagina."
+#: mod/wallmessage.php:140 mod/editpost.php:76 mod/message.php:259
+#: mod/message.php:440
+msgid "Insert web link"
+msgstr "Voeg een webadres in"
 
-#: mod/admin.php:324
-msgid "Display Privacy Statement"
-msgstr "Toon Privacy Verklaring"
+#: mod/match.php:49
+msgid "No keywords to match. Please add keywords to your default profile."
+msgstr "Geen sleutelwoorden om te zoeken. Voeg sleutelwoorden toe aan je standaard profiel."
 
-#: mod/admin.php:324
-#, 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 "Toon wat inlichtigen over de nodige informatite om de node te beheren in overeenstemming met bvb. de <a href=\"%s\" target=\"_blank\">EU-GDPR</a> (EU-AVG)."
+#: mod/match.php:102 mod/suggest.php:106 src/Content/Widget.php:42
+#: src/Module/AllFriends.php:91 src/Module/BaseSearchModule.php:131
+msgid "Connect"
+msgstr "Verbinden"
 
-#: mod/admin.php:325
-msgid "Privacy Statement Preview"
-msgstr "Privacy Verklaring Voorbeeldweergave"
+#: mod/match.php:115 src/Content/Pager.php:198
+msgid "first"
+msgstr "eerste"
 
-#: mod/admin.php:327
-msgid "The Terms of Service"
-msgstr "De Gebruiksvoorwaarden"
+#: mod/match.php:120 src/Content/Pager.php:258
+msgid "next"
+msgstr "volgende"
 
-#: mod/admin.php:327
-msgid ""
-"Enter the Terms of Service for your node here. You can use BBCode. Headers "
-"of sections should be [h2] and below."
-msgstr "Geef hier de Gebruiksvoorwaarden van je node op. Je kan BBCode gebruiken. Sectie headers moeten [h2] zijn of lager."
+#: mod/match.php:130 src/Module/BaseSearchModule.php:92
+msgid "No matches"
+msgstr "Geen resultaten"
 
-#: mod/admin.php:329 mod/admin.php:1489 mod/admin.php:2138 mod/admin.php:2392
-#: mod/admin.php:2467 mod/admin.php:2614 mod/delegate.php:174
-#: mod/settings.php:680 mod/settings.php:787 mod/settings.php:875
-#: mod/settings.php:964 mod/settings.php:1189
-msgid "Save Settings"
-msgstr "Instellingen opslaan"
+#: mod/match.php:135
+msgid "Profile Match"
+msgstr "Profielmatch"
 
-#: mod/admin.php:375 mod/admin.php:393 mod/dfrn_request.php:348
-#: mod/friendica.php:122 src/Model/Contact.php:1603
-msgid "Blocked domain"
-msgstr "Domein geblokeerd"
+#: mod/profiles.php:43 mod/profiles.php:152 mod/profiles.php:196
+#: mod/profiles.php:511 mod/dfrn_confirm.php:70
+msgid "Profile not found."
+msgstr "Profiel niet gevonden"
 
-#: mod/admin.php:375
-msgid "The blocked domain"
-msgstr "Het geblokkeerde domein"
+#: mod/profiles.php:62
+msgid "Profile deleted."
+msgstr "Profiel verwijderd"
 
-#: mod/admin.php:376 mod/admin.php:394 mod/friendica.php:122
-msgid "Reason for the block"
-msgstr "Reden van de blokkering"
+#: mod/profiles.php:78 mod/profiles.php:114
+msgid "Profile-"
+msgstr "Profiel-"
 
-#: mod/admin.php:376 mod/admin.php:389
-msgid "The reason why you blocked this domain."
-msgstr "De reden waarom je dit domein geblokkeerd hebt."
+#: mod/profiles.php:97 mod/profiles.php:135
+msgid "New profile created."
+msgstr "Nieuw profiel aangemaakt."
 
-#: mod/admin.php:377
-msgid "Delete domain"
-msgstr "Verwijder domein"
+#: mod/profiles.php:120
+msgid "Profile unavailable to clone."
+msgstr "Profiel niet beschikbaar om te klonen."
 
-#: mod/admin.php:377
-msgid "Check to delete this entry from the blocklist"
-msgstr "Vink aan om dit item van de blokkeerlijst te verwijderen"
+#: mod/profiles.php:206
+msgid "Profile Name is required."
+msgstr "Profielnaam is vereist."
 
-#: mod/admin.php:385
-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 "
-"domains you should also give a reason why you have blocked the remote "
-"server."
-msgstr "Deze pagina kan je gebruiken om een zwarte lijst van servers aan te leggen van het gefedereerde netwerk die niet met jouw node mogen interageren. Voor alle domeine die je opgeeft moet je ook een reden geven waarom je die remote server geblokkeerd hebt."
+#: mod/profiles.php:346
+msgid "Marital Status"
+msgstr "Echtelijke staat"
 
-#: mod/admin.php:386
-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 "De lijst van geblokkeerde servers zal publiek beschikbaar gemaakt worden op de /friendica pagina zodat je gebruikers en personen die communicatie problemen onderzoeken gemakkelijk de reden kunnen vinden."
+#: mod/profiles.php:349
+msgid "Romantic Partner"
+msgstr "Romantische Partner"
 
-#: mod/admin.php:387
-msgid "Add new entry to block list"
-msgstr "Voeg nieuw item toe aan de blokkeerlijst"
+#: mod/profiles.php:358
+msgid "Work/Employment"
+msgstr "Werk"
 
-#: mod/admin.php:388
-msgid "Server Domain"
-msgstr "Server Domein"
+#: mod/profiles.php:361
+msgid "Religion"
+msgstr "Godsdienst"
 
-#: mod/admin.php:388
-msgid ""
-"The domain of the new server to add to the block list. Do not include the "
-"protocol."
-msgstr "Het domein van de nieuwe server om toe te voegen aan de blokkeerlijst. Laat het protocol weg."
+#: mod/profiles.php:364
+msgid "Political Views"
+msgstr "Politieke standpunten"
 
-#: mod/admin.php:389
-msgid "Block reason"
-msgstr "Reden voor blokkering"
+#: mod/profiles.php:367
+msgid "Gender"
+msgstr "Geslacht"
 
-#: mod/admin.php:390
-msgid "Add Entry"
-msgstr "Voeg Item toe"
+#: mod/profiles.php:370
+msgid "Sexual Preference"
+msgstr "Seksuele Voorkeur"
 
-#: mod/admin.php:391
-msgid "Save changes to the blocklist"
-msgstr "Sla veranderingen in de blokkeerlijst op"
+#: mod/profiles.php:373
+msgid "XMPP"
+msgstr "XMPP"
 
-#: mod/admin.php:392
-msgid "Current Entries in the Blocklist"
-msgstr "Huidige Items in de blokkeerlijst"
+#: mod/profiles.php:376
+msgid "Homepage"
+msgstr "Tijdlijn"
 
-#: mod/admin.php:395
-msgid "Delete entry from blocklist"
-msgstr "Verwijder item uit de blokkeerlijst"
+#: mod/profiles.php:379 mod/profiles.php:578
+msgid "Interests"
+msgstr "Interesses"
 
-#: mod/admin.php:398
-msgid "Delete entry from blocklist?"
-msgstr "Item verwijderen uit de blokkeerlijst?"
+#: mod/profiles.php:382
+msgid "Address"
+msgstr "Adres"
 
-#: mod/admin.php:424
-msgid "Server added to blocklist."
-msgstr "Server toegevoegd aan blokkeerlijst."
+#: mod/profiles.php:389 mod/profiles.php:574
+msgid "Location"
+msgstr "Plaats"
 
-#: mod/admin.php:440
-msgid "Site blocklist updated."
-msgstr "Site blokkeerlijst opgeslagen"
+#: mod/profiles.php:469
+msgid "Profile updated."
+msgstr "Profiel opgeslagen"
 
-#: mod/admin.php:463 src/Core/Console/GlobalCommunityBlock.php:68
-msgid "The contact has been blocked from the node"
-msgstr "Het contact is geblokkeerd van deze node"
+#: mod/profiles.php:523
+msgid "Hide contacts and friends:"
+msgstr "Verberg contacten en vrienden:"
 
-#: mod/admin.php:465 src/Core/Console/GlobalCommunityBlock.php:65
-#, php-format
-msgid "Could not find any contact entry for this URL (%s)"
-msgstr "Kon geen contact vinden op deze URL (%s)"
+#: mod/profiles.php:528
+msgid "Hide your contact/friend list from viewers of this profile?"
+msgstr "Je vrienden/contacten verbergen voor bezoekers van dit profiel?"
 
-#: mod/admin.php:472
-#, php-format
-msgid "%s contact unblocked"
-msgid_plural "%s contacts unblocked"
-msgstr[0] "%s contact is niet langer geblokkeerd"
-msgstr[1] "%s contacten zijn niet langer geblokkeerd"
+#: mod/profiles.php:548
+msgid "Show more profile fields:"
+msgstr "Toon meer profiel velden:"
 
-#: mod/admin.php:500
-msgid "Remote Contact Blocklist"
-msgstr "Remote Contact Blokkeerlijst"
+#: mod/profiles.php:560
+msgid "Profile Actions"
+msgstr "Profiel Acties"
 
-#: mod/admin.php:501
-msgid ""
-"This page allows you to prevent any message from a remote contact to reach "
-"your node."
-msgstr "De pagina laat je toe om te vermijden dat boodschappen van een remote contact je node bereiken."
+#: mod/profiles.php:561
+msgid "Edit Profile Details"
+msgstr "Profieldetails bewerken"
 
-#: mod/admin.php:502
-msgid "Block Remote Contact"
-msgstr "Blokkeer Remote Contact"
+#: mod/profiles.php:562 mod/crepair.php:149 mod/events.php:552
+#: mod/fsuggest.php:92 mod/manage.php:183 mod/message.php:261
+#: mod/message.php:441 mod/photos.php:991 mod/photos.php:1101
+#: mod/photos.php:1387 mod/photos.php:1432 mod/photos.php:1471
+#: mod/photos.php:1531 mod/poke.php:184 view/theme/duepuntozero/config.php:72
+#: view/theme/frio/config.php:127 view/theme/quattro/config.php:74
+#: view/theme/vier/config.php:120 src/Module/Contact.php:598
+#: src/Module/Debug/Localtime.php:45 src/Module/Install.php:213
+#: src/Module/Install.php:253 src/Module/Install.php:289
+#: src/Module/Invite.php:157 src/Module/Item/Compose.php:178
+#: src/Object/Post.php:878
+msgid "Submit"
+msgstr "Opslaan"
 
-#: mod/admin.php:503 mod/admin.php:1963
-msgid "select all"
-msgstr "Alles selecteren"
+#: mod/profiles.php:563
+msgid "Change Profile Photo"
+msgstr "Profielfoto wijzigen"
 
-#: mod/admin.php:504
-msgid "select none"
-msgstr "selecteer geen"
+#: mod/profiles.php:565
+msgid "View this profile"
+msgstr "Dit profiel bekijken"
 
-#: mod/admin.php:505 mod/admin.php:1972 src/Module/Contact.php:627
-#: src/Module/Contact.php:829 src/Module/Contact.php:1082
-msgid "Block"
-msgstr "Blokkeren"
+#: mod/profiles.php:566
+msgid "View all profiles"
+msgstr "Toon alle profielen"
 
-#: mod/admin.php:506 mod/admin.php:1974 src/Module/Contact.php:627
-#: src/Module/Contact.php:829 src/Module/Contact.php:1082
-msgid "Unblock"
-msgstr "Blokkering opheffen"
+#: mod/profiles.php:567 mod/profiles.php:662 src/Model/Profile.php:423
+msgid "Edit visibility"
+msgstr "Pas zichtbaarheid aan"
 
-#: mod/admin.php:507
-msgid "No remote contact is blocked from this node."
-msgstr "Geen enkel remote contact is geblokkeerd van deze node."
+#: mod/profiles.php:568
+msgid "Create a new profile using these settings"
+msgstr "Nieuw profiel aanmaken met deze instellingen"
 
-#: mod/admin.php:509
-msgid "Blocked Remote Contacts"
-msgstr "Geblokkeerde Remote Contacts"
+#: mod/profiles.php:569
+msgid "Clone this profile"
+msgstr "Dit profiel klonen"
 
-#: mod/admin.php:510
-msgid "Block New Remote Contact"
-msgstr "Blokkeer Nieuwe Remote Contacten"
+#: mod/profiles.php:570
+msgid "Delete this profile"
+msgstr "Dit profiel verwijderen"
 
-#: mod/admin.php:511
-msgid "Photo"
-msgstr "Foto"
+#: mod/profiles.php:572
+msgid "Basic information"
+msgstr "Basis informatie"
 
-#: mod/admin.php:511 mod/admin.php:1955 mod/admin.php:1966 mod/admin.php:1980
-#: mod/admin.php:1996 mod/crepair.php:161 mod/settings.php:682
-#: mod/settings.php:708
-msgid "Name"
-msgstr "Naam"
+#: mod/profiles.php:573
+msgid "Profile picture"
+msgstr "Profiel foto"
 
-#: mod/admin.php:511 mod/profiles.php:395
-msgid "Address"
-msgstr "Adres"
+#: mod/profiles.php:575
+msgid "Preferences"
+msgstr "Voorkeuren"
 
-#: mod/admin.php:511 mod/admin.php:521 mod/follow.php:170
-#: mod/notifications.php:177 mod/notifications.php:261 mod/unfollow.php:139
-#: src/Module/Contact.php:646
-msgid "Profile URL"
-msgstr "Profiel url"
+#: mod/profiles.php:576
+msgid "Status information"
+msgstr "Status informatie"
 
-#: mod/admin.php:519
-#, php-format
-msgid "%s total blocked contact"
-msgid_plural "%s total blocked contacts"
-msgstr[0] "%s geblokkeerde contacten in totaal"
-msgstr[1] "%s geblokkeerde contacten in totaal"
+#: mod/profiles.php:577
+msgid "Additional information"
+msgstr "Bijkomende informatie"
 
-#: mod/admin.php:521
-msgid "URL of the remote contact to block."
-msgstr "URL van de remote contact die je wil blokkeren."
+#: mod/profiles.php:579 mod/network.php:992
+#: src/Core/NotificationsManager.php:158
+msgid "Personal"
+msgstr "Persoonlijk"
 
-#: mod/admin.php:543
-msgid "Delete this Item"
-msgstr "Verwijder dit Item"
+#: mod/profiles.php:580
+msgid "Relation"
+msgstr "Relatie"
 
-#: mod/admin.php:544
-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 "Op deze pagina kan je een item van je node verwijderen. Als het item een bericht is op het eerste niveau, dan zal de hele gesprek verwijderd worden."
+#: mod/profiles.php:581 src/Util/Temporal.php:79 src/Util/Temporal.php:81
+msgid "Miscellaneous"
+msgstr "Diversen"
 
-#: mod/admin.php:545
-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 "Je moet de GUID van het item kennen. Je kan het terugvinden bvb. door te kijken naar de getoonde URL. Het laatste deel van http://example.com/display/123456 is de GUID, hier 123456."
+#: mod/profiles.php:583 mod/profile_photo.php:246 src/Module/Welcome.php:39
+msgid "Upload Profile Photo"
+msgstr "Profielfoto uploaden"
 
-#: mod/admin.php:546
-msgid "GUID"
-msgstr "GUID"
+#: mod/profiles.php:584
+msgid "Your Gender:"
+msgstr "Je Geslacht:"
 
-#: mod/admin.php:546
-msgid "The GUID of the item you want to delete."
-msgstr "De GUID van het item dat je wil verwijderen."
+#: mod/profiles.php:585
+msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
+msgstr "<span class=\"heart\">&hearts;</span> Echtelijke Staat:"
 
-#: mod/admin.php:580
-msgid "Item marked for deletion."
-msgstr "Item gemarkeerd om te verwijderen."
+#: mod/profiles.php:586 src/Model/Profile.php:800
+msgid "Sexual Preference:"
+msgstr "Seksuele Voorkeur:"
 
-#: mod/admin.php:651
-msgid "unknown"
-msgstr "onbekend"
+#: mod/profiles.php:587
+msgid "Example: fishing photography software"
+msgstr "Voorbeeld: vissen fotografie software"
 
-#: mod/admin.php:754
-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 "Deze pagina toont je statistieken van het gekende deel van het gefedereerde sociale netwerk waarvan je Friendica node deel uitmaakt. Deze statistieken zijn niet volledig maar reflecteren het deel van het network dat jouw node kent."
+#: mod/profiles.php:592
+msgid "Profile Name:"
+msgstr "Profiel Naam:"
 
-#: mod/admin.php:755
-msgid ""
-"The <em>Auto Discovered Contact Directory</em> feature is not enabled, it "
-"will improve the data displayed here."
-msgstr "Het <em>Automatisch Achterhaalde Contact Gids</em> feature is niet geactiveerd, het zal de hier getoonde informatie verbeteren."
+#: mod/profiles.php:592 mod/events.php:510 mod/events.php:542
+msgid "Required"
+msgstr "Vereist"
 
-#: mod/admin.php:767
-#, php-format
+#: mod/profiles.php:594
 msgid ""
-"Currently this node is aware of %d nodes with %d registered users from the "
-"following platforms:"
-msgstr "Op dit moment kent deze node %d nodes met %d geregistreerde gebruikers op basis van de volgende patformen:"
-
-#: mod/admin.php:806 mod/admin.php:857
-msgid "ID"
-msgstr "ID"
+"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
+"be visible to anybody using the internet."
+msgstr "Dit is jouw <strong>publiek</strong> profiel.<br />Het <strong>kan</strong> zichtbaar zijn voor iedereen op het internet."
 
-#: mod/admin.php:807
-msgid "Recipient Name"
-msgstr "Naam van de Ontvanger"
+#: mod/profiles.php:595
+msgid "Your Full Name:"
+msgstr "Je volledige naam:"
 
-#: mod/admin.php:808
-msgid "Recipient Profile"
-msgstr "Profiel van de Ontvanger"
+#: mod/profiles.php:596
+msgid "Title/Description:"
+msgstr "Titel/Beschrijving:"
 
-#: mod/admin.php:809 src/Content/Nav.php:236
-#: src/Core/NotificationsManager.php:180 view/theme/frio/theme.php:280
-msgid "Network"
-msgstr "Netwerk"
+#: mod/profiles.php:599
+msgid "Street Address:"
+msgstr "Postadres:"
 
-#: mod/admin.php:810 mod/admin.php:859
-msgid "Created"
-msgstr "Aangemaakt"
+#: mod/profiles.php:600
+msgid "Locality/City:"
+msgstr "Gemeente/Stad:"
 
-#: mod/admin.php:811
-msgid "Last Tried"
-msgstr "Laatste poging"
+#: mod/profiles.php:601
+msgid "Region/State:"
+msgstr "Regio/Staat:"
 
-#: mod/admin.php:812
-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 "Deze pagina lijst de inhoud van de wachtrij op voor uitgaande berichten. Dit zijn berichten waarvoor de initiële aflevering faalde. Ze zullen later opnieuw verzonden worden en uiteindelijk verwijderd worden als de aflevering permanent faalt."
+#: mod/profiles.php:602
+msgid "Postal/Zip Code:"
+msgstr "Postcode:"
 
-#: mod/admin.php:833
-msgid "Inspect Deferred Worker Queue"
-msgstr "Inspecteer wachtrij van uitgestelde workers"
+#: mod/profiles.php:603
+msgid "Country:"
+msgstr "Land:"
 
-#: mod/admin.php:834
-msgid ""
-"This page lists the deferred worker jobs. This are jobs that couldn't be "
-"executed at the first time."
-msgstr "Deze pagine geeft alle uitgestelde workertaken. Dit zijn taken die niet onmiddelijk konden worden uitgevoerd"
+#: mod/profiles.php:604 src/Util/Temporal.php:149
+msgid "Age: "
+msgstr "Leeftijd:"
 
-#: mod/admin.php:837
-msgid "Inspect Worker Queue"
-msgstr "Taakwachtrij inspecteren"
+#: mod/profiles.php:607
+msgid "Who: (if applicable)"
+msgstr "Wie: (indien toepasbaar)"
 
-#: mod/admin.php:838
-msgid ""
-"This page lists the currently queued worker jobs. These jobs are handled by "
-"the worker cronjob you've set up during install."
-msgstr "Deze pagina toont alle taken in de wachtrij. Deze taken worden behandeld door de geplande taak die je hebt ingesteld tijdens installatie."
+#: mod/profiles.php:607
+msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
+msgstr "Voorbeelden: Kathleen123, Kathleen Peeters, kathleen@voorbeeld.nl"
 
-#: mod/admin.php:858
-msgid "Job Parameters"
-msgstr "Taak parameters"
+#: mod/profiles.php:608
+msgid "Since [date]:"
+msgstr "Sinds [datum]:"
 
-#: mod/admin.php:860
-msgid "Priority"
-msgstr "Prioriteit"
+#: mod/profiles.php:610
+msgid "Tell us about yourself..."
+msgstr "Vertel iets over jezelf..."
 
-#: mod/admin.php:885
-#, php-format
-msgid ""
-"Your DB still runs with MyISAM tables. You should change the engine type to "
-"InnoDB. As Friendica will use InnoDB only features in the future, you should"
-" change this! See <a href=\"%s\">here</a> for a guide that may be helpful "
-"converting the table engines. You may also use the command <tt>php "
-"bin/console.php dbstructure toinnodb</tt> of your Friendica installation for"
-" an automatic conversion.<br />"
-msgstr "Je DB opereert nog met MyISAM tabellen. Best is van engine te veranderen naar InnoDB. Aangezien Friendica in de toekomst gebruik zal maken van InnoDB features, zou je dit best aanpassen! Zie <a href=\"%s\">hier</a> voor een gids die je kan helpen om de tabel engines te converteren. Je kan ook het commando<tt>php bin/console.php dbstructure toinnodb</tt> van je Friendica installatie gebruiken voor een automatische conversie.<br />"
+#: mod/profiles.php:611
+msgid "XMPP (Jabber) address:"
+msgstr "XMPP (Jabber) adres:"
 
-#: mod/admin.php:892
-#, php-format
+#: mod/profiles.php:611
 msgid ""
-"There is a new version of Friendica available for download. Your current "
-"version is %1$s, upstream version is %2$s"
-msgstr "Er is een nieuwe versie van Friendica beschikbaar om te downloaden. Je huidige versie is %1$s, upstream versie is %2$s"
+"The XMPP address will be propagated to your contacts so that they can follow"
+" you."
+msgstr "Het XMPP adres zal doorgegeven worden aan je contacten zodat zij je kunnen volgen."
 
-#: mod/admin.php:902
-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 "Database update is mislukt. Gelieve  \"php bin/console.php dbstructure update\" vanaf de command line uit te voeren en de foutmeldingen die zouden kunnen verschijnen na te kijken."
+#: mod/profiles.php:612
+msgid "Homepage URL:"
+msgstr "Adres tijdlijn:"
 
-#: mod/admin.php:908
-msgid "The worker was never executed. Please check your database structure!"
-msgstr "De worker werd nooit uitgevoerd. Best je database structuur eens nakijken!"
+#: mod/profiles.php:613 src/Model/Profile.php:808
+msgid "Hometown:"
+msgstr "Woonplaats:"
 
-#: mod/admin.php:911
-#, php-format
-msgid ""
-"The last worker execution was on %s UTC. This is older than one hour. Please"
-" check your crontab settings."
-msgstr "De laatste worker uitvoering was op %s UTC. Dit is langer dan 1 uur geleden. Best je crontab instellingen nakijken."
+#: mod/profiles.php:614 src/Model/Profile.php:816
+msgid "Political Views:"
+msgstr "Politieke standpunten:"
 
-#: mod/admin.php:917
-#, php-format
-msgid ""
-"Friendica's configuration now is stored in config/local.config.php, please "
-"copy config/local-sample.config.php and move your config from "
-"<code>.htconfig.php</code>. See <a href=\"%s\">the Config help page</a> for "
-"help with the transition."
-msgstr "Het configuratiebestand bevind zich nu in config/local.config.php. Kopieer het bestand config/local-sample.config.php en verplaats je configuratie uit <code>.htconfig.php</code>. Ga naar de<a href=\"%s\">configuratie help pagina</a> voor hulp bij transitie."
+#: mod/profiles.php:615
+msgid "Religious Views:"
+msgstr "Geloof:"
 
-#: mod/admin.php:924
-#, php-format
-msgid ""
-"<a href=\"%s\">%s</a> is not reachable on your system. This is a severe "
-"configuration issue that prevents server to server communication. See <a "
-"href=\"%s\">the installation page</a> for help."
-msgstr "<a href=\"%s\">%s</a> is niet bereikbaar. Dit is een belangrijk communicatieprobleem waardoor server-naar-server communicatie niet mogelijk is. Lees de <a href=\"%s\">the installatie pagina</a> voor hulp."
+#: mod/profiles.php:616
+msgid "Public Keywords:"
+msgstr "Publieke Sleutelwoorden:"
 
-#: mod/admin.php:930
-msgid "Normal Account"
-msgstr "Normaal account"
+#: mod/profiles.php:616
+msgid "(Used for suggesting potential friends, can be seen by others)"
+msgstr "(Gebruikt om mogelijke vrienden voor te stellen, kan door anderen gezien worden)"
 
-#: mod/admin.php:931
-msgid "Automatic Follower Account"
-msgstr "Automatische Volger Account"
+#: mod/profiles.php:617
+msgid "Private Keywords:"
+msgstr "Privé Sleutelwoorden:"
 
-#: mod/admin.php:932
-msgid "Public Forum Account"
-msgstr "Publiek Forum account"
+#: mod/profiles.php:617
+msgid "(Used for searching profiles, never shown to others)"
+msgstr "(Gebruikt om profielen te zoeken, nooit aan anderen getoond)"
 
-#: mod/admin.php:933
-msgid "Automatic Friend Account"
-msgstr "Automatisch Vriendschapsaccount"
+#: mod/profiles.php:618 src/Model/Profile.php:832
+msgid "Likes:"
+msgstr "Houdt van:"
 
-#: mod/admin.php:934
-msgid "Blog Account"
-msgstr "Blog Account"
+#: mod/profiles.php:619 src/Model/Profile.php:836
+msgid "Dislikes:"
+msgstr "Houdt niet van:"
 
-#: mod/admin.php:935
-msgid "Private Forum Account"
-msgstr "Privé Forum Account"
+#: mod/profiles.php:620
+msgid "Musical interests"
+msgstr "Muzikale interesses"
 
-#: mod/admin.php:958
-msgid "Message queues"
-msgstr "Bericht-wachtrijen"
+#: mod/profiles.php:621
+msgid "Books, literature"
+msgstr "Boeken, literatuur"
 
-#: mod/admin.php:964
-msgid "Server Settings"
-msgstr "Server instellingen."
+#: mod/profiles.php:622
+msgid "Television"
+msgstr "Televisie"
 
-#: mod/admin.php:973
-msgid "Summary"
-msgstr "Samenvatting"
+#: mod/profiles.php:623
+msgid "Film/dance/culture/entertainment"
+msgstr "Film/dans/cultuur/ontspanning"
 
-#: mod/admin.php:975
-msgid "Registered users"
-msgstr "Geregistreerde gebruikers"
+#: mod/profiles.php:624
+msgid "Hobbies/Interests"
+msgstr "Hobby's/Interesses"
 
-#: mod/admin.php:977
-msgid "Pending registrations"
-msgstr "Registraties die in de wacht staan"
+#: mod/profiles.php:625
+msgid "Love/romance"
+msgstr "Liefde/romance"
 
-#: mod/admin.php:978
-msgid "Version"
-msgstr "Versie"
+#: mod/profiles.php:626
+msgid "Work/employment"
+msgstr "Werk"
 
-#: mod/admin.php:983
-msgid "Active addons"
-msgstr "Actieve addons"
+#: mod/profiles.php:627
+msgid "School/education"
+msgstr "School/opleiding"
 
-#: mod/admin.php:1015
-msgid "Can not parse base url. Must have at least <scheme>://<domain>"
-msgstr "Kan de basis url niet verwerken. Moet minstens zijn <scheme>://<domain>"
+#: mod/profiles.php:628
+msgid "Contact information and Social Networks"
+msgstr "Contactinformatie en sociale netwerken"
 
-#: mod/admin.php:1351
-msgid "Site settings updated."
-msgstr "Site instellingen opgeslagen"
+#: mod/profiles.php:659 src/Model/Profile.php:419
+msgid "Profile Image"
+msgstr "Profiel afbeelding"
 
-#: mod/admin.php:1379 mod/settings.php:908
-msgid "No special theme for mobile devices"
-msgstr "Geen speciaal thema voor mobiele apparaten"
+#: mod/profiles.php:661 src/Model/Profile.php:422
+msgid "visible to everybody"
+msgstr "zichtbaar voor iedereen"
 
-#: mod/admin.php:1408
-msgid "No community page for local users"
-msgstr "Geen groepspagina voor lokale gebruikers"
+#: mod/profiles.php:668
+msgid "Edit/Manage Profiles"
+msgstr "Wijzig/Beheer Profielen"
 
-#: mod/admin.php:1409
-msgid "No community page"
-msgstr "Geen groepspagina"
+#: mod/profiles.php:669 src/Model/Profile.php:409 src/Model/Profile.php:430
+msgid "Change profile photo"
+msgstr "Profiel foto wijzigen"
 
-#: mod/admin.php:1410
-msgid "Public postings from users of this site"
-msgstr "Publieke berichten van gebruikers van deze site"
+#: mod/profiles.php:670 src/Model/Profile.php:410
+msgid "Create New Profile"
+msgstr "Maak nieuw profiel"
 
-#: mod/admin.php:1411
-msgid "Public postings from the federated network"
-msgstr "Publieke berichten van het gefedereerde netwerk"
+#: mod/cal.php:34 mod/cal.php:38 mod/community.php:40 mod/follow.php:20
+#: src/Module/Debug/ItemBody.php:18
+msgid "Access denied."
+msgstr "Toegang geweigerd"
 
-#: mod/admin.php:1412
-msgid "Public postings from local users and the federated network"
-msgstr "Publieke berichten van lokale gebruikers en van het gefedereerde netwerk"
+#: mod/cal.php:140 mod/display.php:301 src/Module/Profile.php:177
+msgid "Access to this profile has been restricted."
+msgstr "Toegang tot dit profiel is beperkt."
 
-#: mod/admin.php:1416 mod/admin.php:1585 mod/admin.php:1595
-#: src/Module/Contact.php:552
-msgid "Disabled"
-msgstr "Uitgeschakeld"
+#: mod/cal.php:271 mod/events.php:383 view/theme/frio/theme.php:271
+#: view/theme/frio/theme.php:275 src/Content/Nav.php:164
+#: src/Content/Nav.php:228 src/Model/Profile.php:945 src/Model/Profile.php:956
+msgid "Events"
+msgstr "Gebeurtenissen"
 
-#: mod/admin.php:1418
-msgid "Users, Global Contacts"
-msgstr "Gebruikers, Globale contacten"
+#: mod/cal.php:272 mod/events.php:384
+msgid "View"
+msgstr "Beeld"
 
-#: mod/admin.php:1419
-msgid "Users, Global Contacts/fallback"
-msgstr "Gebruikers, Globale Contacten/noodoplossing"
+#: mod/cal.php:273 mod/events.php:386
+msgid "Previous"
+msgstr "Vorige"
 
-#: mod/admin.php:1423
-msgid "One month"
-msgstr "Een maand"
+#: mod/cal.php:274 mod/events.php:387 src/Module/Install.php:175
+msgid "Next"
+msgstr "Volgende"
 
-#: mod/admin.php:1424
-msgid "Three months"
-msgstr "Drie maanden"
+#: mod/cal.php:277 mod/events.php:392 src/Model/Event.php:428
+msgid "today"
+msgstr "vandaag"
 
-#: mod/admin.php:1425
-msgid "Half a year"
-msgstr "Een half jaar"
+#: mod/cal.php:278 mod/events.php:393 src/Util/Temporal.php:314
+#: src/Model/Event.php:429
+msgid "month"
+msgstr "maand"
 
-#: mod/admin.php:1426
-msgid "One year"
-msgstr "Een jaar"
+#: mod/cal.php:279 mod/events.php:394 src/Util/Temporal.php:315
+#: src/Model/Event.php:430
+msgid "week"
+msgstr "week"
 
-#: mod/admin.php:1431
-msgid "Multi user instance"
-msgstr "Server voor meerdere gebruikers"
+#: mod/cal.php:280 mod/events.php:395 src/Util/Temporal.php:316
+#: src/Model/Event.php:431
+msgid "day"
+msgstr "dag"
 
-#: mod/admin.php:1457
-msgid "Closed"
-msgstr "Gesloten"
+#: mod/cal.php:281 mod/events.php:396
+msgid "list"
+msgstr "lijst"
 
-#: mod/admin.php:1458
-msgid "Requires approval"
-msgstr "Toestemming vereist"
+#: mod/cal.php:294 src/Model/User.php:384 src/Console/NewPassword.php:88
+msgid "User not found"
+msgstr "Gebruiker niet gevonden"
 
-#: mod/admin.php:1459
-msgid "Open"
-msgstr "Open"
+#: mod/cal.php:310
+msgid "This calendar format is not supported"
+msgstr "Dit kalender formaat is niet ondersteund"
 
-#: mod/admin.php:1463
-msgid "No SSL policy, links will track page SSL state"
-msgstr "Geen SSL beleid, links zullen SSL status van pagina volgen"
+#: mod/cal.php:312
+msgid "No exportable data found"
+msgstr "Geen exporteerbare data gevonden"
 
-#: mod/admin.php:1464
-msgid "Force all links to use SSL"
-msgstr "Verplicht alle links om SSL te gebruiken"
+#: mod/cal.php:329
+msgid "calendar"
+msgstr "kalender"
 
-#: mod/admin.php:1465
-msgid "Self-signed certificate, use SSL for local links only (discouraged)"
-msgstr "Zelf-ondertekend certificaat, gebruik SSL alleen voor lokale links (afgeraden)"
+#: mod/common.php:90
+msgid "No contacts in common."
+msgstr "Geen gedeelde contacten."
 
-#: mod/admin.php:1469
-msgid "Don't check"
-msgstr "Geen rekening mee houden"
-
-#: mod/admin.php:1470
-msgid "check the stable version"
-msgstr "Neem de stabiele versie in rekening"
-
-#: mod/admin.php:1471
-msgid "check the development version"
-msgstr "Neem de ontwikkel versie in rekening"
-
-#: mod/admin.php:1490
-msgid "Republish users to directory"
-msgstr "Opnieuw de gebruikers naar de gids publiceren"
+#: mod/common.php:141 src/Module/Contact.php:895
+msgid "Common Friends"
+msgstr "Gedeelde Vrienden"
 
-#: mod/admin.php:1491 mod/register.php:268
-msgid "Registration"
-msgstr "Registratie"
+#: mod/community.php:33 mod/dfrn_request.php:597 mod/display.php:199
+#: mod/photos.php:850 mod/search.php:87 mod/search.php:93 mod/videos.php:118
+#: src/Module/Debug/Probe.php:20 src/Module/Debug/WebFinger.php:19
+#: src/Module/Directory.php:30
+msgid "Public access denied."
+msgstr "Niet vrij toegankelijk"
 
-#: mod/admin.php:1492
-msgid "File upload"
-msgstr "Uploaden bestand"
+#: mod/community.php:76
+msgid "Community option not available."
+msgstr "Groepsoptie niet beschikbaar"
 
-#: mod/admin.php:1493
-msgid "Policies"
-msgstr "Beleid"
+#: mod/community.php:93
+msgid "Not available."
+msgstr "Niet beschikbaar"
 
-#: mod/admin.php:1494 mod/events.php:561 src/Model/Profile.php:878
-#: src/Module/Contact.php:907
-msgid "Advanced"
-msgstr "Geavanceerd"
+#: mod/community.php:103
+msgid "Local Community"
+msgstr "Lokale Groep"
 
-#: mod/admin.php:1495
-msgid "Auto Discovered Contact Directory"
-msgstr "Automatisch Achterhaalde Contact Gids"
+#: mod/community.php:106
+msgid "Posts from local users on this server"
+msgstr "Berichten van lokale gebruikers op deze server"
 
-#: mod/admin.php:1496
-msgid "Performance"
-msgstr "Performantie"
+#: mod/community.php:114
+msgid "Global Community"
+msgstr "Globale gemeenschap"
 
-#: mod/admin.php:1497
-msgid "Worker"
-msgstr "Worker"
+#: mod/community.php:117
+msgid "Posts from users of the whole federated network"
+msgstr "Berichten van gebruikers van het hele gefedereerde netwerk"
 
-#: mod/admin.php:1498
-msgid "Message Relay"
-msgstr "Boodschap Relais"
+#: mod/community.php:163 mod/search.php:222
+msgid "No results."
+msgstr "Geen resultaten."
 
-#: mod/admin.php:1499
-msgid "Relocate Instance"
-msgstr "Verhuis node"
+#: mod/community.php:215
+msgid ""
+"This community stream shows all public posts received by this node. They may"
+" not reflect the opinions of this node’s users."
+msgstr "Deze groepsstroom toont alle publieke berichten die deze node ontvangen heeft. Ze kunnen mogelijks niet de mening van de gebruikers van deze node weerspiegelen."
 
-#: mod/admin.php:1500
-msgid "Warning! Advanced function. Could make this server unreachable."
-msgstr "Waarschuwing! Geavanceerde functie. Dit kan u node onbereikbaar maken"
+#: mod/crepair.php:79
+msgid "Contact settings applied."
+msgstr "Contactinstellingen toegepast."
 
-#: mod/admin.php:1503
-msgid "Site name"
-msgstr "Site naam"
+#: mod/crepair.php:81
+msgid "Contact update failed."
+msgstr "Aanpassen van contact mislukt."
 
-#: mod/admin.php:1504
-msgid "Host name"
-msgstr "Host naam"
+#: mod/crepair.php:102 mod/dfrn_confirm.php:125 mod/fsuggest.php:32
+#: mod/fsuggest.php:75 mod/redir.php:32 mod/redir.php:140
+#: src/Module/FollowConfirm.php:46 src/Module/Group.php:92
+msgid "Contact not found."
+msgstr "Contact niet gevonden"
 
-#: mod/admin.php:1505
-msgid "Sender Email"
-msgstr "Verzender Email"
+#: 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>WAARSCHUWING: Dit is zeer geavanceerd</strong> en als je verkeerde informatie invult, zal je mogelijk niet meer kunnen communiceren met deze contactpersoon."
 
-#: mod/admin.php:1505
+#: mod/crepair.php:116
 msgid ""
-"The email address your server shall use to send notification emails from."
-msgstr "Het email adres als afzender van notificatie emails."
+"Please use your browser 'Back' button <strong>now</strong> if you are "
+"uncertain what to do on this page."
+msgstr "Gebruik <strong>nu</strong> de \"terug\"-knop in je webbrowser wanneer je niet weet wat je op deze pagina moet doen."
 
-#: mod/admin.php:1506
-msgid "Banner/Logo"
-msgstr "Banner/Logo"
+#: mod/crepair.php:130 mod/crepair.php:132
+msgid "No mirroring"
+msgstr "Geen mirroring"
 
-#: mod/admin.php:1507
-msgid "Shortcut icon"
-msgstr "Snelkoppeling icoon"
+#: mod/crepair.php:130
+msgid "Mirror as forwarded posting"
+msgstr "Spiegel als geforward bericht"
 
-#: mod/admin.php:1507
-msgid "Link to an icon that will be used for browsers."
-msgstr "Link naar een icoon dat zal gebruikt worden voor browsers."
+#: mod/crepair.php:130 mod/crepair.php:132
+msgid "Mirror as my own posting"
+msgstr "Spiegel als mijn eigen bericht"
 
-#: mod/admin.php:1508
-msgid "Touch icon"
-msgstr "Pictogram voor smartphones"
+#: mod/crepair.php:145
+msgid "Return to contact editor"
+msgstr "Ga terug naar contactbewerker"
 
-#: mod/admin.php:1508
-msgid "Link to an icon that will be used for tablets and mobiles."
-msgstr "Link naar een icoon dat zal gebruikt worden voor tablets en mobiele telefoons."
+#: mod/crepair.php:147
+msgid "Refetch contact data"
+msgstr "Contact data opnieuw ophalen"
 
-#: mod/admin.php:1509
-msgid "Additional Info"
-msgstr "Bijkomende Info"
+#: mod/crepair.php:150
+msgid "Remote Self"
+msgstr "Mijn identiteit elders"
 
-#: mod/admin.php:1509
-#, php-format
+#: mod/crepair.php:153
+msgid "Mirror postings from this contact"
+msgstr "Berichten van dit contact spiegelen"
+
+#: mod/crepair.php:155
 msgid ""
-"For public servers: you can add additional information here that will be "
-"listed at %s/servers."
-msgstr "Voor publieke servers: je kan bijkomende informatie hier toevoegen die zal opgelijst zijn op %s/servers."
+"Mark this contact as remote_self, this will cause friendica to repost new "
+"entries from this contact."
+msgstr "Markeer dit contact als remote_self, hierdoor zal friendica nieuwe berichten van dit contact opnieuw posten."
 
-#: mod/admin.php:1510
-msgid "System language"
-msgstr "Systeemtaal"
+#: mod/crepair.php:159 mod/settings.php:679 mod/settings.php:705
+#: src/Module/Admin/Blocklist/Contact.php:73 src/Module/Admin/Users.php:272
+#: src/Module/Admin/Users.php:283 src/Module/Admin/Users.php:297
+#: src/Module/Admin/Users.php:313
+msgid "Name"
+msgstr "Naam"
 
-#: mod/admin.php:1511
-msgid "System theme"
-msgstr "Systeem thema"
+#: mod/crepair.php:160
+msgid "Account Nickname"
+msgstr "Bijnaam account"
 
-#: mod/admin.php:1511
-msgid ""
-"Default system theme - may be over-ridden by user profiles - <a href='#' "
-"id='cnftheme'>change theme settings</a>"
-msgstr "Standaard systeem thema - kan door gebruikersprofielen veranderd worden - <a href='#' id='cnftheme'>verander thema instellingen</a>"
+#: mod/crepair.php:161
+msgid "@Tagname - overrides Name/Nickname"
+msgstr "@Labelnaam - krijgt voorrang op naam/bijnaam"
 
-#: mod/admin.php:1512
-msgid "Mobile system theme"
-msgstr "Mobiel systeem thema"
+#: mod/crepair.php:162
+msgid "Account URL"
+msgstr "URL account"
 
-#: mod/admin.php:1512
-msgid "Theme for mobile devices"
-msgstr "Thema voor mobiele apparaten"
+#: mod/crepair.php:163
+msgid "Account URL Alias"
+msgstr "Account URL Alias"
 
-#: mod/admin.php:1513
-msgid "SSL link policy"
-msgstr "Beleid SSL-links"
+#: mod/crepair.php:164
+msgid "Friend Request URL"
+msgstr "URL vriendschapsverzoek"
 
-#: mod/admin.php:1513
-msgid "Determines whether generated links should be forced to use SSL"
-msgstr "Bepaald of gegenereerde verwijzingen verplicht SSL moeten gebruiken"
+#: mod/crepair.php:165
+msgid "Friend Confirm URL"
+msgstr "URL vriendschapsbevestiging"
 
-#: mod/admin.php:1514
-msgid "Force SSL"
-msgstr "Dwing SSL af"
+#: mod/crepair.php:166
+msgid "Notification Endpoint URL"
+msgstr "Notificatie Endpoint URL"
 
-#: mod/admin.php:1514
-msgid ""
-"Force all Non-SSL requests to SSL - Attention: on some systems it could lead"
-" to endless loops."
-msgstr "Forceer alle Niet-SSL aanvragen naar SSL - Pas op: dit kan op sommige systeem resulteren in oneindige lussen."
+#: mod/crepair.php:167
+msgid "Poll/Feed URL"
+msgstr "URL poll/feed"
 
-#: mod/admin.php:1515
-msgid "Hide help entry from navigation menu"
-msgstr "Verberg de 'help' uit het navigatiemenu"
+#: mod/crepair.php:168
+msgid "New photo from this URL"
+msgstr "Nieuwe foto van deze URL"
 
-#: mod/admin.php:1515
+#: mod/dfrn_confirm.php:126
 msgid ""
-"Hides the menu entry for the Help pages from the navigation menu. You can "
-"still access it calling /help directly."
-msgstr "Verbergt het menu-item voor de Help pagina's uit het navigatiemenu. Je kunt ze nog altijd vinden door /help direct in te geven."
-
-#: mod/admin.php:1516
-msgid "Single user instance"
-msgstr "Server voor één gebruiker"
+"This may occasionally happen if contact was requested by both persons and it"
+" has already been approved."
+msgstr "Dit kan soms gebeuren als het contact door beide personen werd gevraagd, en het werd al goedgekeurd."
 
-#: mod/admin.php:1516
-msgid "Make this instance multi-user or single-user for the named user"
-msgstr "Stel deze server in voor meerdere gebruikers, of enkel voor de geselecteerde gebruiker."
+#: mod/dfrn_confirm.php:227
+msgid "Response from remote site was not understood."
+msgstr "Antwoord van de website op afstand werd niet begrepen."
 
-#: mod/admin.php:1517
-msgid "Maximum image size"
-msgstr "Maximum afbeeldingsgrootte"
+#: mod/dfrn_confirm.php:234 mod/dfrn_confirm.php:240
+msgid "Unexpected response from remote site: "
+msgstr "Onverwacht antwoord van website op afstand:"
 
-#: mod/admin.php:1517
-msgid ""
-"Maximum size in bytes of uploaded images. Default is 0, which means no "
-"limits."
-msgstr "Maximum afmeting in bytes van afbeeldingen. Standaard is 0, dus geen beperking."
+#: mod/dfrn_confirm.php:249
+msgid "Confirmation completed successfully."
+msgstr "Bevestiging werd correct voltooid."
 
-#: mod/admin.php:1518
-msgid "Maximum image length"
-msgstr "Maximum afbeeldingslengte"
+#: mod/dfrn_confirm.php:261
+msgid "Temporary failure. Please wait and try again."
+msgstr "Tijdelijke fout. Wacht even en probeer opnieuw."
 
-#: mod/admin.php:1518
-msgid ""
-"Maximum length in pixels of the longest side of uploaded images. Default is "
-"-1, which means no limits."
-msgstr "Maximum lengte in pixels van de langste kant van afbeeldingen. Standaard is -1, dus geen beperkingen."
+#: mod/dfrn_confirm.php:264
+msgid "Introduction failed or was revoked."
+msgstr "Verzoek mislukt of herroepen."
 
-#: mod/admin.php:1519
-msgid "JPEG image quality"
-msgstr "JPEG afbeeldingskwaliteit"
+#: mod/dfrn_confirm.php:269
+msgid "Remote site reported: "
+msgstr "Website op afstand berichtte: "
 
-#: mod/admin.php:1519
-msgid ""
-"Uploaded JPEGS will be saved at this quality setting [0-100]. Default is "
-"100, which is full quality."
-msgstr "JPEGS zullen met deze kwaliteitsinstelling bewaard worden [0-100]. Standaard is 100, dit is volledige kwaliteit."
+#: mod/dfrn_confirm.php:374
+#, php-format
+msgid "No user record found for '%s' "
+msgstr "Geen gebruiker gevonden voor '%s'"
 
-#: mod/admin.php:1521
-msgid "Register policy"
-msgstr "Registratiebeleid"
+#: mod/dfrn_confirm.php:384
+msgid "Our site encryption key is apparently messed up."
+msgstr "De encryptie-sleutel van onze webstek is blijkbaar beschadigd."
 
-#: mod/admin.php:1522
-msgid "Maximum Daily Registrations"
-msgstr "Maximum aantal registraties per dag"
+#: mod/dfrn_confirm.php:395
+msgid "Empty site URL was provided or URL could not be decrypted by us."
+msgstr "Er werd een lege URL gegeven, of de URL kon niet ontcijferd worden door ons."
 
-#: mod/admin.php:1522
-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 "Als registratie hierboven is toegelaten, zet dit het maximum aantal registraties van nieuwe gebruikers per dag. Als registratie niet is toegelaten heeft deze instelling geen effect."
+#: mod/dfrn_confirm.php:411
+msgid "Contact record was not found for you on our site."
+msgstr "We vonden op onze webstek geen contactrecord voor jou."
 
-#: mod/admin.php:1523
-msgid "Register text"
-msgstr "Registratietekst"
+#: mod/dfrn_confirm.php:425
+#, php-format
+msgid "Site public key not available in contact record for URL %s."
+msgstr "Publieke sleutel voor webstek niet beschikbaar in contactrecord voor URL %s."
 
-#: mod/admin.php:1523
+#: mod/dfrn_confirm.php:441
 msgid ""
-"Will be displayed prominently on the registration page. You can use BBCode "
-"here."
-msgstr "Zal prominent op de registratie pagina getoond worden. Je kan hierin BBCode gebruiken."
+"The ID provided by your system is a duplicate on our system. It should work "
+"if you try again."
+msgstr "Het ID dat jouw systeem aangeeft is een dubbel op ons systeem. Als je opnieuw probeert zou het moeten werken."
 
-#: mod/admin.php:1524
-msgid "Forbidden Nicknames"
-msgstr "Verboden bijnamen"
+#: mod/dfrn_confirm.php:452
+msgid "Unable to set your contact credentials on our system."
+msgstr "Niet in staat om op dit systeem je contactreferenties in te stellen."
 
-#: mod/admin.php:1524
-msgid ""
-"Comma separated list of nicknames that are forbidden from registration. "
-"Preset is a list of role names according RFC 2142."
-msgstr "Kommagescheiden lijst van bijnamen die verboden zijn voor registratie. De lijst uit RFC2142 is op voorhand ingesteld."
+#: mod/dfrn_confirm.php:508
+msgid "Unable to update your contact profile details on our system"
+msgstr "Kan je contact profiel details op ons systeem niet aanpassen"
 
-#: mod/admin.php:1525
-msgid "Accounts abandoned after x days"
-msgstr "Verlaten accounts na x dagen"
+#: mod/dfrn_confirm.php:538 mod/dfrn_request.php:560
+#: src/Model/Contact.php:2457
+msgid "[Name Withheld]"
+msgstr "[Naam achtergehouden]"
 
-#: mod/admin.php:1525
-msgid ""
-"Will not waste system resources polling external sites for abandonded "
-"accounts. Enter 0 for no time limit."
-msgstr "Dit zal geen systeembronnen verspillen aan het nakijken van externe sites voor verlaten accounts. Geef 0 is voor geen tijdslimiet."
+#: mod/dfrn_poll.php:125 mod/dfrn_poll.php:530
+#, php-format
+msgid "%1$s welcomes %2$s"
+msgstr "%1$s heet %2$s van harte welkom"
 
-#: mod/admin.php:1526
-msgid "Allowed friend domains"
-msgstr "Toegelaten vriend domeinen"
+#: mod/dfrn_request.php:98
+msgid "This introduction has already been accepted."
+msgstr "Verzoek is al goedgekeurd"
 
-#: mod/admin.php:1526
-msgid ""
-"Comma separated list of domains which are allowed to establish friendships "
-"with this site. Wildcards are accepted. Empty to allow any domains"
-msgstr "Komma-gescheiden lijst van domeinen die een vriendschapsband met deze website mogen aangaan. Jokers zijn toegelaten. Laat leeg om alle domeinen toe te laten."
-
-#: mod/admin.php:1527
-msgid "Allowed email domains"
-msgstr "Toegelaten e-mail domeinen"
+#: mod/dfrn_request.php:116 mod/dfrn_request.php:354
+msgid "Profile location is not valid or does not contain profile information."
+msgstr "Profiel is ongeldig of bevat geen informatie"
 
-#: mod/admin.php:1527
-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 "Door komma's gescheiden lijst met e-maildomeinen die op deze website mogen registeren. Wildcards zijn toegestaan.\nLeeg laten om alle domeinen toe te staan."
+#: mod/dfrn_request.php:120 mod/dfrn_request.php:358
+msgid "Warning: profile location has no identifiable owner name."
+msgstr "Waarschuwing: de profiellocatie heeft geen identificeerbare eigenaar."
 
-#: mod/admin.php:1528
-msgid "No OEmbed rich content"
-msgstr "Geen OEmbed richt content"
+#: mod/dfrn_request.php:123 mod/dfrn_request.php:361
+msgid "Warning: profile location has no profile photo."
+msgstr "Waarschuwing: Profieladres heeft geen profielfoto."
 
-#: mod/admin.php:1528
-msgid ""
-"Don't show the rich content (e.g. embedded PDF), except from the domains "
-"listed below."
-msgstr "Toon geen rich content (bvb. embedded PDF), behalve van domeinen hieronder opgelijst."
+#: mod/dfrn_request.php:127 mod/dfrn_request.php:365
+#, php-format
+msgid "%d required parameter was not found at the given location"
+msgid_plural "%d required parameters were not found at the given location"
+msgstr[0] "De %d vereiste parameter is niet op het gegeven adres gevonden"
+msgstr[1] "De %d vereiste parameters zijn niet op het gegeven adres gevonden"
 
-#: mod/admin.php:1529
-msgid "Allowed OEmbed domains"
-msgstr "Sta OEmbed domeinen toe"
+#: mod/dfrn_request.php:165
+msgid "Introduction complete."
+msgstr "Verzoek voltooid."
 
-#: mod/admin.php:1529
-msgid ""
-"Comma separated list of domains which oembed content is allowed to be "
-"displayed. Wildcards are accepted."
-msgstr "Met komma's gescheiden lijst van domeinen waarvoor oembed content mag getoond worden. Wildcards zijn toegelaten."
+#: mod/dfrn_request.php:201
+msgid "Unrecoverable protocol error."
+msgstr "Onherstelbare protocolfout. "
 
-#: mod/admin.php:1530
-msgid "Block public"
-msgstr "Openbare toegang blokkeren"
+#: mod/dfrn_request.php:228
+msgid "Profile unavailable."
+msgstr "Profiel onbeschikbaar"
 
-#: mod/admin.php:1530
-msgid ""
-"Check to block public access to all otherwise public personal pages on this "
-"site unless you are currently logged in."
-msgstr "Kruis dit aan om alle openbare persoonlijke pagina's alleen toegankelijk te maken voor ingelogde gebruikers."
+#: mod/dfrn_request.php:249
+#, php-format
+msgid "%s has received too many connection requests today."
+msgstr "%s heeft te veel verzoeken gehad vandaag."
 
-#: mod/admin.php:1531
-msgid "Force publish"
-msgstr "Dwing publiceren af"
+#: mod/dfrn_request.php:250
+msgid "Spam protection measures have been invoked."
+msgstr "Beveiligingsmaatregelen tegen spam zijn in werking getreden."
 
-#: mod/admin.php:1531
-msgid ""
-"Check to force all profiles on this site to be listed in the site directory."
-msgstr "Kruis dit aan om af te dwingen dat alle profielen op deze website in de gids van deze website gepubliceerd worden."
+#: mod/dfrn_request.php:251
+msgid "Friends are advised to please try again in 24 hours."
+msgstr "Wij adviseren vrienden om het over 24 uur nog een keer te proberen."
 
-#: mod/admin.php:1531
-msgid "Enabling this may violate privacy laws like the GDPR"
-msgstr "Dit activeren zou privacy wetten zoals GDPR (AVG) kunnen overtreden"
+#: mod/dfrn_request.php:275
+msgid "Invalid locator"
+msgstr "Ongeldige plaatsbepaler"
 
-#: mod/admin.php:1532
-msgid "Global directory URL"
-msgstr "Algemene gids URL"
+#: mod/dfrn_request.php:311
+msgid "You have already introduced yourself here."
+msgstr "Je hebt jezelf hier al voorgesteld."
 
-#: mod/admin.php:1532
-msgid ""
-"URL to the global directory. If this is not set, the global directory is "
-"completely unavailable to the application."
-msgstr "URL naar de globale gids. Als dit niet geconfigureerd is, dan zal de globale gids volledig onbeschikbaar zijn voor de applicatie."
+#: mod/dfrn_request.php:314
+#, php-format
+msgid "Apparently you are already friends with %s."
+msgstr "Blijkbaar ben je al bevriend met %s."
 
-#: mod/admin.php:1533
-msgid "Private posts by default for new users"
-msgstr "Privéberichten als standaard voor nieuwe gebruikers"
+#: mod/dfrn_request.php:334
+msgid "Invalid profile URL."
+msgstr "Ongeldig profiel adres."
 
-#: mod/admin.php:1533
-msgid ""
-"Set default post permissions for all new members to the default privacy "
-"group rather than public."
-msgstr "Stel de standaardrechten van berichten voor nieuwe leden op de standaard privacygroep in, in plaats van openbaar."
+#: mod/dfrn_request.php:340 src/Model/Contact.php:2099
+msgid "Disallowed profile URL."
+msgstr "Niet toegelaten profiel adres."
 
-#: mod/admin.php:1534
-msgid "Don't include post content in email notifications"
-msgstr "De inhoud van het bericht niet insluiten bij e-mailnotificaties"
+#: mod/dfrn_request.php:346 src/Model/Contact.php:2104
+#: src/Module/Friendica.php:59
+msgid "Blocked domain"
+msgstr "Domein geblokeerd"
 
-#: mod/admin.php:1534
-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 "De inhoud van berichten/commentaar/privéberichten/enzovoort  niet insluiten in e-mailnotificaties die door deze website verzonden worden, voor de bescherming van je privacy."
+#: mod/dfrn_request.php:413 src/Module/Contact.php:143
+msgid "Failed to update contact record."
+msgstr "Ik kon de contactgegevens niet aanpassen."
 
-#: mod/admin.php:1535
-msgid "Disallow public access to addons listed in the apps menu."
-msgstr "Publieke toegang ontzeggen tot addons die opgelijst zijn in het applicatie menu."
+#: mod/dfrn_request.php:433
+msgid "Your introduction has been sent."
+msgstr "Je verzoek is verzonden."
 
-#: mod/admin.php:1535
+#: mod/dfrn_request.php:471
 msgid ""
-"Checking this box will restrict addons listed in the apps menu to members "
-"only."
-msgstr "Dit vakje aanvinken zal de lijst van addons in het applicatie menu beperken tot alleen leden."
+"Remote subscription can't be done for your network. Please subscribe "
+"directly on your system."
+msgstr "Remote inschrijving kan niet op jouw netwerk. Gelieve direct op je systeem in te schrijven."
 
-#: mod/admin.php:1536
-msgid "Don't embed private images in posts"
-msgstr "Privé beelden in berichten niet inwerken"
+#: mod/dfrn_request.php:487
+msgid "Please login to confirm introduction."
+msgstr "Log in om je verzoek te bevestigen."
 
-#: mod/admin.php:1536
+#: mod/dfrn_request.php:495
 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 "
-"photos will have to authenticate and load each image, which may take a "
-"while."
-msgstr "Vervang lokaal gehoste privé foto's in berichten niet door een ingewerkte kopie van het beeld. Dit betekent dat contacten die berichten krijgen met privé foto's zullen moeten authentificeren en elk beeld apart laden, wat een tijdje kan duren."
+"Incorrect identity currently logged in. Please login to "
+"<strong>this</strong> profile."
+msgstr "Je huidige identiteit is niet de juiste. Log met <strong>dit</strong> profiel in."
 
-#: mod/admin.php:1537
-msgid "Explicit Content"
-msgstr "Expliciete inhoud"
+#: mod/dfrn_request.php:509 mod/dfrn_request.php:524
+msgid "Confirm"
+msgstr "Bevestig"
 
-#: mod/admin.php:1537
-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 "
-"node information and might be used, e.g. by the global directory, to filter "
-"your node from listings of nodes to join. Additionally a note about this "
-"will be shown at the user registration page."
-msgstr "Vink dit aan om aan te duiden dat deze node veel expliciet materiaal verspreid en niet bedoeld is voor minderjarigen. Deze info zal gepubliceert worden bij de node-info en kan vb. gebruikt worden voor een filter in de globale lijst. Dit word ook getoont naar de gebruiker op de registratie pagina."
+#: mod/dfrn_request.php:520
+msgid "Hide this contact"
+msgstr "Verberg dit contact"
 
-#: mod/admin.php:1538
-msgid "Allow Users to set remote_self"
-msgstr "Sta Gebruikers toe om remote_self te configureren"
+#: mod/dfrn_request.php:522
+#, php-format
+msgid "Welcome home %s."
+msgstr "Welkom terug %s."
 
-#: mod/admin.php:1538
+#: mod/dfrn_request.php:523
+#, php-format
+msgid "Please confirm your introduction/connection request to %s."
+msgstr "Bevestig je vriendschaps-/connectieverzoek voor %s."
+
+#: mod/dfrn_request.php:632
 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 "Als je dit aanvinkt, dan mag elke gebruiker elke contact als remote_self aanduiden in de 'herstel contact' dialoog. Deze vlag aanzetten voor een contact zorgt ervoor dat elke bericht van dit contact gespiegeld wordt in de gebruiker zijn of haar stroom. "
+"Please enter your 'Identity Address' from one of the following supported "
+"communications networks:"
+msgstr "Vul hier uw 'Identiteitsadres' in van een van de volgende ondersteunde communicatienetwerken:"
 
-#: mod/admin.php:1539
-msgid "Block multiple registrations"
-msgstr "Blokkeer meerdere registraties"
+#: mod/dfrn_request.php:634
+#, php-format
+msgid ""
+"If you are not yet a member of the free social web, <a href=\"%s\">follow "
+"this link to find a public Friendica site and join us today</a>."
+msgstr "Als je nog geen lid bent van het vrije sociale web, <a href=\"%s\">volg dan deze link om een publieke Friendica site te vinden en vervoeg ons vandaag</a>"
 
-#: mod/admin.php:1539
-msgid "Disallow users to register additional accounts for use as pages."
-msgstr "Laat niet toe dat gebruikers meerdere accounts aanmaken."
+#: mod/dfrn_request.php:637
+msgid "Friend/Connection Request"
+msgstr "Vriendschaps-/connectieverzoek"
 
-#: mod/admin.php:1540
-msgid "OpenID support"
-msgstr "OpenID ondersteuning"
+#: mod/dfrn_request.php:638
+msgid ""
+"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
+"testuser@gnusocial.de"
+msgstr "Voorbeelden: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@gnusocial.de"
 
-#: mod/admin.php:1540
-msgid "OpenID support for registration and logins."
-msgstr "OpenID ondersteuning voor registraties en logins."
+#: mod/dfrn_request.php:639 mod/follow.php:162
+msgid "Please answer the following:"
+msgstr "Beantwoord het volgende:"
 
-#: mod/admin.php:1541
-msgid "Fullname check"
-msgstr "Controleer volledige naam"
+#: mod/dfrn_request.php:640 mod/follow.php:163
+#, php-format
+msgid "Does %s know you?"
+msgstr "Kent %s jou?"
 
-#: mod/admin.php:1541
-msgid ""
-"Force users to register with a space between firstname and lastname in Full "
-"name, as an antispam measure"
-msgstr "Verplicht gebruikers om zich te registreren met een spatie tussen voornaam en achternaam, als anti-spam maatregel"
+#: mod/dfrn_request.php:641 mod/follow.php:164
+msgid "Add a personal note:"
+msgstr "Voeg een persoonlijke opmerking toe:"
 
-#: mod/admin.php:1542
-msgid "Community pages for visitors"
-msgstr "Groepspagina voor bezoekers"
+#: mod/dfrn_request.php:643
+msgid "Friendica"
+msgstr "Friendica"
 
-#: mod/admin.php:1542
-msgid ""
-"Which community pages should be available for visitors. Local users always "
-"see both pages."
-msgstr "Welke groepspagina's moeten beschikbaar zijn voor bezoekers. Lokale gebruikers zien altijd beide pagina's."
+#: mod/dfrn_request.php:644
+msgid "GNU Social (Pleroma, Mastodon)"
+msgstr "GNU Social (Pleroma, Mastodon)"
 
-#: mod/admin.php:1543
-msgid "Posts per user on community page"
-msgstr "Berichten per gebruiker op de groepspagina"
+#: mod/dfrn_request.php:645
+msgid "Diaspora (Socialhome, Hubzilla)"
+msgstr "Diaspora (Socialhome, Hubzilla)"
 
-#: mod/admin.php:1543
+#: mod/dfrn_request.php:646
+#, php-format
 msgid ""
-"The maximum number of posts per user on the community page. (Not valid for "
-"'Global Community')"
-msgstr "Het maximum aantal berichten per gebruiker op de groepspagina. (Niet geldig voor 'Globale Gemeenschap')"
+" - please do not use this form.  Instead, enter %s into your Diaspora search"
+" bar."
+msgstr "- Gebruik niet dit formulier. Vul %s in in je Diaspora zoekbalk."
 
-#: mod/admin.php:1544
-msgid "Enable OStatus support"
-msgstr "OStatus ondersteuning activeren"
+#: mod/display.php:252 mod/display.php:337
+msgid "The requested item doesn't exist or has been deleted."
+msgstr "Het gevraagde item bestaat niet of is verwijderd"
 
-#: mod/admin.php:1544
-msgid ""
-"Provide built-in OStatus (StatusNet, GNU Social etc.) compatibility. All "
-"communications in OStatus are public, so privacy warnings will be "
-"occasionally displayed."
-msgstr "Verschaf ingebouwde OStatus (StatusNet, GNU Social enz.) compatibiliteit. Alle communicatie in OStatus is publiek, dus privacy waarschuwingen zullen occasioneel getoond worden."
+#: mod/display.php:412
+msgid "The feed for this item is unavailable."
+msgstr "De tijdlijn voor dit item is niet beschikbaar"
 
-#: mod/admin.php:1545
-msgid "Only import OStatus/ActivityPub threads from our contacts"
-msgstr "Importeer enkel OStatus/ActivityPub gesprekken van contacten."
+#: mod/editpost.php:28 mod/editpost.php:38
+msgid "Item not found"
+msgstr "Item niet gevonden"
 
-#: mod/admin.php:1545
-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 "Normaal importeren we alle inhoud van OStatus en ActivityPub contacten. Met deze optie slaan we enkel gesprekken op die zijn gestart door een contact dat gekend is op deze server."
+#: mod/editpost.php:45
+msgid "Edit post"
+msgstr "Bericht bewerken"
 
-#: mod/admin.php:1546
-msgid "OStatus support can only be enabled if threading is enabled."
-msgstr "OStatus ondersteuning kan alleen geactiveerd worden als de gespreksstroom geactiveerd is."
+#: mod/editpost.php:71 mod/notes.php:46 src/Content/Text/HTML.php:883
+#: src/Module/Filer/SaveTag.php:49
+msgid "Save"
+msgstr "Bewaren"
 
-#: mod/admin.php:1548
-msgid ""
-"Diaspora support can't be enabled because Friendica was installed into a sub"
-" directory."
-msgstr "Diaspora ondersteuning is niet mogelijk omdat Friendica in een sub folder geïnstalleerd is."
+#: mod/editpost.php:77
+msgid "web link"
+msgstr "webadres"
 
-#: mod/admin.php:1549
-msgid "Enable Diaspora support"
-msgstr "Diaspora ondersteuning activeren"
+#: mod/editpost.php:78
+msgid "Insert video link"
+msgstr "Voeg video toe"
 
-#: mod/admin.php:1549
-msgid "Provide built-in Diaspora network compatibility."
-msgstr "Bied ingebouwde ondersteuning voor het Diaspora netwerk."
+#: mod/editpost.php:79
+msgid "video link"
+msgstr "video adres"
 
-#: mod/admin.php:1550
-msgid "Only allow Friendica contacts"
-msgstr "Laat alleen Friendica contacten toe"
+#: mod/editpost.php:80
+msgid "Insert audio link"
+msgstr "Voeg audio adres toe"
 
-#: mod/admin.php:1550
-msgid ""
-"All contacts must use Friendica protocols. All other built-in communication "
-"protocols disabled."
-msgstr "Alle contacten moeten een Friendica protocol gebruiken. Alle andere ingebouwde communicatieprotocols worden uitgeschakeld."
+#: mod/editpost.php:81
+msgid "audio link"
+msgstr "audio adres"
 
-#: mod/admin.php:1551
-msgid "Verify SSL"
-msgstr "Controleer SSL"
+#: mod/editpost.php:95 src/Core/ACL.php:308 src/Module/Item/Compose.php:200
+msgid "CC: email addresses"
+msgstr "CC: e-mailadressen"
 
-#: mod/admin.php:1551
-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 "Als je wilt kun je striktere certificaat controle activeren. Dit betekent dat je (totaal) niet kunt connecteren met sites die zelf-ondertekende SSL certificaten gebruiken."
+#: mod/editpost.php:102 src/Core/ACL.php:309
+msgid "Example: bob@example.com, mary@example.com"
+msgstr "Voorbeeld: bob@voorbeeld.nl, an@voorbeeld.be"
 
-#: mod/admin.php:1552
-msgid "Proxy user"
-msgstr "Proxy-gebruiker"
+#: mod/events.php:118 mod/events.php:120
+msgid "Event can not end before it has started."
+msgstr "Gebeurtenis kan niet eindigen voor het begin."
 
-#: mod/admin.php:1553
-msgid "Proxy URL"
-msgstr "Proxy-URL"
+#: mod/events.php:127 mod/events.php:129
+msgid "Event title and start time are required."
+msgstr "Titel en begintijd van de gebeurtenis zijn vereist."
 
-#: mod/admin.php:1554
-msgid "Network timeout"
-msgstr "Netwerk timeout"
+#: mod/events.php:385
+msgid "Create New Event"
+msgstr "Maak een nieuwe gebeurtenis"
 
-#: mod/admin.php:1554
-msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
-msgstr "Waarde is in seconden. Zet op 0 voor onbeperkt (niet aanbevolen)."
+#: mod/events.php:508
+msgid "Event details"
+msgstr "Gebeurtenis details"
 
-#: mod/admin.php:1555
-msgid "Maximum Load Average"
-msgstr "Maximum gemiddelde belasting"
+#: mod/events.php:509
+msgid "Starting date and Title are required."
+msgstr "Start datum en Titel zijn verplicht."
 
-#: mod/admin.php:1555
-msgid ""
-"Maximum system load before delivery and poll processes are deferred - "
-"default 50."
-msgstr "Maximum systeembelasting voordat aflever- en poll-processen uitgesteld worden - standaard 50."
+#: mod/events.php:510 mod/events.php:515
+msgid "Event Starts:"
+msgstr "Gebeurtenis begint:"
 
-#: mod/admin.php:1556
-msgid "Maximum Load Average (Frontend)"
-msgstr "Maximum Gemiddelde Belasting (Frontend)"
+#: mod/events.php:523 mod/events.php:548
+msgid "Finish date/time is not known or not relevant"
+msgstr "Einddatum/tijd is niet gekend of niet relevant"
 
-#: mod/admin.php:1556
-msgid "Maximum system load before the frontend quits service - default 50."
-msgstr "Maximum systeem belasting wanneer de frontend ermee ophoudt - standaard waarde 50."
+#: mod/events.php:525 mod/events.php:530
+msgid "Event Finishes:"
+msgstr "Gebeurtenis eindigt:"
 
-#: mod/admin.php:1557
-msgid "Minimal Memory"
-msgstr "Minimaal Geheugen"
+#: mod/events.php:536 mod/events.php:549
+msgid "Adjust for viewer timezone"
+msgstr "Pas aan aan de tijdzone van de gebruiker"
 
-#: mod/admin.php:1557
-msgid ""
-"Minimal free memory in MB for the worker. Needs access to /proc/meminfo - "
-"default 0 (deactivated)."
-msgstr "Minimum vrij geheugen in MB voor de worker. Toegang nodig tot /proc/meminfo - standaard waarde 0 (gedeactiveerd)."
+#: mod/events.php:538
+msgid "Description:"
+msgstr "Beschrijving:"
 
-#: mod/admin.php:1558
-msgid "Maximum table size for optimization"
-msgstr "Maximum tabel grootte voor optimisatie"
+#: mod/events.php:540 mod/notifications.php:264 src/Model/Event.php:68
+#: src/Model/Event.php:95 src/Model/Event.php:437 src/Model/Event.php:933
+#: src/Model/Profile.php:447 src/Module/Contact.php:645
+#: src/Module/Directory.php:137
+msgid "Location:"
+msgstr "Plaats:"
 
-#: mod/admin.php:1558
-msgid ""
-"Maximum table size (in MB) for the automatic optimization. Enter -1 to "
-"disable it."
-msgstr "Maximum tabel grootte (in MB) voor de automatisch optimisatie. Geef -1 op om dit te deactiveren."
+#: mod/events.php:542 mod/events.php:544
+msgid "Title:"
+msgstr "Titel:"
 
-#: mod/admin.php:1559
-msgid "Minimum level of fragmentation"
-msgstr "Minimum niveau van fragmentatie"
+#: mod/events.php:545 mod/events.php:546
+msgid "Share this event"
+msgstr "Deel deze gebeurtenis"
 
-#: mod/admin.php:1559
-msgid ""
-"Minimum fragmenation level to start the automatic optimization - default "
-"value is 30%."
-msgstr "Minimum fragmentatie niveau om de automatische optimisatie te starten - standaard waarde is 30%."
+#: mod/events.php:553 src/Model/Profile.php:882
+msgid "Basic"
+msgstr "Basis"
 
-#: mod/admin.php:1561
-msgid "Periodical check of global contacts"
-msgstr "Regematige controle van de globale contacten"
+#: mod/events.php:554 src/Model/Profile.php:883 src/Module/Admin/Site.php:574
+#: src/Module/Contact.php:905
+msgid "Advanced"
+msgstr "Geavanceerd"
 
-#: mod/admin.php:1561
-msgid ""
-"If enabled, the global contacts are checked periodically for missing or "
-"outdated data and the vitality of the contacts and servers."
-msgstr "Als dit geactiveerd is, dan worden de globale contacten regelmatig gecheckt naar ontbrekende of verlopen data and the vitaliteit van de contacten en servers."
+#: mod/events.php:555 mod/photos.php:1009 mod/photos.php:1383
+#: src/Core/ACL.php:314
+msgid "Permissions"
+msgstr "Rechten"
 
-#: mod/admin.php:1562
-msgid "Days between requery"
-msgstr "Dagen tussen herbevraging"
+#: mod/events.php:571
+msgid "Failed to remove event"
+msgstr "Kon remote event niet verwijderen"
 
-#: mod/admin.php:1562
-msgid "Number of days after which a server is requeried for his contacts."
-msgstr "Aantal dagen waarna de server opnieuw bevraagd wordt naar zijn contacten."
+#: mod/events.php:573
+msgid "Event removed"
+msgstr "Gebeurtenis verwijderd"
 
-#: mod/admin.php:1563
-msgid "Discover contacts from other servers"
-msgstr "Ontdek contacten van andere servers"
+#: mod/fbrowser.php:43 view/theme/frio/theme.php:269 src/Content/Nav.php:162
+#: src/Model/Profile.php:925
+msgid "Photos"
+msgstr "Foto's"
 
-#: mod/admin.php:1563
-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, "
-"Global Contacts'."
-msgstr "Bevraag andere servers regelmatig naar contacten. Je kan kiezen tussen 'gebruikers': de gebruikers op het remote systeem, 'Globale contacten': actieve contacten die gekend zijn op het systeem. De noodoplossing is bedoeld voor Redmatrix servers en oude Friendica servers, waarop globale contacten niet bestonden. De noodoplossing veroorzaakt meer belasting van de server, dus de aanbevolen configuratie is 'Gebruikers, Globale contacten'."
-
-#: mod/admin.php:1564
-msgid "Timeframe for fetching global contacts"
-msgstr "Tijdspanne voor het ophalen van globale contacten"
+#: mod/fbrowser.php:52 mod/fbrowser.php:76 mod/photos.php:196
+#: mod/photos.php:973 mod/photos.php:1090 mod/photos.php:1107
+#: mod/photos.php:1584 mod/photos.php:1599 src/Model/Photo.php:574
+#: src/Model/Photo.php:583
+msgid "Contact Photos"
+msgstr "Contactfoto's"
 
-#: mod/admin.php:1564
-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 "Wanneer ontdekking is geactiveerd, dan definieert deze waarde de tijdspanne voor de activiteit van globale contacten die opgehaald worden van andere servers."
+#: mod/fbrowser.php:112 mod/fbrowser.php:141 mod/profile_photo.php:247
+msgid "Upload"
+msgstr "Uploaden"
 
-#: mod/admin.php:1565
-msgid "Search the local directory"
-msgstr "Doorzoek de lokale gids"
+#: mod/fbrowser.php:136
+msgid "Files"
+msgstr "Bestanden"
 
-#: mod/admin.php:1565
-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 "Doorzoek de lokale gids in plaats van de globale gids. Bij lokale doorzoeking wordt elke opzoeking in de globale gids op de achtergrond uitgevoerd. Dit verbetert de zoekresultaten wanneer de zoekopdracht herhaald wordt."
+#: mod/follow.php:46
+msgid "The contact could not be added."
+msgstr "Het contact kon niet toegevoegd worden."
 
-#: mod/admin.php:1567
-msgid "Publish server information"
-msgstr "Publiceer server informatie"
+#: mod/follow.php:87
+msgid "You already added this contact."
+msgstr "Je hebt deze kontakt al toegevoegd"
 
-#: mod/admin.php:1567
-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 "
-"profiles, number of posts and the activated protocols and connectors. See <a"
-" href='http://the-federation.info/'>the-federation.info</a> for details."
-msgstr "Als deze optie geactiveerd is, dan zal algemene server en gebruiksdata gepubliceerd worden. De data bevat de naam en versie van de server, het aantal gebruikers met publieke profielen, het aantal berichten en de geactiveerd protocollen en connectoren. Zie <a href='http://the-federation.info/'>the-federation.info</a> voor details."
+#: mod/follow.php:99
+msgid "Diaspora support isn't enabled. Contact can't be added."
+msgstr "Diaspora ondersteuning is niet geactiveerd. Contact kan niet toegevoegd worden."
 
-#: mod/admin.php:1569
-msgid "Check upstream version"
-msgstr "Controleer upstream versie"
+#: mod/follow.php:106
+msgid "OStatus support is disabled. Contact can't be added."
+msgstr "OStatus ondersteuning is niet geactiveerd. Contact kan niet toegevoegd woren."
 
-#: mod/admin.php:1569
-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 "Activeer het controleren op nieuwe versies van Friendica bij github. Als er een nieuwe versie is, dan word je geïnformeerd in the administratie paneel."
+#: mod/follow.php:113
+msgid "The network type couldn't be detected. Contact can't be added."
+msgstr "Het type netwerk kon niet gedetecteerd worden. Contact kan niet toegevoegd worden."
 
-#: mod/admin.php:1570
-msgid "Suppress Tags"
-msgstr "Onderdruk Tags"
+#: mod/follow.php:183 mod/notifications.php:268 src/Model/Profile.php:812
+#: src/Module/Contact.php:651
+msgid "Tags:"
+msgstr "Labels:"
 
-#: mod/admin.php:1570
-msgid "Suppress showing a list of hashtags at the end of the posting."
-msgstr "Onderdruk het tonen van een lijst van hastags op het einde van het bericht."
+#: mod/fsuggest.php:44
+msgid "Suggested contact not found."
+msgstr "Voorgesteld contact werd niet gevonden"
 
-#: mod/admin.php:1571
-msgid "Clean database"
-msgstr "Database opruimen"
+#: mod/fsuggest.php:57
+msgid "Friend suggestion sent."
+msgstr "Vriendschapsvoorstel verzonden."
 
-#: mod/admin.php:1571
-msgid ""
-"Remove old remote items, orphaned database records and old content from some"
-" other helper tables."
-msgstr "Verwijder oude remote items, database weesrecords en oude content van andere helper tabellen."
+#: mod/fsuggest.php:79
+msgid "Suggest Friends"
+msgstr "Stel vrienden voor"
 
-#: mod/admin.php:1572
-msgid "Lifespan of remote items"
-msgstr "Levensduur van remote items"
+#: mod/fsuggest.php:81
+#, php-format
+msgid "Suggest a friend for %s"
+msgstr "Stel een vriend voor aan %s"
 
-#: mod/admin.php:1572
-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 "Als de database opruiming is geactiveerd, dan definieert dit na hoeveel dagen remote items verwijderd zullen worden. Eigen items, en gemarkeerde of opgeslagen items worden altijd behouden. 0 deactiveert dit gedrag."
+#: mod/hcard.php:20
+msgid "No profile"
+msgstr "Geen profiel"
 
-#: mod/admin.php:1573
-msgid "Lifespan of unclaimed items"
-msgstr "Levensduur van niet geclaimde items"
+#: mod/item.php:123
+msgid "Unable to locate original post."
+msgstr "Ik kan de originele post niet meer vinden."
 
-#: mod/admin.php:1573
+#: mod/item.php:323
+msgid "Empty post discarded."
+msgstr "Lege post weggegooid."
+
+#: mod/item.php:803
+#, php-format
 msgid ""
-"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."
-msgstr "Als de database opruiming geactiveerd is, dan definieert dit na hoeveel dagen ongeclaimde remote items (meestal content van een relais) zal verwijderd worden. Standaard waarde is 90 dagen. Als de waarde 0 is, dan is de waarde gelijk aan de algemene levensduur van remote items."
+"This message was sent to you by %s, a member of the Friendica social "
+"network."
+msgstr "Dit bericht werd naar jou gestuurd door %s, een lid van het Friendica sociale netwerk."
 
-#: mod/admin.php:1574
-msgid "Lifespan of raw conversation data"
-msgstr "Levenstijd van ruwe gespreksdata"
+#: mod/item.php:805
+#, php-format
+msgid "You may visit them online at %s"
+msgstr "Je kunt ze online bezoeken op %s"
 
-#: mod/admin.php:1574
+#: mod/item.php:806
 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 "De gespreksdata word gebruikt voor ActivityPub, OStatus en voor debugging doeleinden. Het is veilig om dit na 14 dagen te verwijderen. Standaard staat dit op 90 dagen."
+"Please contact the sender by replying to this post if you do not wish to "
+"receive these messages."
+msgstr "Contacteer de afzender door op dit bericht te antwoorden als je deze berichten niet wilt ontvangen."
 
-#: mod/admin.php:1575
-msgid "Path to item cache"
-msgstr "Pad naar cache voor items"
+#: mod/item.php:810
+#, php-format
+msgid "%s posted an update."
+msgstr "%s heeft een wijziging geplaatst."
 
-#: mod/admin.php:1575
-msgid "The item caches buffers generated bbcode and external images."
-msgstr "Item caches bufferen gegenereerde bbcodes en externe beelden."
+#: mod/lockview.php:47 mod/lockview.php:58
+msgid "Remote privacy information not available."
+msgstr "Privacyinformatie op afstand niet beschikbaar."
 
-#: mod/admin.php:1576
-msgid "Cache duration in seconds"
-msgstr "Cache tijdsduur in seconden"
+#: mod/lockview.php:67
+msgid "Visible to:"
+msgstr "Zichtbaar voor:"
 
-#: mod/admin.php:1576
-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 "Hoe lang moeten de cache bestanden bijgehouden worden? Standaard waarde is 86400 seconden (een dag). Zet de waarde op -1 om de item cache te deactiveren."
+#: mod/lockview.php:73 mod/lockview.php:108 src/Content/Widget.php:192
+#: src/Module/Contact.php:797 src/Module/Item/Compose.php:97
+#: src/Module/Profile/Contacts.php:126
+msgid "Followers"
+msgstr "Volgers"
 
-#: mod/admin.php:1577
-msgid "Maximum numbers of comments per post"
-msgstr "Maximum aantal reacties per bericht"
+#: mod/lockview.php:79 mod/lockview.php:114 src/Module/Item/Compose.php:104
+msgid "Mutuals"
+msgstr "Gemeenschappelijk"
 
-#: mod/admin.php:1577
-msgid "How much comments should be shown for each post? Default value is 100."
-msgstr "Hoeveel reacties moeten getoond worden per bericht? Standaard waarde is 100."
+#: mod/lostpass.php:26
+msgid "No valid account found."
+msgstr "Geen geldige account gevonden."
 
-#: mod/admin.php:1578
-msgid "Temp path"
-msgstr "Tijdelijk pad"
+#: mod/lostpass.php:38
+msgid "Password reset request issued. Check your email."
+msgstr "Verzoek om wachtwoord opnieuw in te stellen werd verstuurd. Kijk uw e-mail na."
 
-#: mod/admin.php:1578
+#: mod/lostpass.php:44
+#, php-format
 msgid ""
-"If you have a restricted system where the webserver can't access the system "
-"temp path, enter another path here."
-msgstr "Als je een systeem met restricties hebt waarbij de webserver geen toegang heeft tot het systeem pad, geef hier dan een ander pad in. "
-
-#: mod/admin.php:1579
-msgid "Base path to installation"
-msgstr "Basispad voor installatie"
+"\n"
+"\t\tDear %1$s,\n"
+"\t\t\tA request was recently received at \"%2$s\" to reset your account\n"
+"\t\tpassword. In order to confirm this request, please select the verification link\n"
+"\t\tbelow or paste it into your web browser address bar.\n"
+"\n"
+"\t\tIf you did NOT request this change, please DO NOT follow the link\n"
+"\t\tprovided and ignore and/or delete this email, the request will expire shortly.\n"
+"\n"
+"\t\tYour password will not be changed unless we can verify that you\n"
+"\t\tissued this request."
+msgstr "\n\t\tBeste %1$s,\n\t\t\tEr is recent om \"%2$s\" een verzoek gekomen om je paswoord te resetten.\n\t\tOm dit verzoek te bevestigen, gelieve de verificatie link hieronder te volgen of in je browser te kopiëren.\n\n\t\tAls je dit verzoek NIET hebt gedaan, volg deze link dan NIET en negeer \n\t\ten/of verwijder deze email, het verzoek zal binnenkort vanzelf ongeldig worden.\n\n\t\tJe paswoord zal niet aangepast worden tenzij we kunnen verifiëren\n\t\tdat je dit verzoek verzonden hebt."
 
-#: mod/admin.php:1579
+#: mod/lostpass.php:55
+#, php-format
 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 "Als het systeem het correcte pad naar je installatie niet kan detecteren, geef hier dan het correcte pad in. Deze instelling zou alleen geconfigureerd moeten worden als je een systeem met restricties hebt en symbolische links naar je webroot."
+"\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"
+msgstr "\n\t\tVolg nu deze link om je identiteit te bevestigen:\n\n\t\t%1$s\n\n\t\tJe zal dan een boodschap krijgen met je nieuw paswoord.\n\t\tJe kunt je paswoord veranderen in je instelling pagina nadat je ingelogd bent.\n\n\t\tDe login details zijn de volgende:\n\n\t\tSite locatie:\t%2$s\n\t\tLogin naam:\t%3$s"
 
-#: mod/admin.php:1580
-msgid "Disable picture proxy"
-msgstr "Schakel beeld proxy uit"
+#: mod/lostpass.php:74
+#, php-format
+msgid "Password reset requested at %s"
+msgstr "Op %s werd gevraagd je wachtwoord opnieuw in te stellen"
 
-#: mod/admin.php:1580
+#: mod/lostpass.php:89
 msgid ""
-"The picture proxy increases performance and privacy. It shouldn't be used on"
-" systems with very low bandwidth."
-msgstr "De beeld proxy verhoogt de performantie en privacy. Gebruik dit niet op systemen met erg lage bandbreedte."
-
-#: mod/admin.php:1581
-msgid "Only search in tags"
-msgstr "Zoek alleen in tags"
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
+msgstr "Verzoek kon niet geverifieerd worden. (Misschien heb je het voordien al ingediend.) Wachtwoord niet opnieuw ingesteld."
 
-#: mod/admin.php:1581
-msgid "On large systems the text search can slow down the system extremely."
-msgstr "Het opzoeken van tekst kan grote systemen extreem vertragen."
+#: mod/lostpass.php:102
+msgid "Request has expired, please make a new one."
+msgstr "Aanvraag is verlopen, gelieve een nieuwe aan te maken."
 
-#: mod/admin.php:1583
-msgid "New base url"
-msgstr "Nieuwe basis url"
+#: mod/lostpass.php:117
+msgid "Forgot your Password?"
+msgstr "Wachtwoord vergeten?"
 
-#: mod/admin.php:1583
+#: mod/lostpass.php:118
 msgid ""
-"Change base url for this server. Sends relocate message to all Friendica and"
-" Diaspora* contacts of all users."
-msgstr "Verander de basis url voor deze server. Stuurt een verhuis boodschap naar all Friendica en Diaspora* contacten."
-
-#: mod/admin.php:1585
-msgid "RINO Encryption"
-msgstr "RINO encryptie"
+"Enter your email address and submit to have your password reset. Then check "
+"your email for further instructions."
+msgstr "Voer je e-mailadres in en verstuur het om je wachtwoord opnieuw in te stellen. Kijk dan je e-mail na voor verdere instructies."
 
-#: mod/admin.php:1585
-msgid "Encryption layer between nodes."
-msgstr "Encryptie laag tussen nodes."
+#: mod/lostpass.php:119 src/Module/Login.php:318
+msgid "Nickname or Email: "
+msgstr "Bijnaam of e-mail:"
 
-#: mod/admin.php:1585
-msgid "Enabled"
-msgstr "Geactiveerd"
+#: mod/lostpass.php:120
+msgid "Reset"
+msgstr "Opnieuw"
 
-#: mod/admin.php:1587
-msgid "Maximum number of parallel workers"
-msgstr "Maximum aantal parallelle workers"
+#: mod/lostpass.php:135 src/Module/Login.php:330
+msgid "Password Reset"
+msgstr "Wachtwoord opnieuw instellen"
 
-#: mod/admin.php:1587
-#, php-format
-msgid ""
-"On shared hosters set this to %d. On larger systems, values of %d are great."
-" Default value is %d."
-msgstr "Op gedeelde hosts zet dit op %d. Op grotere systemen, waarden als %d zijn goed. standaard waarde is %d"
+#: mod/lostpass.php:136
+msgid "Your password has been reset as requested."
+msgstr "Je wachtwoord is opnieuw ingesteld zoals gevraagd."
 
-#: mod/admin.php:1588
-msgid "Don't use 'proc_open' with the worker"
-msgstr "Gebruik 'proc_open' niet met de worker"
+#: mod/lostpass.php:137
+msgid "Your new password is"
+msgstr "Je nieuwe wachtwoord is"
 
-#: mod/admin.php:1588
-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 "Activeer dit als je systeem het gebruik van 'proc_open' niet toelaat. Dit kan het geval zijn op gedeelde hosts. Als dit geactiveerd is, dan verhoog je best ook de frequentie van de oproepen naar de workers in je crontab."
+#: mod/lostpass.php:138
+msgid "Save or copy your new password - and then"
+msgstr "Bewaar of kopieer je nieuw wachtwoord - en dan"
 
-#: mod/admin.php:1589
-msgid "Enable fastlane"
-msgstr "Activeer fastlane"
+#: mod/lostpass.php:139
+msgid "click here to login"
+msgstr "klik hier om in te loggen"
 
-#: mod/admin.php:1589
+#: mod/lostpass.php:140
 msgid ""
-"When enabed, the fastlane mechanism starts an additional worker if processes"
-" with higher priority are blocked by processes of lower priority."
-msgstr "Als deze parameter geactiveerd is, dan start het fastlane mechanisme een bijkomende worker als processen met hogere prioriteit geblokkeerd worden door processen met een lagere prioriteit."
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
+msgstr "Je kunt dit wachtwoord veranderen nadat je bent ingelogd op de <em>Instellingen></em> pagina."
 
-#: mod/admin.php:1590
-msgid "Enable frontend worker"
-msgstr "Activeer frontend worker"
+#: mod/lostpass.php:147
+#, php-format
+msgid ""
+"\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"
+msgstr "\n\t\t\tBeste %1$s,\n\t\t\t\tJe paswoord is aangepast zoals je gevraagd hebt. Hou deze informatie\n\t\t\talstublieft bij (of pas je paswoord onmiddellijk aan\n\t\t\tnaar iets wat je je kan herinneren).\n\t\t"
 
-#: mod/admin.php:1590
+#: mod/lostpass.php:153
 #, php-format
 msgid ""
-"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."
-msgstr "Als deze parameter geactiveerd is, dan wordt het Worker proces getriggerd wanneer toegang wordt verkregen tot de backend \\x28bvb. boodschappen die geleverd worden\\x29. Op kleinere sites zal je mogelijks opteren om %s/worker op regelmatige basis via een externe geplande taak op te roepen. Activeer deze optie alleen als je cron/geplande taken op je server niet kan gebruiken."
+"\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"
+msgstr "\n\t\t\tJe login details zijn de volgende:\n\n\t\t\tSite Locatie:\t%1$s\n\t\t\tLogin Naam:\t%2$s\n\t\t\tPaswoord:\t%3$s\n\n\t\t\tJe kan dit paswoord in het account instellingen aanpassen nadat je ingelogd bent.\n\t\t"
 
-#: mod/admin.php:1592
-msgid "Subscribe to relay"
-msgstr "Schrijf in op relais"
+#: mod/lostpass.php:169
+#, php-format
+msgid "Your password has been changed at %s"
+msgstr "Je wachtwoord is veranderd op %s"
+
+#: mod/manage.php:179
+msgid "Manage Identities and/or Pages"
+msgstr "Beheer Identiteiten en/of Pagina's"
 
-#: mod/admin.php:1592
+#: mod/manage.php:180
 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 "Activeert het ontvangen van publieke berichten vanwege de relais. Ze zullen inbegrepen zijn in de zoekresultaten, tags waarop je ingeschreven bent en op de globale groepspagina."
+"Toggle between different identities or community/group pages which share "
+"your account details or which you have been granted \"manage\" permissions"
+msgstr "Wissel tussen verschillende identiteiten of forum/groeppagina's die jouw accountdetails delen of waar je \"beheerdersrechten\" hebt gekregen."
 
-#: mod/admin.php:1593
-msgid "Relay server"
-msgstr "Relais server"
+#: mod/manage.php:181
+msgid "Select an identity to manage: "
+msgstr "Selecteer een identiteit om te beheren:"
 
-#: mod/admin.php:1593
-msgid ""
-"Address of the relay server where public posts should be send to. For "
-"example https://relay.diasp.org"
-msgstr "Adres van de relais server waar publieke berichten naartoe moeten gezonden worden. Bijvoorbeeld https://relay.diasp.org"
+#: mod/message.php:33 mod/message.php:116 src/Content/Nav.php:257
+msgid "New Message"
+msgstr "Nieuw Bericht"
 
-#: mod/admin.php:1594
-msgid "Direct relay transfer"
-msgstr "Directe relais transfer"
+#: mod/message.php:74
+msgid "Unable to locate contact information."
+msgstr "Ik kan geen contact informatie vinden."
 
-#: mod/admin.php:1594
-msgid ""
-"Enables the direct transfer to other servers without using the relay servers"
-msgstr "Activeert directe relais transfer naar andere servers zonder gebruik van relais servers"
+#: mod/message.php:110 mod/notifications.php:47 mod/notifications.php:190
+#: mod/notifications.php:246
+msgid "Discard"
+msgstr "Verwerpen"
 
-#: mod/admin.php:1595
-msgid "Relay scope"
-msgstr "Scope van de relais"
+#: mod/message.php:123 view/theme/frio/theme.php:276 src/Content/Nav.php:254
+msgid "Messages"
+msgstr "Privéberichten"
 
-#: mod/admin.php:1595
-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 "Kan 'alle' of 'tags' zijn. 'alle' betekent dat elk publiek bericht ontvangen moet worden. 'tags' betekent dat alleen berichten met geselecteerde tags moeten ontvangen worden."
+#: mod/message.php:148
+msgid "Do you really want to delete this message?"
+msgstr "Wil je echt dit bericht verwijderen?"
 
-#: mod/admin.php:1595
-msgid "all"
-msgstr "alle"
+#: mod/message.php:166
+msgid "Conversation not found."
+msgstr "Gesprek niet gevonden."
 
-#: mod/admin.php:1595
-msgid "tags"
-msgstr "tags"
+#: mod/message.php:171
+msgid "Message deleted."
+msgstr "Bericht verwijderd."
 
-#: mod/admin.php:1596
-msgid "Server tags"
-msgstr "Server tags"
+#: mod/message.php:176 mod/message.php:190
+msgid "Conversation removed."
+msgstr "Gesprek verwijderd."
 
-#: mod/admin.php:1596
-msgid "Comma separated list of tags for the 'tags' subscription."
-msgstr "Door komma's gescheiden lijst van tags voor de 'tags' inschrijving."
+#: mod/message.php:289
+msgid "No messages."
+msgstr "Geen berichten."
 
-#: mod/admin.php:1597
-msgid "Allow user tags"
-msgstr "Sta gebruiker tags toe."
+#: mod/message.php:352
+msgid "Message not available."
+msgstr "Bericht niet beschikbaar."
 
-#: mod/admin.php:1597
-msgid ""
-"If enabled, the tags from the saved searches will used for the 'tags' "
-"subscription in addition to the 'relay_server_tags'."
-msgstr "Als deze parameter geactiveerd is, dan zullen de tags uit de opgeslagen zoekresultaten gebruikt worden voor de 'tags' inschrijving bovenop de 'relais_server_tags'."
+#: mod/message.php:406
+msgid "Delete message"
+msgstr "Verwijder bericht"
 
-#: mod/admin.php:1600
-msgid "Start Relocation"
-msgstr "Start verhuis"
+#: mod/message.php:408 mod/message.php:540
+msgid "D, d M Y - g:i A"
+msgstr "D, d M Y - g:i A"
 
-#: mod/admin.php:1626
-msgid "Update has been marked successful"
-msgstr "Wijziging succesvol gemarkeerd "
+#: mod/message.php:423 mod/message.php:537
+msgid "Delete conversation"
+msgstr "Verwijder gesprek"
 
-#: mod/admin.php:1633
-#, php-format
-msgid "Database structure update %s was successfully applied."
-msgstr "Database structuur update %s werd met succes toegepast."
+#: mod/message.php:425
+msgid ""
+"No secure communications available. You <strong>may</strong> be able to "
+"respond from the sender's profile page."
+msgstr "Geen beveiligde communicatie beschikbaar. Je kunt <strong>misschien</strong> antwoorden vanaf de profiel-pagina van de afzender."
 
-#: mod/admin.php:1637
-#, php-format
-msgid "Executing of database structure update %s failed with error: %s"
-msgstr "Uitvoering van de database structuur update %s is mislukt met fout: %s"
+#: mod/message.php:429
+msgid "Send Reply"
+msgstr "Verstuur Antwoord"
 
-#: mod/admin.php:1653
+#: mod/message.php:512
 #, php-format
-msgid "Executing %s failed with error: %s"
-msgstr "Uitvoering van %s mislukt met fout: %s"
+msgid "Unknown sender - %s"
+msgstr "Onbekende afzender - %s"
 
-#: mod/admin.php:1655
+#: mod/message.php:514
 #, php-format
-msgid "Update %s was successfully applied."
-msgstr "Wijziging %s geslaagd."
+msgid "You and %s"
+msgstr "Jij en %s"
 
-#: mod/admin.php:1658
+#: mod/message.php:516
 #, php-format
-msgid "Update %s did not return a status. Unknown if it succeeded."
-msgstr "Wijziging %s gaf geen status terug. We weten niet of de wijziging geslaagd is."
+msgid "%s and You"
+msgstr "%s en jij"
 
-#: mod/admin.php:1661
+#: mod/message.php:543
 #, php-format
-msgid "There was no additional update function %s that needed to be called."
-msgstr "Er was geen bijkomende update functie %s die moest opgeroepen worden."
+msgid "%d message"
+msgid_plural "%d messages"
+msgstr[0] "%d bericht"
+msgstr[1] "%d berichten"
 
-#: mod/admin.php:1684
-msgid "No failed updates."
-msgstr "Geen mislukte wijzigingen"
+#: mod/network.php:183 mod/search.php:35
+msgid "Remove term"
+msgstr "Verwijder zoekterm"
 
-#: mod/admin.php:1685
-msgid "Check database structure"
-msgstr "Controleer de database structuur"
+#: mod/network.php:190 mod/search.php:44
+msgid "Saved Searches"
+msgstr "Opgeslagen zoekopdrachten"
 
-#: mod/admin.php:1690
-msgid "Failed Updates"
-msgstr "Mislukte wijzigingen"
+#: mod/network.php:191 src/Model/Group.php:483
+msgid "add"
+msgstr "toevoegen"
 
-#: mod/admin.php:1691
+#: mod/network.php:571
+#, php-format
 msgid ""
-"This does not include updates prior to 1139, which did not return a status."
-msgstr "Dit is zonder de wijzigingen voor 1139, welke geen status teruggaven."
+"Warning: This group contains %s member from a network that doesn't allow non"
+" public messages."
+msgid_plural ""
+"Warning: This group contains %s members from a network that doesn't allow "
+"non public messages."
+msgstr[0] "Waarschuwing: Deze groep bevat %s lid van een netwerk dat geen niet-publieke boodschappen toelaat."
+msgstr[1] "Waarschuwing: Deze groep bevat %s leden van een netwerk dat geen niet-publieke boodschappen toelaat."
 
-#: mod/admin.php:1692
-msgid "Mark success (if update was manually applied)"
-msgstr "Markeren als succes (als aanpassing manueel doorgevoerd werd)"
+#: mod/network.php:574
+msgid "Messages in this group won't be send to these receivers."
+msgstr "Boodschappen in deze groep zullen niet verzonden worden naar deze ontvangers."
 
-#: mod/admin.php:1693
-msgid "Attempt to execute this update step automatically"
-msgstr "Probeer deze stap automatisch uit te voeren"
+#: mod/network.php:641
+msgid "No such group"
+msgstr "Zo'n groep bestaat niet"
 
-#: mod/admin.php:1732
-#, php-format
-msgid ""
-"\n"
-"\t\t\tDear %1$s,\n"
-"\t\t\t\tthe administrator of %2$s has set up an account for you."
-msgstr "\n\t\t\tBeste %1$s,\n\t\t\t\tde beheerder van %2$s heeft een account aangemaakt voor jou."
+#: mod/network.php:662 src/Module/Group.php:288
+msgid "Group is empty"
+msgstr "De groep is leeg"
 
-#: mod/admin.php:1735
+#: mod/network.php:666
 #, php-format
-msgid ""
-"\n"
-"\t\t\tThe login details are as follows:\n"
-"\n"
-"\t\t\tSite Location:\t%1$s\n"
-"\t\t\tLogin Name:\t\t%2$s\n"
-"\t\t\tPassword:\t\t%3$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 %1$s/removeme\n"
-"\n"
-"\t\t\tThank you and welcome to %4$s."
-msgstr "\n\t\t\tDe login details zijn de volgende:\n\n\t\t\tSite Locatie:\t%1$s\n\t\t\tLogin Naam:\t\t%2$s\n\t\t\tPaswoord:\t\t%3$s\n\n\t\t\tJe kan je paswoord in je account \"Instellingen\" pagina aanpassen \nnadat je ingelogd bent\n\t\t\tNeem alstublieft een ogenblik om de andere account instellingen op die pagina na te kijken.\n\n\t\t\tMisschien wil je ook wat basis informatie toevoegen aan je standaard profiel\n\t\t\t(op de \"Profielen\" pagina) zodat anderen je gemakkelijk kunnen terugvinden.\n\n\t\t\tWe raden aan je volledige naam in te stellen, een profiel foto toe te voegen,\n\t\t\tenkele \"sleutelwoorden\" toe te voegen (zeer handig om nieuwe vrienden te maken) - en\n\t\t\tmisschien ook in welk land je woont; als je liever niet specifieker \nbent dan dat.\n\n\n\t\t\tWe respecteren ten volle je recht op privacy, en geen van deze items is verplicht.\n\t\t\tAls je nieuw bent hier en niemand kent, dan kunnen zij je mogelijks helpen\n\t\t\tom enkele nieuwe en interessante vrienden te leren kennen.\n\n\t\t\tAls je ooit je account wil verwijderen, dan kan dat via %1$s/removeme\n\n\t\t\tBedankt en welkom bij %4$s."
+msgid "Group: %s"
+msgstr "Groep: %s"
 
-#: mod/admin.php:1772 src/Model/User.php:773
-#, php-format
-msgid "Registration details for %s"
-msgstr "Registratie details voor %s"
+#: mod/network.php:692
+msgid "Private messages to this person are at risk of public disclosure."
+msgstr "Privéberichten naar deze persoon kunnen openbaar gemaakt worden."
 
-#: mod/admin.php:1782
-#, php-format
-msgid "%s user blocked/unblocked"
-msgid_plural "%s users blocked/unblocked"
-msgstr[0] "%s gebruiker geblokkeerd/niet geblokkeerd"
-msgstr[1] "%s gebruikers geblokkeerd/niet geblokkeerd"
+#: mod/network.php:695 src/Module/AllFriends.php:35
+#: src/Module/AllFriends.php:43
+msgid "Invalid contact."
+msgstr "Ongeldig contact."
 
-#: mod/admin.php:1789 mod/admin.php:1842
-msgid "You can't remove yourself"
-msgstr "Je kan jezelf niet verwijderen"
+#: mod/network.php:974
+msgid "Commented Order"
+msgstr "Nieuwe reacties bovenaan"
 
-#: mod/admin.php:1792
-#, php-format
-msgid "%s user deleted"
-msgid_plural "%s users deleted"
-msgstr[0] "%s gebruiker verwijderd"
-msgstr[1] "%s gebruikers verwijderd"
+#: mod/network.php:977
+msgid "Sort by Comment Date"
+msgstr "Berichten met nieuwe reacties bovenaan"
 
-#: mod/admin.php:1840
-#, php-format
-msgid "User '%s' deleted"
-msgstr "Gebruiker '%s' verwijderd"
+#: mod/network.php:982
+msgid "Posted Order"
+msgstr "Nieuwe berichten bovenaan"
 
-#: mod/admin.php:1851
-#, php-format
-msgid "User '%s' unblocked"
-msgstr "Gebruiker '%s' niet meer geblokkeerd"
+#: mod/network.php:985
+msgid "Sort by Post Date"
+msgstr "Nieuwe berichten bovenaan"
 
-#: mod/admin.php:1851
-#, php-format
-msgid "User '%s' blocked"
-msgstr "Gebruiker '%s' geblokkeerd"
+#: mod/network.php:995
+msgid "Posts that mention or involve you"
+msgstr "Alleen berichten die jou vermelden of op jou betrekking hebben"
 
-#: mod/admin.php:1899 mod/settings.php:1064
-msgid "Normal Account Page"
-msgstr "Normale accountpagina"
+#: mod/network.php:1002
+msgid "New"
+msgstr "Nieuw"
 
-#: mod/admin.php:1900 mod/settings.php:1068
-msgid "Soapbox Page"
-msgstr "Zeepkist-pagina"
+#: mod/network.php:1005
+msgid "Activity Stream - by date"
+msgstr "Activiteitenstroom - volgens datum"
 
-#: mod/admin.php:1901 mod/settings.php:1072
-msgid "Public Forum"
-msgstr "Publiek Forum"
+#: mod/network.php:1013
+msgid "Shared Links"
+msgstr "Gedeelde links"
 
-#: mod/admin.php:1902 mod/settings.php:1076
-msgid "Automatic Friend Page"
-msgstr "Automatisch Vriendschapspagina"
+#: mod/network.php:1016
+msgid "Interesting Links"
+msgstr "Interessante links"
 
-#: mod/admin.php:1903
-msgid "Private Forum"
-msgstr "Privé Forum"
+#: mod/network.php:1023
+msgid "Starred"
+msgstr "Met ster"
 
-#: mod/admin.php:1906 mod/settings.php:1048
-msgid "Personal Page"
-msgstr "Persoonlijke pagina"
+#: mod/network.php:1026
+msgid "Favourite Posts"
+msgstr "Favoriete berichten"
 
-#: mod/admin.php:1907 mod/settings.php:1052
-msgid "Organisation Page"
-msgstr "Organisatie Pagina"
+#: mod/notes.php:34 src/Model/Profile.php:967
+msgid "Personal Notes"
+msgstr "Persoonlijke Nota's"
 
-#: mod/admin.php:1908 mod/settings.php:1056
-msgid "News Page"
-msgstr "Nieuws pagina"
+#: mod/notifications.php:38
+msgid "Invalid request identifier."
+msgstr "Ongeldige <em>request identifier</em>."
 
-#: mod/admin.php:1909 mod/settings.php:1060
-msgid "Community Forum"
-msgstr "Groepsforum"
+#: mod/notifications.php:93 src/Content/Nav.php:249
+msgid "Notifications"
+msgstr "Notificaties"
 
-#: mod/admin.php:1955 mod/admin.php:1966 mod/admin.php:1980 mod/admin.php:1998
-#: src/Content/ContactSelector.php:84
-msgid "Email"
-msgstr "E-mail"
+#: mod/notifications.php:107
+msgid "Network Notifications"
+msgstr "Netwerknotificaties"
 
-#: mod/admin.php:1955 mod/admin.php:1980
-msgid "Register date"
-msgstr "Registratiedatum"
+#: mod/notifications.php:112
+msgid "System Notifications"
+msgstr "Systeemnotificaties"
 
-#: mod/admin.php:1955 mod/admin.php:1980
-msgid "Last login"
-msgstr "Laatste login"
+#: mod/notifications.php:117
+msgid "Personal Notifications"
+msgstr "Persoonlijke notificaties"
 
-#: mod/admin.php:1955 mod/admin.php:1980
-msgid "Last item"
-msgstr "Laatste item"
+#: mod/notifications.php:122
+msgid "Home Notifications"
+msgstr "Tijdlijn-notificaties"
 
-#: mod/admin.php:1955
-msgid "Type"
-msgstr "Type"
+#: mod/notifications.php:145
+msgid "Show unread"
+msgstr "Toon ongelezen"
 
-#: mod/admin.php:1962
-msgid "Add User"
-msgstr "Gebruiker toevoegen"
+#: mod/notifications.php:145
+msgid "Show all"
+msgstr "Toon alles"
 
-#: mod/admin.php:1964
-msgid "User registrations waiting for confirm"
-msgstr "Gebruikersregistraties wachten op een bevestiging"
+#: mod/notifications.php:156
+msgid "Show Ignored Requests"
+msgstr "Toon genegeerde verzoeken"
 
-#: mod/admin.php:1965
-msgid "User waiting for permanent deletion"
-msgstr "Gebruiker wacht op permanente verwijdering"
+#: mod/notifications.php:156
+msgid "Hide Ignored Requests"
+msgstr "Verberg genegeerde verzoeken"
 
-#: mod/admin.php:1966
-msgid "Request date"
-msgstr "Registratiedatum"
+#: mod/notifications.php:169 mod/notifications.php:254
+msgid "Notification type:"
+msgstr "Notificatiesoort:"
 
-#: mod/admin.php:1967
-msgid "No registrations."
-msgstr "Geen registraties."
+#: mod/notifications.php:172
+msgid "Suggested by:"
+msgstr "Voorgesteld door:"
 
-#: mod/admin.php:1968
-msgid "Note from the user"
-msgstr "Nota van de gebruiker"
+#: mod/notifications.php:184 mod/notifications.php:271
+#: src/Module/Contact.php:632
+msgid "Hide this contact from others"
+msgstr "Verberg dit contact voor anderen"
 
-#: mod/admin.php:1969 mod/notifications.php:181 mod/notifications.php:267
+#: mod/notifications.php:186 mod/notifications.php:280
+#: src/Module/Admin/Users.php:286
 msgid "Approve"
 msgstr "Goedkeuren"
 
-#: mod/admin.php:1970
-msgid "Deny"
-msgstr "Weiger"
-
-#: mod/admin.php:1973
-msgid "User blocked"
-msgstr "Gebruiker geblokeerd"
+#: mod/notifications.php:206
+msgid "Claims to be known to you: "
+msgstr "Denkt dat je hem of haar kent:"
 
-#: mod/admin.php:1975
-msgid "Site admin"
-msgstr "Sitebeheerder"
+#: mod/notifications.php:207
+msgid "yes"
+msgstr "Ja"
 
-#: mod/admin.php:1976
-msgid "Account expired"
-msgstr "Account verlopen"
+#: mod/notifications.php:207
+msgid "no"
+msgstr "Nee"
 
-#: mod/admin.php:1979
-msgid "New User"
-msgstr "Nieuwe gebruiker"
+#: mod/notifications.php:208 mod/notifications.php:212
+msgid "Shall your connection be bidirectional or not?"
+msgstr "Zal je connectie bidirectioneel zijn of niet?"
 
-#: mod/admin.php:1980
-msgid "Delete in"
-msgstr "Verwijderen in "
+#: mod/notifications.php:209 mod/notifications.php:213
+#, php-format
+msgid ""
+"Accepting %s as a friend allows %s to subscribe to your posts, and you will "
+"also receive updates from them in your news feed."
+msgstr "%s als vriend accepteren laat %s toe om in te schrijven op je berichten, en je zal ook updates ontvangen van hen in je nieuws feed."
 
-#: mod/admin.php:1985
+#: mod/notifications.php:210
+#, php-format
 msgid ""
-"Selected users will be deleted!\\n\\nEverything these users had posted on "
-"this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "Geselecteerde gebruikers zullen verwijderd worden!\\n\\nAlles wat deze gebruikers gepost hebben op deze website zal permanent verwijderd worden!\\n\\nBen je zeker?"
+"Accepting %s as a subscriber allows them to subscribe to your posts, but you"
+" will not receive updates from them in your news feed."
+msgstr "%s als volger accepteren laat hen toe om in te schrijven op je berichten, maar je zal geen updates ontvangen van hen in je nieuws feed."
 
-#: mod/admin.php:1986
+#: mod/notifications.php:214
+#, php-format
 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 "De gebruiker {0} zal verwijderd worden!\\n\\nAlles wat deze gebruiker gepost heeft op deze website zal permanent verwijderd worden!\\n\\nBen je zeker?"
+"Accepting %s as a sharer allows them to subscribe to your posts, but you "
+"will not receive updates from them in your news feed."
+msgstr "%s als deler accepteren laat hen toe om in te schrijven op je berichten, maar je zal geen updates ontvangen van hen in je nieuws feed."
 
-#: mod/admin.php:1996
-msgid "Name of the new user."
-msgstr "Naam van nieuwe gebruiker"
+#: mod/notifications.php:225
+msgid "Friend"
+msgstr "Vriend"
 
-#: mod/admin.php:1997
-msgid "Nickname"
-msgstr "Bijnaam"
+#: mod/notifications.php:226
+msgid "Sharer"
+msgstr "Deler"
 
-#: mod/admin.php:1997
-msgid "Nickname of the new user."
-msgstr "Bijnaam van nieuwe gebruiker"
+#: mod/notifications.php:226
+msgid "Subscriber"
+msgstr "Volger"
 
-#: mod/admin.php:1998
-msgid "Email address of the new user."
-msgstr "E-mailadres van nieuwe gebruiker"
+#: mod/notifications.php:266 src/Model/Profile.php:453
+#: src/Model/Profile.php:824 src/Module/Contact.php:649
+#: src/Module/Directory.php:145
+msgid "About:"
+msgstr "Over:"
 
-#: mod/admin.php:2039
-#, php-format
-msgid "Addon %s disabled."
-msgstr "Addon %s gedeactiveerd"
+#: mod/notifications.php:270 src/Model/Profile.php:450
+#: src/Model/Profile.php:763 src/Module/Directory.php:142
+msgid "Gender:"
+msgstr "Geslacht:"
+
+#: mod/notifications.php:277 src/Model/Profile.php:550
+#: src/Module/Contact.php:333
+msgid "Network:"
+msgstr "Netwerk:"
+
+#: mod/notifications.php:291
+msgid "No introductions."
+msgstr "Geen vriendschaps- of connectieverzoeken."
 
-#: mod/admin.php:2042
+#: mod/notifications.php:325
 #, php-format
-msgid "Addon %s enabled."
-msgstr "Addon %s geactiveerd"
+msgid "No more %s notifications."
+msgstr "Geen %s notificaties meer."
 
-#: mod/admin.php:2053 mod/admin.php:2302
-msgid "Disable"
-msgstr "Uitschakelen"
+#: mod/openid.php:31
+msgid "OpenID protocol error. No ID returned."
+msgstr "OpenID protocol fout. Geen ID Gevonden."
 
-#: mod/admin.php:2056 mod/admin.php:2305
-msgid "Enable"
-msgstr "Inschakelen"
+#: mod/openid.php:67
+msgid ""
+"Account not found and OpenID registration is not permitted on this site."
+msgstr "Account niet gevonden, en OpenID-registratie is niet toegelaten op deze website."
 
-#: mod/admin.php:2078 mod/admin.php:2348
-msgid "Toggle"
-msgstr "Schakelaar"
+#: mod/openid.php:117 src/Module/Login.php:88 src/Module/Login.php:139
+msgid "Login failed."
+msgstr "Login mislukt."
 
-#: mod/admin.php:2079 mod/admin.php:2349 mod/newmember.php:19
-#: mod/settings.php:136 src/Content/Nav.php:260 view/theme/frio/theme.php:283
-msgid "Settings"
-msgstr "Instellingen"
+#: mod/photos.php:113 src/Model/Profile.php:928
+msgid "Photo Albums"
+msgstr "Fotoalbums"
 
-#: mod/admin.php:2086 mod/admin.php:2357
-msgid "Author: "
-msgstr "Auteur:"
+#: mod/photos.php:114 mod/photos.php:1639
+msgid "Recent Photos"
+msgstr "Recente foto's"
 
-#: mod/admin.php:2087 mod/admin.php:2358
-msgid "Maintainer: "
-msgstr "Onderhoud:"
+#: mod/photos.php:116 mod/photos.php:1152 mod/photos.php:1641
+msgid "Upload New Photos"
+msgstr "Nieuwe foto's uploaden"
 
-#: mod/admin.php:2139
-msgid "Reload active addons"
-msgstr "Herlaad actieve addons"
+#: mod/photos.php:134 mod/settings.php:60 src/Module/BaseSettingsModule.php:18
+msgid "everybody"
+msgstr "iedereen"
 
-#: mod/admin.php:2144
-#, php-format
-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 "Er zijn op je node momenteel geen addons beschikbaar. Je kan de officiële addon repository vinden op %1$s en je kan mogelijks nog andere interessante addons vinden in de open addon registry op %2$s"
+#: mod/photos.php:185
+msgid "Contact information unavailable"
+msgstr "Contactinformatie niet beschikbaar"
+
+#: mod/photos.php:207
+msgid "Album not found."
+msgstr "Album niet gevonden"
 
-#: mod/admin.php:2264
-msgid "No themes found."
-msgstr "Geen thema's gevonden."
+#: mod/photos.php:265
+msgid "Album successfully deleted"
+msgstr "Album succesvol gedeeld"
 
-#: mod/admin.php:2339
-msgid "Screenshot"
-msgstr "Schermafdruk"
+#: mod/photos.php:267
+msgid "Album was empty."
+msgstr "Het album was leeg"
 
-#: mod/admin.php:2393
-msgid "Reload active themes"
-msgstr "Herlaad actieve thema's"
+#: mod/photos.php:590
+msgid "a photo"
+msgstr "een foto"
 
-#: mod/admin.php:2398
+#: mod/photos.php:590
 #, php-format
-msgid "No themes found on the system. They should be placed in %1$s"
-msgstr "Geen thema's gevonden op het systeem. Ze zouden zich moeten bevinden in %1$s"
+msgid "%1$s was tagged in %2$s by %3$s"
+msgstr "%1$s is gelabeld in %2$s door %3$s"
 
-#: mod/admin.php:2399
-msgid "[Experimental]"
-msgstr "[Experimenteel]"
+#: mod/photos.php:689
+msgid "Image upload didn't complete, please try again"
+msgstr "Opladen van het beeld is niet compleet, probeer het opnieuw"
 
-#: mod/admin.php:2400
-msgid "[Unsupported]"
-msgstr "[Niet ondersteund]"
+#: mod/photos.php:692
+msgid "Image file is missing"
+msgstr "Beeld bestand ontbreekt"
 
-#: mod/admin.php:2424
-msgid "Log settings updated."
-msgstr "Log instellingen opgeslagen"
+#: mod/photos.php:697
+msgid ""
+"Server can't accept new file upload at this time, please contact your "
+"administrator"
+msgstr "De server kan op dit moment geen nieuw bestand opladen, contacteer alsjeblieft je beheerder"
 
-#: mod/admin.php:2457
-msgid "PHP log currently enabled."
-msgstr "PHP log momenteel geactiveerd"
+#: mod/photos.php:723
+msgid "Image file is empty."
+msgstr "Afbeeldingsbestand is leeg."
 
-#: mod/admin.php:2459
-msgid "PHP log currently disabled."
-msgstr "PHP log momenteel gedeactiveerd"
+#: mod/photos.php:855
+msgid "No photos selected"
+msgstr "Geen foto's geselecteerd"
 
-#: mod/admin.php:2468
-msgid "Clear"
-msgstr "Wis"
+#: mod/photos.php:947 mod/videos.php:210
+msgid "Access to this item is restricted."
+msgstr "Toegang tot dit item is beperkt."
 
-#: mod/admin.php:2472
-msgid "Enable Debugging"
-msgstr "Activeer Debugging"
+#: mod/photos.php:1001
+msgid "Upload Photos"
+msgstr "Upload foto's"
 
-#: mod/admin.php:2473
-msgid "Log file"
-msgstr "Logbestand"
+#: mod/photos.php:1005 mod/photos.php:1097
+msgid "New album name: "
+msgstr "Nieuwe albumnaam: "
 
-#: mod/admin.php:2473
-msgid ""
-"Must be writable by web server. Relative to your Friendica top-level "
-"directory."
-msgstr "De webserver moet hier kunnen schrijven. Relatief t.o.v. de hoogste folder binnen je Friendica-installatie."
+#: mod/photos.php:1006
+msgid "or select existing album:"
+msgstr "Of selecteer bestaand album:"
 
-#: mod/admin.php:2474
-msgid "Log level"
-msgstr "Log niveau"
+#: mod/photos.php:1007
+msgid "Do not show a status post for this upload"
+msgstr "Toon geen bericht op je tijdlijn van deze upload"
 
-#: mod/admin.php:2476
-msgid "PHP logging"
-msgstr "PHP logging"
+#: mod/photos.php:1023 mod/photos.php:1391 mod/settings.php:1213
+msgid "Show to Groups"
+msgstr "Tonen aan groepen"
 
-#: mod/admin.php:2477
-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 "
-"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 "Om logging van PHP fouten en waarschuwingen te activeren, kan je het volgende toevoegen aan het begin van je index.php bestand van je installatie. De naam van het bestand die ingesteld is in de 'error_log' lijn is relatief tegenover de friendica top-level folder en de server moet erin kunnen schrijven. De optie '1' voor 'log_errors' en 'display_errors' activeert deze opties, configureer '0' om ze te deactiveren. "
+#: mod/photos.php:1024 mod/photos.php:1392 mod/settings.php:1214
+msgid "Show to Contacts"
+msgstr "Tonen aan contacten"
 
-#: mod/admin.php:2508
-#, 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 "Fout bij het openen van log file <strong>%1$s</strong> .\\r\\n<br/>Kijk na of bestand %1$s bestaat en mag gelezen worden."
+#: mod/photos.php:1079
+msgid "Do you really want to delete this photo album and all its photos?"
+msgstr "Wil je echt dit fotoalbum en alle foto's erin verwijderen?"
 
-#: mod/admin.php:2512
-#, 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 "Kon log file <strong>%1$s</strong> niet openen.\\r\\n<br/>Kijk na of bestand %1$s mag gelezen worden."
+#: mod/photos.php:1081 mod/photos.php:1102
+msgid "Delete Album"
+msgstr "Verwijder album"
 
-#: mod/admin.php:2603 mod/admin.php:2604 mod/settings.php:778
-msgid "Off"
-msgstr "Uit"
+#: mod/photos.php:1108
+msgid "Edit Album"
+msgstr "Album wijzigen"
 
-#: mod/admin.php:2603 mod/admin.php:2604 mod/settings.php:778
-msgid "On"
-msgstr "Aan"
+#: mod/photos.php:1109
+msgid "Drop Album"
+msgstr "Album verwijderen"
 
-#: mod/admin.php:2604
-#, php-format
-msgid "Lock feature %s"
-msgstr "Fixeer feature %s "
+#: mod/photos.php:1114
+msgid "Show Newest First"
+msgstr "Toon niewste eerst"
 
-#: mod/admin.php:2612
-msgid "Manage Additional Features"
-msgstr "Beheer Bijkomende Features"
+#: mod/photos.php:1116
+msgid "Show Oldest First"
+msgstr "Toon oudste eerst"
 
-#: mod/allfriends.php:54
-msgid "No friends to display."
-msgstr "Geen vrienden om te laten zien."
+#: mod/photos.php:1137 mod/photos.php:1624
+msgid "View Photo"
+msgstr "Bekijk foto"
 
-#: mod/allfriends.php:93 mod/dirfind.php:219 mod/match.php:107
-#: mod/suggest.php:105 src/Content/Widget.php:41 src/Model/Profile.php:309
-msgid "Connect"
-msgstr "Verbinden"
+#: mod/photos.php:1174
+msgid "Permission denied. Access to this item may be restricted."
+msgstr "Toegang geweigerd. Toegang tot dit item is mogelijk beperkt."
 
-#: mod/api.php:87 mod/api.php:109
-msgid "Authorize application connection"
-msgstr "Verbinding met de applicatie goedkeuren"
+#: mod/photos.php:1176
+msgid "Photo not available"
+msgstr "Foto is niet beschikbaar"
 
-#: mod/api.php:88
-msgid "Return to your app and insert this Securty Code:"
-msgstr "Keer terug naar jouw app en voeg deze beveiligingscode in:"
+#: mod/photos.php:1186
+msgid "Do you really want to delete this photo?"
+msgstr "Wil je echt deze foto verwijderen?"
 
-#: mod/api.php:97
-msgid "Please login to continue."
-msgstr "Log in om verder te gaan."
+#: mod/photos.php:1188 mod/photos.php:1388
+msgid "Delete Photo"
+msgstr "Verwijder foto"
 
-#: mod/api.php:111
-msgid ""
-"Do you want to authorize this application to access your posts and contacts,"
-" and/or create new posts for you?"
-msgstr "Wil je deze toepassing toestemming geven om jouw berichten en contacten in te kijken, en/of nieuwe berichten in jouw plaats aan te maken?"
+#: mod/photos.php:1279
+msgid "View photo"
+msgstr "Bekijk foto"
 
-#: mod/api.php:113 mod/dfrn_request.php:648 mod/follow.php:154
-#: mod/profiles.php:542 mod/profiles.php:546 mod/profiles.php:567
-#: mod/register.php:240 mod/settings.php:1100 mod/settings.php:1106
-#: mod/settings.php:1113 mod/settings.php:1117 mod/settings.php:1121
-#: mod/settings.php:1125 mod/settings.php:1129 mod/settings.php:1133
-#: mod/settings.php:1153 mod/settings.php:1154 mod/settings.php:1155
-#: mod/settings.php:1156 mod/settings.php:1157
-msgid "No"
-msgstr "Nee"
+#: mod/photos.php:1281
+msgid "Edit photo"
+msgstr "Bewerk foto"
 
-#: mod/apps.php:15 src/App.php:1656
-msgid "You must be logged in to use addons. "
-msgstr "Je moet ingelogd zijn om deze addons te kunnen gebruiken. "
+#: mod/photos.php:1282
+msgid "Delete photo"
+msgstr "Foto verwijderen"
 
-#: mod/apps.php:20
-msgid "Applications"
-msgstr "Toepassingen"
+#: mod/photos.php:1283
+msgid "Use as profile photo"
+msgstr "Gebruik als profielfoto"
 
-#: mod/apps.php:25
-msgid "No installed applications."
-msgstr "Geen toepassingen geïnstalleerd"
+#: mod/photos.php:1290
+msgid "Private Photo"
+msgstr "Privé foto"
 
-#: mod/attach.php:16
-msgid "Item not available."
-msgstr "Item niet beschikbaar"
+#: mod/photos.php:1296
+msgid "View Full Size"
+msgstr "Bekijk in volledig formaat"
 
-#: mod/attach.php:26
-msgid "Item was not found."
-msgstr "Item niet gevonden"
+#: mod/photos.php:1356
+msgid "Tags: "
+msgstr "Labels: "
 
-#: mod/babel.php:25
-msgid "Source input"
-msgstr "Bron input"
+#: mod/photos.php:1359
+msgid "[Select tags to remove]"
+msgstr "[Selecteer tags om te verwijderen]"
 
-#: mod/babel.php:31
-msgid "BBCode::toPlaintext"
-msgstr "BBCode::toPlaintext"
+#: mod/photos.php:1374
+msgid "New album name"
+msgstr "Nieuwe albumnaam"
 
-#: mod/babel.php:37
-msgid "BBCode::convert (raw HTML)"
-msgstr "BBCode::convert (raw HTML)"
+#: mod/photos.php:1375
+msgid "Caption"
+msgstr "Onderschrift"
 
-#: mod/babel.php:42
-msgid "BBCode::convert"
-msgstr "BBCode::convert"
+#: mod/photos.php:1376
+msgid "Add a Tag"
+msgstr "Een label toevoegen"
 
-#: mod/babel.php:48
-msgid "BBCode::convert => HTML::toBBCode"
-msgstr "BBCode::convert => HTML::toBBCode"
+#: mod/photos.php:1376
+msgid ""
+"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+msgstr "Voorbeeld: @bob, @Barbara_Jansen, @jan@voorbeeld.nl, #Ardennen, #camping "
 
-#: mod/babel.php:54
-msgid "BBCode::toMarkdown"
-msgstr "BBCode::toMarkdown"
+#: mod/photos.php:1377
+msgid "Do not rotate"
+msgstr "Niet roteren"
 
-#: mod/babel.php:60
-msgid "BBCode::toMarkdown => Markdown::convert"
-msgstr "BBCode::toMarkdown => Markdown::convert"
+#: mod/photos.php:1378
+msgid "Rotate CW (right)"
+msgstr "Roteren met de klok mee (rechts)"
 
-#: mod/babel.php:66
-msgid "BBCode::toMarkdown => Markdown::toBBCode"
-msgstr "BBCode::toMarkdown => Markdown::toBBCode"
+#: mod/photos.php:1379
+msgid "Rotate CCW (left)"
+msgstr "Roteren tegen de klok in (links)"
 
-#: mod/babel.php:72
-msgid "BBCode::toMarkdown =>  Markdown::convert => HTML::toBBCode"
-msgstr "BBCode::toMarkdown =>  Markdown::convert => HTML::toBBCode"
+#: mod/photos.php:1413 src/Object/Post.php:313
+msgid "I like this (toggle)"
+msgstr "Vind ik leuk"
 
-#: mod/babel.php:79
-msgid "Source input (Diaspora format)"
-msgstr "Bron ingave (Diaspora formaat):"
+#: mod/photos.php:1414 src/Object/Post.php:314
+msgid "I don't like this (toggle)"
+msgstr "Vind ik niet leuk"
 
-#: mod/babel.php:85
-msgid "Markdown::convert (raw HTML)"
-msgstr "Markdown::convert (Ruwe HTML)"
+#: mod/photos.php:1429 mod/photos.php:1468 mod/photos.php:1528
+#: src/Module/Contact.php:1017 src/Module/Item/Compose.php:176
+#: src/Object/Post.php:875
+msgid "This is you"
+msgstr "Dit ben jij"
 
-#: mod/babel.php:90
-msgid "Markdown::convert"
-msgstr "Markdown::convert"
+#: mod/photos.php:1431 mod/photos.php:1470 mod/photos.php:1530
+#: src/Object/Post.php:420 src/Object/Post.php:877
+msgid "Comment"
+msgstr "Reacties"
 
-#: mod/babel.php:96
-msgid "Markdown::toBBCode"
-msgstr "Markdown::toBBCode"
+#: mod/photos.php:1559
+msgid "Map"
+msgstr "Kaart"
 
-#: mod/babel.php:103
-msgid "Raw HTML input"
-msgstr "Onverwerkte HTML input"
+#: mod/photos.php:1630 mod/videos.php:287
+msgid "View Album"
+msgstr "Album bekijken"
 
-#: mod/babel.php:108
-msgid "HTML Input"
-msgstr "HTML Input"
+#: mod/ping.php:272
+msgid "{0} wants to be your friend"
+msgstr "{0} wilt je vriend worden"
 
-#: mod/babel.php:114
-msgid "HTML::toBBCode"
-msgstr "HTML::toBBCode"
+#: mod/ping.php:288
+msgid "{0} requested registration"
+msgstr "{0} vroeg om zich te registreren"
 
-#: mod/babel.php:120
-msgid "HTML::toBBCode => BBCode::convert"
-msgstr "HTML::toBBCode => BBCode::convert"
+#: mod/poke.php:177
+msgid "Poke/Prod"
+msgstr "Aanstoten/porren"
 
-#: mod/babel.php:125
-msgid "HTML::toBBCode => BBCode::convert (raw HTML)"
-msgstr "HTML::toBBCode => BBCode::convert (Ruwe HTML)"
+#: mod/poke.php:178
+msgid "poke, prod or do other things to somebody"
+msgstr "aanstoten, porren of andere dingen met iemand doen"
 
-#: mod/babel.php:131
-msgid "HTML::toMarkdown"
-msgstr "HTML::toMarkdown"
+#: mod/poke.php:179
+msgid "Recipient"
+msgstr "Ontvanger"
 
-#: mod/babel.php:137
-msgid "HTML::toPlaintext"
-msgstr "HTML::toPlaintext"
+#: mod/poke.php:180
+msgid "Choose what you wish to do to recipient"
+msgstr "Kies wat je met de ontvanger wil doen"
 
-#: mod/babel.php:145
-msgid "Source text"
-msgstr "Brontekst"
+#: mod/poke.php:183
+msgid "Make this post private"
+msgstr "Dit bericht privé maken"
 
-#: mod/babel.php:146
-msgid "BBCode"
-msgstr "BBCode"
+#: mod/profile_photo.php:58
+msgid "Image uploaded but image cropping failed."
+msgstr "Afbeelding opgeladen, maar bijsnijden mislukt."
 
-#: mod/babel.php:147
-msgid "Markdown"
-msgstr "Markdown"
+#: mod/profile_photo.php:88 mod/profile_photo.php:97 mod/profile_photo.php:106
+#: mod/profile_photo.php:311
+#, php-format
+msgid "Image size reduction [%s] failed."
+msgstr "Verkleining van de afbeelding [%s] mislukt."
 
-#: mod/babel.php:148
-msgid "HTML"
-msgstr "HTML"
+#: mod/profile_photo.php:125
+msgid ""
+"Shift-reload the page or clear browser cache if the new photo does not "
+"display immediately."
+msgstr "Shift-herlaad de pagina, of maak de browser cache leeg als nieuwe foto's niet onmiddellijk verschijnen."
 
-#: mod/bookmarklet.php:25 src/Content/Nav.php:167 src/Module/Login.php:322
-msgid "Login"
-msgstr "Login"
+#: mod/profile_photo.php:133
+msgid "Unable to process image"
+msgstr "Ik kan de afbeelding niet verwerken"
 
-#: mod/bookmarklet.php:35
-msgid "Bad Request"
-msgstr "Bad Request"
+#: mod/profile_photo.php:244
+msgid "Upload File:"
+msgstr "Upload bestand:"
 
-#: mod/bookmarklet.php:57
-msgid "The post was created"
-msgstr "Het bericht is aangemaakt"
+#: mod/profile_photo.php:245
+msgid "Select a profile:"
+msgstr "Kies een profiel:"
 
-#: mod/cal.php:35 mod/cal.php:39 mod/community.php:38 mod/follow.php:21
-#: mod/viewcontacts.php:23 mod/viewcontacts.php:27 mod/viewsrc.php:13
-msgid "Access denied."
-msgstr "Toegang geweigerd"
+#: mod/profile_photo.php:250
+msgid "or"
+msgstr "of"
 
-#: mod/cal.php:47 mod/dfrn_poll.php:493 mod/help.php:67
-#: mod/viewcontacts.php:38 src/App.php:1707
-msgid "Page not found."
-msgstr "Pagina niet gevonden"
+#: mod/profile_photo.php:251
+msgid "skip this step"
+msgstr "Deze stap overslaan"
 
-#: mod/cal.php:142 mod/display.php:311 mod/profile.php:190
-msgid "Access to this profile has been restricted."
-msgstr "Toegang tot dit profiel is beperkt."
+#: mod/profile_photo.php:251
+msgid "select a photo from your photo albums"
+msgstr "Kies een foto uit je fotoalbums"
 
-#: mod/cal.php:274 mod/events.php:390 src/Content/Nav.php:157
-#: src/Content/Nav.php:223 src/Model/Profile.php:937 src/Model/Profile.php:948
-#: view/theme/frio/theme.php:277 view/theme/frio/theme.php:281
-msgid "Events"
-msgstr "Gebeurtenissen"
+#: mod/profile_photo.php:264
+msgid "Crop Image"
+msgstr "Afbeelding bijsnijden"
 
-#: mod/cal.php:275 mod/events.php:391
-msgid "View"
-msgstr "Beeld"
+#: mod/profile_photo.php:265
+msgid "Please adjust the image cropping for optimum viewing."
+msgstr "Pas het afsnijden van de afbeelding aan voor het beste resultaat."
 
-#: mod/cal.php:276 mod/events.php:393
-msgid "Previous"
-msgstr "Vorige"
+#: mod/profile_photo.php:267
+msgid "Done Editing"
+msgstr "Wijzigingen compleet"
 
-#: mod/cal.php:277 mod/events.php:394 src/Module/Install.php:135
-msgid "Next"
-msgstr "Volgende"
+#: mod/profile_photo.php:301
+msgid "Image uploaded successfully."
+msgstr "Uploaden van afbeelding gelukt."
 
-#: mod/cal.php:280 mod/events.php:399 src/Model/Event.php:430
-msgid "today"
-msgstr "vandaag"
+#: mod/search.php:92
+msgid "Only logged in users are permitted to perform a search."
+msgstr "Alleen ingelogde gebruikers mogen een zoekopdracht starten."
 
-#: mod/cal.php:281 mod/events.php:400 src/Model/Event.php:431
-#: src/Util/Temporal.php:312
-msgid "month"
-msgstr "maand"
+#: mod/search.php:114
+msgid "Only one search per minute is permitted for not logged in users."
+msgstr "Niet ingelogde gebruikers mogen slechts 1 opzoeking doen per minuut"
 
-#: mod/cal.php:282 mod/events.php:401 src/Model/Event.php:432
-#: src/Util/Temporal.php:313
-msgid "week"
-msgstr "week"
+#: mod/search.php:134 src/Content/Text/HTML.php:889 src/Content/Nav.php:200
+msgid "Search"
+msgstr "Zoeken"
 
-#: mod/cal.php:283 mod/events.php:402 src/Model/Event.php:433
-#: src/Util/Temporal.php:314
-msgid "day"
-msgstr "dag"
+#: mod/search.php:228
+#, php-format
+msgid "Items tagged with: %s"
+msgstr "Items getagd met: %s"
 
-#: mod/cal.php:284 mod/events.php:403
-msgid "list"
-msgstr "lijst"
+#: mod/search.php:230 src/Module/Contact.php:819
+#, php-format
+msgid "Results for: %s"
+msgstr "Resultaten voor: %s"
 
-#: mod/cal.php:297 src/Core/Console/NewPassword.php:68 src/Model/User.php:260
-msgid "User not found"
-msgstr "Gebruiker niet gevonden"
+#: mod/settings.php:65 src/Module/BaseSettingsModule.php:24
+msgid "Account"
+msgstr "Account"
 
-#: mod/cal.php:313
-msgid "This calendar format is not supported"
-msgstr "Dit kalender formaat is niet ondersteund"
-
-#: mod/cal.php:315
-msgid "No exportable data found"
-msgstr "Geen exporteerbare data gevonden"
+#: mod/settings.php:73 src/Module/BaseSettingsModule.php:31
+#: src/Module/Settings/TwoFactor/Index.php:89
+#: src/Module/TwoFactor/Verify.php:62
+msgid "Two-factor authentication"
+msgstr "2-factor authenticatie"
 
-#: mod/cal.php:332
-msgid "calendar"
-msgstr "kalender"
+#: mod/settings.php:80 src/Content/Nav.php:268 src/Model/Profile.php:402
+#: src/Module/BaseSettingsModule.php:38
+msgid "Profiles"
+msgstr "Profielen"
 
-#: mod/common.php:92
-msgid "No contacts in common."
-msgstr "Geen gedeelde contacten."
+#: mod/settings.php:88 src/Module/BaseAdminModule.php:84
+#: src/Module/BaseSettingsModule.php:46
+msgid "Additional features"
+msgstr "Extra functies"
 
-#: mod/common.php:143 src/Module/Contact.php:897
-msgid "Common Friends"
-msgstr "Gedeelde Vrienden"
+#: mod/settings.php:96 src/Module/BaseSettingsModule.php:54
+msgid "Display"
+msgstr "Weergave"
 
-#: mod/community.php:31 mod/dfrn_request.php:602 mod/directory.php:43
-#: mod/display.php:203 mod/photos.php:945 mod/probe.php:13 mod/search.php:106
-#: mod/search.php:112 mod/videos.php:194 mod/viewcontacts.php:51
-#: mod/webfinger.php:16
-msgid "Public access denied."
-msgstr "Niet vrij toegankelijk"
+#: mod/settings.php:103 mod/settings.php:843
+#: src/Module/BaseSettingsModule.php:61
+msgid "Social Networks"
+msgstr "Sociale netwerken"
 
-#: mod/community.php:74
-msgid "Community option not available."
-msgstr "Groepsoptie niet beschikbaar"
+#: mod/settings.php:110 src/Module/Admin/Addons/Details.php:100
+#: src/Module/Admin/Addons/Index.php:51 src/Module/BaseAdminModule.php:82
+#: src/Module/BaseSettingsModule.php:68
+msgid "Addons"
+msgstr "Addons"
 
-#: mod/community.php:91
-msgid "Not available."
-msgstr "Niet beschikbaar"
+#: mod/settings.php:117 src/Content/Nav.php:263
+#: src/Module/BaseSettingsModule.php:75
+msgid "Delegations"
+msgstr "Delegaties"
 
-#: mod/community.php:103
-msgid "Local Community"
-msgstr "Lokale Groep"
+#: mod/settings.php:124 src/Module/BaseSettingsModule.php:82
+msgid "Connected apps"
+msgstr "Verbonden applicaties"
 
-#: mod/community.php:106
-msgid "Posts from local users on this server"
-msgstr "Berichten van lokale gebruikers op deze server"
+#: mod/settings.php:131 mod/uexport.php:59
+#: src/Module/BaseSettingsModule.php:89
+msgid "Export personal data"
+msgstr "Persoonlijke gegevens exporteren"
 
-#: mod/community.php:114
-msgid "Global Community"
-msgstr "Globale gemeenschap"
+#: mod/settings.php:138 src/Module/BaseSettingsModule.php:96
+msgid "Remove account"
+msgstr "Account verwijderen"
 
-#: mod/community.php:117
-msgid "Posts from users of the whole federated network"
-msgstr "Berichten van gebruikers van het hele gefedereerde netwerk"
+#: mod/settings.php:147 view/theme/frio/theme.php:277 src/Content/Nav.php:265
+#: src/Module/Admin/Addons/Details.php:102
+#: src/Module/Admin/Themes/Details.php:107
+#: src/Module/BaseSettingsModule.php:105 src/Module/Welcome.php:33
+msgid "Settings"
+msgstr "Instellingen"
 
-#: mod/community.php:163 mod/search.php:243
-msgid "No results."
-msgstr "Geen resultaten."
+#: mod/settings.php:190
+msgid "Missing some important data!"
+msgstr "Een belangrijk gegeven ontbreekt!"
 
-#: mod/community.php:207
-msgid ""
-"This community stream shows all public posts received by this node. They may"
-" not reflect the opinions of this node’s users."
-msgstr "Deze groepsstroom toont alle publieke berichten die deze node ontvangen heeft. Ze kunnen mogelijks niet de mening van de gebruikers van deze node weerspiegelen."
+#: mod/settings.php:192 mod/settings.php:703 src/Module/Contact.php:826
+msgid "Update"
+msgstr "Wijzigen"
 
-#: mod/credits.php:19
-msgid "Credits"
-msgstr "Credits"
+#: mod/settings.php:302
+msgid "Failed to connect with email account using the settings provided."
+msgstr "Ik kon geen verbinding maken met het e-mail account met de gegeven instellingen."
 
-#: mod/credits.php:20
-msgid ""
-"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!"
-msgstr "Friendica is een gemeenschapsproject dat niet mogelijk zou zijn zonder de hulp van vele mensen.  Hier is een lijst van alle mensen die aan de code of vertalingen van Friendica hebben meegewerkt.  Allen van harte bedankt!"
+#: mod/settings.php:307
+msgid "Email settings updated."
+msgstr "E-mail instellingen opgeslagen"
 
-#: mod/crepair.php:90
-msgid "Contact settings applied."
-msgstr "Contactinstellingen toegepast."
+#: mod/settings.php:323
+msgid "Features updated"
+msgstr "Functies opgeslagen"
 
-#: mod/crepair.php:92
-msgid "Contact update failed."
-msgstr "Aanpassen van contact mislukt."
+#: mod/settings.php:384
+msgid "The theme you chose isn't available."
+msgstr "Het thema dat je koos is niet beschikbaar"
 
-#: mod/crepair.php:113 mod/dfrn_confirm.php:130 mod/fsuggest.php:31
-#: mod/fsuggest.php:97 mod/redir.php:31 mod/redir.php:129
-msgid "Contact not found."
-msgstr "Contact niet gevonden"
+#: mod/settings.php:396
+msgid "Relocate message has been send to your contacts"
+msgstr "Verhuis boodschap is verzonden naar je contacten"
 
-#: mod/crepair.php:117
-msgid ""
-"<strong>WARNING: This is highly advanced</strong> and if you enter incorrect"
-" information your communications with this contact may stop working."
-msgstr "<strong>WAARSCHUWING: Dit is zeer geavanceerd</strong> en als je verkeerde informatie invult, zal je mogelijk niet meer kunnen communiceren met deze contactpersoon."
+#: mod/settings.php:408
+msgid "Passwords do not match."
+msgstr "Wachtwoorden zijn niet gelijk"
 
-#: mod/crepair.php:118
-msgid ""
-"Please use your browser 'Back' button <strong>now</strong> if you are "
-"uncertain what to do on this page."
-msgstr "Gebruik <strong>nu</strong> de \"terug\"-knop in je webbrowser wanneer je niet weet wat je op deze pagina moet doen."
+#: mod/settings.php:416 src/Console/NewPassword.php:101
+msgid "Password update failed. Please try again."
+msgstr "Wachtwoord-)wijziging mislukt. Probeer opnieuw."
 
-#: mod/crepair.php:132 mod/crepair.php:134
-msgid "No mirroring"
-msgstr "Geen mirroring"
+#: mod/settings.php:419 src/Console/NewPassword.php:104
+msgid "Password changed."
+msgstr "Wachtwoord gewijzigd."
 
-#: mod/crepair.php:132
-msgid "Mirror as forwarded posting"
-msgstr "Spiegel als geforward bericht"
+#: mod/settings.php:422
+msgid "Password unchanged."
+msgstr "Wachtwoord ongewijzigd"
 
-#: mod/crepair.php:132 mod/crepair.php:134
-msgid "Mirror as my own posting"
-msgstr "Spiegel als mijn eigen bericht"
+#: mod/settings.php:503
+msgid " Please use a shorter name."
+msgstr "Gebruik een kortere naam."
 
-#: mod/crepair.php:147
-msgid "Return to contact editor"
-msgstr "Ga terug naar contactbewerker"
+#: mod/settings.php:506
+msgid " Name too short."
+msgstr "Naam te kort."
 
-#: mod/crepair.php:149
-msgid "Refetch contact data"
-msgstr "Contact data opnieuw ophalen"
+#: mod/settings.php:513 src/Module/Settings/TwoFactor/Index.php:72
+msgid "Wrong Password"
+msgstr "Verkeerd wachtwoord"
 
-#: mod/crepair.php:151 mod/events.php:559 mod/fsuggest.php:115
-#: mod/invite.php:154 mod/localtime.php:56 mod/manage.php:185
-#: mod/message.php:265 mod/message.php:426 mod/photos.php:1093
-#: mod/photos.php:1181 mod/photos.php:1456 mod/photos.php:1501
-#: mod/photos.php:1540 mod/photos.php:1600 mod/poke.php:194
-#: mod/profiles.php:578 src/Module/Contact.php:600 src/Module/Install.php:189
-#: src/Module/Install.php:224 src/Object/Post.php:813
-#: 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 "Opslaan"
+#: mod/settings.php:518
+msgid "Invalid email."
+msgstr "Ongeldig email adres."
 
-#: mod/crepair.php:152
-msgid "Remote Self"
-msgstr "Mijn identiteit elders"
+#: mod/settings.php:524
+msgid "Cannot change to that email."
+msgstr "Kan niet naar dat email adres veranderen."
 
-#: mod/crepair.php:155
-msgid "Mirror postings from this contact"
-msgstr "Berichten van dit contact spiegelen"
+#: mod/settings.php:574
+msgid "Private forum has no privacy permissions. Using default privacy group."
+msgstr "Privéforum/-groep heeft geen privacyrechten. De standaard privacygroep wordt gebruikt."
 
-#: mod/crepair.php:157
-msgid ""
-"Mark this contact as remote_self, this will cause friendica to repost new "
-"entries from this contact."
-msgstr "Markeer dit contact als remote_self, hierdoor zal friendica nieuwe berichten van dit contact opnieuw posten."
+#: mod/settings.php:577
+msgid "Private forum has no privacy permissions and no default privacy group."
+msgstr "Privéforum/-groep heeft geen privacyrechten en geen standaard privacygroep."
 
-#: mod/crepair.php:162
-msgid "Account Nickname"
-msgstr "Bijnaam account"
+#: mod/settings.php:617
+msgid "Settings updated."
+msgstr "Instellingen opgeslagen"
 
-#: mod/crepair.php:163
-msgid "@Tagname - overrides Name/Nickname"
-msgstr "@Labelnaam - krijgt voorrang op naam/bijnaam"
+#: mod/settings.php:676 mod/settings.php:702 mod/settings.php:736
+msgid "Add application"
+msgstr "Toepassing toevoegen"
 
-#: mod/crepair.php:164
-msgid "Account URL"
-msgstr "URL account"
+#: mod/settings.php:680 mod/settings.php:706
+msgid "Consumer Key"
+msgstr "Gebruikerssleutel"
 
-#: mod/crepair.php:165
-msgid "Friend Request URL"
-msgstr "URL vriendschapsverzoek"
+#: mod/settings.php:681 mod/settings.php:707
+msgid "Consumer Secret"
+msgstr "Gebruikersgeheim"
 
-#: mod/crepair.php:166
-msgid "Friend Confirm URL"
-msgstr "URL vriendschapsbevestiging"
+#: mod/settings.php:682 mod/settings.php:708
+msgid "Redirect"
+msgstr "Doorverwijzing"
 
-#: mod/crepair.php:167
-msgid "Notification Endpoint URL"
-msgstr "Notificatie Endpoint URL"
+#: mod/settings.php:683 mod/settings.php:709
+msgid "Icon url"
+msgstr "URL pictogram"
 
-#: mod/crepair.php:168
-msgid "Poll/Feed URL"
-msgstr "URL poll/feed"
+#: mod/settings.php:694
+msgid "You can't edit this application."
+msgstr "Je kunt deze toepassing niet wijzigen."
 
-#: mod/crepair.php:169
-msgid "New photo from this URL"
-msgstr "Nieuwe foto van deze URL"
+#: mod/settings.php:735
+msgid "Connected Apps"
+msgstr "Verbonden applicaties"
 
-#: mod/delegate.php:43
-msgid "Parent user not found."
-msgstr "Ouderlijke gebruiker niet gevonden."
+#: mod/settings.php:737 src/Object/Post.php:168 src/Object/Post.php:170
+msgid "Edit"
+msgstr "Bewerken"
 
-#: mod/delegate.php:150
-msgid "No parent user"
-msgstr "Ouderlijke gebruiker ontbreekt"
+#: mod/settings.php:739
+msgid "Client key starts with"
+msgstr "Client sleutel begint met"
 
-#: mod/delegate.php:165
-msgid "Parent Password:"
-msgstr "Ouderlijk paswoord:"
+#: mod/settings.php:740
+msgid "No name"
+msgstr "Geen naam"
 
-#: mod/delegate.php:165
-msgid ""
-"Please enter the password of the parent account to legitimize your request."
-msgstr "Geef alstublieft het paswoord van het ouderlijke account om je verzoek te legitimeren."
+#: mod/settings.php:741
+msgid "Remove authorization"
+msgstr "Verwijder authorisatie"
 
-#: mod/delegate.php:170
-msgid "Parent User"
-msgstr "Ouderlijke gebruiker"
+#: mod/settings.php:752
+msgid "No Addon settings configured"
+msgstr "Geen Addon instellingen geconfigureerd"
 
-#: mod/delegate.php:173
-msgid ""
-"Parent users have total control about this account, including the account "
-"settings. Please double check whom you give this access."
-msgstr "Ouderlijke gebruikers hebben totale controle over dit account, de account instellingen inbegrepen. Dubbel check dus alstublieft aan wie je deze toegang geeft."
+#: mod/settings.php:761
+msgid "Addon Settings"
+msgstr "Addon instellingen"
 
-#: mod/delegate.php:175 src/Content/Nav.php:258
-msgid "Delegate Page Management"
-msgstr "Paginabeheer uitbesteden"
+#: mod/settings.php:775 src/Module/Admin/Features.php:58
+#: src/Module/Admin/Features.php:59
+msgid "Off"
+msgstr "Uit"
 
-#: mod/delegate.php:176
-msgid "Delegates"
-msgstr "Gemachtigden"
+#: mod/settings.php:775 src/Module/Admin/Features.php:58
+#: src/Module/Admin/Features.php:59
+msgid "On"
+msgstr "Aan"
 
-#: mod/delegate.php:178
-msgid ""
-"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."
-msgstr "Personen waaraan het beheer is uitbesteed kunnen alle onderdelen van een account/pagina beheren, behalve de basisinstellingen van een account. Besteed je persoonlijke account daarom niet uit aan personen die je niet volledig vertrouwt."
+#: mod/settings.php:782
+msgid "Additional Features"
+msgstr "Extra functies"
 
-#: mod/delegate.php:179
-msgid "Existing Page Delegates"
-msgstr "Bestaande personen waaraan het paginabeheer is uitbesteed"
+#: mod/settings.php:806 src/Content/ContactSelector.php:87
+msgid "Diaspora"
+msgstr "Diaspora"
 
-#: mod/delegate.php:181
-msgid "Potential Delegates"
-msgstr "Mogelijke personen waaraan het paginabeheer kan worden uitbesteed "
+#: mod/settings.php:806 mod/settings.php:807
+msgid "enabled"
+msgstr "ingeschakeld"
 
-#: mod/delegate.php:183 mod/tagrm.php:112
-msgid "Remove"
-msgstr "Verwijderen"
+#: mod/settings.php:806 mod/settings.php:807
+msgid "disabled"
+msgstr "uitgeschakeld"
 
-#: mod/delegate.php:184
-msgid "Add"
-msgstr "Toevoegen"
+#: mod/settings.php:806 mod/settings.php:807
+#, php-format
+msgid "Built-in support for %s connectivity is %s"
+msgstr "Ingebouwde ondersteuning voor connectiviteit met %s is %s"
 
-#: mod/delegate.php:185
-msgid "No entries."
-msgstr "Geen gegevens."
+#: mod/settings.php:807
+msgid "GNU Social (OStatus)"
+msgstr "GNU Social (OStatus)"
 
-#: mod/dfrn_confirm.php:75 mod/profiles.php:42 mod/profiles.php:152
-#: mod/profiles.php:197 mod/profiles.php:527
-msgid "Profile not found."
-msgstr "Profiel niet gevonden"
+#: mod/settings.php:838
+msgid "Email access is disabled on this site."
+msgstr "E-mailtoegang is op deze website uitgeschakeld."
 
-#: mod/dfrn_confirm.php:131
-msgid ""
-"This may occasionally happen if contact was requested by both persons and it"
-" has already been approved."
-msgstr "Dit kan soms gebeuren als het contact door beide personen werd gevraagd, en het werd al goedgekeurd."
+#: mod/settings.php:848
+msgid "General Social Media Settings"
+msgstr "Algemene Sociale Media Instellingen"
 
-#: mod/dfrn_confirm.php:241
-msgid "Response from remote site was not understood."
-msgstr "Antwoord van de website op afstand werd niet begrepen."
+#: mod/settings.php:849
+msgid "Accept only top level posts by contacts you follow"
+msgstr "Enkel posts van het het hoogste niveau accepteren van contacten die je volgt."
 
-#: mod/dfrn_confirm.php:248 mod/dfrn_confirm.php:254
-msgid "Unexpected response from remote site: "
-msgstr "Onverwacht antwoord van website op afstand:"
+#: mod/settings.php:849
+msgid ""
+"The system does an auto completion of threads when a comment arrives. This "
+"has got the side effect that you can receive posts that had been started by "
+"a non-follower but had been commented by someone you follow. This setting "
+"deactivates this behaviour. When activated, you strictly only will receive "
+"posts from people you really do follow."
+msgstr "Het systeem doet auto-complete bij posts wanneer een nieuwe reactie aankomt. Dit heeft het neveneffect dat je posts kan ontvangen die zijn gestart door iemand die je niet volgt maar op werd gereageerd door iemand die je wel volgt. Deze instelling deactiveerd dit gedrag. Als je dit activeert zal je enkel posts ontvangen van mensen die je echt volgt."
 
-#: mod/dfrn_confirm.php:263
-msgid "Confirmation completed successfully."
-msgstr "Bevestiging werd correct voltooid."
+#: mod/settings.php:850
+msgid "Disable Content Warning"
+msgstr "Deactiveer Content Waarschuwing"
 
-#: mod/dfrn_confirm.php:275
-msgid "Temporary failure. Please wait and try again."
-msgstr "Tijdelijke fout. Wacht even en probeer opnieuw."
-
-#: mod/dfrn_confirm.php:278
-msgid "Introduction failed or was revoked."
-msgstr "Verzoek mislukt of herroepen."
-
-#: mod/dfrn_confirm.php:283
-msgid "Remote site reported: "
-msgstr "Website op afstand berichtte: "
+#: mod/settings.php:850
+msgid ""
+"Users on networks like Mastodon or Pleroma are able to set a content warning"
+" field which collapse their post by default. This disables the automatic "
+"collapsing and sets the content warning as the post title. Doesn't affect "
+"any other content filtering you eventually set up."
+msgstr "Gebruikers op netwerken als Mastodon en Pleroma kunnen een content waarschuwing instellen die hun bericht standaard inklapt. Dit deactiveert het automatisch inklappen en toont de content waarschuwing als titel van het bericht. Dit beïnvloedt andere content filters die je mogelijk ingesteld hebt niet."
 
-#: mod/dfrn_confirm.php:384
-msgid "Unable to set contact photo."
-msgstr "Ik kan geen contact foto instellen."
+#: mod/settings.php:851
+msgid "Disable intelligent shortening"
+msgstr "Deactiveer intelligent afkorten"
 
-#: mod/dfrn_confirm.php:446
-#, php-format
-msgid "No user record found for '%s' "
-msgstr "Geen gebruiker gevonden voor '%s'"
+#: mod/settings.php:851
+msgid ""
+"Normally the system tries to find the best link to add to shortened posts. "
+"If this option is enabled then every shortened post will always point to the"
+" original friendica post."
+msgstr "Normaal probeert het systeem de beste link te vinden om toe te voegen aan ingekorte berichten. Als deze optie geactiveerd is, dan zal elk ingekort bericht altijd verwijzen naar het originele friendica bericht."
 
-#: mod/dfrn_confirm.php:456
-msgid "Our site encryption key is apparently messed up."
-msgstr "De encryptie-sleutel van onze webstek is blijkbaar beschadigd."
+#: mod/settings.php:852
+msgid "Automatically follow any GNU Social (OStatus) followers/mentioners"
+msgstr "Volg automatisch alle GNU Social (OStatus) volgers/vermelders"
 
-#: mod/dfrn_confirm.php:467
-msgid "Empty site URL was provided or URL could not be decrypted by us."
-msgstr "Er werd een lege URL gegeven, of de URL kon niet ontcijferd worden door ons."
+#: mod/settings.php:852
+msgid ""
+"If you receive a message from an unknown OStatus user, this option decides "
+"what to do. If it is checked, a new contact will be created for every "
+"unknown user."
+msgstr "Als je een boodschap ontvangt van een voor jou onbekende OStatus gebruiker, dan beslist deze optie wat er moet gebeuren. Als de optie is geactiveerd, dan zal voor elke onbekende gebruiker een nieuw contact aangemaakt worden."
 
-#: mod/dfrn_confirm.php:483
-msgid "Contact record was not found for you on our site."
-msgstr "We vonden op onze webstek geen contactrecord voor jou."
+#: mod/settings.php:853
+msgid "Default group for OStatus contacts"
+msgstr "Standaard groep voor OStatus contacten"
 
-#: mod/dfrn_confirm.php:497
-#, php-format
-msgid "Site public key not available in contact record for URL %s."
-msgstr "Publieke sleutel voor webstek niet beschikbaar in contactrecord voor URL %s."
+#: mod/settings.php:854
+msgid "Your legacy GNU Social account"
+msgstr "Je verouderd GNU Social account"
 
-#: mod/dfrn_confirm.php:513
+#: mod/settings.php:854
 msgid ""
-"The ID provided by your system is a duplicate on our system. It should work "
-"if you try again."
-msgstr "Het ID dat jouw systeem aangeeft is een dubbel op ons systeem. Als je opnieuw probeert zou het moeten werken."
+"If you enter your old GNU Social/Statusnet account name here (in the format "
+"user@domain.tld), your contacts will be added automatically. The field will "
+"be emptied when done."
+msgstr "Als je hier je oude GNU Social/Statusnet account naam invoert (in het formaat gebruiker@domein.tld), dan zullen je contacten automatisch toegevoegd worden. Het veld zal nadien leeg gemaakt worden."
 
-#: mod/dfrn_confirm.php:524
-msgid "Unable to set your contact credentials on our system."
-msgstr "Niet in staat om op dit systeem je contactreferenties in te stellen."
+#: mod/settings.php:857
+msgid "Repair OStatus subscriptions"
+msgstr "Herstel OStatus inschrijvingen"
 
-#: mod/dfrn_confirm.php:580
-msgid "Unable to update your contact profile details on our system"
-msgstr "Kan je contact profiel details op ons systeem niet aanpassen"
+#: mod/settings.php:861
+msgid "Email/Mailbox Setup"
+msgstr "E-mail Instellen"
 
-#: mod/dfrn_confirm.php:610 mod/dfrn_request.php:564
-#: src/Model/Contact.php:1919
-msgid "[Name Withheld]"
-msgstr "[Naam achtergehouden]"
+#: mod/settings.php:862
+msgid ""
+"If you wish to communicate with email contacts using this service "
+"(optional), please specify how to connect to your mailbox."
+msgstr "Als je wilt communiceren met e-mail contacten via deze dienst (optioneel), moet je hier opgeven hoe ik jouw mailbox kan bereiken."
 
-#: mod/dfrn_poll.php:128 mod/dfrn_poll.php:537
-#, php-format
-msgid "%1$s welcomes %2$s"
-msgstr "%1$s heet %2$s van harte welkom"
+#: mod/settings.php:863
+msgid "Last successful email check:"
+msgstr "Laatste succesvolle e-mail controle:"
 
-#: mod/dfrn_request.php:97
-msgid "This introduction has already been accepted."
-msgstr "Verzoek is al goedgekeurd"
+#: mod/settings.php:865
+msgid "IMAP server name:"
+msgstr "IMAP server naam:"
 
-#: mod/dfrn_request.php:115 mod/dfrn_request.php:356
-msgid "Profile location is not valid or does not contain profile information."
-msgstr "Profiel is ongeldig of bevat geen informatie"
+#: mod/settings.php:866
+msgid "IMAP port:"
+msgstr "IMAP poort:"
 
-#: mod/dfrn_request.php:119 mod/dfrn_request.php:360
-msgid "Warning: profile location has no identifiable owner name."
-msgstr "Waarschuwing: de profiellocatie heeft geen identificeerbare eigenaar."
+#: mod/settings.php:867
+msgid "Security:"
+msgstr "Beveiliging:"
 
-#: mod/dfrn_request.php:122 mod/dfrn_request.php:363
-msgid "Warning: profile location has no profile photo."
-msgstr "Waarschuwing: Profieladres heeft geen profielfoto."
+#: mod/settings.php:867 mod/settings.php:872
+msgid "None"
+msgstr "Geen"
 
-#: mod/dfrn_request.php:126 mod/dfrn_request.php:367
-#, php-format
-msgid "%d required parameter was not found at the given location"
-msgid_plural "%d required parameters were not found at the given location"
-msgstr[0] "De %d vereiste parameter is niet op het gegeven adres gevonden"
-msgstr[1] "De %d vereiste parameters zijn niet op het gegeven adres gevonden"
+#: mod/settings.php:868
+msgid "Email login name:"
+msgstr "E-mail login naam:"
 
-#: mod/dfrn_request.php:164
-msgid "Introduction complete."
-msgstr "Verzoek voltooid."
+#: mod/settings.php:869
+msgid "Email password:"
+msgstr "E-mail wachtwoord:"
 
-#: mod/dfrn_request.php:200
-msgid "Unrecoverable protocol error."
-msgstr "Onherstelbare protocolfout. "
+#: mod/settings.php:870
+msgid "Reply-to address:"
+msgstr "Antwoord adres:"
 
-#: mod/dfrn_request.php:227
-msgid "Profile unavailable."
-msgstr "Profiel onbeschikbaar"
+#: mod/settings.php:871
+msgid "Send public posts to all email contacts:"
+msgstr "Openbare posts naar alle e-mail contacten versturen:"
 
-#: mod/dfrn_request.php:249
-#, php-format
-msgid "%s has received too many connection requests today."
-msgstr "%s heeft te veel verzoeken gehad vandaag."
+#: mod/settings.php:872
+msgid "Action after import:"
+msgstr "Actie na importeren:"
 
-#: mod/dfrn_request.php:250
-msgid "Spam protection measures have been invoked."
-msgstr "Beveiligingsmaatregelen tegen spam zijn in werking getreden."
+#: mod/settings.php:872 src/Content/Nav.php:251
+msgid "Mark as seen"
+msgstr "Als 'gelezen' markeren"
 
-#: mod/dfrn_request.php:251
-msgid "Friends are advised to please try again in 24 hours."
-msgstr "Wij adviseren vrienden om het over 24 uur nog een keer te proberen."
+#: mod/settings.php:872
+msgid "Move to folder"
+msgstr "Naar map verplaatsen"
 
-#: mod/dfrn_request.php:277
-msgid "Invalid locator"
-msgstr "Ongeldige plaatsbepaler"
+#: mod/settings.php:873
+msgid "Move to folder:"
+msgstr "Verplaatsen naar map:"
 
-#: mod/dfrn_request.php:313
-msgid "You have already introduced yourself here."
-msgstr "Je hebt jezelf hier al voorgesteld."
+#: mod/settings.php:897 src/Module/Admin/Site.php:434
+msgid "No special theme for mobile devices"
+msgstr "Geen speciaal thema voor mobiele apparaten"
 
-#: mod/dfrn_request.php:316
+#: mod/settings.php:905
 #, php-format
-msgid "Apparently you are already friends with %s."
-msgstr "Blijkbaar ben je al bevriend met %s."
+msgid "%s - (Unsupported)"
+msgstr "%s - (Niet ondersteund)"
 
-#: mod/dfrn_request.php:336
-msgid "Invalid profile URL."
-msgstr "Ongeldig profiel adres."
+#: mod/settings.php:907 src/Module/Admin/Site.php:451
+#, php-format
+msgid "%s - (Experimental)"
+msgstr "%s - (Experimenteel)"
 
-#: mod/dfrn_request.php:342 src/Model/Contact.php:1598
-msgid "Disallowed profile URL."
-msgstr "Niet toegelaten profiel adres."
+#: mod/settings.php:935 src/Core/L10n/L10n.php:370 src/Model/Event.php:395
+msgid "Sunday"
+msgstr "Zondag"
 
-#: mod/dfrn_request.php:415 src/Module/Contact.php:240
-msgid "Failed to update contact record."
-msgstr "Ik kon de contactgegevens niet aanpassen."
+#: mod/settings.php:935 src/Core/L10n/L10n.php:370 src/Model/Event.php:396
+msgid "Monday"
+msgstr "Maandag"
 
-#: mod/dfrn_request.php:435
-msgid "Your introduction has been sent."
-msgstr "Je verzoek is verzonden."
+#: mod/settings.php:951
+msgid "Display Settings"
+msgstr "Scherminstellingen"
 
-#: mod/dfrn_request.php:473
-msgid ""
-"Remote subscription can't be done for your network. Please subscribe "
-"directly on your system."
-msgstr "Remote inschrijving kan niet op jouw netwerk. Gelieve direct op je systeem in te schrijven."
+#: mod/settings.php:957
+msgid "Display Theme:"
+msgstr "Schermthema:"
 
-#: mod/dfrn_request.php:489
-msgid "Please login to confirm introduction."
-msgstr "Log in om je verzoek te bevestigen."
+#: mod/settings.php:958
+msgid "Mobile Theme:"
+msgstr "Mobiel thema:"
+
+#: mod/settings.php:959
+msgid "Suppress warning of insecure networks"
+msgstr "Onderdruk waarschuwingen over onbeveiligde netwerken"
 
-#: mod/dfrn_request.php:497
+#: mod/settings.php:959
 msgid ""
-"Incorrect identity currently logged in. Please login to "
-"<strong>this</strong> profile."
-msgstr "Je huidige identiteit is niet de juiste. Log met <strong>dit</strong> profiel in."
+"Should the system suppress the warning that the current group contains "
+"members of networks that can't receive non public postings."
+msgstr "Moet het systeem waarschuwingen onderdrukken dat de huidige groep leden bevat van netwerken die geen niet-publieke berichten kunnen ontvangen."
 
-#: mod/dfrn_request.php:511 mod/dfrn_request.php:528
-msgid "Confirm"
-msgstr "Bevestig"
+#: mod/settings.php:960
+msgid "Update browser every xx seconds"
+msgstr "Browser elke xx seconden verversen"
 
-#: mod/dfrn_request.php:523
-msgid "Hide this contact"
-msgstr "Verberg dit contact"
+#: mod/settings.php:960
+msgid "Minimum of 10 seconds. Enter -1 to disable it."
+msgstr "Minimum 10 seconden. Geef -1 op om te deactiveren."
 
-#: mod/dfrn_request.php:526
-#, php-format
-msgid "Welcome home %s."
-msgstr "Welkom terug %s."
+#: mod/settings.php:961
+msgid "Number of items to display per page:"
+msgstr "Aantal items te tonen per pagina:"
 
-#: mod/dfrn_request.php:527
-#, php-format
-msgid "Please confirm your introduction/connection request to %s."
-msgstr "Bevestig je vriendschaps-/connectieverzoek voor %s."
+#: mod/settings.php:961 mod/settings.php:962
+msgid "Maximum of 100 items"
+msgstr "Maximum 100 items"
 
-#: mod/dfrn_request.php:637
-msgid ""
-"Please enter your 'Identity Address' from one of the following supported "
-"communications networks:"
-msgstr "Vul hier uw 'Identiteitsadres' in van een van de volgende ondersteunde communicatienetwerken:"
+#: mod/settings.php:962
+msgid "Number of items to display per page when viewed from mobile device:"
+msgstr "Aantal items per pagina als je een mobiel toestel gebruikt:"
 
-#: mod/dfrn_request.php:640
-#, php-format
-msgid ""
-"If you are not yet a member of the free social web, <a href=\"%s\">follow "
-"this link to find a public Friendica site and join us today</a>."
-msgstr "Als je nog geen lid bent van het vrije sociale web, <a href=\"%s\">volg dan deze link om een publieke Friendica site te vinden en vervoeg ons vandaag</a>"
+#: mod/settings.php:963
+msgid "Don't show emoticons"
+msgstr "Emoticons niet tonen"
 
-#: mod/dfrn_request.php:645
-msgid "Friend/Connection Request"
-msgstr "Vriendschaps-/connectieverzoek"
+#: mod/settings.php:964
+msgid "Calendar"
+msgstr "Kalender"
 
-#: mod/dfrn_request.php:646
-msgid ""
-"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
-"testuser@gnusocial.de"
-msgstr "Voorbeelden: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@gnusocial.de"
+#: mod/settings.php:965
+msgid "Beginning of week:"
+msgstr "Begin van de week:"
 
-#: mod/dfrn_request.php:647 mod/follow.php:153
-msgid "Please answer the following:"
-msgstr "Beantwoord het volgende:"
+#: mod/settings.php:966
+msgid "Don't show notices"
+msgstr "Toon geen aankondigingen"
 
-#: mod/dfrn_request.php:648 mod/follow.php:154
-#, php-format
-msgid "Does %s know you?"
-msgstr "Kent %s jou?"
+#: mod/settings.php:967
+msgid "Infinite scroll"
+msgstr "Oneindig scrollen"
 
-#: mod/dfrn_request.php:649 mod/follow.php:155
-msgid "Add a personal note:"
-msgstr "Voeg een persoonlijke opmerking toe:"
+#: mod/settings.php:968
+msgid "Automatic updates only at the top of the network page"
+msgstr "Automatische updates alleen bovenaan de netwerk pagina"
 
-#: mod/dfrn_request.php:651
-msgid "Friendica"
-msgstr "Friendica"
+#: mod/settings.php:968
+msgid ""
+"When disabled, the network page is updated all the time, which could be "
+"confusing while reading."
+msgstr "Als deze parameter gedeactiveerd is, dan wordt de netwerk pagina constant geüpdate, wat verwarrend zou kunnen zijn tijdens het lezen."
 
-#: mod/dfrn_request.php:652
-msgid "GNU Social (Pleroma, Mastodon)"
-msgstr "GNU Social (Pleroma, Mastodon)"
-
-#: mod/dfrn_request.php:653
-msgid "Diaspora (Socialhome, Hubzilla)"
-msgstr "Diaspora (Socialhome, Hubzilla)"
+#: mod/settings.php:969
+msgid "Bandwidth Saver Mode"
+msgstr "Bandbreedte Besparen Mode"
 
-#: mod/dfrn_request.php:654
-#, php-format
+#: mod/settings.php:969
 msgid ""
-" - please do not use this form.  Instead, enter %s into your Diaspora search"
-" bar."
-msgstr "- Gebruik niet dit formulier. Vul %s in in je Diaspora zoekbalk."
+"When enabled, embedded content is not displayed on automatic updates, they "
+"only show on page reload."
+msgstr "Als deze parameter geactiveerd is, dan wordt embedded content niet getoond bij automatische updates, ze worden alleen getoond bij het herladen van de pagina."
 
-#: mod/dfrn_request.php:655 mod/follow.php:161 mod/unfollow.php:130
-msgid "Your Identity Address:"
-msgstr "Adres van je identiteit:"
+#: mod/settings.php:970
+msgid "Smart Threading"
+msgstr "Slimme Gespreksstroom"
 
-#: mod/dfrn_request.php:657 mod/follow.php:66 mod/unfollow.php:133
-msgid "Submit Request"
-msgstr "Aanvraag indienen"
+#: mod/settings.php:970
+msgid ""
+"When enabled, suppress extraneous thread indentation while keeping it where "
+"it matters. Only works if threading is available and enabled."
+msgstr "Als deze parameter geactiveerd is, dan dan wordt overbodig inspringen van reacties onderdrukt terwijl het behouden blijft waar het nodig is. Werkt alleen als gespreksstroom beschikbaar is en geactiveerd."
 
-#: mod/directory.php:154 mod/events.php:547 mod/notifications.php:251
-#: src/Model/Event.php:70 src/Model/Event.php:97 src/Model/Event.php:439
-#: src/Model/Event.php:930 src/Model/Profile.php:434
-#: src/Module/Contact.php:650
-msgid "Location:"
-msgstr "Plaats:"
+#: mod/settings.php:972
+msgid "General Theme Settings"
+msgstr "Algemene Thema Instellingen"
 
-#: mod/directory.php:159 mod/notifications.php:257 src/Model/Profile.php:437
-#: src/Model/Profile.php:758
-msgid "Gender:"
-msgstr "Geslacht:"
+#: mod/settings.php:973
+msgid "Custom Theme Settings"
+msgstr "Speciale Thema Instellingen"
 
-#: mod/directory.php:160 src/Model/Profile.php:438 src/Model/Profile.php:782
-msgid "Status:"
-msgstr "Tijdlijn:"
+#: mod/settings.php:974
+msgid "Content Settings"
+msgstr "Content Instellingen"
 
-#: mod/directory.php:161 src/Model/Profile.php:439 src/Model/Profile.php:799
-msgid "Homepage:"
-msgstr "Website:"
+#: mod/settings.php:975 view/theme/duepuntozero/config.php:73
+#: view/theme/frio/config.php:128 view/theme/quattro/config.php:75
+#: view/theme/vier/config.php:121
+msgid "Theme settings"
+msgstr "Thema-instellingen"
 
-#: mod/directory.php:162 mod/notifications.php:253 src/Model/Profile.php:440
-#: src/Model/Profile.php:819 src/Module/Contact.php:654
-msgid "About:"
-msgstr "Over:"
+#: mod/settings.php:989
+msgid "Unable to find your profile. Please contact your admin."
+msgstr "Kan je profiel niet vinden. Contacteer alsjeblieft je beheerder."
 
-#: mod/directory.php:210 src/Content/Widget.php:72
-#: view/theme/vier/theme.php:208
-msgid "Global Directory"
-msgstr "Globale gids"
+#: mod/settings.php:1028
+msgid "Account Types"
+msgstr "Account Types"
 
-#: mod/directory.php:212
-msgid "Find on this site"
-msgstr "Op deze website zoeken"
+#: mod/settings.php:1029
+msgid "Personal Page Subtypes"
+msgstr "Persoonlijke Pagina Subtypes"
 
-#: mod/directory.php:214
-msgid "Results for:"
-msgstr "Resultaten voor:"
+#: mod/settings.php:1030
+msgid "Community Forum Subtypes"
+msgstr "Groepsforum Subtypes"
 
-#: mod/directory.php:216
-msgid "Site Directory"
-msgstr "Websitegids"
+#: mod/settings.php:1037 src/Module/Admin/Users.php:229
+msgid "Personal Page"
+msgstr "Persoonlijke pagina"
 
-#: mod/directory.php:217 src/Content/Widget.php:67 src/Module/Contact.php:822
-#: view/theme/vier/theme.php:203
-msgid "Find"
-msgstr "Zoek"
+#: mod/settings.php:1038
+msgid "Account for a personal profile."
+msgstr "Account voor een persoonlijk profiel"
 
-#: mod/directory.php:221
-msgid "No entries (some entries may be hidden)."
-msgstr "Geen gegevens (sommige gegevens kunnen verborgen zijn)."
+#: mod/settings.php:1041 src/Module/Admin/Users.php:230
+msgid "Organisation Page"
+msgstr "Organisatie Pagina"
 
-#: mod/dirfind.php:55
-#, php-format
-msgid "People Search - %s"
-msgstr "Mensen Zoeken - %s"
+#: mod/settings.php:1042
+msgid ""
+"Account for an organisation that automatically approves contact requests as "
+"\"Followers\"."
+msgstr "Account voor een organisatie die automatisch contact aanvragen goedkeurt als \"Volgers\"."
 
-#: mod/dirfind.php:66
-#, php-format
-msgid "Forum Search - %s"
-msgstr "Forum doorzoeken - %s"
+#: mod/settings.php:1045 src/Module/Admin/Users.php:231
+msgid "News Page"
+msgstr "Nieuws pagina"
 
-#: mod/dirfind.php:261 mod/match.php:125
-msgid "No matches"
-msgstr "Geen resultaten"
+#: mod/settings.php:1046
+msgid ""
+"Account for a news reflector that automatically approves contact requests as"
+" \"Followers\"."
+msgstr "Account voor een nieuws reflector die automatisch contact aanvragen goedkeurt als \"Volgers\"."
 
-#: mod/editpost.php:29 mod/editpost.php:39
-msgid "Item not found"
-msgstr "Item niet gevonden"
+#: mod/settings.php:1049 src/Module/Admin/Users.php:232
+msgid "Community Forum"
+msgstr "Groepsforum"
 
-#: mod/editpost.php:46
-msgid "Edit post"
-msgstr "Bericht bewerken"
+#: mod/settings.php:1050
+msgid "Account for community discussions."
+msgstr "Account voor groepsdiscussies."
 
-#: mod/editpost.php:94 mod/filer.php:38 mod/notes.php:54
-#: src/Content/Text/HTML.php:961
-msgid "Save"
-msgstr "Bewaren"
+#: mod/settings.php:1053 src/Module/Admin/Users.php:222
+msgid "Normal Account Page"
+msgstr "Normale accountpagina"
 
-#: mod/editpost.php:99 mod/message.php:263 mod/message.php:425
-#: mod/wallmessage.php:140
-msgid "Insert web link"
-msgstr "Voeg een webadres in"
+#: mod/settings.php:1054
+msgid ""
+"Account for a regular personal profile that requires manual approval of "
+"\"Friends\" and \"Followers\"."
+msgstr "Account voor een normaal persoonlijk profiel dat manuele goedkeuring vereist van \"Vrienden\" en \"Volgers\"."
 
-#: mod/editpost.php:100
-msgid "web link"
-msgstr "webadres"
+#: mod/settings.php:1057 src/Module/Admin/Users.php:223
+msgid "Soapbox Page"
+msgstr "Zeepkist-pagina"
 
-#: mod/editpost.php:101
-msgid "Insert video link"
-msgstr "Voeg video toe"
+#: mod/settings.php:1058
+msgid ""
+"Account for a public profile that automatically approves contact requests as"
+" \"Followers\"."
+msgstr "Account voor een publiek profiel dat automatisch contact aanvragen goedkeurt als \"Volgers\"."
 
-#: mod/editpost.php:102
-msgid "video link"
-msgstr "video adres"
+#: mod/settings.php:1061 src/Module/Admin/Users.php:224
+msgid "Public Forum"
+msgstr "Publiek Forum"
 
-#: mod/editpost.php:103
-msgid "Insert audio link"
-msgstr "Voeg audio adres toe"
+#: mod/settings.php:1062
+msgid "Automatically approves all contact requests."
+msgstr "Aanvaardt automatisch all contact aanvragen."
 
-#: mod/editpost.php:104
-msgid "audio link"
-msgstr "audio adres"
+#: mod/settings.php:1065 src/Module/Admin/Users.php:225
+msgid "Automatic Friend Page"
+msgstr "Automatisch Vriendschapspagina"
 
-#: mod/editpost.php:119 src/Core/ACL.php:305
-msgid "CC: email addresses"
-msgstr "CC: e-mailadressen"
+#: mod/settings.php:1066
+msgid ""
+"Account for a popular profile that automatically approves contact requests "
+"as \"Friends\"."
+msgstr "Account voor een populair profiel dat automatisch contact aanvragen goedkeurt als \"Vrienden\"."
 
-#: mod/editpost.php:126 src/Core/ACL.php:306
-msgid "Example: bob@example.com, mary@example.com"
-msgstr "Voorbeeld: bob@voorbeeld.nl, an@voorbeeld.be"
+#: mod/settings.php:1069
+msgid "Private Forum [Experimental]"
+msgstr "Privé-forum [experimenteel]"
 
-#: mod/events.php:109 mod/events.php:111
-msgid "Event can not end before it has started."
-msgstr "Gebeurtenis kan niet eindigen voor het begin."
+#: mod/settings.php:1070
+msgid "Requires manual approval of contact requests."
+msgstr "Vereist manuele goedkeuring van contact aanvragen."
 
-#: mod/events.php:118 mod/events.php:120
-msgid "Event title and start time are required."
-msgstr "Titel en begintijd van de gebeurtenis zijn vereist."
+#: mod/settings.php:1081
+msgid "OpenID:"
+msgstr "OpenID:"
 
-#: mod/events.php:392
-msgid "Create New Event"
-msgstr "Maak een nieuwe gebeurtenis"
+#: mod/settings.php:1081
+msgid "(Optional) Allow this OpenID to login to this account."
+msgstr "(Optioneel) Laat dit OpenID toe om in te loggen op deze account."
 
-#: mod/events.php:515
-msgid "Event details"
-msgstr "Gebeurtenis details"
+#: mod/settings.php:1089
+msgid "Publish your default profile in your local site directory?"
+msgstr "Je standaardprofiel in je lokale gids publiceren?"
 
-#: mod/events.php:516
-msgid "Starting date and Title are required."
-msgstr "Start datum en Titel zijn verplicht."
+#: mod/settings.php:1089
+#, php-format
+msgid ""
+"Your profile will be published in this node's <a href=\"%s\">local "
+"directory</a>. Your profile details may be publicly visible depending on the"
+" system settings."
+msgstr "Je profiel zal gepubliceerd worden de <a href=\"%s\">lokale gids</a> van deze node. Je profiel details kunnen publiek zichtbaar zijn afhankelijk van de systeem instellingen."
 
-#: mod/events.php:517 mod/events.php:522
-msgid "Event Starts:"
-msgstr "Gebeurtenis begint:"
+#: mod/settings.php:1095
+msgid "Publish your default profile in the global social directory?"
+msgstr "Je standaardprofiel in de globale sociale gids publiceren?"
 
-#: mod/events.php:517 mod/events.php:549 mod/profiles.php:608
-msgid "Required"
-msgstr "Vereist"
+#: mod/settings.php:1095
+#, php-format
+msgid ""
+"Your profile will be published in the global friendica directories (e.g. <a "
+"href=\"%s\">%s</a>). Your profile will be visible in public."
+msgstr "Je profiel zal gepubliceerd worden in de globale friendica gids (bvb. <a href=\"%s\">%s</a>). Je profiel zal publiek zichtbaar zijn."
 
-#: mod/events.php:530 mod/events.php:555
-msgid "Finish date/time is not known or not relevant"
-msgstr "Einddatum/tijd is niet gekend of niet relevant"
+#: mod/settings.php:1102
+msgid "Hide your contact/friend list from viewers of your default profile?"
+msgstr "Je vrienden/contacten verbergen voor bezoekers van je standaard profiel?"
 
-#: mod/events.php:532 mod/events.php:537
-msgid "Event Finishes:"
-msgstr "Gebeurtenis eindigt:"
+#: mod/settings.php:1102
+msgid ""
+"Your contact list won't be shown in your default profile page. You can "
+"decide to show your contact list separately for each additional profile you "
+"create"
+msgstr "Je contact lijst zal niet getoond worden in je standaard profiel pagina. Je kan beslissen om je contact lijst apart te tonen per bijkomend profiel dat je aanmaakt."
 
-#: mod/events.php:543 mod/events.php:556
-msgid "Adjust for viewer timezone"
-msgstr "Pas aan aan de tijdzone van de gebruiker"
+#: mod/settings.php:1106
+msgid "Hide your profile details from anonymous viewers?"
+msgstr "Je profiel details verbergen voor anonieme bezoekers?"
 
-#: mod/events.php:545
-msgid "Description:"
-msgstr "Beschrijving:"
+#: mod/settings.php:1106
+msgid ""
+"Anonymous visitors will only see your profile picture, your display name and"
+" the nickname you are using on your profile page. Your public posts and "
+"replies will still be accessible by other means."
+msgstr "Anonieme bezoekers zullen alleen je profiel foto zien, je naam en de bijnaam die je gebruikt op je profiel pagina. Je publieke berichten en reacties zullen nog altijd toegankelijk zijn via andere wegen."
 
-#: mod/events.php:549 mod/events.php:551
-msgid "Title:"
-msgstr "Titel:"
+#: mod/settings.php:1110
+msgid "Allow friends to post to your profile page?"
+msgstr "Vrienden toestaan om op jouw profielpagina te posten?"
 
-#: mod/events.php:552 mod/events.php:553
-msgid "Share this event"
-msgstr "Deel deze gebeurtenis"
+#: mod/settings.php:1110
+msgid ""
+"Your contacts may write posts on your profile wall. These posts will be "
+"distributed to your contacts"
+msgstr "Je contacten kunnen berichten schrijven op je tijdslijn. Deze berichten zullen verspreid worden naar je contacten"
 
-#: mod/events.php:560 src/Model/Profile.php:877
-msgid "Basic"
-msgstr "Basis"
+#: mod/settings.php:1114
+msgid "Allow friends to tag your posts?"
+msgstr "Sta vrienden toe om jouw berichten te labelen?"
 
-#: mod/events.php:562 mod/photos.php:1111 mod/photos.php:1452
-#: src/Core/ACL.php:308
-msgid "Permissions"
-msgstr "Rechten"
+#: mod/settings.php:1114
+msgid "Your contacts can add additional tags to your posts."
+msgstr "Je contacten kunnen tags toevoegen aan je berichten."
 
-#: mod/events.php:578
-msgid "Failed to remove event"
-msgstr "Kon remote event niet verwijderen"
+#: mod/settings.php:1118
+msgid "Allow us to suggest you as a potential friend to new members?"
+msgstr "Sta je mij toe om jou als mogelijke vriend  voor te stellen aan nieuwe leden?"
 
-#: mod/events.php:580
-msgid "Event removed"
-msgstr "Gebeurtenis verwijderd"
+#: mod/settings.php:1118
+msgid ""
+"If you like, Friendica may suggest new members to add you as a contact."
+msgstr "Als je wil, kan Friendica je nieuwe leden suggereren als contacten."
 
-#: mod/fbrowser.php:36 src/Content/Nav.php:155 src/Model/Profile.php:917
-#: view/theme/frio/theme.php:275
-msgid "Photos"
-msgstr "Foto's"
+#: mod/settings.php:1122
+msgid "Permit unknown people to send you private mail?"
+msgstr "Mogen onbekende personen jou privé berichten sturen?"
 
-#: mod/fbrowser.php:45 mod/fbrowser.php:70 mod/photos.php:204
-#: mod/photos.php:1075 mod/photos.php:1170 mod/photos.php:1187
-#: mod/photos.php:1654 mod/photos.php:1669 src/Model/Photo.php:244
-#: src/Model/Photo.php:253
-msgid "Contact Photos"
-msgstr "Contactfoto's"
+#: mod/settings.php:1122
+msgid ""
+"Friendica network users may send you private messages even if they are not "
+"in your contact list."
+msgstr "Friendica netwerk gebruikers kunnen je privé boodschappen sturen zelfs als ze niet in je contact lijst staan."
 
-#: mod/fbrowser.php:107 mod/fbrowser.php:138 mod/profile_photo.php:251
-msgid "Upload"
-msgstr "Uploaden"
+#: mod/settings.php:1126
+msgid "Profile is <strong>not published</strong>."
+msgstr "Profiel is <strong>niet gepubliceerd</strong>."
 
-#: mod/fbrowser.php:133
-msgid "Files"
-msgstr "Bestanden"
+#: mod/settings.php:1132
+#, php-format
+msgid "Your Identity Address is <strong>'%s'</strong> or '%s'."
+msgstr "Je Identiteit adres is <strong>'%s'</strong> of '%s'."
 
-#: mod/feedtest.php:22
-msgid "You must be logged in to use this module"
-msgstr "Je moet ingelogd zijn om deze module te gebruiken"
+#: mod/settings.php:1139
+msgid "Automatically expire posts after this many days:"
+msgstr "Laat berichten automatisch vervallen na zo veel dagen:"
 
-#: mod/feedtest.php:49
-msgid "Source URL"
-msgstr "Bron URL"
+#: mod/settings.php:1139
+msgid "If empty, posts will not expire. Expired posts will be deleted"
+msgstr "Berichten zullen niet vervallen indien leeg. Vervallen berichten zullen worden verwijderd."
 
-#: mod/fetch.php:21 mod/fetch.php:48 mod/fetch.php:55 mod/help.php:64
-#: src/App.php:1704
-msgid "Not Found"
-msgstr "Niet gevonden"
+#: mod/settings.php:1140
+msgid "Advanced expiration settings"
+msgstr "Geavanceerde instellingen voor vervallen"
 
-#: mod/filer.php:37
-msgid "- select -"
-msgstr "- Kies -"
+#: mod/settings.php:1141
+msgid "Advanced Expiration"
+msgstr "Geavanceerd Verval:"
 
-#: mod/follow.php:47
-msgid "The contact could not be added."
-msgstr "Het contact kon niet toegevoegd worden."
+#: mod/settings.php:1142
+msgid "Expire posts:"
+msgstr "Laat berichten vervallen:"
 
-#: mod/follow.php:77
-msgid "You already added this contact."
-msgstr "Je hebt deze kontakt al toegevoegd"
+#: mod/settings.php:1143
+msgid "Expire personal notes:"
+msgstr "Laat persoonlijke aantekeningen verlopen:"
 
-#: mod/follow.php:87
-msgid "Diaspora support isn't enabled. Contact can't be added."
-msgstr "Diaspora ondersteuning is niet geactiveerd. Contact kan niet toegevoegd worden."
+#: mod/settings.php:1144
+msgid "Expire starred posts:"
+msgstr "Laat berichten met ster verlopen"
 
-#: mod/follow.php:94
-msgid "OStatus support is disabled. Contact can't be added."
-msgstr "OStatus ondersteuning is niet geactiveerd. Contact kan niet toegevoegd woren."
+#: mod/settings.php:1145
+msgid "Expire photos:"
+msgstr "Laat foto's vervallen:"
 
-#: mod/follow.php:101
-msgid "The network type couldn't be detected. Contact can't be added."
-msgstr "Het type netwerk kon niet gedetecteerd worden. Contact kan niet toegevoegd worden."
+#: mod/settings.php:1146
+msgid "Only expire posts by others:"
+msgstr "Laat alleen berichten door anderen vervallen:"
 
-#: mod/follow.php:181 mod/notifications.php:255 src/Model/Profile.php:807
-#: src/Module/Contact.php:656
-msgid "Tags:"
-msgstr "Labels:"
+#: mod/settings.php:1176
+msgid "Account Settings"
+msgstr "Account Instellingen"
 
-#: mod/follow.php:193 mod/unfollow.php:149 src/Model/Profile.php:904
-#: src/Module/Contact.php:869
-msgid "Status Messages and Posts"
-msgstr "Berichten op jouw tijdlijn"
+#: mod/settings.php:1184
+msgid "Password Settings"
+msgstr "Wachtwoord Instellingen"
 
-#: mod/friendica.php:79
-#, 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 "Dit is Friendica, versie %s en draait op op locatie %s. De databaseversie is %s, en de bericht update versie is %s."
+#: mod/settings.php:1185 src/Module/Register.php:130
+msgid "New Password:"
+msgstr "Nieuw Wachtwoord:"
 
-#: mod/friendica.php:85
+#: mod/settings.php:1185
 msgid ""
-"Please visit <a href=\"https://friendi.ca\">Friendi.ca</a> to learn more "
-"about the Friendica project."
-msgstr "Ga naar <a href=\"https://friendi.ca\">Friendi.ca</a> om meer te vernemen over het Friendica project."
+"Allowed characters are a-z, A-Z, 0-9 and special characters except white "
+"spaces, accentuated letters and colon (:)."
+msgstr "Toegestane tekens zijn a-z, A-Z, 0-9 en speciale tekens behalve spatie, geaccentueerde tekens en dubbele punt."
 
-#: mod/friendica.php:89
-msgid "Bug reports and issues: please visit"
-msgstr "Bug rapporten en problemen: bezoek"
+#: mod/settings.php:1186 src/Module/Register.php:131
+msgid "Confirm:"
+msgstr "Bevestig:"
 
-#: mod/friendica.php:89
-msgid "the bugtracker at github"
-msgstr "de github bugtracker"
+#: mod/settings.php:1186
+msgid "Leave password fields blank unless changing"
+msgstr "Laat de wachtwoord-velden leeg, tenzij je het wilt veranderen"
 
-#: mod/friendica.php:92
-msgid "Suggestions, praise, etc. - please email \"info\" at \"friendi - dot - ca"
-msgstr "Suggesties, appreciatie, enz. - aub stuur een email naar \"info\" at \"friendi - dot - ca"
+#: mod/settings.php:1187
+msgid "Current Password:"
+msgstr "Huidig wachtwoord:"
 
-#: mod/friendica.php:97
-msgid "Installed addons/apps:"
-msgstr "Geïnstalleerde addons/applicaties:"
+#: mod/settings.php:1187 mod/settings.php:1188
+msgid "Your current password to confirm the changes"
+msgstr "Je huidig wachtwoord om de wijzigingen te bevestigen"
 
-#: mod/friendica.php:111
-msgid "No installed addons/apps"
-msgstr "Geen geïnstalleerde addons/applicaties"
+#: mod/settings.php:1188
+msgid "Password:"
+msgstr "Wachtwoord:"
 
-#: mod/friendica.php:116
-#, php-format
-msgid "Read about the <a href=\"%1$s/tos\">Terms of Service</a> of this node."
-msgstr "Lees de <a href=\"%1$s/tos\">Gebruiksvoorwaarden</a> van deze node na."
+#: mod/settings.php:1192
+msgid "Basic Settings"
+msgstr "Basis Instellingen"
 
-#: mod/friendica.php:121
-msgid "On this server the following remote servers are blocked."
-msgstr "De volgende remote servers zijn geblokkeerd."
+#: mod/settings.php:1193 src/Model/Profile.php:756
+msgid "Full Name:"
+msgstr "Volledige Naam:"
 
-#: mod/fsuggest.php:73
-msgid "Friend suggestion sent."
-msgstr "Vriendschapsvoorstel verzonden."
+#: mod/settings.php:1194
+msgid "Email Address:"
+msgstr "E-mailadres:"
 
-#: mod/fsuggest.php:102
-msgid "Suggest Friends"
-msgstr "Stel vrienden voor"
+#: mod/settings.php:1195
+msgid "Your Timezone:"
+msgstr "Je Tijdzone:"
 
-#: mod/fsuggest.php:104
-#, php-format
-msgid "Suggest a friend for %s"
-msgstr "Stel een vriend voor aan %s"
+#: mod/settings.php:1196
+msgid "Your Language:"
+msgstr "Je taal:"
 
-#: mod/group.php:40
-msgid "Group created."
-msgstr "Groep aangemaakt."
+#: mod/settings.php:1196
+msgid ""
+"Set the language we use to show you friendica interface and to send you "
+"emails"
+msgstr "Configureer de taal van die we gebruiken als friendica interface en om je emails te sturen"
 
-#: mod/group.php:46
-msgid "Could not create group."
-msgstr "Kon de groep niet aanmaken."
+#: mod/settings.php:1197
+msgid "Default Post Location:"
+msgstr "Standaard locatie:"
 
-#: mod/group.php:60 mod/group.php:187
-msgid "Group not found."
-msgstr "Groep niet gevonden."
+#: mod/settings.php:1198
+msgid "Use Browser Location:"
+msgstr "Gebruik Webbrowser Locatie:"
 
-#: mod/group.php:74
-msgid "Group name changed."
-msgstr "Groepsnaam gewijzigd."
+#: mod/settings.php:1201
+msgid "Security and Privacy Settings"
+msgstr "Instellingen voor Beveiliging en Privacy"
 
-#: mod/group.php:87 mod/profperm.php:30 src/App.php:1785
-msgid "Permission denied"
-msgstr "Toegang geweigerd"
+#: mod/settings.php:1203
+msgid "Maximum Friend Requests/Day:"
+msgstr "Maximum aantal vriendschapsverzoeken per dag:"
 
-#: mod/group.php:105
-msgid "Save Group"
-msgstr "Bewaar groep"
+#: mod/settings.php:1203 mod/settings.php:1232
+msgid "(to prevent spam abuse)"
+msgstr "(om spam misbruik te voorkomen)"
 
-#: mod/group.php:106
-msgid "Filter"
-msgstr "filter"
+#: mod/settings.php:1204
+msgid "Default Post Permissions"
+msgstr "Standaard rechten voor nieuwe berichten"
 
-#: mod/group.php:111
-msgid "Create a group of contacts/friends."
-msgstr "Maak een groep contacten/vrienden aan."
+#: mod/settings.php:1205
+msgid "(click to open/close)"
+msgstr "(klik om te openen/sluiten)"
 
-#: mod/group.php:112 mod/group.php:136 mod/group.php:229
-#: src/Model/Group.php:419
-msgid "Group Name: "
-msgstr "Groepsnaam:"
+#: mod/settings.php:1215
+msgid "Default Private Post"
+msgstr "Standaard Privé Post"
 
-#: mod/group.php:127 src/Model/Group.php:416
-msgid "Contacts not in any group"
-msgstr "Contacten bestaan in geen enkele groep"
+#: mod/settings.php:1216
+msgid "Default Public Post"
+msgstr "Standaard Publieke Post"
 
-#: mod/group.php:159
-msgid "Group removed."
-msgstr "Groep verwijderd."
+#: mod/settings.php:1220
+msgid "Default Permissions for New Posts"
+msgstr "Standaard rechten voor nieuwe berichten"
 
-#: mod/group.php:161
-msgid "Unable to remove group."
-msgstr "Niet in staat om groep te verwijderen."
+#: mod/settings.php:1232
+msgid "Maximum private messages per day from unknown people:"
+msgstr "Maximum aantal privé-berichten per dag van onbekende personen:"
 
-#: mod/group.php:222
-msgid "Delete Group"
-msgstr "Verwijder Groep"
+#: mod/settings.php:1235
+msgid "Notification Settings"
+msgstr "Notificatie Instellingen"
 
-#: mod/group.php:233
-msgid "Edit Group Name"
-msgstr "Bewerk Groep Naam"
+#: mod/settings.php:1236
+msgid "Send a notification email when:"
+msgstr "Stuur een notificatie e-mail wanneer:"
 
-#: mod/group.php:244
-msgid "Members"
-msgstr "Leden"
+#: mod/settings.php:1237
+msgid "You receive an introduction"
+msgstr "Je ontvangt een vriendschaps- of connectieverzoek"
 
-#: mod/group.php:246 src/Module/Contact.php:711
-msgid "All Contacts"
-msgstr "Alle Contacten"
+#: mod/settings.php:1238
+msgid "Your introductions are confirmed"
+msgstr "Jouw vriendschaps- of connectieverzoeken zijn bevestigd"
 
-#: mod/group.php:247 mod/network.php:659
-msgid "Group is empty"
-msgstr "De groep is leeg"
+#: mod/settings.php:1239
+msgid "Someone writes on your profile wall"
+msgstr "Iemand iets op je tijdlijn schrijft"
 
-#: mod/group.php:260
-msgid "Remove contact from group"
-msgstr "Verwijder contact uit de groep"
+#: mod/settings.php:1240
+msgid "Someone writes a followup comment"
+msgstr "Iemand een reactie schrijft"
 
-#: mod/group.php:278 mod/profperm.php:119
-msgid "Click on a contact to add or remove."
-msgstr "Klik op een contact om het toe te voegen of te verwijderen."
+#: mod/settings.php:1241
+msgid "You receive a private message"
+msgstr "Je een privé-bericht ontvangt"
 
-#: mod/group.php:292
-msgid "Add contact to group"
-msgstr "Voeg contact toe aan de groep"
+#: mod/settings.php:1242
+msgid "You receive a friend suggestion"
+msgstr "Je een suggestie voor een vriendschap ontvangt"
 
-#: mod/hcard.php:19
-msgid "No profile"
-msgstr "Geen profiel"
+#: mod/settings.php:1243
+msgid "You are tagged in a post"
+msgstr "Je expliciet in een bericht bent genoemd"
 
-#: mod/help.php:51
-msgid "Help:"
-msgstr "Help:"
+#: mod/settings.php:1244
+msgid "You are poked/prodded/etc. in a post"
+msgstr "Je in een bericht bent aangestoten/gepord/etc."
 
-#: mod/help.php:58 src/Content/Nav.php:187 view/theme/vier/theme.php:297
-msgid "Help"
-msgstr "Help"
+#: mod/settings.php:1246
+msgid "Activate desktop notifications"
+msgstr "Activeer desktop notificaties"
 
-#: mod/home.php:40
-#, php-format
-msgid "Welcome to %s"
-msgstr "Welkom op %s"
+#: mod/settings.php:1246
+msgid "Show desktop popup on new notifications"
+msgstr "Toon desktop pop-up bij nieuwe notificaties"
 
-#: mod/invite.php:38
-msgid "Total invitation limit exceeded."
-msgstr "Totale uitnodigingslimiet overschreden."
+#: mod/settings.php:1248
+msgid "Text-only notification emails"
+msgstr "Alleen-tekst notificatie emails"
 
-#: mod/invite.php:60
-#, php-format
-msgid "%s : Not a valid email address."
-msgstr "%s: Geen geldig e-mailadres."
+#: mod/settings.php:1250
+msgid "Send text only notification emails, without the html part"
+msgstr "Stuur alleen-tekst notificatie emails, zonder het html gedeelte"
 
-#: mod/invite.php:87
-msgid "Please join us on Friendica"
-msgstr "Kom bij ons op Friendica"
+#: mod/settings.php:1252
+msgid "Show detailled notifications"
+msgstr "Toon gedetailleerde notificaties"
 
-#: mod/invite.php:96
-msgid "Invitation limit exceeded. Please contact your site administrator."
-msgstr "Uitnodigingslimiet overschreden. Neem contact op met de beheerder van je website."
+#: mod/settings.php:1254
+msgid ""
+"Per default, notifications are condensed to a single notification per item. "
+"When enabled every notification is displayed."
+msgstr "Standaard worden notificaties samengevoegd in een enkele notificatie per item. Als je deze parameter activeert wordt elke notificatie getoond."
 
-#: mod/invite.php:100
-#, php-format
-msgid "%s : Message delivery failed."
-msgstr "%s : Aflevering van bericht mislukt."
+#: mod/settings.php:1256
+msgid "Advanced Account/Page Type Settings"
+msgstr "Geavanceerde Account/Pagina Type Instellingen"
 
-#: mod/invite.php:104
-#, php-format
-msgid "%d message sent."
-msgid_plural "%d messages sent."
-msgstr[0] "%d bericht verzonden."
-msgstr[1] "%d berichten verzonden."
+#: mod/settings.php:1257
+msgid "Change the behaviour of this account for special situations"
+msgstr "Pas het gedrag van dit account aan voor speciale situaties"
 
-#: mod/invite.php:122
-msgid "You have no more invitations available"
-msgstr "Je kunt geen uitnodigingen meer sturen"
+#: mod/settings.php:1260
+msgid "Relocate"
+msgstr "Verhuis"
 
-#: mod/invite.php:130
-#, php-format
+#: mod/settings.php:1261
 msgid ""
-"Visit %s for a list of public sites that you can join. Friendica members on "
-"other sites can all connect with each other, as well as with members of many"
-" other social networks."
-msgstr "Bezoek %s voor een lijst van openbare sites waar je je kunt aansluiten. Friendica leden op andere sites kunnen allemaal met elkaar verbonden worden, en ook met leden van verschillende andere sociale netwerken."
+"If you have moved this profile from another server, and some of your "
+"contacts don't receive your updates, try pushing this button."
+msgstr "Als je je profiel van een andere server hebt verhuisd, en er zijn contacten die geen updates van je ontvangen, probeer dan eens deze knop."
+
+#: mod/settings.php:1262
+msgid "Resend relocate message to contacts"
+msgstr "Stuur verhuis boodschap naar contacten"
 
-#: mod/invite.php:132
+#: mod/subthread.php:104
 #, php-format
-msgid ""
-"To accept this invitation, please visit and register at %s or any other "
-"public Friendica website."
-msgstr "Om deze uitnodiging te accepteren kan je je op %s registreren of op een andere vrij toegankelijke Friendica-website."
-
-#: mod/invite.php:133
-#, php-format
-msgid ""
-"Friendica sites all inter-connect to create a huge privacy-enhanced social "
-"web that is owned and controlled by its members. They can also connect with "
-"many traditional social networks. See %s for a list of alternate Friendica "
-"sites you can join."
-msgstr "Friendica servers zijn allemaal onderling verbonden om een reusachtig sociaal web te maken met verbeterde privacy, dat eigendom is van en gecontroleerd door zijn leden. Ze kunnen ook verbindingen maken met verschillende traditionele sociale netwerken. Bekijk %s voor een lijst van alternatieve Friendica servers waar je aan kunt sluiten."
+msgid "%1$s is following %2$s's %3$s"
+msgstr "%1$s volgt %3$s van %2$s"
 
-#: mod/invite.php:137
-msgid ""
-"Our apologies. This system is not currently configured to connect with other"
-" public sites or invite members."
-msgstr "Onze verontschuldigingen. Dit systeem is momenteel niet ingesteld om verbinding te maken met andere openbare plaatsen of leden uit te nodigen."
+#: mod/suggest.php:28
+msgid "Contact suggestion successfully ignored."
+msgstr "Contact suggestie succesvol genegeerd"
 
-#: mod/invite.php:141
+#: mod/suggest.php:52
 msgid ""
-"Friendica sites all inter-connect to create a huge privacy-enhanced social "
-"web that is owned and controlled by its members. They can also connect with "
-"many traditional social networks."
-msgstr "Friendica servers zijn allemaal onderling verbonden om een reusachtig sociaal web te maken met verbeterde privacy, dat eigendom is van en gecontroleerd door zijn leden. Ze kunnen ook verbindingen maken met verschillende traditionele sociale netwerken."
+"No suggestions available. If this is a new site, please try again in 24 "
+"hours."
+msgstr "Geen voorstellen beschikbaar. Als dit een nieuwe website is, kun je het over 24 uur nog eens proberen."
 
-#: mod/invite.php:140
-#, php-format
-msgid "To accept this invitation, please visit and register at %s."
-msgstr "Om deze uitnodiging te accepteren, ga naar en registreer op %s."
+#: mod/suggest.php:71
+msgid "Do you really want to delete this suggestion?"
+msgstr "Wil je echt dit voorstel verwijderen?"
 
-#: mod/invite.php:147
-msgid "Send invitations"
-msgstr "Verstuur uitnodigingen"
+#: mod/suggest.php:89 mod/suggest.php:109
+msgid "Ignore/Hide"
+msgstr "Negeren/Verbergen"
 
-#: mod/invite.php:148
-msgid "Enter email addresses, one per line:"
-msgstr "Vul e-mailadressen in, één per lijn:"
+#: mod/suggest.php:119 view/theme/vier/theme.php:204 src/Content/Widget.php:69
+msgid "Friend Suggestions"
+msgstr "Vriendschapsvoorstellen"
 
-#: mod/invite.php:149 mod/message.php:259 mod/message.php:420
-#: mod/wallmessage.php:137
-msgid "Your message:"
-msgstr "Jouw bericht:"
+#: mod/uexport.php:52
+msgid "Export account"
+msgstr "Account exporteren"
 
-#: mod/invite.php:149
+#: mod/uexport.php:52
 msgid ""
-"You are cordially invited to join me and other close friends on Friendica - "
-"and help us to create a better social web."
-msgstr "Ik nodig je vriendelijk uit om bij mij en andere vrienden te komen op Friendica - en ons te helpen om een beter sociaal web te bouwen."
-
-#: mod/invite.php:151
-msgid "You will need to supply this invitation code: $invite_code"
-msgstr "Je zult deze uitnodigingscode moeten invullen: $invite_code"
+"Export your account info and contacts. Use this to make a backup of your "
+"account and/or to move it to another server."
+msgstr "Je account informatie en contacten exporteren. Gebruik dit om een backup van je account te maken en/of om het te verhuizen naar een andere server."
 
-#: mod/invite.php:151
-msgid ""
-"Once you have registered, please connect with me via my profile page at:"
-msgstr "Eens je geregistreerd bent kun je contact leggen met mij via mijn profielpagina op:"
+#: mod/uexport.php:53
+msgid "Export all"
+msgstr "Alles exporteren"
 
-#: mod/invite.php:153
+#: mod/uexport.php:53
 msgid ""
-"For more information about the Friendica project and why we feel it is "
-"important, please visit http://friendi.ca"
-msgstr "Voor meer informatie over het Friendica project en waarom wij denken dat het belangrijk is kun je http://friendi.ca/ bezoeken"
+"Export your accout info, contacts and all your items as json. Could be a "
+"very big file, and could take a lot of time. Use this to make a full backup "
+"of your account (photos are not exported)"
+msgstr "Je account info, contacten en al je items in json formaat exporteren. Dit kan een heel groot bestand worden, en kan lang duren. Gebruik dit om een volledige backup van je account te maken (foto's worden niet geexporteerd)"
 
-#: mod/item.php:120
-msgid "Unable to locate original post."
-msgstr "Ik kan de originele post niet meer vinden."
+#: mod/videos.php:123
+msgid "No videos selected"
+msgstr "Geen video's geselecteerd"
 
-#: mod/item.php:288
-msgid "Empty post discarded."
-msgstr "Lege post weggegooid."
+#: mod/videos.php:280 src/Model/Item.php:3468
+msgid "View Video"
+msgstr "Bekijk Video"
 
-#: mod/item.php:810
-#, php-format
-msgid ""
-"This message was sent to you by %s, a member of the Friendica social "
-"network."
-msgstr "Dit bericht werd naar jou gestuurd door %s, een lid van het Friendica sociale netwerk."
+#: mod/videos.php:295
+msgid "Recent Videos"
+msgstr "Recente video's"
 
-#: mod/item.php:812
-#, php-format
-msgid "You may visit them online at %s"
-msgstr "Je kunt ze online bezoeken op %s"
+#: mod/videos.php:297
+msgid "Upload New Videos"
+msgstr "Nieuwe video's uploaden"
 
-#: mod/item.php:813
-msgid ""
-"Please contact the sender by replying to this post if you do not wish to "
-"receive these messages."
-msgstr "Contacteer de afzender door op dit bericht te antwoorden als je deze berichten niet wilt ontvangen."
+#: view/theme/duepuntozero/config.php:55 src/Model/User.php:745
+msgid "default"
+msgstr "standaard"
 
-#: mod/item.php:817
-#, php-format
-msgid "%s posted an update."
-msgstr "%s heeft een wijziging geplaatst."
+#: view/theme/duepuntozero/config.php:56
+msgid "greenzero"
+msgstr "greenzero"
 
-#: mod/localtime.php:19 src/Model/Event.php:38 src/Model/Event.php:844
-msgid "l F d, Y \\@ g:i A"
-msgstr "l F d, Y \\@ g:i A"
+#: view/theme/duepuntozero/config.php:57
+msgid "purplezero"
+msgstr "purplezero"
 
-#: mod/localtime.php:33
-msgid "Time Conversion"
-msgstr "Tijdsconversie"
+#: view/theme/duepuntozero/config.php:58
+msgid "easterbunny"
+msgstr "easterbunny"
 
-#: mod/localtime.php:35
-msgid ""
-"Friendica provides this service for sharing events with other networks and "
-"friends in unknown timezones."
-msgstr "Friendica biedt deze dienst aan om gebeurtenissen te delen met andere netwerken en vrienden in onbekende tijdzones."
+#: view/theme/duepuntozero/config.php:59
+msgid "darkzero"
+msgstr "darkzero"
 
-#: mod/localtime.php:39
-#, php-format
-msgid "UTC time: %s"
-msgstr "UTC tijd: %s"
+#: view/theme/duepuntozero/config.php:60
+msgid "comix"
+msgstr "comix"
 
-#: mod/localtime.php:42
-#, php-format
-msgid "Current timezone: %s"
-msgstr "Huidige Tijdzone: %s"
+#: view/theme/duepuntozero/config.php:61
+msgid "slackr"
+msgstr "slackr"
 
-#: mod/localtime.php:46
-#, php-format
-msgid "Converted localtime: %s"
-msgstr "Omgerekende lokale tijd: %s"
+#: view/theme/duepuntozero/config.php:74
+msgid "Variations"
+msgstr "Variaties"
 
-#: mod/localtime.php:52
-msgid "Please select your timezone:"
-msgstr "Selecteer je tijdzone:"
+#: view/theme/frio/php/Image.php:24
+msgid "Top Banner"
+msgstr "Banner Bovenaan"
 
-#: mod/lockview.php:46 mod/lockview.php:57
-msgid "Remote privacy information not available."
-msgstr "Privacyinformatie op afstand niet beschikbaar."
+#: 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 "Pas het beeld aan aan de breedte van het scherm en toon achtergrondkleur onder lange pagina's"
 
-#: mod/lockview.php:66
-msgid "Visible to:"
-msgstr "Zichtbaar voor:"
+#: view/theme/frio/php/Image.php:25
+msgid "Full screen"
+msgstr "Volledig scherm"
 
-#: mod/lostpass.php:30
-msgid "No valid account found."
-msgstr "Geen geldige account gevonden."
+#: view/theme/frio/php/Image.php:25
+msgid ""
+"Resize image to fill entire screen, clipping either the right or the bottom."
+msgstr "Pas het beeld aan om het hele scherm te vullen, met ofwel de rechter- of de onderkant afgeknipt."
 
-#: mod/lostpass.php:42
-msgid "Password reset request issued. Check your email."
-msgstr "Verzoek om wachtwoord opnieuw in te stellen werd verstuurd. Kijk uw e-mail na."
+#: view/theme/frio/php/Image.php:26
+msgid "Single row mosaic"
+msgstr "Enkele rij mozaïek"
 
-#: mod/lostpass.php:48
-#, php-format
+#: view/theme/frio/php/Image.php:26
 msgid ""
-"\n"
-"\t\tDear %1$s,\n"
-"\t\t\tA request was recently received at \"%2$s\" to reset your account\n"
-"\t\tpassword. In order to confirm this request, please select the verification link\n"
-"\t\tbelow or paste it into your web browser address bar.\n"
-"\n"
-"\t\tIf you did NOT request this change, please DO NOT follow the link\n"
-"\t\tprovided and ignore and/or delete this email, the request will expire shortly.\n"
-"\n"
-"\t\tYour password will not be changed unless we can verify that you\n"
-"\t\tissued this request."
-msgstr "\n\t\tBeste %1$s,\n\t\t\tEr is recent om \"%2$s\" een verzoek gekomen om je paswoord te resetten.\n\t\tOm dit verzoek te bevestigen, gelieve de verificatie link hieronder te volgen of in je browser te kopiëren.\n\n\t\tAls je dit verzoek NIET hebt gedaan, volg deze link dan NIET en negeer \n\t\ten/of verwijder deze email, het verzoek zal binnenkort vanzelf ongeldig worden.\n\n\t\tJe paswoord zal niet aangepast worden tenzij we kunnen verifiëren\n\t\tdat je dit verzoek verzonden hebt."
+"Resize image to repeat it on a single row, either vertical or horizontal."
+msgstr "Pas het beeld aan zodat het herhaald wordt op een enkele rij, ofwel vertikaal ofwel horizontaal"
 
-#: mod/lostpass.php:59
-#, php-format
-msgid ""
-"\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"
-msgstr "\n\t\tVolg nu deze link om je identiteit te bevestigen:\n\n\t\t%1$s\n\n\t\tJe zal dan een boodschap krijgen met je nieuw paswoord.\n\t\tJe kunt je paswoord veranderen in je instelling pagina nadat je ingelogd bent.\n\n\t\tDe login details zijn de volgende:\n\n\t\tSite locatie:\t%2$s\n\t\tLogin naam:\t%3$s"
+#: view/theme/frio/php/Image.php:27
+msgid "Mosaic"
+msgstr "Mozaïek"
 
-#: mod/lostpass.php:78
-#, php-format
-msgid "Password reset requested at %s"
-msgstr "Op %s werd gevraagd je wachtwoord opnieuw in te stellen"
+#: view/theme/frio/php/Image.php:27
+msgid "Repeat image to fill the screen."
+msgstr "Herhaal beeld om het scherm te vullen."
 
-#: mod/lostpass.php:94
-msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
-msgstr "Verzoek kon niet geverifieerd worden. (Misschien heb je het voordien al ingediend.) Wachtwoord niet opnieuw ingesteld."
+#: view/theme/frio/config.php:111
+msgid "Custom"
+msgstr "Aangepast"
 
-#: mod/lostpass.php:107
-msgid "Request has expired, please make a new one."
-msgstr "Aanvraag is verlopen, gelieve een nieuwe aan te maken."
+#: view/theme/frio/config.php:123
+msgid "Note"
+msgstr "Nota"
 
-#: mod/lostpass.php:122
-msgid "Forgot your Password?"
-msgstr "Wachtwoord vergeten?"
+#: view/theme/frio/config.php:123
+msgid "Check image permissions if all users are allowed to see the image"
+msgstr "Controleer of alle gebruikers permissie hebben om het beeld te zien "
+
+#: view/theme/frio/config.php:129
+msgid "Select color scheme"
+msgstr "Selecteer kleurschema"
 
-#: mod/lostpass.php:123
+#: view/theme/frio/config.php:130
+msgid "Copy or paste schemestring"
+msgstr "Kopieer of plak schemastring"
+
+#: view/theme/frio/config.php:130
 msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
-msgstr "Voer je e-mailadres in en verstuur het om je wachtwoord opnieuw in te stellen. Kijk dan je e-mail na voor verdere instructies."
+"You can copy this string to share your theme with others. Pasting here "
+"applies the schemestring"
+msgstr "Je kan deze string kopiëren om uw je kleurenschema met anderen te delen. Een schemastring plakken past deze toe."
 
-#: mod/lostpass.php:124 src/Module/Login.php:324
-msgid "Nickname or Email: "
-msgstr "Bijnaam of e-mail:"
+#: view/theme/frio/config.php:131
+msgid "Navigation bar background color"
+msgstr "Navigatie balk achtergrondkleur"
 
-#: mod/lostpass.php:125
-msgid "Reset"
-msgstr "Opnieuw"
+#: view/theme/frio/config.php:132
+msgid "Navigation bar icon color "
+msgstr "Navigatie balk icoon kleur"
 
-#: mod/lostpass.php:141 src/Module/Login.php:336
-msgid "Password Reset"
-msgstr "Wachtwoord opnieuw instellen"
+#: view/theme/frio/config.php:133
+msgid "Link color"
+msgstr "Link kleur"
 
-#: mod/lostpass.php:142
-msgid "Your password has been reset as requested."
-msgstr "Je wachtwoord is opnieuw ingesteld zoals gevraagd."
+#: view/theme/frio/config.php:134
+msgid "Set the background color"
+msgstr "Stel de achtergrondkleur in"
 
-#: mod/lostpass.php:143
-msgid "Your new password is"
-msgstr "Je nieuwe wachtwoord is"
+#: view/theme/frio/config.php:135
+msgid "Content background opacity"
+msgstr "Content achtergrond opaciteit"
 
-#: mod/lostpass.php:144
-msgid "Save or copy your new password - and then"
-msgstr "Bewaar of kopieer je nieuw wachtwoord - en dan"
+#: view/theme/frio/config.php:136
+msgid "Set the background image"
+msgstr "Stel het achtergrondbeeld in"
 
-#: mod/lostpass.php:145
-msgid "click here to login"
-msgstr "klik hier om in te loggen"
+#: view/theme/frio/config.php:137
+msgid "Background image style"
+msgstr "Achtergrond beeld stijl"
 
-#: mod/lostpass.php:146
-msgid ""
-"Your password may be changed from the <em>Settings</em> page after "
-"successful login."
-msgstr "Je kunt dit wachtwoord veranderen nadat je bent ingelogd op de <em>Instellingen></em> pagina."
+#: view/theme/frio/config.php:139
+msgid "Enable Compose page"
+msgstr "Nieuw bericht pagina activeren"
 
-#: mod/lostpass.php:154
-#, php-format
+#: view/theme/frio/config.php:139
 msgid ""
-"\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"
-msgstr "\n\t\t\tBeste %1$s,\n\t\t\t\tJe paswoord is aangepast zoals je gevraagd hebt. Hou deze informatie\n\t\t\talstublieft bij (of pas je paswoord onmiddellijk aan\n\t\t\tnaar iets wat je je kan herinneren).\n\t\t"
-
-#: mod/lostpass.php:160
-#, php-format
-msgid ""
-"\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"
-msgstr "\n\t\t\tJe login details zijn de volgende:\n\n\t\t\tSite Locatie:\t%1$s\n\t\t\tLogin Naam:\t%2$s\n\t\t\tPaswoord:\t%3$s\n\n\t\t\tJe kan dit paswoord in het account instellingen aanpassen nadat je ingelogd bent.\n\t\t"
+"This replaces the jot modal window for writing new posts with a link to <a "
+"href=\"compose\">the new Compose page</a>."
+msgstr ""
 
-#: mod/lostpass.php:176
-#, php-format
-msgid "Your password has been changed at %s"
-msgstr "Je wachtwoord is veranderd op %s"
+#: view/theme/frio/config.php:143
+msgid "Login page background image"
+msgstr "Achtergrondafbeelding aanmeldpagina"
 
-#: mod/maintenance.php:26
-msgid "System down for maintenance"
-msgstr "Systeem onbeschikbaar wegens onderhoud"
+#: view/theme/frio/config.php:147
+msgid "Login page background color"
+msgstr "Achtergrondkleur aanmeldpagina"
 
-#: mod/manage.php:181
-msgid "Manage Identities and/or Pages"
-msgstr "Beheer Identiteiten en/of Pagina's"
+#: view/theme/frio/config.php:147
+msgid "Leave background image and color empty for theme defaults"
+msgstr "Laat de achtergrondafbeelding en kleur leeg om de standaard van het thema te gebruiken"
 
-#: mod/manage.php:182
-msgid ""
-"Toggle between different identities or community/group pages which share "
-"your account details or which you have been granted \"manage\" permissions"
-msgstr "Wissel tussen verschillende identiteiten of forum/groeppagina's die jouw accountdetails delen of waar je \"beheerdersrechten\" hebt gekregen."
+#: view/theme/frio/theme.php:246
+msgid "Guest"
+msgstr "Gast"
 
-#: mod/manage.php:183
-msgid "Select an identity to manage: "
-msgstr "Selecteer een identiteit om te beheren:"
+#: view/theme/frio/theme.php:251
+msgid "Visitor"
+msgstr "Bezoeker"
 
-#: mod/match.php:51
-msgid "No keywords to match. Please add keywords to your default profile."
-msgstr "Geen sleutelwoorden om te zoeken. Voeg sleutelwoorden toe aan je standaard profiel."
+#: view/theme/frio/theme.php:267 src/Content/Nav.php:160
+#: src/Model/Profile.php:909 src/Module/Contact.php:654
+#: src/Module/Contact.php:856 src/Module/Settings/TwoFactor/Index.php:91
+msgid "Status"
+msgstr "Tijdlijn"
 
-#: mod/match.php:106
-msgid "is interested in:"
-msgstr "Is geïnteresseerd in:"
+#: view/theme/frio/theme.php:267 src/Content/Nav.php:160
+#: src/Content/Nav.php:244
+msgid "Your posts and conversations"
+msgstr "Jouw berichten en gesprekken"
 
-#: mod/match.php:120
-msgid "Profile Match"
-msgstr "Profielmatch"
+#: view/theme/frio/theme.php:268 src/Content/Nav.php:161
+msgid "Your profile page"
+msgstr "Jouw profiel pagina"
 
-#: mod/message.php:35 mod/message.php:118 src/Content/Nav.php:252
-msgid "New Message"
-msgstr "Nieuw Bericht"
+#: view/theme/frio/theme.php:269 src/Content/Nav.php:162
+msgid "Your photos"
+msgstr "Jouw foto's"
 
-#: mod/message.php:72 mod/wallmessage.php:60
-msgid "No recipient selected."
-msgstr "Geen ontvanger geselecteerd."
+#: view/theme/frio/theme.php:270 src/Content/Nav.php:163
+#: src/Model/Profile.php:933 src/Model/Profile.php:936
+msgid "Videos"
+msgstr "Video's"
 
-#: mod/message.php:76
-msgid "Unable to locate contact information."
-msgstr "Ik kan geen contact informatie vinden."
+#: view/theme/frio/theme.php:270 src/Content/Nav.php:163
+msgid "Your videos"
+msgstr "Je video's"
 
-#: mod/message.php:79 mod/wallmessage.php:66
-msgid "Message could not be sent."
-msgstr "Bericht kon niet verzonden worden."
+#: view/theme/frio/theme.php:271 src/Content/Nav.php:164
+msgid "Your events"
+msgstr "Jouw gebeurtenissen"
 
-#: mod/message.php:82 mod/wallmessage.php:69
-msgid "Message collection failure."
-msgstr "Fout bij het verzamelen van berichten."
+#: view/theme/frio/theme.php:274 src/Core/NotificationsManager.php:151
+#: src/Content/Nav.php:241
+msgid "Network"
+msgstr "Netwerk"
 
-#: mod/message.php:85 mod/wallmessage.php:72
-msgid "Message sent."
-msgstr "Bericht verzonden."
+#: view/theme/frio/theme.php:274 src/Content/Nav.php:241
+msgid "Conversations from your friends"
+msgstr "Gesprekken van je vrienden"
 
-#: mod/message.php:112 mod/notifications.php:47 mod/notifications.php:185
-#: mod/notifications.php:233
-msgid "Discard"
-msgstr "Verwerpen"
+#: view/theme/frio/theme.php:275 src/Content/Nav.php:228
+#: src/Model/Profile.php:948 src/Model/Profile.php:959
+msgid "Events and Calendar"
+msgstr "Gebeurtenissen en kalender"
 
-#: mod/message.php:125 src/Content/Nav.php:249 view/theme/frio/theme.php:282
-msgid "Messages"
+#: view/theme/frio/theme.php:276 src/Content/Nav.php:254
+msgid "Private mail"
 msgstr "Privéberichten"
 
-#: mod/message.php:150
-msgid "Do you really want to delete this message?"
-msgstr "Wil je echt dit bericht verwijderen?"
-
-#: mod/message.php:168
-msgid "Conversation not found."
-msgstr "Gesprek niet gevonden."
+#: view/theme/frio/theme.php:277 src/Content/Nav.php:265
+msgid "Account settings"
+msgstr "Account instellingen"
 
-#: mod/message.php:173
-msgid "Message deleted."
-msgstr "Bericht verwijderd."
+#: view/theme/frio/theme.php:278 src/Content/Text/HTML.php:900
+#: src/Content/Nav.php:205 src/Content/Nav.php:271 src/Model/Profile.php:988
+#: src/Model/Profile.php:991 src/Module/Contact.php:800
+#: src/Module/Contact.php:884
+msgid "Contacts"
+msgstr "Contacten"
 
-#: mod/message.php:178 mod/message.php:193
-msgid "Conversation removed."
-msgstr "Gesprek verwijderd."
+#: view/theme/frio/theme.php:278 src/Content/Nav.php:271
+msgid "Manage/edit friends and contacts"
+msgstr "Beheer/Wijzig vrienden en contacten"
 
-#: mod/message.php:207 mod/message.php:347 mod/wallmessage.php:123
-msgid "Please enter a link URL:"
-msgstr "Vul een internetadres/URL in:"
+#: view/theme/quattro/config.php:76
+msgid "Alignment"
+msgstr "Uitlijning"
 
-#: mod/message.php:250 mod/wallmessage.php:128
-msgid "Send Private Message"
-msgstr "Verstuur privébericht"
+#: view/theme/quattro/config.php:76
+msgid "Left"
+msgstr "Links"
 
-#: mod/message.php:251 mod/message.php:415 mod/wallmessage.php:130
-msgid "To:"
-msgstr "Aan:"
+#: view/theme/quattro/config.php:76
+msgid "Center"
+msgstr "Gecentreerd"
 
-#: mod/message.php:255 mod/message.php:417 mod/wallmessage.php:131
-msgid "Subject:"
-msgstr "Onderwerp:"
+#: view/theme/quattro/config.php:77
+msgid "Color scheme"
+msgstr "Kleurschema"
 
-#: mod/message.php:293
-msgid "No messages."
-msgstr "Geen berichten."
+#: view/theme/quattro/config.php:78
+msgid "Posts font size"
+msgstr "Lettergrootte berichten"
 
-#: mod/message.php:334
-msgid "Message not available."
-msgstr "Bericht niet beschikbaar."
+#: view/theme/quattro/config.php:79
+msgid "Textareas font size"
+msgstr "Lettergrootte tekstgebieden"
 
-#: mod/message.php:391
-msgid "Delete message"
-msgstr "Verwijder bericht"
+#: view/theme/vier/config.php:76
+msgid "Comma separated list of helper forums"
+msgstr "Kommagescheiden lijst van de helper forums"
 
-#: mod/message.php:393 mod/message.php:494
-msgid "D, d M Y - g:i A"
-msgstr "D, d M Y - g:i A"
+#: view/theme/vier/config.php:116 src/Core/ACL.php:302
+msgid "don't show"
+msgstr "niet tonen"
 
-#: mod/message.php:408 mod/message.php:491
-msgid "Delete conversation"
-msgstr "Verwijder gesprek"
+#: view/theme/vier/config.php:116 src/Core/ACL.php:301
+msgid "show"
+msgstr "tonen"
 
-#: mod/message.php:410
-msgid ""
-"No secure communications available. You <strong>may</strong> be able to "
-"respond from the sender's profile page."
-msgstr "Geen beveiligde communicatie beschikbaar. Je kunt <strong>misschien</strong> antwoorden vanaf de profiel-pagina van de afzender."
+#: view/theme/vier/config.php:122
+msgid "Set style"
+msgstr "Stijl instellen"
 
-#: mod/message.php:414
-msgid "Send Reply"
-msgstr "Verstuur Antwoord"
+#: view/theme/vier/config.php:123
+msgid "Community Pages"
+msgstr "Forum/groepspagina's"
 
-#: mod/message.php:465
-#, php-format
-msgid "Unknown sender - %s"
-msgstr "Onbekende afzender - %s"
+#: view/theme/vier/config.php:124 view/theme/vier/theme.php:151
+msgid "Community Profiles"
+msgstr "Forum/groepsprofielen"
 
-#: mod/message.php:467
-#, php-format
-msgid "You and %s"
-msgstr "Jij en %s"
+#: view/theme/vier/config.php:125
+msgid "Help or @NewHere ?"
+msgstr "Help of @NewHere ?"
 
-#: mod/message.php:469
-#, php-format
-msgid "%s and You"
-msgstr "%s en jij"
+#: view/theme/vier/config.php:126 view/theme/vier/theme.php:373
+msgid "Connect Services"
+msgstr "Diensten verbinden"
 
-#: mod/message.php:497
-#, php-format
-msgid "%d message"
-msgid_plural "%d messages"
-msgstr[0] "%d bericht"
-msgstr[1] "%d berichten"
+#: view/theme/vier/config.php:127
+msgid "Find Friends"
+msgstr "Zoek vrienden"
 
-#: mod/network.php:192 mod/search.php:40
-msgid "Remove term"
-msgstr "Verwijder zoekterm"
+#: view/theme/vier/config.php:128 view/theme/vier/theme.php:181
+msgid "Last users"
+msgstr "Laatste gebruikers"
 
-#: mod/network.php:199 mod/search.php:49
-msgid "Saved Searches"
-msgstr "Opgeslagen zoekopdrachten"
+#: view/theme/vier/theme.php:199 src/Content/Widget.php:64
+msgid "Find People"
+msgstr "Zoek mensen"
 
-#: mod/network.php:200 src/Model/Group.php:410
-msgid "add"
-msgstr "toevoegen"
+#: view/theme/vier/theme.php:200 src/Content/Widget.php:65
+msgid "Enter name or interest"
+msgstr "Vul naam of interesse in"
 
-#: mod/network.php:567
-#, php-format
-msgid ""
-"Warning: This group contains %s member from a network that doesn't allow non"
-" public messages."
-msgid_plural ""
-"Warning: This group contains %s members from a network that doesn't allow "
-"non public messages."
-msgstr[0] "Waarschuwing: Deze groep bevat %s lid van een netwerk dat geen niet-publieke boodschappen toelaat."
-msgstr[1] "Waarschuwing: Deze groep bevat %s leden van een netwerk dat geen niet-publieke boodschappen toelaat."
+#: view/theme/vier/theme.php:202 src/Content/Widget.php:67
+msgid "Examples: Robert Morgenstein, Fishing"
+msgstr "Voorbeelden: Jan Peeters, Vissen"
 
-#: mod/network.php:570
-msgid "Messages in this group won't be send to these receivers."
-msgstr "Boodschappen in deze groep zullen niet verzonden worden naar deze ontvangers."
+#: view/theme/vier/theme.php:203 src/Content/Widget.php:68
+#: src/Module/Contact.php:820 src/Module/Directory.php:86
+msgid "Find"
+msgstr "Zoek"
 
-#: mod/network.php:638
-msgid "No such group"
-msgstr "Zo'n groep bestaat niet"
+#: view/theme/vier/theme.php:205 src/Content/Widget.php:70
+msgid "Similar Interests"
+msgstr "Dezelfde interesses"
 
-#: mod/network.php:663
-#, php-format
-msgid "Group: %s"
-msgstr "Groep: %s"
+#: view/theme/vier/theme.php:206 src/Content/Widget.php:71
+msgid "Random Profile"
+msgstr "Willekeurig Profiel"
 
-#: mod/network.php:689
-msgid "Private messages to this person are at risk of public disclosure."
-msgstr "Privéberichten naar deze persoon kunnen openbaar gemaakt worden."
+#: view/theme/vier/theme.php:207 src/Content/Widget.php:72
+msgid "Invite Friends"
+msgstr "Vrienden uitnodigen"
 
-#: mod/network.php:692
-msgid "Invalid contact."
-msgstr "Ongeldig contact."
+#: view/theme/vier/theme.php:208 src/Content/Widget.php:73
+#: src/Module/Directory.php:78
+msgid "Global Directory"
+msgstr "Globale gids"
 
-#: mod/network.php:970
-msgid "Commented Order"
-msgstr "Nieuwe reacties bovenaan"
+#: view/theme/vier/theme.php:210 src/Content/Widget.php:75
+msgid "Local Directory"
+msgstr "Lokale gids"
 
-#: mod/network.php:973
-msgid "Sort by Comment Date"
-msgstr "Berichten met nieuwe reacties bovenaan"
+#: view/theme/vier/theme.php:250 src/Content/Text/HTML.php:903
+#: src/Content/ForumManager.php:130 src/Content/Nav.php:209
+msgid "Forums"
+msgstr "Forums"
 
-#: mod/network.php:978
-msgid "Posted Order"
-msgstr "Nieuwe berichten bovenaan"
+#: view/theme/vier/theme.php:252 src/Content/ForumManager.php:132
+msgid "External link to forum"
+msgstr "Externe link naar het forum"
 
-#: mod/network.php:981
-msgid "Sort by Post Date"
-msgstr "Nieuwe berichten bovenaan"
+#: view/theme/vier/theme.php:255 src/Content/ForumManager.php:135
+#: src/Content/Widget.php:407 src/Content/Widget.php:507
+msgid "show more"
+msgstr "toon meer"
 
-#: mod/network.php:988 mod/profiles.php:595
-#: src/Core/NotificationsManager.php:187
-msgid "Personal"
-msgstr "Persoonlijk"
+#: view/theme/vier/theme.php:288
+msgid "Quick Start"
+msgstr "Snelstart"
 
-#: mod/network.php:991
-msgid "Posts that mention or involve you"
-msgstr "Alleen berichten die jou vermelden of op jou betrekking hebben"
+#: view/theme/vier/theme.php:294 src/Content/Nav.php:192
+#: src/Module/Help.php:50 src/Module/Settings/TwoFactor/AppSpecific.php:99
+#: src/Module/Settings/TwoFactor/Index.php:90
+#: src/Module/Settings/TwoFactor/Recovery.php:77
+#: src/Module/Settings/TwoFactor/Verify.php:117
+msgid "Help"
+msgstr "Help"
 
-#: mod/network.php:998
-msgid "New"
-msgstr "Nieuw"
+#: src/Core/ACL.php:288 src/Module/Item/Compose.php:139
+msgid "Post to Email"
+msgstr "Verzenden per e-mail"
 
-#: mod/network.php:1001
-msgid "Activity Stream - by date"
-msgstr "Activiteitenstroom - volgens datum"
+#: src/Core/ACL.php:300
+msgid "Visible to everybody"
+msgstr "Zichtbaar voor iedereen"
 
-#: mod/network.php:1009
-msgid "Shared Links"
-msgstr "Gedeelde links"
+#: src/Core/ACL.php:311
+msgid "Connectors"
+msgstr ""
 
-#: mod/network.php:1012
-msgid "Interesting Links"
-msgstr "Interessante links"
+#: src/Core/ACL.php:313
+msgid "Hide your profile details from unknown viewers?"
+msgstr "Je profieldetails verbergen voor onbekende bezoekers?"
 
-#: mod/network.php:1019
-msgid "Starred"
-msgstr "Met ster"
-
-#: mod/network.php:1022
-msgid "Favourite Posts"
-msgstr "Favoriete berichten"
-
-#: mod/newmember.php:11
-msgid "Welcome to Friendica"
-msgstr "Welkom bij Friendica"
+#: src/Core/ACL.php:313
+#, php-format
+msgid "Connectors disabled, since \"%s\" is enabled."
+msgstr "Connectoren gedeactiveerd, aangezien \"%s\" geactiveerd is."
 
-#: mod/newmember.php:12
-msgid "New Member Checklist"
-msgstr "Checklist voor nieuwe leden"
+#: src/Core/ACL.php:315
+msgid "Close"
+msgstr "Afsluiten"
 
-#: mod/newmember.php:14
+#: src/Core/Installer.php:163
 msgid ""
-"We would like to offer some tips and links to help make your experience "
-"enjoyable. Click any item to visit the relevant page. A link to this page "
-"will be visible from your home page for two weeks after your initial "
-"registration and then will quietly disappear."
-msgstr "We willen je een paar tips en verwijzingen aanreiken om je een aangename ervaring te bezorgen. Klik op een item om de relevante pagina's te bezoeken. Een verwijzing naar deze pagina zal twee weken lang na je registratie zichtbaar zijn op je tijdlijn. Daarna zal de verwijzing stilletjes verdwijnen."
-
-#: mod/newmember.php:15
-msgid "Getting Started"
-msgstr "Aan de slag"
-
-#: mod/newmember.php:17
-msgid "Friendica Walk-Through"
-msgstr "Doorloop Friendica"
+"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 "Het databaseconfiguratiebestand \"config/local.config.php\" kon niet worden weggeschreven. Je kunt de bijgevoegde tekst gebruiken om in een configuratiebestand aan te maken in de hoogste map van je webserver. "
 
-#: mod/newmember.php:17
+#: src/Core/Installer.php:182
 msgid ""
-"On your <em>Quick Start</em> page - find a brief introduction to your "
-"profile and network tabs, make some new connections, and find some groups to"
-" join."
-msgstr "Op je <em>Snelstart</em> pagina kun je een korte inleiding vinden over je profiel en netwerk tabs, om enkele nieuwe connecties te leggen en groepen te vinden om lid van te worden."
+"You may need to import the file \"database.sql\" manually using phpmyadmin "
+"or mysql."
+msgstr "Het kan nodig zijn om het bestand \"database.sql\" manueel te importeren met phpmyadmin of mysql."
 
-#: mod/newmember.php:21
-msgid "Go to Your Settings"
-msgstr "Ga naar je instellingen"
+#: src/Core/Installer.php:183 src/Module/Install.php:174
+#: src/Module/Install.php:330
+msgid "Please see the file \"INSTALL.txt\"."
+msgstr "Zie het bestand \"INSTALL.txt\"."
 
-#: mod/newmember.php:21
-msgid ""
-"On your <em>Settings</em> page -  change your initial password. Also make a "
-"note of your Identity Address. This looks just like an email address - and "
-"will be useful in making friends on the free social web."
-msgstr "Verander je initieel wachtwoord op je <em>instellingenpagina</em>. Noteer ook het adres van je identiteit. Dit ziet er uit als een e-mailadres - en zal nuttig zijn om vrienden te maken op het vrije sociale web."
+#: src/Core/Installer.php:244
+msgid "Could not find a command line version of PHP in the web server PATH."
+msgstr "Kan geen command-line-versie van PHP vinden in het PATH van de webserver."
 
-#: mod/newmember.php:22
+#: src/Core/Installer.php:245
 msgid ""
-"Review the other settings, particularly the privacy settings. An unpublished"
-" directory listing is like having an unlisted phone number. In general, you "
-"should probably publish your listing - unless all of your friends and "
-"potential friends know exactly how to find you."
-msgstr "Controleer ook de andere instellingen, in het bijzonder de privacy-instellingen. Een niet-gepubliceerd adres is zoals een privé-telefoonnummer. In het algemeen wil je waarschijnlijk je adres publiceren - tenzij al je vrienden en mogelijke vrienden precies weten hoe je te vinden."
-
-#: mod/newmember.php:24 mod/profperm.php:117 src/Content/Nav.php:154
-#: src/Model/Profile.php:743 src/Model/Profile.php:876
-#: src/Model/Profile.php:909 src/Module/Contact.php:661
-#: src/Module/Contact.php:874 view/theme/frio/theme.php:274
-msgid "Profile"
-msgstr "Profiel"
+"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 "Als je geen command line versie van PHP geïnstalleerd hebt op je server, dan kan je de achtergrondprocessen niet draaien. Zie <a href='https://github.com/friendica/friendica/blob/master/doc/Install.md#set-up-the-worker'>'Installatie van de worker'</a>"
 
-#: mod/newmember.php:26 mod/profiles.php:599 mod/profile_photo.php:250
-msgid "Upload Profile Photo"
-msgstr "Profielfoto uploaden"
+#: src/Core/Installer.php:250
+msgid "PHP executable path"
+msgstr "PATH van het PHP commando"
 
-#: mod/newmember.php:26
+#: src/Core/Installer.php:250
 msgid ""
-"Upload a profile photo if you have not done so already. Studies have shown "
-"that people with real photos of themselves are ten times more likely to make"
-" friends than people who do not."
-msgstr "Upload een profielfoto, als je dat nog niet gedaan hebt. Studies tonen aan dat mensen met echte foto's van zichzelf tien keer gemakkelijker vrienden maken dan mensen die dat niet doen."
+"Enter full path to php executable. You can leave this blank to continue the "
+"installation."
+msgstr "Vul het volledige pad in naar het php programma. Je kunt dit leeg laten om de installatie verder te zetten."
 
-#: mod/newmember.php:27
-msgid "Edit Your Profile"
-msgstr "Bewerk je profiel"
+#: src/Core/Installer.php:255
+msgid "Command line PHP"
+msgstr "PHP-opdrachtregel"
 
-#: mod/newmember.php:27
-msgid ""
-"Edit your <strong>default</strong> profile to your liking. Review the "
-"settings for hiding your list of friends and hiding the profile from unknown"
-" visitors."
-msgstr "Bewerk je <strong>standaard</strong> profiel zoals je wilt. Controleer de instellingen om je vriendenlijst te verbergen, en om je profiel voor ongekende bezoekers te verbergen."
+#: src/Core/Installer.php:264
+msgid "PHP executable is not the php cli binary (could be cgi-fgci version)"
+msgstr "PHP uitvoerbaar bestand is niet de php cli binary (zou kunnen de cgi-fgci versie zijn)"
 
-#: mod/newmember.php:28
-msgid "Profile Keywords"
-msgstr "Sleutelwoorden voor dit profiel"
+#: src/Core/Installer.php:265
+msgid "Found PHP version: "
+msgstr "Gevonden PHP versie:"
 
-#: mod/newmember.php:28
+#: src/Core/Installer.php:267
+msgid "PHP cli binary"
+msgstr "PHP cli binary"
+
+#: src/Core/Installer.php:280
 msgid ""
-"Set some public keywords for your default profile which describe your "
-"interests. We may be able to find other people with similar interests and "
-"suggest friendships."
-msgstr "Stel enkele openbare sleutelwoorden in voor je standaard profiel die je interesses beschrijven. We kunnen dan misschien mensen vinden met gelijkaardige interesses, en vrienden voorstellen."
+"The command line version of PHP on your system does not have "
+"\"register_argc_argv\" enabled."
+msgstr "De command-line versie van PHP op jouw systeem heeft \"register_argc_argv\" niet geactiveerd."
 
-#: mod/newmember.php:30
-msgid "Connecting"
-msgstr "Verbinding aan het maken"
+#: src/Core/Installer.php:281
+msgid "This is required for message delivery to work."
+msgstr "Dit is nodig om het verzenden van berichten mogelijk te maken."
 
-#: mod/newmember.php:36
-msgid "Importing Emails"
-msgstr "E-mails importeren"
+#: src/Core/Installer.php:286
+msgid "PHP register_argc_argv"
+msgstr "PHP register_argc_argv"
 
-#: mod/newmember.php:36
+#: src/Core/Installer.php:318
 msgid ""
-"Enter your email access information on your Connector Settings page if you "
-"wish to import and interact with friends or mailing lists from your email "
-"INBOX"
-msgstr "Vul je e-mailtoegangsinformatie in op je pagina met verbindingsinstellingen als je vrienden of mailinglijsten uit je e-mail-inbox wilt importeren, en met hen wilt communiceren"
-
-#: mod/newmember.php:39
-msgid "Go to Your Contacts Page"
-msgstr "Ga naar je contactenpagina"
+"Error: the \"openssl_pkey_new\" function on this system is not able to "
+"generate encryption keys"
+msgstr "Fout: de \"openssl_pkey_new\" functie op dit systeem kan geen encryptie sleutels genereren"
 
-#: mod/newmember.php:39
+#: src/Core/Installer.php:319
 msgid ""
-"Your Contacts page is your gateway to managing friendships and connecting "
-"with friends on other networks. Typically you enter their address or site "
-"URL in the <em>Add New Contact</em> dialog."
-msgstr "Je contactenpagina is jouw poort om vriendschappen te beheren en verbinding te leggen met vrienden op andere netwerken. Je kunt hun adres of URL toevoegen in de <em>Voeg nieuw contact toe</em> dialoog."
+"If running under Windows, please see "
+"\"http://www.php.net/manual/en/openssl.installation.php\"."
+msgstr "Zie \"http://www.php.net/manual/en/openssl.installation.php\" wanneer u Friendica onder Windows draait."
 
-#: mod/newmember.php:40
-msgid "Go to Your Site's Directory"
-msgstr "Ga naar de gids van je website"
+#: src/Core/Installer.php:322
+msgid "Generate encryption keys"
+msgstr "Genereer encryptie sleutels"
 
-#: mod/newmember.php:40
+#: src/Core/Installer.php:374
 msgid ""
-"The Directory page lets you find other people in this network or other "
-"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
-"their profile page. Provide your own Identity Address if requested."
-msgstr "In de gids vind je andere mensen in dit netwerk of op andere federatieve sites. Zoek naar het woord <em>Connect</em> of <em>Follow</em> op hun profielpagina (meestal aan de linkerkant). Vul je eigen identiteitsadres in wanneer daar om wordt gevraagd."
+"Error: Apache webserver mod-rewrite module is required but not installed."
+msgstr "Fout: Apache-module mod-rewrite is vereist, maar niet geïnstalleerd."
 
-#: mod/newmember.php:41
-msgid "Finding New People"
-msgstr "Nieuwe mensen vinden"
+#: src/Core/Installer.php:379
+msgid "Apache mod_rewrite module"
+msgstr "Apache mod_rewrite module"
 
-#: mod/newmember.php:41
-msgid ""
-"On the side panel of the Contacts page are several tools to find new "
-"friends. We can match people by interest, look up people by name or "
-"interest, and provide suggestions based on network relationships. On a brand"
-" new site, friend suggestions will usually begin to be populated within 24 "
-"hours."
-msgstr "Op het zijpaneel van de Contacten pagina vind je verschillende tools om nieuwe vrienden te zoeken. We kunnen mensen op interesses matchen, mensen opzoeken op naam of hobby, en suggesties doen gebaseerd op netwerk-relaties. Op een nieuwe webstek beginnen vriendschapssuggesties meestal binnen de 24 uur beschikbaar te worden."
+#: src/Core/Installer.php:385
+msgid "Error: PDO or MySQLi PHP module required but not installed."
+msgstr "Fout: PDO of MySQLi PHP module vereist maar niet geïnstalleerd."
 
-#: mod/newmember.php:43 src/Model/Group.php:411 src/Module/Contact.php:759
-msgid "Groups"
-msgstr "Groepen"
+#: src/Core/Installer.php:390
+msgid "Error: The MySQL driver for PDO is not installed."
+msgstr "Fout: de MySQL driver voor PDO is niet geïnstalleerd."
 
-#: mod/newmember.php:45
-msgid "Group Your Contacts"
-msgstr "Groepeer je contacten"
+#: src/Core/Installer.php:394
+msgid "PDO or MySQLi PHP module"
+msgstr "PDO of MySQLi PHP module"
 
-#: mod/newmember.php:45
-msgid ""
-"Once you have made some friends, organize them into private conversation "
-"groups from the sidebar of your Contacts page and then you can interact with"
-" each group privately on your Network page."
-msgstr "Als je een aantal vrienden gemaakt hebt kun je ze in je eigen gespreksgroepen indelen vanuit de zijbalk van je 'Contacten' pagina, en dan kun je met elke groep apart contact houden op je Netwerk pagina. "
+#: src/Core/Installer.php:402
+msgid "Error, XML PHP module required but not installed."
+msgstr "Fout: XML PHP module vereist maar niet geinstalleerd."
 
-#: mod/newmember.php:48
-msgid "Why Aren't My Posts Public?"
-msgstr "Waarom zijn mijn berichten niet openbaar?"
+#: src/Core/Installer.php:406
+msgid "XML PHP module"
+msgstr "XML PHP module"
 
-#: mod/newmember.php:48
-msgid ""
-"Friendica respects your privacy. By default, your posts will only show up to"
-" people you've added as friends. For more information, see the help section "
-"from the link above."
-msgstr "Friendica respecteert je privacy. Standaard zullen je berichten alleen zichtbaar zijn voor personen die jij als vriend hebt toegevoegd. Lees de help (zie de verwijzing hierboven) voor meer informatie."
+#: src/Core/Installer.php:409
+msgid "libCurl PHP module"
+msgstr "libCurl PHP module"
 
-#: mod/newmember.php:52
-msgid "Getting Help"
-msgstr "Hulp krijgen"
+#: src/Core/Installer.php:410
+msgid "Error: libCURL PHP module required but not installed."
+msgstr "Fout: PHP-module libCURL is vereist, maar niet geïnstalleerd."
 
-#: mod/newmember.php:54
-msgid "Go to the Help Section"
-msgstr "Ga naar de help"
+#: src/Core/Installer.php:416
+msgid "GD graphics PHP module"
+msgstr "GD graphics PHP module"
 
-#: mod/newmember.php:54
+#: src/Core/Installer.php:417
 msgid ""
-"Our <strong>help</strong> pages may be consulted for detail on other program"
-" features and resources."
-msgstr "Je kunt onze <strong>help</strong> pagina's raadplegen voor gedetailleerde informatie over andere functies van dit programma."
+"Error: GD graphics PHP module with JPEG support required but not installed."
+msgstr "Fout: PHP-module GD graphics met JPEG support is vereist, maar niet geïnstalleerd."
 
-#: mod/notes.php:42 src/Model/Profile.php:959
-msgid "Personal Notes"
-msgstr "Persoonlijke Nota's"
+#: src/Core/Installer.php:423
+msgid "OpenSSL PHP module"
+msgstr "OpenSSL PHP module"
 
-#: mod/notifications.php:38
-msgid "Invalid request identifier."
-msgstr "Ongeldige <em>request identifier</em>."
+#: src/Core/Installer.php:424
+msgid "Error: openssl PHP module required but not installed."
+msgstr "Fout: PHP-module openssl is vereist, maar niet geïnstalleerd."
 
-#: mod/notifications.php:60 mod/notifications.php:184
-#: mod/notifications.php:269 src/Module/Contact.php:628
-#: src/Module/Contact.php:830 src/Module/Contact.php:1090
-msgid "Ignore"
-msgstr "Negeren"
+#: src/Core/Installer.php:430
+msgid "mb_string PHP module"
+msgstr "mb_string PHP module"
 
-#: mod/notifications.php:93 src/Content/Nav.php:244
-msgid "Notifications"
-msgstr "Notificaties"
+#: src/Core/Installer.php:431
+msgid "Error: mb_string PHP module required but not installed."
+msgstr "Fout: PHP-module mb_string is vereist, maar niet geïnstalleerd."
 
-#: mod/notifications.php:105
-msgid "Network Notifications"
-msgstr "Netwerknotificaties"
+#: src/Core/Installer.php:437
+msgid "iconv PHP module"
+msgstr "iconv PHP module"
 
-#: mod/notifications.php:110 mod/notify.php:82
-msgid "System Notifications"
-msgstr "Systeemnotificaties"
+#: src/Core/Installer.php:438
+msgid "Error: iconv PHP module required but not installed."
+msgstr "Fout: iconv PHP module vereist maar niet geïnstalleerd."
 
-#: mod/notifications.php:115
-msgid "Personal Notifications"
-msgstr "Persoonlijke notificaties"
+#: src/Core/Installer.php:444
+msgid "POSIX PHP module"
+msgstr "POSIX PHP module"
 
-#: mod/notifications.php:120
-msgid "Home Notifications"
-msgstr "Tijdlijn-notificaties"
+#: src/Core/Installer.php:445
+msgid "Error: POSIX PHP module required but not installed."
+msgstr "Fout: POSIX PHP module vereist maar niet geïnstalleerd."
 
-#: mod/notifications.php:140
-msgid "Show unread"
-msgstr "Toon ongelezen"
+#: src/Core/Installer.php:451
+msgid "JSON PHP module"
+msgstr ""
 
-#: mod/notifications.php:140
-msgid "Show all"
-msgstr "Toon alles"
+#: src/Core/Installer.php:452
+msgid "Error: JSON PHP module required but not installed."
+msgstr ""
 
-#: mod/notifications.php:151
-msgid "Show Ignored Requests"
-msgstr "Toon genegeerde verzoeken"
+#: src/Core/Installer.php:458
+msgid "File Information PHP module"
+msgstr ""
 
-#: mod/notifications.php:151
-msgid "Hide Ignored Requests"
-msgstr "Verberg genegeerde verzoeken"
+#: src/Core/Installer.php:459
+msgid "Error: File Information PHP module required but not installed."
+msgstr ""
 
-#: mod/notifications.php:164 mod/notifications.php:241
-msgid "Notification type:"
-msgstr "Notificatiesoort:"
+#: 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 "Het installatieprogramma moet een bestand \"local.config.php\" in de \"config\" map van je webserver aanmaken, maar kan dit niet doen. "
 
-#: mod/notifications.php:167
-msgid "Suggested by:"
-msgstr "Voorgesteld door:"
+#: 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 "Dit is meestal een permissieprobleem, omdat de webserver niet in staat is om in deze map bestanden weg te schrijven - ook al kun je dit zelf wel."
 
-#: mod/notifications.php:179 mod/notifications.php:258
-#: src/Module/Contact.php:636
-msgid "Hide this contact from others"
-msgstr "Verberg dit contact voor anderen"
-
-#: mod/notifications.php:201
-msgid "Claims to be known to you: "
-msgstr "Denkt dat je hem of haar kent:"
+#: 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 "Op het einde van deze procedure zal ik je een tekst geven om te bewaren in een bestand local.config.php in Friendica \"config\" map. "
 
-#: mod/notifications.php:202
-msgid "yes"
-msgstr "Ja"
+#: 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 "Je kunt ook deze procedure overslaan, en een manuele installatie uitvoeren. Lees het bestand \"INSTALL.txt\" voor instructies."
 
-#: mod/notifications.php:202
-msgid "no"
-msgstr "Nee"
+#: src/Core/Installer.php:488
+msgid "config/local.config.php is writable"
+msgstr "config/local.config.php is schrijfbaar "
 
-#: mod/notifications.php:203 mod/notifications.php:207
-msgid "Shall your connection be bidirectional or not?"
-msgstr "Zal je connectie bidirectioneel zijn of niet?"
+#: 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 "Friendica gebruikt het Smarty3 sjabloon systeem om zijn webpagina's weer te geven. Smarty3 compileert sjablonen naar PHP om de weergave te versnellen."
 
-#: mod/notifications.php:204 mod/notifications.php:208
-#, php-format
+#: src/Core/Installer.php:509
 msgid ""
-"Accepting %s as a friend allows %s to subscribe to your posts, and you will "
-"also receive updates from them in your news feed."
-msgstr "%s als vriend accepteren laat %s toe om in te schrijven op je berichten, en je zal ook updates ontvangen van hen in je nieuws feed."
+"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 "Om deze gecompileerde sjablonen op te slaan moet de webserver schrijftoegang hebben tot de folder view/smarty3, t.o.v. van de hoogste folder van je Friendica-installatie."
 
-#: mod/notifications.php:205
-#, php-format
+#: src/Core/Installer.php:510
 msgid ""
-"Accepting %s as a subscriber allows them to subscribe to your posts, but you"
-" will not receive updates from them in your news feed."
-msgstr "%s als volger accepteren laat hen toe om in te schrijven op je berichten, maar je zal geen updates ontvangen van hen in je nieuws feed."
+"Please ensure that the user that your web server runs as (e.g. www-data) has"
+" write access to this folder."
+msgstr "Zorg ervoor dat de gebruiker waaronder je webserver runt (bijv. www-data) schrijf-toegang heeft tot deze map."
 
-#: mod/notifications.php:209
-#, php-format
+#: src/Core/Installer.php:511
 msgid ""
-"Accepting %s as a sharer allows them to subscribe to your posts, but you "
-"will not receive updates from them in your news feed."
-msgstr "%s als deler accepteren laat hen toe om in te schrijven op je berichten, maar je zal geen updates ontvangen van hen in je nieuws feed."
+"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 "Opmerking: voor een goede beveiliging zou je de webserver alleen schrijf-toegang moeten geven voor de map view/smarty3 -- niet voor de template bestanden (.tpl) die in die map zitten."
 
-#: mod/notifications.php:220
-msgid "Friend"
-msgstr "Vriend"
+#: src/Core/Installer.php:514
+msgid "view/smarty3 is writable"
+msgstr "view/smarty3 is schrijfbaar"
 
-#: mod/notifications.php:221
-msgid "Sharer"
-msgstr "Deler"
+#: src/Core/Installer.php:543
+msgid ""
+"Url rewrite in .htaccess is not working. Make sure you copied .htaccess-dist"
+" to .htaccess."
+msgstr "Url rewrite in .htaccess werkt niet. Heb je .htaccess-dist gekopieerd naar .htaccess?"
 
-#: mod/notifications.php:221
-msgid "Subscriber"
-msgstr "Volger"
+#: src/Core/Installer.php:545
+msgid "Error message from Curl when fetching"
+msgstr "Fout boodschap van Curl bij ophalen"
 
-#: mod/notifications.php:264 src/Model/Profile.php:537
-#: src/Module/Contact.php:93
-msgid "Network:"
-msgstr "Netwerk:"
+#: src/Core/Installer.php:550
+msgid "Url rewrite is working"
+msgstr "Url rewrite werkt correct"
 
-#: mod/notifications.php:277
-msgid "No introductions."
-msgstr "Geen vriendschaps- of connectieverzoeken."
+#: src/Core/Installer.php:579
+msgid "ImageMagick PHP extension is not installed"
+msgstr "ImageMagick PHP extensie is niet geïnstalleerd"
 
-#: mod/notifications.php:311
-#, php-format
-msgid "No more %s notifications."
-msgstr "Geen %s notificaties meer."
+#: src/Core/Installer.php:581
+msgid "ImageMagick PHP extension is installed"
+msgstr "ImageMagick PHP extensie is geïnstalleerd"
 
-#: mod/notify.php:78
-msgid "No more system notifications."
-msgstr "Geen systeemnotificaties meer."
+#: src/Core/Installer.php:583 tests/src/Core/InstallerTest.php:372
+#: tests/src/Core/InstallerTest.php:400
+msgid "ImageMagick supports GIF"
+msgstr "ImageMagick ondersteunt GIF"
 
-#: mod/oexchange.php:32
-msgid "Post successful."
-msgstr "Bericht succesvol geplaatst."
+#: src/Core/Installer.php:606
+msgid "Database already in use."
+msgstr "Database al in gebruik."
 
-#: mod/openid.php:32
-msgid "OpenID protocol error. No ID returned."
-msgstr "OpenID protocol fout. Geen ID Gevonden."
+#: src/Core/Installer.php:611
+msgid "Could not connect to database."
+msgstr "Kon geen toegang krijgen tot de database."
 
-#: mod/openid.php:68
-msgid ""
-"Account not found and OpenID registration is not permitted on this site."
-msgstr "Account niet gevonden, en OpenID-registratie is niet toegelaten op deze website."
+#: src/Core/L10n/L10n.php:370 src/Model/Event.php:397
+msgid "Tuesday"
+msgstr "Dinsdag"
 
-#: mod/openid.php:118 src/Module/Login.php:94 src/Module/Login.php:144
-msgid "Login failed."
-msgstr "Login mislukt."
+#: src/Core/L10n/L10n.php:370 src/Model/Event.php:398
+msgid "Wednesday"
+msgstr "Woensdag"
 
-#: mod/ostatus_subscribe.php:23
-msgid "Subscribing to OStatus contacts"
-msgstr "Inschrijven bij OStatus contacten"
+#: src/Core/L10n/L10n.php:370 src/Model/Event.php:399
+msgid "Thursday"
+msgstr "Donderdag"
 
-#: mod/ostatus_subscribe.php:35
-msgid "No contact provided."
-msgstr "Geen contact opgegeven."
+#: src/Core/L10n/L10n.php:370 src/Model/Event.php:400
+msgid "Friday"
+msgstr "Vrijdag"
 
-#: mod/ostatus_subscribe.php:42
-msgid "Couldn't fetch information for contact."
-msgstr "Kon de informatie voor het contact niet ophalen."
+#: src/Core/L10n/L10n.php:370 src/Model/Event.php:401
+msgid "Saturday"
+msgstr "Zaterdag"
 
-#: mod/ostatus_subscribe.php:52
-msgid "Couldn't fetch friends for contact."
-msgstr "Kon de vrienden van contact niet ophalen."
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:416
+msgid "January"
+msgstr "Januari"
 
-#: mod/ostatus_subscribe.php:70 mod/repair_ostatus.php:52
-msgid "Done"
-msgstr "Klaar"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:417
+msgid "February"
+msgstr "Februari"
 
-#: mod/ostatus_subscribe.php:84
-msgid "success"
-msgstr "Succesvol"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:418
+msgid "March"
+msgstr "Maart"
 
-#: mod/ostatus_subscribe.php:86
-msgid "failed"
-msgstr "Mislukt"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:419
+msgid "April"
+msgstr "April"
 
-#: mod/ostatus_subscribe.php:89 src/Object/Post.php:282
-msgid "ignored"
-msgstr "Verboden"
+#: src/Core/L10n/L10n.php:374 src/Core/L10n/L10n.php:394
+#: src/Model/Event.php:407
+msgid "May"
+msgstr "Mei"
 
-#: mod/ostatus_subscribe.php:94 mod/repair_ostatus.php:58
-msgid "Keep this window open until done."
-msgstr "Houd dit scherm open tot het klaar is"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:420
+msgid "June"
+msgstr "Juni"
 
-#: mod/photos.php:118 src/Model/Profile.php:920
-msgid "Photo Albums"
-msgstr "Fotoalbums"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:421
+msgid "July"
+msgstr "Juli"
 
-#: mod/photos.php:119 mod/photos.php:1710
-msgid "Recent Photos"
-msgstr "Recente foto's"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:422
+msgid "August"
+msgstr "Augustus"
 
-#: mod/photos.php:122 mod/photos.php:1231 mod/photos.php:1712
-msgid "Upload New Photos"
-msgstr "Nieuwe foto's uploaden"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:423
+msgid "September"
+msgstr "September"
 
-#: mod/photos.php:140 mod/settings.php:56
-msgid "everybody"
-msgstr "iedereen"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:424
+msgid "October"
+msgstr "Oktober"
 
-#: mod/photos.php:196
-msgid "Contact information unavailable"
-msgstr "Contactinformatie niet beschikbaar"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:425
+msgid "November"
+msgstr "November"
 
-#: mod/photos.php:215
-msgid "Album not found."
-msgstr "Album niet gevonden"
+#: src/Core/L10n/L10n.php:374 src/Model/Event.php:426
+msgid "December"
+msgstr "December"
 
-#: mod/photos.php:244 mod/photos.php:257 mod/photos.php:1182
-msgid "Delete Album"
-msgstr "Verwijder album"
+#: src/Core/L10n/L10n.php:390 src/Model/Event.php:388
+msgid "Mon"
+msgstr "Maa"
 
-#: mod/photos.php:255
-msgid "Do you really want to delete this photo album and all its photos?"
-msgstr "Wil je echt dit fotoalbum en alle foto's erin verwijderen?"
+#: src/Core/L10n/L10n.php:390 src/Model/Event.php:389
+msgid "Tue"
+msgstr "Din"
 
-#: mod/photos.php:317 mod/photos.php:329 mod/photos.php:1457
-msgid "Delete Photo"
-msgstr "Verwijder foto"
+#: src/Core/L10n/L10n.php:390 src/Model/Event.php:390
+msgid "Wed"
+msgstr "Woe"
 
-#: mod/photos.php:327
-msgid "Do you really want to delete this photo?"
-msgstr "Wil je echt deze foto verwijderen?"
+#: src/Core/L10n/L10n.php:390 src/Model/Event.php:391
+msgid "Thu"
+msgstr "Don"
 
-#: mod/photos.php:684
-msgid "a photo"
-msgstr "een foto"
+#: src/Core/L10n/L10n.php:390 src/Model/Event.php:392
+msgid "Fri"
+msgstr "Vrij"
 
-#: mod/photos.php:684
-#, php-format
-msgid "%1$s was tagged in %2$s by %3$s"
-msgstr "%1$s is gelabeld in %2$s door %3$s"
+#: src/Core/L10n/L10n.php:390 src/Model/Event.php:393
+msgid "Sat"
+msgstr "Zat"
 
-#: mod/photos.php:780 mod/photos.php:783 mod/photos.php:812
-#: mod/profile_photo.php:155 mod/wall_upload.php:197
-#, php-format
-msgid "Image exceeds size limit of %s"
-msgstr "Beeld is groter dan de limiet ( %s )"
+#: src/Core/L10n/L10n.php:390 src/Model/Event.php:387
+msgid "Sun"
+msgstr "Zon"
 
-#: mod/photos.php:786
-msgid "Image upload didn't complete, please try again"
-msgstr "Opladen van het beeld is niet compleet, probeer het opnieuw"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:403
+msgid "Jan"
+msgstr "Jan"
 
-#: mod/photos.php:789
-msgid "Image file is missing"
-msgstr "Beeld bestand ontbreekt"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:404
+msgid "Feb"
+msgstr "Feb"
 
-#: mod/photos.php:794
-msgid ""
-"Server can't accept new file upload at this time, please contact your "
-"administrator"
-msgstr "De server kan op dit moment geen nieuw bestand opladen, contacteer alsjeblieft je beheerder"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:405
+msgid "Mar"
+msgstr "Maa"
 
-#: mod/photos.php:820
-msgid "Image file is empty."
-msgstr "Afbeeldingsbestand is leeg."
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:406
+msgid "Apr"
+msgstr "Apr"
 
-#: mod/photos.php:835 mod/profile_photo.php:164 mod/wall_upload.php:211
-msgid "Unable to process image."
-msgstr "Niet in staat om de afbeelding te verwerken"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:408
+msgid "Jun"
+msgstr "Jun"
 
-#: mod/photos.php:864 mod/profile_photo.php:309 mod/wall_upload.php:250
-msgid "Image upload failed."
-msgstr "Uploaden van afbeelding mislukt."
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:409
+msgid "Jul"
+msgstr "Jul"
 
-#: mod/photos.php:952
-msgid "No photos selected"
-msgstr "Geen foto's geselecteerd"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:410
+msgid "Aug"
+msgstr "Aug"
 
-#: mod/photos.php:1049 mod/videos.php:302
-msgid "Access to this item is restricted."
-msgstr "Toegang tot dit item is beperkt."
+#: src/Core/L10n/L10n.php:394
+msgid "Sep"
+msgstr "Sep"
 
-#: mod/photos.php:1103
-msgid "Upload Photos"
-msgstr "Upload foto's"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:412
+msgid "Oct"
+msgstr "Okt"
 
-#: mod/photos.php:1107 mod/photos.php:1177
-msgid "New album name: "
-msgstr "Nieuwe albumnaam: "
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:413
+msgid "Nov"
+msgstr "Nov"
 
-#: mod/photos.php:1108
-msgid "or select existing album:"
-msgstr "Of selecteer bestaand album:"
+#: src/Core/L10n/L10n.php:394 src/Model/Event.php:414
+msgid "Dec"
+msgstr "Dec"
 
-#: mod/photos.php:1109
-msgid "Do not show a status post for this upload"
-msgstr "Toon geen bericht op je tijdlijn van deze upload"
+#: src/Core/L10n/L10n.php:413
+msgid "poke"
+msgstr "por"
 
-#: mod/photos.php:1125 mod/photos.php:1460 mod/settings.php:1224
-msgid "Show to Groups"
-msgstr "Tonen aan groepen"
+#: src/Core/L10n/L10n.php:413
+msgid "poked"
+msgstr "porde"
 
-#: mod/photos.php:1126 mod/photos.php:1461 mod/settings.php:1225
-msgid "Show to Contacts"
-msgstr "Tonen aan contacten"
+#: src/Core/L10n/L10n.php:414
+msgid "ping"
+msgstr "ping"
 
-#: mod/photos.php:1188
-msgid "Edit Album"
-msgstr "Album wijzigen"
+#: src/Core/L10n/L10n.php:414
+msgid "pinged"
+msgstr "gepingd"
 
-#: mod/photos.php:1193
-msgid "Show Newest First"
-msgstr "Toon niewste eerst"
+#: src/Core/L10n/L10n.php:415
+msgid "prod"
+msgstr "porren"
 
-#: mod/photos.php:1195
-msgid "Show Oldest First"
-msgstr "Toon oudste eerst"
+#: src/Core/L10n/L10n.php:415
+msgid "prodded"
+msgstr "gepord"
 
-#: mod/photos.php:1216 mod/photos.php:1695
-msgid "View Photo"
-msgstr "Bekijk foto"
+#: src/Core/L10n/L10n.php:416
+msgid "slap"
+msgstr "slaan"
 
-#: mod/photos.php:1257
-msgid "Permission denied. Access to this item may be restricted."
-msgstr "Toegang geweigerd. Toegang tot dit item is mogelijk beperkt."
+#: src/Core/L10n/L10n.php:416
+msgid "slapped"
+msgstr "geslagen"
 
-#: mod/photos.php:1259
-msgid "Photo not available"
-msgstr "Foto is niet beschikbaar"
+#: src/Core/L10n/L10n.php:417
+msgid "finger"
+msgstr "finger"
 
-#: mod/photos.php:1334
-msgid "View photo"
-msgstr "Bekijk foto"
+#: src/Core/L10n/L10n.php:417
+msgid "fingered"
+msgstr "gerfingerd"
 
-#: mod/photos.php:1334
-msgid "Edit photo"
-msgstr "Bewerk foto"
+#: src/Core/L10n/L10n.php:418
+msgid "rebuff"
+msgstr "afpoeieren"
 
-#: mod/photos.php:1335
-msgid "Use as profile photo"
-msgstr "Gebruik als profielfoto"
+#: src/Core/L10n/L10n.php:418
+msgid "rebuffed"
+msgstr "afgepoeierd"
 
-#: mod/photos.php:1341 src/Object/Post.php:155
-msgid "Private Message"
-msgstr "Privébericht"
+#: src/Core/NotificationsManager.php:144
+msgid "System"
+msgstr "Systeem"
 
-#: mod/photos.php:1361
-msgid "View Full Size"
-msgstr "Bekijk in volledig formaat"
+#: src/Core/NotificationsManager.php:165 src/Content/Nav.php:182
+#: src/Content/Nav.php:244
+msgid "Home"
+msgstr "Tijdlijn"
 
-#: mod/photos.php:1425
-msgid "Tags: "
-msgstr "Labels: "
+#: src/Core/NotificationsManager.php:172 src/Content/Nav.php:248
+msgid "Introductions"
+msgstr "Verzoeken"
 
-#: mod/photos.php:1428
-msgid "[Select tags to remove]"
-msgstr "[Selecteer tags om te verwijderen]"
+#: src/Core/NotificationsManager.php:234 src/Core/NotificationsManager.php:246
+#, php-format
+msgid "%s commented on %s's post"
+msgstr "%s gaf een reactie op het bericht van %s"
 
-#: mod/photos.php:1443
-msgid "New album name"
-msgstr "Nieuwe albumnaam"
+#: src/Core/NotificationsManager.php:245
+#, php-format
+msgid "%s created a new post"
+msgstr "%s schreef een nieuw bericht"
 
-#: mod/photos.php:1444
-msgid "Caption"
-msgstr "Onderschrift"
+#: src/Core/NotificationsManager.php:259
+#, php-format
+msgid "%s liked %s's post"
+msgstr "%s vond het bericht van %s leuk"
 
-#: mod/photos.php:1445
-msgid "Add a Tag"
-msgstr "Een label toevoegen"
+#: src/Core/NotificationsManager.php:272
+#, php-format
+msgid "%s disliked %s's post"
+msgstr "%s vond het bericht van %s niet leuk"
 
-#: mod/photos.php:1445
-msgid ""
-"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
-msgstr "Voorbeeld: @bob, @Barbara_Jansen, @jan@voorbeeld.nl, #Ardennen, #camping "
+#: src/Core/NotificationsManager.php:285
+#, php-format
+msgid "%s is attending %s's event"
+msgstr "%s woont het event van %s bij"
 
-#: mod/photos.php:1446
-msgid "Do not rotate"
-msgstr "Niet roteren"
+#: src/Core/NotificationsManager.php:298
+#, php-format
+msgid "%s is not attending %s's event"
+msgstr "%s woont het event van %s niet bij"
 
-#: mod/photos.php:1447
-msgid "Rotate CW (right)"
-msgstr "Roteren met de klok mee (rechts)"
+#: src/Core/NotificationsManager.php:311
+#, php-format
+msgid "%s may attend %s's event"
+msgstr "%s woont het event van %s misschien bij"
 
-#: mod/photos.php:1448
-msgid "Rotate CCW (left)"
-msgstr "Roteren tegen de klok in (links)"
+#: src/Core/NotificationsManager.php:344
+#, php-format
+msgid "%s is now friends with %s"
+msgstr "%s is nu bevriend met %s"
 
-#: mod/photos.php:1482 src/Object/Post.php:310
-msgid "I like this (toggle)"
-msgstr "Vind ik leuk"
+#: src/Core/NotificationsManager.php:622
+msgid "Friend Suggestion"
+msgstr "Vriendschapsvoorstel"
 
-#: mod/photos.php:1483 src/Object/Post.php:311
-msgid "I don't like this (toggle)"
-msgstr "Vind ik niet leuk"
+#: src/Core/NotificationsManager.php:656
+msgid "Friend/Connect Request"
+msgstr "Vriendschapsverzoek"
 
-#: mod/photos.php:1498 mod/photos.php:1537 mod/photos.php:1597
-#: src/Module/Contact.php:1023 src/Object/Post.php:810
-msgid "This is you"
-msgstr "Dit ben jij"
+#: src/Core/NotificationsManager.php:656
+msgid "New Follower"
+msgstr "Nieuwe Volger"
 
-#: mod/photos.php:1500 mod/photos.php:1539 mod/photos.php:1599
-#: src/Object/Post.php:415 src/Object/Post.php:812
-msgid "Comment"
-msgstr "Reacties"
+#: src/Core/Session.php:188
+#, php-format
+msgid "Welcome %s"
+msgstr ""
 
-#: mod/photos.php:1629
-msgid "Map"
-msgstr "Kaart"
+#: src/Core/Session.php:189
+msgid "Please upload a profile photo."
+msgstr "Upload een profielfoto."
 
-#: mod/photos.php:1701 mod/videos.php:379
-msgid "View Album"
-msgstr "Album bekijken"
+#: src/Core/Session.php:192
+#, php-format
+msgid "Welcome back %s"
+msgstr ""
 
-#: mod/ping.php:281
-msgid "{0} wants to be your friend"
-msgstr "{0} wilt je vriend worden"
+#: src/Core/Update.php:193
+#, php-format
+msgid "Update %s failed. See error logs."
+msgstr "Wijziging %s mislukt. Lees de error logbestanden."
 
-#: mod/ping.php:297
-msgid "{0} sent you a message"
-msgstr "{0} stuurde jou een bericht"
+#: src/Core/Update.php:257
+#, 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 "\n\t\t\t\tDe Friendica ontwikkelaars hebben recent update %svrijgegeven,\n \t\t\t\tmaar wanneer ik deze probeerde te installeren ging het verschrikkelijk fout.\n \t\t\t\tDit moet snel opgelost worden en ik kan het niet alleen. Contacteer alstublieft\n \t\t\t\teen Friendica ontwikkelaar als je mij zelf niet kan helpen. Mijn database kan ongeldig zijn."
 
-#: mod/ping.php:313
-msgid "{0} requested registration"
-msgstr "{0} vroeg om zich te registreren"
+#: src/Core/Update.php:263
+#, php-format
+msgid ""
+"The error message is\n"
+"[pre]%s[/pre]"
+msgstr "De foutboodschap is\n[pre]%s[/pre]"
 
-#: mod/poke.php:187
-msgid "Poke/Prod"
-msgstr "Aanstoten/porren"
+#: src/Core/Update.php:269 src/Core/Update.php:308
+msgid "[Friendica Notify] Database update"
+msgstr ""
 
-#: mod/poke.php:188
-msgid "poke, prod or do other things to somebody"
-msgstr "aanstoten, porren of andere dingen met iemand doen"
+#: src/Core/Update.php:300
+#, php-format
+msgid ""
+"\n"
+"\t\t\t\t\tThe friendica database was successfully updated from %s to %s."
+msgstr "\n\t\t\t\t\tDe Friendica database is succesvol geupdatet van %s naar %s"
 
-#: mod/poke.php:189
-msgid "Recipient"
-msgstr "Ontvanger"
+#: src/Core/UserImport.php:107
+msgid "Error decoding account file"
+msgstr "Fout bij decoderen van het account bestand"
 
-#: mod/poke.php:190
-msgid "Choose what you wish to do to recipient"
-msgstr "Kies wat je met de ontvanger wil doen"
+#: src/Core/UserImport.php:113
+msgid "Error! No version data in file! This is not a Friendica account file?"
+msgstr "Fout! Geen versie data in het bestand! Is dit wel een Friendica account bestand?"
 
-#: mod/poke.php:193
-msgid "Make this post private"
-msgstr "Dit bericht privé maken"
+#: src/Core/UserImport.php:121
+#, php-format
+msgid "User '%s' already exists on this server!"
+msgstr "Gebruiker '%s' bestaat al op deze server!"
 
-#: mod/probe.php:14 mod/webfinger.php:17
-msgid "Only logged in users are permitted to perform a probing."
-msgstr "Alleen ingelogde gebruikers hebben toelating om aan probing te doen."
+#: src/Core/UserImport.php:157
+msgid "User creation error"
+msgstr "Fout bij het aanmaken van de gebruiker"
 
-#: mod/profile.php:44 src/Model/Profile.php:132
-msgid "Requested profile is not available."
-msgstr "Gevraagde profiel is niet beschikbaar."
+#: src/Core/UserImport.php:175
+msgid "User profile creation error"
+msgstr "Fout bij het aanmaken van het gebruikersprofiel"
 
-#: mod/profile.php:95 mod/profile.php:98 src/Protocol/OStatus.php:1290
+#: src/Core/UserImport.php:219
 #, php-format
-msgid "%s's timeline"
-msgstr "Tijdslijn van %s"
+msgid "%d contact not imported"
+msgid_plural "%d contacts not imported"
+msgstr[0] "%d contact werd niet geïmporteerd"
+msgstr[1] "%d contacten werden niet geïmporteerd"
 
-#: mod/profile.php:96 src/Protocol/OStatus.php:1294
-#, php-format
-msgid "%s's posts"
-msgstr "Berichten van %s"
+#: src/Core/UserImport.php:284
+msgid "Done. You can now login with your username and password"
+msgstr "Gebeurd. Je kunt nu inloggen met je gebruikersnaam en wachtwoord"
 
-#: mod/profile.php:97 src/Protocol/OStatus.php:1297
-#, php-format
-msgid "%s's comments"
-msgstr "reactie van %s"
+#: src/Util/Temporal.php:147 src/Model/Profile.php:776
+msgid "Birthday:"
+msgstr "Verjaardag:"
 
-#: mod/profiles.php:61
-msgid "Profile deleted."
-msgstr "Profiel verwijderd"
+#: src/Util/Temporal.php:151
+msgid "YYYY-MM-DD or MM-DD"
+msgstr "JJJJ-MM-DD of MM-DD"
 
-#: mod/profiles.php:77 mod/profiles.php:113
-msgid "Profile-"
-msgstr "Profiel-"
+#: src/Util/Temporal.php:298
+msgid "never"
+msgstr "nooit"
 
-#: mod/profiles.php:96 mod/profiles.php:135
-msgid "New profile created."
-msgstr "Nieuw profiel aangemaakt."
+#: src/Util/Temporal.php:305
+msgid "less than a second ago"
+msgstr "minder dan een seconde geleden"
 
-#: mod/profiles.php:119
-msgid "Profile unavailable to clone."
-msgstr "Profiel niet beschikbaar om te klonen."
+#: src/Util/Temporal.php:313
+msgid "year"
+msgstr "jaar"
 
-#: mod/profiles.php:207
-msgid "Profile Name is required."
-msgstr "Profielnaam is vereist."
+#: src/Util/Temporal.php:313
+msgid "years"
+msgstr "jaren"
 
-#: mod/profiles.php:348
-msgid "Marital Status"
-msgstr "Echtelijke staat"
+#: src/Util/Temporal.php:314
+msgid "months"
+msgstr "maanden"
 
-#: mod/profiles.php:352
-msgid "Romantic Partner"
-msgstr "Romantische Partner"
+#: src/Util/Temporal.php:315
+msgid "weeks"
+msgstr "weken"
 
-#: mod/profiles.php:364
-msgid "Work/Employment"
-msgstr "Werk"
+#: src/Util/Temporal.php:316
+msgid "days"
+msgstr "dagen"
 
-#: mod/profiles.php:367
-msgid "Religion"
-msgstr "Godsdienst"
+#: src/Util/Temporal.php:317
+msgid "hour"
+msgstr "uur"
 
-#: mod/profiles.php:371
-msgid "Political Views"
-msgstr "Politieke standpunten"
+#: src/Util/Temporal.php:317
+msgid "hours"
+msgstr "uren"
 
-#: mod/profiles.php:375
-msgid "Gender"
-msgstr "Geslacht"
+#: src/Util/Temporal.php:318
+msgid "minute"
+msgstr "minuut"
 
-#: mod/profiles.php:379
-msgid "Sexual Preference"
-msgstr "Seksuele Voorkeur"
+#: src/Util/Temporal.php:318
+msgid "minutes"
+msgstr "minuten"
 
-#: mod/profiles.php:383
-msgid "XMPP"
-msgstr "XMPP"
+#: src/Util/Temporal.php:319
+msgid "second"
+msgstr "seconde"
 
-#: mod/profiles.php:387
-msgid "Homepage"
-msgstr "Tijdlijn"
+#: src/Util/Temporal.php:319
+msgid "seconds"
+msgstr "seconden"
 
-#: mod/profiles.php:391 mod/profiles.php:594
-msgid "Interests"
-msgstr "Interesses"
+#: src/Util/Temporal.php:329
+#, php-format
+msgid "in %1$d %2$s"
+msgstr "in %1$d%2$s"
 
-#: mod/profiles.php:402 mod/profiles.php:590
-msgid "Location"
-msgstr "Plaats"
+#: src/Util/Temporal.php:332
+#, php-format
+msgid "%1$d %2$s ago"
+msgstr "%1$d %2$s geleden"
 
-#: mod/profiles.php:485
-msgid "Profile updated."
-msgstr "Profiel opgeslagen"
+#: src/Content/Text/BBCode.php:457
+msgid "view full size"
+msgstr "Volledig formaat"
 
-#: mod/profiles.php:539
-msgid "Hide contacts and friends:"
-msgstr "Verberg contacten en vrienden:"
+#: src/Content/Text/BBCode.php:891 src/Content/Text/BBCode.php:1533
+#: src/Content/Text/BBCode.php:1534
+msgid "Image/photo"
+msgstr "Afbeelding/foto"
 
-#: mod/profiles.php:544
-msgid "Hide your contact/friend list from viewers of this profile?"
-msgstr "Je vrienden/contacten verbergen voor bezoekers van dit profiel?"
+#: src/Content/Text/BBCode.php:1009
+#, 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"
 
-#: mod/profiles.php:564
-msgid "Show more profile fields:"
-msgstr "Toon meer profiel velden:"
+#: src/Content/Text/BBCode.php:1460 src/Content/Text/BBCode.php:1482
+msgid "$1 wrote:"
+msgstr "$1 schreef:"
 
-#: mod/profiles.php:576
-msgid "Profile Actions"
-msgstr "Profiel Acties"
+#: src/Content/Text/BBCode.php:1536 src/Content/Text/BBCode.php:1537
+msgid "Encrypted content"
+msgstr "Versleutelde inhoud"
 
-#: mod/profiles.php:577
-msgid "Edit Profile Details"
-msgstr "Profieldetails bewerken"
+#: src/Content/Text/BBCode.php:1758
+msgid "Invalid source protocol"
+msgstr "Ongeldig bron protocol"
 
-#: mod/profiles.php:579
-msgid "Change Profile Photo"
-msgstr "Profielfoto wijzigen"
+#: src/Content/Text/BBCode.php:1769
+msgid "Invalid link protocol"
+msgstr "Ongeldig verbinding protocol"
 
-#: mod/profiles.php:581
-msgid "View this profile"
-msgstr "Dit profiel bekijken"
+#: src/Content/Text/HTML.php:789
+msgid "Loading more entries..."
+msgstr "Meer berichten aan het laden..."
 
-#: mod/profiles.php:582
-msgid "View all profiles"
-msgstr "Toon alle profielen"
+#: src/Content/Text/HTML.php:790
+msgid "The end"
+msgstr "Het einde"
 
-#: mod/profiles.php:583 mod/profiles.php:678 src/Model/Profile.php:410
-msgid "Edit visibility"
-msgstr "Pas zichtbaarheid aan"
+#: src/Content/Text/HTML.php:883 src/Model/Profile.php:536
+#: src/Module/Contact.php:335
+msgid "Follow"
+msgstr "Volg"
 
-#: mod/profiles.php:584
-msgid "Create a new profile using these settings"
-msgstr "Nieuw profiel aanmaken met deze instellingen"
+#: src/Content/Text/HTML.php:892 src/Content/Nav.php:79
+msgid "@name, !forum, #tags, content"
+msgstr "@naam, !forum, #labels, inhoud"
 
-#: mod/profiles.php:585
-msgid "Clone this profile"
-msgstr "Dit profiel klonen"
+#: src/Content/Text/HTML.php:898 src/Content/Nav.php:203
+msgid "Full Text"
+msgstr "Volledige tekst"
 
-#: mod/profiles.php:586
-msgid "Delete this profile"
-msgstr "Dit profiel verwijderen"
+#: src/Content/Text/HTML.php:899 src/Content/Widget/TagCloud.php:54
+#: src/Content/Nav.php:204
+msgid "Tags"
+msgstr "Labels"
 
-#: mod/profiles.php:588
-msgid "Basic information"
-msgstr "Basis informatie"
+#: src/Content/Text/HTML.php:940 src/Model/Item.php:3518
+#: src/Model/Item.php:3529
+msgid "Click to open/close"
+msgstr "klik om te openen/sluiten"
 
-#: mod/profiles.php:589
-msgid "Profile picture"
-msgstr "Profiel foto"
+#: src/Content/Widget/CalendarExport.php:64
+msgid "Export"
+msgstr "Exporteer"
 
-#: mod/profiles.php:591
-msgid "Preferences"
-msgstr "Voorkeuren"
+#: src/Content/Widget/CalendarExport.php:65
+msgid "Export calendar as ical"
+msgstr "Exporteer kalender als ical"
 
-#: mod/profiles.php:592
-msgid "Status information"
-msgstr "Status informatie"
+#: src/Content/Widget/CalendarExport.php:66
+msgid "Export calendar as csv"
+msgstr "Exporteer kalender als csv"
 
-#: mod/profiles.php:593
-msgid "Additional information"
-msgstr "Bijkomende informatie"
+#: src/Content/Widget/ContactBlock.php:58
+msgid "No contacts"
+msgstr "Geen contacten"
 
-#: mod/profiles.php:596
-msgid "Relation"
-msgstr "Relatie"
+#: src/Content/Widget/ContactBlock.php:90
+#, php-format
+msgid "%d Contact"
+msgid_plural "%d Contacts"
+msgstr[0] "%d contact"
+msgstr[1] "%d contacten"
 
-#: mod/profiles.php:597 src/Util/Temporal.php:83 src/Util/Temporal.php:85
-msgid "Miscellaneous"
-msgstr "Diversen"
+#: src/Content/Widget/ContactBlock.php:109
+msgid "View Contacts"
+msgstr "Bekijk contacten"
 
-#: mod/profiles.php:600
-msgid "Your Gender:"
-msgstr "Je Geslacht:"
+#: src/Content/Widget/TrendingTags.php:34
+#, php-format
+msgid "Trending Tags (last %d hour)"
+msgid_plural "Trending Tags (last %d hours)"
+msgstr[0] ""
+msgstr[1] ""
 
-#: mod/profiles.php:601
-msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
-msgstr "<span class=\"heart\">&hearts;</span> Echtelijke Staat:"
+#: src/Content/Widget/TrendingTags.php:35
+msgid "More Trending Tags"
+msgstr ""
 
-#: mod/profiles.php:602 src/Model/Profile.php:795
-msgid "Sexual Preference:"
-msgstr "Seksuele Voorkeur:"
+#: src/Content/Pager.php:153
+msgid "newer"
+msgstr "nieuwere berichten"
 
-#: mod/profiles.php:603
-msgid "Example: fishing photography software"
-msgstr "Voorbeeld: vissen fotografie software"
+#: src/Content/Pager.php:158
+msgid "older"
+msgstr "oudere berichten"
 
-#: mod/profiles.php:608
-msgid "Profile Name:"
-msgstr "Profiel Naam:"
+#: src/Content/Pager.php:203
+msgid "prev"
+msgstr "vorige"
 
-#: mod/profiles.php:610
-msgid ""
-"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
-"be visible to anybody using the internet."
-msgstr "Dit is jouw <strong>publiek</strong> profiel.<br />Het <strong>kan</strong> zichtbaar zijn voor iedereen op het internet."
+#: src/Content/Pager.php:263
+msgid "last"
+msgstr "laatste"
 
-#: mod/profiles.php:611
-msgid "Your Full Name:"
-msgstr "Je volledige naam:"
+#: src/Content/ContactSelector.php:58
+msgid "Frequently"
+msgstr "Frequent"
 
-#: mod/profiles.php:612
-msgid "Title/Description:"
-msgstr "Titel/Beschrijving:"
+#: src/Content/ContactSelector.php:59
+msgid "Hourly"
+msgstr "Ieder uur"
 
-#: mod/profiles.php:615
-msgid "Street Address:"
-msgstr "Postadres:"
+#: src/Content/ContactSelector.php:60
+msgid "Twice daily"
+msgstr "Twee maal daags"
 
-#: mod/profiles.php:616
-msgid "Locality/City:"
-msgstr "Gemeente/Stad:"
+#: src/Content/ContactSelector.php:61
+msgid "Daily"
+msgstr "Dagelijks"
 
-#: mod/profiles.php:617
-msgid "Region/State:"
-msgstr "Regio/Staat:"
+#: src/Content/ContactSelector.php:62
+msgid "Weekly"
+msgstr "Wekelijks"
 
-#: mod/profiles.php:618
-msgid "Postal/Zip Code:"
-msgstr "Postcode:"
+#: src/Content/ContactSelector.php:63
+msgid "Monthly"
+msgstr "Maandelijks"
 
-#: mod/profiles.php:619
-msgid "Country:"
-msgstr "Land:"
+#: src/Content/ContactSelector.php:83
+msgid "DFRN"
+msgstr "DFRN"
 
-#: mod/profiles.php:620 src/Util/Temporal.php:151
-msgid "Age: "
-msgstr "Leeftijd:"
+#: src/Content/ContactSelector.php:84
+msgid "OStatus"
+msgstr "OStatus"
 
-#: mod/profiles.php:623
-msgid "Who: (if applicable)"
-msgstr "Wie: (indien toepasbaar)"
+#: src/Content/ContactSelector.php:85
+msgid "RSS/Atom"
+msgstr "RSS/Atom"
 
-#: mod/profiles.php:623
-msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
-msgstr "Voorbeelden: Kathleen123, Kathleen Peeters, kathleen@voorbeeld.nl"
+#: src/Content/ContactSelector.php:86 src/Module/Admin/Users.php:272
+#: src/Module/Admin/Users.php:283 src/Module/Admin/Users.php:297
+#: src/Module/Admin/Users.php:315
+msgid "Email"
+msgstr "E-mail"
 
-#: mod/profiles.php:624
-msgid "Since [date]:"
-msgstr "Sinds [datum]:"
+#: src/Content/ContactSelector.php:88
+msgid "Zot!"
+msgstr "Zot!"
 
-#: mod/profiles.php:626
-msgid "Tell us about yourself..."
-msgstr "Vertel iets over jezelf..."
+#: src/Content/ContactSelector.php:89
+msgid "LinkedIn"
+msgstr "LinkedIn"
 
-#: mod/profiles.php:627
-msgid "XMPP (Jabber) address:"
-msgstr "XMPP (Jabber) adres:"
+#: src/Content/ContactSelector.php:90
+msgid "XMPP/IM"
+msgstr "XMPP/Chat"
 
-#: mod/profiles.php:627
-msgid ""
-"The XMPP address will be propagated to your contacts so that they can follow"
-" you."
-msgstr "Het XMPP adres zal doorgegeven worden aan je contacten zodat zij je kunnen volgen."
+#: src/Content/ContactSelector.php:91
+msgid "MySpace"
+msgstr "MySpace"
 
-#: mod/profiles.php:628
-msgid "Homepage URL:"
-msgstr "Adres tijdlijn:"
+#: src/Content/ContactSelector.php:92
+msgid "Google+"
+msgstr "Google+"
 
-#: mod/profiles.php:629 src/Model/Profile.php:803
-msgid "Hometown:"
-msgstr "Woonplaats:"
+#: src/Content/ContactSelector.php:93
+msgid "pump.io"
+msgstr "pump.io"
 
-#: mod/profiles.php:630 src/Model/Profile.php:811
-msgid "Political Views:"
-msgstr "Politieke standpunten:"
+#: src/Content/ContactSelector.php:94
+msgid "Twitter"
+msgstr "Twitter"
 
-#: mod/profiles.php:631
-msgid "Religious Views:"
-msgstr "Geloof:"
+#: src/Content/ContactSelector.php:95
+msgid "Diaspora Connector"
+msgstr "Diaspora Connector"
 
-#: mod/profiles.php:632
-msgid "Public Keywords:"
-msgstr "Publieke Sleutelwoorden:"
+#: src/Content/ContactSelector.php:96
+msgid "GNU Social Connector"
+msgstr "GNU Social Connector"
 
-#: mod/profiles.php:632
-msgid "(Used for suggesting potential friends, can be seen by others)"
-msgstr "(Gebruikt om mogelijke vrienden voor te stellen, kan door anderen gezien worden)"
+#: src/Content/ContactSelector.php:97
+msgid "ActivityPub"
+msgstr "ActivityPub"
 
-#: mod/profiles.php:633
-msgid "Private Keywords:"
-msgstr "Privé Sleutelwoorden:"
+#: src/Content/ContactSelector.php:98
+msgid "pnut"
+msgstr "pnut"
 
-#: mod/profiles.php:633
-msgid "(Used for searching profiles, never shown to others)"
-msgstr "(Gebruikt om profielen te zoeken, nooit aan anderen getoond)"
+#: src/Content/ContactSelector.php:153 src/Content/ContactSelector.php:193
+#: src/Content/ContactSelector.php:231
+msgid "No answer"
+msgstr "Geen antwoord"
 
-#: mod/profiles.php:634 src/Model/Profile.php:827
-msgid "Likes:"
-msgstr "Houdt van:"
+#: src/Content/ContactSelector.php:154
+msgid "Male"
+msgstr "Mannelijk"
 
-#: mod/profiles.php:635 src/Model/Profile.php:831
-msgid "Dislikes:"
-msgstr "Houdt niet van:"
+#: src/Content/ContactSelector.php:155
+msgid "Female"
+msgstr "Vrouwelijk"
 
-#: mod/profiles.php:636
-msgid "Musical interests"
-msgstr "Muzikale interesses"
+#: src/Content/ContactSelector.php:156
+msgid "Currently Male"
+msgstr "Momenteel mannelijk"
 
-#: mod/profiles.php:637
-msgid "Books, literature"
-msgstr "Boeken, literatuur"
+#: src/Content/ContactSelector.php:157
+msgid "Currently Female"
+msgstr "Momenteel vrouwelijk"
 
-#: mod/profiles.php:638
-msgid "Television"
-msgstr "Televisie"
+#: src/Content/ContactSelector.php:158
+msgid "Mostly Male"
+msgstr "Hoofdzakelijk mannelijk"
 
-#: mod/profiles.php:639
-msgid "Film/dance/culture/entertainment"
-msgstr "Film/dans/cultuur/ontspanning"
+#: src/Content/ContactSelector.php:159
+msgid "Mostly Female"
+msgstr "Hoofdzakelijk vrouwelijk"
 
-#: mod/profiles.php:640
-msgid "Hobbies/Interests"
-msgstr "Hobby's/Interesses"
-
-#: mod/profiles.php:641
-msgid "Love/romance"
-msgstr "Liefde/romance"
-
-#: mod/profiles.php:642
-msgid "Work/employment"
-msgstr "Werk"
+#: src/Content/ContactSelector.php:160
+msgid "Transgender"
+msgstr "Transgender"
 
-#: mod/profiles.php:643
-msgid "School/education"
-msgstr "School/opleiding"
+#: src/Content/ContactSelector.php:161
+msgid "Intersex"
+msgstr "Intersex"
 
-#: mod/profiles.php:644
-msgid "Contact information and Social Networks"
-msgstr "Contactinformatie en sociale netwerken"
+#: src/Content/ContactSelector.php:162
+msgid "Transsexual"
+msgstr "Transeksueel"
 
-#: mod/profiles.php:675 src/Model/Profile.php:406
-msgid "Profile Image"
-msgstr "Profiel afbeelding"
+#: src/Content/ContactSelector.php:163
+msgid "Hermaphrodite"
+msgstr "Hermafrodiet"
 
-#: mod/profiles.php:677 src/Model/Profile.php:409
-msgid "visible to everybody"
-msgstr "zichtbaar voor iedereen"
+#: src/Content/ContactSelector.php:164
+msgid "Neuter"
+msgstr "Onzijdig"
 
-#: mod/profiles.php:684
-msgid "Edit/Manage Profiles"
-msgstr "Wijzig/Beheer Profielen"
+#: src/Content/ContactSelector.php:165
+msgid "Non-specific"
+msgstr "Niet-specifiek"
 
-#: mod/profiles.php:685 src/Model/Profile.php:396 src/Model/Profile.php:418
-msgid "Change profile photo"
-msgstr "Profiel foto wijzigen"
+#: src/Content/ContactSelector.php:166
+msgid "Other"
+msgstr "Anders"
 
-#: mod/profiles.php:686 src/Model/Profile.php:397
-msgid "Create New Profile"
-msgstr "Maak nieuw profiel"
+#: src/Content/ContactSelector.php:194
+msgid "Males"
+msgstr "Mannen"
 
-#: mod/profile_photo.php:59
-msgid "Image uploaded but image cropping failed."
-msgstr "Afbeelding opgeladen, maar bijsnijden mislukt."
+#: src/Content/ContactSelector.php:195
+msgid "Females"
+msgstr "Vrouwen"
 
-#: mod/profile_photo.php:91 mod/profile_photo.php:100
-#: mod/profile_photo.php:109 mod/profile_photo.php:317
-#, php-format
-msgid "Image size reduction [%s] failed."
-msgstr "Verkleining van de afbeelding [%s] mislukt."
+#: src/Content/ContactSelector.php:196
+msgid "Gay"
+msgstr "Homo"
 
-#: mod/profile_photo.php:128
-msgid ""
-"Shift-reload the page or clear browser cache if the new photo does not "
-"display immediately."
-msgstr "Shift-herlaad de pagina, of maak de browser cache leeg als nieuwe foto's niet onmiddellijk verschijnen."
+#: src/Content/ContactSelector.php:197
+msgid "Lesbian"
+msgstr "Lesbienne"
 
-#: mod/profile_photo.php:136
-msgid "Unable to process image"
-msgstr "Ik kan de afbeelding niet verwerken"
+#: src/Content/ContactSelector.php:198
+msgid "No Preference"
+msgstr "Geen voorkeur"
 
-#: mod/profile_photo.php:248
-msgid "Upload File:"
-msgstr "Upload bestand:"
+#: src/Content/ContactSelector.php:199
+msgid "Bisexual"
+msgstr "Biseksueel"
 
-#: mod/profile_photo.php:249
-msgid "Select a profile:"
-msgstr "Kies een profiel:"
+#: src/Content/ContactSelector.php:200
+msgid "Autosexual"
+msgstr "Autoseksueel"
 
-#: mod/profile_photo.php:254
-msgid "or"
-msgstr "of"
+#: src/Content/ContactSelector.php:201
+msgid "Abstinent"
+msgstr "Onthouder"
 
-#: mod/profile_photo.php:255
-msgid "skip this step"
-msgstr "Deze stap overslaan"
+#: src/Content/ContactSelector.php:202
+msgid "Virgin"
+msgstr "Maagd"
 
-#: mod/profile_photo.php:255
-msgid "select a photo from your photo albums"
-msgstr "Kies een foto uit je fotoalbums"
+#: src/Content/ContactSelector.php:203
+msgid "Deviant"
+msgstr "Afwijkend"
 
-#: mod/profile_photo.php:268
-msgid "Crop Image"
-msgstr "Afbeelding bijsnijden"
+#: src/Content/ContactSelector.php:204
+msgid "Fetish"
+msgstr "Fetisj"
 
-#: mod/profile_photo.php:269
-msgid "Please adjust the image cropping for optimum viewing."
-msgstr "Pas het afsnijden van de afbeelding aan voor het beste resultaat."
+#: src/Content/ContactSelector.php:205
+msgid "Oodles"
+msgstr "Veel"
 
-#: mod/profile_photo.php:271
-msgid "Done Editing"
-msgstr "Wijzigingen compleet"
+#: src/Content/ContactSelector.php:206
+msgid "Nonsexual"
+msgstr "Niet seksueel"
 
-#: mod/profile_photo.php:307
-msgid "Image uploaded successfully."
-msgstr "Uploaden van afbeelding gelukt."
+#: src/Content/ContactSelector.php:232
+msgid "Single"
+msgstr "Alleenstaand"
 
-#: mod/profperm.php:36 mod/profperm.php:69
-msgid "Invalid profile identifier."
-msgstr "Ongeldige profiel-identificatie."
+#: src/Content/ContactSelector.php:233
+msgid "Lonely"
+msgstr "Eenzaam"
 
-#: mod/profperm.php:115
-msgid "Profile Visibility Editor"
-msgstr "Profiel Zichtbaarheid Editor"
+#: src/Content/ContactSelector.php:234
+msgid "In a relation"
+msgstr "In een relatie"
 
-#: mod/profperm.php:128
-msgid "Visible To"
-msgstr "Zichtbaar voor"
+#: src/Content/ContactSelector.php:235
+msgid "Has crush"
+msgstr "Verliefd"
 
-#: mod/profperm.php:144
-msgid "All Contacts (with secure profile access)"
-msgstr "Alle contacten (met veilige profieltoegang)"
+#: src/Content/ContactSelector.php:236
+msgid "Infatuated"
+msgstr "Smoorverliefd"
 
-#: mod/register.php:105
-msgid ""
-"Registration successful. Please check your email for further instructions."
-msgstr "Registratie geslaagd. Kijk je e-mail na voor verdere instructies."
+#: src/Content/ContactSelector.php:237
+msgid "Dating"
+msgstr "Aan het daten"
 
-#: mod/register.php:109
-#, 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 "Kon email niet verzenden. Hier zijn je account details: <br> login: %s <br> paswoord: %s<br><br> Je kan je paswoord aanpassen nadat je ingelogd bent."
+#: src/Content/ContactSelector.php:238
+msgid "Unfaithful"
+msgstr "Ontrouw"
 
-#: mod/register.php:116
-msgid "Registration successful."
-msgstr "Registratie succes."
+#: src/Content/ContactSelector.php:239
+msgid "Sex Addict"
+msgstr "Seksverslaafd"
 
-#: mod/register.php:121
-msgid "Your registration can not be processed."
-msgstr "Je registratie kan niet verwerkt worden."
+#: src/Content/ContactSelector.php:240 src/Model/User.php:762
+msgid "Friends"
+msgstr "Vrienden"
 
-#: mod/register.php:164
-msgid "Your registration is pending approval by the site owner."
-msgstr "Jouw registratie wacht op goedkeuring van de beheerder."
+#: src/Content/ContactSelector.php:241
+msgid "Friends/Benefits"
+msgstr "Vriendschap plus"
 
-#: mod/register.php:193 mod/uimport.php:39
-msgid ""
-"This site has exceeded the number of allowed daily account registrations. "
-"Please try again tomorrow."
-msgstr "Deze website heeft het toegelaten dagelijkse aantal registraties overschreden. Probeer morgen opnieuw."
+#: src/Content/ContactSelector.php:242
+msgid "Casual"
+msgstr "Ongebonden/vluchtig"
 
-#: mod/register.php:222
-msgid ""
-"You may (optionally) fill in this form via OpenID by supplying your OpenID "
-"and clicking 'Register'."
-msgstr "Je kunt (optioneel) dit formulier invullen via OpenID door je OpenID in te geven en op 'Registreren' te klikken."
+#: src/Content/ContactSelector.php:243
+msgid "Engaged"
+msgstr "Verloofd"
 
-#: mod/register.php:223
-msgid ""
-"If you are not familiar with OpenID, please leave that field blank and fill "
-"in the rest of the items."
-msgstr "Laat dit veld leeg als je niet vertrouwd bent met OpenID, en vul de rest van de items in."
+#: src/Content/ContactSelector.php:244
+msgid "Married"
+msgstr "Getrouwd"
 
-#: mod/register.php:224
-msgid "Your OpenID (optional): "
-msgstr "Je OpenID (optioneel):"
+#: src/Content/ContactSelector.php:245
+msgid "Imaginarily married"
+msgstr "Denkbeeldig getrouwd"
 
-#: mod/register.php:236
-msgid "Include your profile in member directory?"
-msgstr "Je profiel in de ledengids opnemen?"
+#: src/Content/ContactSelector.php:246
+msgid "Partners"
+msgstr "Partners"
 
-#: mod/register.php:263
-msgid "Note for the admin"
-msgstr "Nota voor de beheerder"
+#: src/Content/ContactSelector.php:247
+msgid "Cohabiting"
+msgstr "Samenwonend"
 
-#: mod/register.php:263
-msgid "Leave a message for the admin, why you want to join this node"
-msgstr "Laat een boodschap na voor de beheerder, waarom je bij deze node wil komen"
+#: src/Content/ContactSelector.php:248
+msgid "Common law"
+msgstr "getrouwd voor-de-wet"
 
-#: mod/register.php:264
-msgid "Membership on this site is by invitation only."
-msgstr "Lidmaatschap van deze website is uitsluitend op uitnodiging."
+#: src/Content/ContactSelector.php:249
+msgid "Happy"
+msgstr "Blij"
 
-#: mod/register.php:265
-msgid "Your invitation code: "
-msgstr "Je uitnodigingscode:"
+#: src/Content/ContactSelector.php:250
+msgid "Not looking"
+msgstr "Niet op zoek"
 
-#: mod/register.php:274
-msgid "Your Full Name (e.g. Joe Smith, real or real-looking): "
-msgstr "Je volledige naam (bvb. Jan Smit, echt of echt lijkend):"
+#: src/Content/ContactSelector.php:251
+msgid "Swinger"
+msgstr "Swinger"
 
-#: mod/register.php:275
-msgid ""
-"Your Email Address: (Initial information will be send there, so this has to "
-"be an existing address.)"
-msgstr "Je Email Adres: (Initiële informatie zal hier naartoe gezonden worden, dus dit moet een bestaand adres zijn.)"
+#: src/Content/ContactSelector.php:252
+msgid "Betrayed"
+msgstr "Bedrogen"
 
-#: mod/register.php:277 mod/settings.php:1196
-msgid "New Password:"
-msgstr "Nieuw Wachtwoord:"
+#: src/Content/ContactSelector.php:253
+msgid "Separated"
+msgstr "Uit elkaar"
 
-#: mod/register.php:277
-msgid "Leave empty for an auto generated password."
-msgstr "Laat leeg voor een automatisch gegenereerd paswoord."
+#: src/Content/ContactSelector.php:254
+msgid "Unstable"
+msgstr "Onstabiel"
 
-#: mod/register.php:278 mod/settings.php:1197
-msgid "Confirm:"
-msgstr "Bevestig:"
+#: src/Content/ContactSelector.php:255
+msgid "Divorced"
+msgstr "Gescheiden"
 
-#: mod/register.php:279
-#, 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 "Kies een bijnaam. Deze moet beginnen met een letter. Je profiel adres op deze site zal dan '<strong>nickname@%s</strong>' zijn."
+#: src/Content/ContactSelector.php:256
+msgid "Imaginarily divorced"
+msgstr "Denkbeeldig gescheiden"
 
-#: mod/register.php:280
-msgid "Choose a nickname: "
-msgstr "Kies een bijnaam:"
+#: src/Content/ContactSelector.php:257
+msgid "Widowed"
+msgstr "Weduwnaar/weduwe"
 
-#: mod/register.php:283 src/Content/Nav.php:181 src/Module/Login.php:293
-msgid "Register"
-msgstr "Registreer"
+#: src/Content/ContactSelector.php:258
+msgid "Uncertain"
+msgstr "Onzeker"
 
-#: mod/register.php:289 mod/uimport.php:54
-msgid "Import"
-msgstr "Importeren"
+#: src/Content/ContactSelector.php:259
+msgid "It's complicated"
+msgstr "Het is gecompliceerd"
 
-#: mod/register.php:290
-msgid "Import your profile to this friendica instance"
-msgstr "Importeer je profiel op deze friendica server"
+#: src/Content/ContactSelector.php:260
+msgid "Don't care"
+msgstr "Kan me niet schelen"
 
-#: mod/register.php:298
-msgid "Note: This node explicitly contains adult content"
-msgstr "Waarschuwing: Deze node heeft inhoud enkel bedoeld voor volwassenen."
+#: src/Content/ContactSelector.php:261
+msgid "Ask me"
+msgstr "Vraag me"
 
-#: mod/regmod.php:55
-msgid "Account approved."
-msgstr "Account goedgekeurd."
+#: src/Content/Feature.php:82
+msgid "General Features"
+msgstr "Algemene functies"
 
-#: mod/regmod.php:79
-#, php-format
-msgid "Registration revoked for %s"
-msgstr "Registratie ingetrokken voor %s"
+#: src/Content/Feature.php:84
+msgid "Multiple Profiles"
+msgstr "Meerdere profielen"
 
-#: mod/regmod.php:86
-msgid "Please login."
-msgstr "Inloggen."
+#: src/Content/Feature.php:84
+msgid "Ability to create multiple profiles"
+msgstr "Mogelijkheid om meerdere profielen aan te maken"
 
-#: mod/removeme.php:49
-msgid "User deleted their account"
-msgstr "Gebruiker verwijderde zijn of haar account"
+#: src/Content/Feature.php:85
+msgid "Photo Location"
+msgstr "Foto Locatie"
 
-#: mod/removeme.php:50
+#: src/Content/Feature.php:85
 msgid ""
-"On your Friendica node an user deleted their account. Please ensure that "
-"their data is removed from the backups."
-msgstr "Een gebruiker heeft zijn of haar account verwijderd op je Friendica node. Zorg er zeker voor dat zijn of haar data verwijderd is uit de backups."
+"Photo metadata is normally stripped. This extracts the location (if present)"
+" prior to stripping metadata and links it to a map."
+msgstr "Foto metadata wordt normaal verwijderd. Dit extraheert de locatie (indien aanwezig) vooraleer de metadata te verwijderen en verbindt die met een kaart."
 
-#: mod/removeme.php:51
-#, php-format
-msgid "The user id is %d"
-msgstr "De gebruikers id is %d"
+#: src/Content/Feature.php:86
+msgid "Export Public Calendar"
+msgstr "Exporteer Publieke Kalender"
 
-#: mod/removeme.php:87 mod/removeme.php:90
-msgid "Remove My Account"
-msgstr "Verwijder mijn account"
+#: src/Content/Feature.php:86
+msgid "Ability for visitors to download the public calendar"
+msgstr "Mogelijkheid voor bezoekers om de publieke kalender te downloaden"
+
+#: src/Content/Feature.php:87
+msgid "Trending Tags"
+msgstr ""
 
-#: mod/removeme.php:88
+#: src/Content/Feature.php:87
 msgid ""
-"This will completely remove your account. Once this has been done it is not "
-"recoverable."
-msgstr "Dit zal je account volledig verwijderen. Dit kan niet hersteld worden als het eenmaal uitgevoerd is."
+"Show a community page widget with a list of the most popular tags in recent "
+"public posts."
+msgstr ""
 
-#: mod/removeme.php:89
-msgid "Please enter your password for verification:"
-msgstr "Voer je wachtwoord in voor verificatie:"
+#: src/Content/Feature.php:92
+msgid "Post Composition Features"
+msgstr "Functies voor het opstellen van berichten"
 
-#: mod/repair_ostatus.php:21
-msgid "Resubscribing to OStatus contacts"
-msgstr "Opnieuw inschrijven bij OStatus contacten"
+#: src/Content/Feature.php:93
+msgid "Auto-mention Forums"
+msgstr "Auto-vermelding Forums"
 
-#: mod/repair_ostatus.php:37
-msgid "Error"
-msgstr "Fout"
+#: src/Content/Feature.php:93
+msgid ""
+"Add/remove mention when a forum page is selected/deselected in ACL window."
+msgstr "Voeg toe/verwijder vermelding wanneer een forum pagina geselecteerd/gedeselecteerd wordt in het ACL venster."
 
-#: mod/search.php:113
-msgid "Only logged in users are permitted to perform a search."
-msgstr "Alleen ingelogde gebruikers mogen een zoekopdracht starten."
+#: src/Content/Feature.php:94
+msgid "Explicit Mentions"
+msgstr ""
 
-#: mod/search.php:137
-msgid "Too Many Requests"
-msgstr "Teveel aanvragen"
+#: src/Content/Feature.php:94
+msgid ""
+"Add explicit mentions to comment box for manual control over who gets "
+"mentioned in replies."
+msgstr ""
 
-#: mod/search.php:138
-msgid "Only one search per minute is permitted for not logged in users."
-msgstr "Niet ingelogde gebruikers mogen slechts 1 opzoeking doen per minuut"
+#: src/Content/Feature.php:99
+msgid "Network Sidebar"
+msgstr "Netwerk Zijbalk"
 
-#: mod/search.php:163 src/Content/Nav.php:195 src/Content/Text/HTML.php:967
-msgid "Search"
-msgstr "Zoeken"
+#: src/Content/Feature.php:100 src/Content/Widget.php:501
+msgid "Archives"
+msgstr "Archieven"
 
-#: mod/search.php:249
-#, php-format
-msgid "Items tagged with: %s"
-msgstr "Items getagd met: %s"
+#: src/Content/Feature.php:100
+msgid "Ability to select posts by date ranges"
+msgstr "Mogelijkheid om berichten te selecteren volgens datumbereik"
 
-#: mod/search.php:251 src/Module/Contact.php:821
-#, php-format
-msgid "Results for: %s"
-msgstr "Resultaten voor: %s"
+#: src/Content/Feature.php:101
+msgid "Protocol Filter"
+msgstr "Proctocol Filter"
 
-#: mod/settings.php:61
-msgid "Account"
-msgstr "Account"
+#: src/Content/Feature.php:101
+msgid "Enable widget to display Network posts only from selected protocols"
+msgstr "Sta de widget toe om netwerkberichten te tonen van bepaalde protocollen"
 
-#: mod/settings.php:69 src/Content/Nav.php:263 src/Model/Profile.php:389
-msgid "Profiles"
-msgstr "Profielen"
+#: src/Content/Feature.php:106
+msgid "Network Tabs"
+msgstr "Netwerktabs"
 
-#: mod/settings.php:85
-msgid "Display"
-msgstr "Weergave"
+#: src/Content/Feature.php:107
+msgid "Network New Tab"
+msgstr "Nieuwe netwerktab"
 
-#: mod/settings.php:92 mod/settings.php:845
-msgid "Social Networks"
-msgstr "Sociale netwerken"
+#: src/Content/Feature.php:107
+msgid "Enable tab to display only new Network posts (from the last 12 hours)"
+msgstr "Laat de tab alleen nieuwe netwerkberichten tonen (van de laatste 12 uur)"
 
-#: mod/settings.php:106 src/Content/Nav.php:258
-msgid "Delegations"
-msgstr "Delegaties"
+#: src/Content/Feature.php:108
+msgid "Network Shared Links Tab"
+msgstr "Netwerk Gedeelde Links Tab"
 
-#: mod/settings.php:113
-msgid "Connected apps"
-msgstr "Verbonden applicaties"
+#: src/Content/Feature.php:108
+msgid "Enable tab to display only Network posts with links in them"
+msgstr "Activeer tab om alleen Netwerk berichten met links in te tonen"
 
-#: mod/settings.php:120 mod/uexport.php:53
-msgid "Export personal data"
-msgstr "Persoonlijke gegevens exporteren"
+#: src/Content/Feature.php:113
+msgid "Post/Comment Tools"
+msgstr "Bericht-/reactiehulpmiddelen"
 
-#: mod/settings.php:127
-msgid "Remove account"
-msgstr "Account verwijderen"
+#: src/Content/Feature.php:114
+msgid "Post Categories"
+msgstr "Categorieën berichten"
 
-#: mod/settings.php:179
-msgid "Missing some important data!"
-msgstr "Een belangrijk gegeven ontbreekt!"
+#: src/Content/Feature.php:114
+msgid "Add categories to your posts"
+msgstr "Voeg categorieën toe aan je berichten"
 
-#: mod/settings.php:181 mod/settings.php:706 src/Module/Contact.php:828
-msgid "Update"
-msgstr "Wijzigen"
+#: src/Content/Feature.php:119
+msgid "Advanced Profile Settings"
+msgstr "Geavanceerde Profiel Instellingen"
 
-#: mod/settings.php:290
-msgid "Failed to connect with email account using the settings provided."
-msgstr "Ik kon geen verbinding maken met het e-mail account met de gegeven instellingen."
+#: src/Content/Feature.php:120
+msgid "List Forums"
+msgstr "Lijst Fora op"
 
-#: mod/settings.php:295
-msgid "Email settings updated."
-msgstr "E-mail instellingen opgeslagen"
+#: src/Content/Feature.php:120
+msgid "Show visitors public community forums at the Advanced Profile Page"
+msgstr "Toon bezoekers de publieke groepsfora in de Geavanceerde Profiel Pagina"
 
-#: mod/settings.php:311
-msgid "Features updated"
-msgstr "Functies opgeslagen"
+#: src/Content/Feature.php:121
+msgid "Tag Cloud"
+msgstr "Tag Wolk"
 
-#: mod/settings.php:384
-msgid "Relocate message has been send to your contacts"
-msgstr "Verhuis boodschap is verzonden naar je contacten"
+#: src/Content/Feature.php:121
+msgid "Provide a personal tag cloud on your profile page"
+msgstr "Voorzie een persoonlijk tag wolk op je profiel pagina"
 
-#: mod/settings.php:396 src/Model/User.php:423
-msgid "Passwords do not match. Password unchanged."
-msgstr "Wachtwoorden komen niet overeen. Wachtwoord niet gewijzigd."
+#: src/Content/Feature.php:122
+msgid "Display Membership Date"
+msgstr "Toon Lidmaatschap Datum"
 
-#: mod/settings.php:401
-msgid "Empty passwords are not allowed. Password unchanged."
-msgstr "Lege wachtwoorden zijn niet toegelaten. Wachtwoord niet gewijzigd."
+#: src/Content/Feature.php:122
+msgid "Display membership date in profile"
+msgstr "Toon lidmaatschap datum in profiel"
 
-#: mod/settings.php:406 src/Core/Console/NewPassword.php:82
-msgid ""
-"The new password has been exposed in a public data dump, please choose "
-"another."
-msgstr "The nieuwe paswoord is gecompromitteerd in een publieke data dump, kies alsjeblieft een ander."
+#: src/Content/Nav.php:74
+msgid "Nothing new here"
+msgstr "Niets nieuw hier"
 
-#: mod/settings.php:412
-msgid "Wrong password."
-msgstr "Verkeerd wachtwoord."
+#: src/Content/Nav.php:78
+msgid "Clear notifications"
+msgstr "Notificaties verwijderen"
 
-#: mod/settings.php:419 src/Core/Console/NewPassword.php:89
-msgid "Password changed."
-msgstr "Wachtwoord gewijzigd."
+#: src/Content/Nav.php:153 src/Module/Login.php:315
+msgid "Logout"
+msgstr "Uitloggen"
 
-#: mod/settings.php:421 src/Core/Console/NewPassword.php:86
-msgid "Password update failed. Please try again."
-msgstr "Wachtwoord-)wijziging mislukt. Probeer opnieuw."
+#: src/Content/Nav.php:153
+msgid "End this session"
+msgstr "Deze sessie beëindigen"
 
-#: mod/settings.php:505
-msgid " Please use a shorter name."
-msgstr "Gebruik een kortere naam."
+#: src/Content/Nav.php:155 src/Module/Bookmarklet.php:25
+#: src/Module/Login.php:316
+msgid "Login"
+msgstr "Login"
 
-#: mod/settings.php:508
-msgid " Name too short."
-msgstr "Naam te kort."
+#: src/Content/Nav.php:155
+msgid "Sign in"
+msgstr "Inloggen"
 
-#: mod/settings.php:516
-msgid "Wrong Password"
-msgstr "Verkeerd wachtwoord"
+#: src/Content/Nav.php:165
+msgid "Personal notes"
+msgstr "Persoonlijke nota's"
 
-#: mod/settings.php:521
-msgid "Invalid email."
-msgstr "Ongeldig email adres."
+#: src/Content/Nav.php:165
+msgid "Your personal notes"
+msgstr "Je persoonlijke nota's"
 
-#: mod/settings.php:527
-msgid "Cannot change to that email."
-msgstr "Kan niet naar dat email adres veranderen."
+#: src/Content/Nav.php:182
+msgid "Home Page"
+msgstr "Jouw tijdlijn"
 
-#: mod/settings.php:577
-msgid "Private forum has no privacy permissions. Using default privacy group."
-msgstr "Privéforum/-groep heeft geen privacyrechten. De standaard privacygroep wordt gebruikt."
+#: src/Content/Nav.php:186 src/Module/Login.php:287
+#: src/Module/Register.php:136
+msgid "Register"
+msgstr "Registreer"
 
-#: mod/settings.php:580
-msgid "Private forum has no privacy permissions and no default privacy group."
-msgstr "Privéforum/-groep heeft geen privacyrechten en geen standaard privacygroep."
+#: src/Content/Nav.php:186
+msgid "Create an account"
+msgstr "Maak een accoount"
 
-#: mod/settings.php:620
-msgid "Settings updated."
-msgstr "Instellingen opgeslagen"
+#: src/Content/Nav.php:192
+msgid "Help and documentation"
+msgstr "Hulp en documentatie"
 
-#: mod/settings.php:679 mod/settings.php:705 mod/settings.php:739
-msgid "Add application"
-msgstr "Toepassing toevoegen"
+#: src/Content/Nav.php:196
+msgid "Apps"
+msgstr "Apps"
 
-#: mod/settings.php:683 mod/settings.php:709
-msgid "Consumer Key"
-msgstr "Gebruikerssleutel"
+#: src/Content/Nav.php:196
+msgid "Addon applications, utilities, games"
+msgstr "Extra toepassingen, hulpmiddelen of spelletjes"
 
-#: mod/settings.php:684 mod/settings.php:710
-msgid "Consumer Secret"
-msgstr "Gebruikersgeheim"
+#: src/Content/Nav.php:200
+msgid "Search site content"
+msgstr "Doorzoek de inhoud van de website"
 
-#: mod/settings.php:685 mod/settings.php:711
-msgid "Redirect"
-msgstr "Doorverwijzing"
+#: src/Content/Nav.php:224
+msgid "Community"
+msgstr "Website"
 
-#: mod/settings.php:686 mod/settings.php:712
-msgid "Icon url"
-msgstr "URL pictogram"
+#: src/Content/Nav.php:224
+msgid "Conversations on this and other servers"
+msgstr "Gesprekken op deze en andere servers"
 
-#: mod/settings.php:697
-msgid "You can't edit this application."
-msgstr "Je kunt deze toepassing niet wijzigen."
+#: src/Content/Nav.php:231
+msgid "Directory"
+msgstr "Gids"
 
-#: mod/settings.php:738
-msgid "Connected Apps"
-msgstr "Verbonden applicaties"
+#: src/Content/Nav.php:231
+msgid "People directory"
+msgstr "Personengids"
 
-#: mod/settings.php:740 src/Object/Post.php:165 src/Object/Post.php:167
-msgid "Edit"
-msgstr "Bewerken"
+#: src/Content/Nav.php:233 src/Module/BaseAdminModule.php:75
+msgid "Information"
+msgstr "Informatie"
 
-#: mod/settings.php:742
-msgid "Client key starts with"
-msgstr "Client sleutel begint met"
+#: src/Content/Nav.php:233
+msgid "Information about this friendica instance"
+msgstr "informatie over deze friendica server"
 
-#: mod/settings.php:743
-msgid "No name"
-msgstr "Geen naam"
+#: src/Content/Nav.php:236 src/Module/Tos.php:73 src/Module/Admin/Tos.php:43
+#: src/Module/BaseAdminModule.php:85 src/Module/Register.php:144
+msgid "Terms of Service"
+msgstr "Gebruiksvoorwaarden"
 
-#: mod/settings.php:744
-msgid "Remove authorization"
-msgstr "Verwijder authorisatie"
+#: src/Content/Nav.php:236
+msgid "Terms of Service of this Friendica instance"
+msgstr "Gebruiksvoorwaarden op deze Friendica server"
 
-#: mod/settings.php:755
-msgid "No Addon settings configured"
-msgstr "Geen Addon instellingen geconfigureerd"
+#: src/Content/Nav.php:242
+msgid "Network Reset"
+msgstr "Netwerkpagina opnieuw instellen"
 
-#: mod/settings.php:764
-msgid "Addon Settings"
-msgstr "Addon instellingen"
+#: src/Content/Nav.php:242
+msgid "Load Network page with no filters"
+msgstr "Laad de netwerkpagina zonder filters"
 
-#: mod/settings.php:785
-msgid "Additional Features"
-msgstr "Extra functies"
+#: src/Content/Nav.php:248
+msgid "Friend Requests"
+msgstr "Vriendschapsverzoeken"
 
-#: mod/settings.php:808 src/Content/ContactSelector.php:85
-msgid "Diaspora"
-msgstr "Diaspora"
+#: src/Content/Nav.php:250
+msgid "See all notifications"
+msgstr "Toon alle notificaties"
 
-#: mod/settings.php:808 mod/settings.php:809
-msgid "enabled"
-msgstr "ingeschakeld"
+#: src/Content/Nav.php:251
+msgid "Mark all system notifications seen"
+msgstr "Alle systeemnotificaties als gelezen markeren"
 
-#: mod/settings.php:808 mod/settings.php:809
-msgid "disabled"
-msgstr "uitgeschakeld"
+#: src/Content/Nav.php:255
+msgid "Inbox"
+msgstr "Inbox"
 
-#: mod/settings.php:808 mod/settings.php:809
-#, php-format
-msgid "Built-in support for %s connectivity is %s"
-msgstr "Ingebouwde ondersteuning voor connectiviteit met %s is %s"
+#: src/Content/Nav.php:256
+msgid "Outbox"
+msgstr "Verzonden berichten"
 
-#: mod/settings.php:809
-msgid "GNU Social (OStatus)"
-msgstr "GNU Social (OStatus)"
+#: src/Content/Nav.php:260
+msgid "Manage"
+msgstr "Beheren"
 
-#: mod/settings.php:840
-msgid "Email access is disabled on this site."
-msgstr "E-mailtoegang is op deze website uitgeschakeld."
+#: src/Content/Nav.php:260
+msgid "Manage other pages"
+msgstr "Andere pagina's beheren"
 
-#: mod/settings.php:850
-msgid "General Social Media Settings"
-msgstr "Algemene Sociale Media Instellingen"
+#: src/Content/Nav.php:268
+msgid "Manage/Edit Profiles"
+msgstr "Beheer/Wijzig Profielen"
 
-#: mod/settings.php:851
-msgid "Disable Content Warning"
-msgstr "Deactiveer Content Waarschuwing"
+#: src/Content/Nav.php:276 src/Module/BaseAdminModule.php:114
+msgid "Admin"
+msgstr "Beheer"
 
-#: mod/settings.php:851
-msgid ""
-"Users on networks like Mastodon or Pleroma are able to set a content warning"
-" field which collapse their post by default. This disables the automatic "
-"collapsing and sets the content warning as the post title. Doesn't affect "
-"any other content filtering you eventually set up."
-msgstr "Gebruikers op netwerken als Mastodon en Pleroma kunnen een content waarschuwing instellen die hun bericht standaard inklapt. Dit deactiveert het automatisch inklappen en toont de content waarschuwing als titel van het bericht. Dit beïnvloedt andere content filters die je mogelijk ingesteld hebt niet."
-
-#: mod/settings.php:852
-msgid "Disable intelligent shortening"
-msgstr "Deactiveer intelligent afkorten"
-
-#: mod/settings.php:852
-msgid ""
-"Normally the system tries to find the best link to add to shortened posts. "
-"If this option is enabled then every shortened post will always point to the"
-" original friendica post."
-msgstr "Normaal probeert het systeem de beste link te vinden om toe te voegen aan ingekorte berichten. Als deze optie geactiveerd is, dan zal elk ingekort bericht altijd verwijzen naar het originele friendica bericht."
+#: src/Content/Nav.php:276
+msgid "Site setup and configuration"
+msgstr "Website opzetten en configureren"
 
-#: mod/settings.php:853
-msgid "Automatically follow any GNU Social (OStatus) followers/mentioners"
-msgstr "Volg automatisch alle GNU Social (OStatus) volgers/vermelders"
+#: src/Content/Nav.php:279
+msgid "Navigation"
+msgstr "Navigatie"
 
-#: mod/settings.php:853
-msgid ""
-"If you receive a message from an unknown OStatus user, this option decides "
-"what to do. If it is checked, a new contact will be created for every "
-"unknown user."
-msgstr "Als je een boodschap ontvangt van een voor jou onbekende OStatus gebruiker, dan beslist deze optie wat er moet gebeuren. Als de optie is geactiveerd, dan zal voor elke onbekende gebruiker een nieuw contact aangemaakt worden."
+#: src/Content/Nav.php:279
+msgid "Site map"
+msgstr "Sitemap"
 
-#: mod/settings.php:854
-msgid "Default group for OStatus contacts"
-msgstr "Standaard groep voor OStatus contacten"
+#: src/Content/OEmbed.php:254
+msgid "Embedding disabled"
+msgstr "Inbedden uitgeschakeld"
 
-#: mod/settings.php:855
-msgid "Your legacy GNU Social account"
-msgstr "Je verouderd GNU Social account"
+#: src/Content/OEmbed.php:377
+msgid "Embedded content"
+msgstr "Ingebedde inhoud"
 
-#: mod/settings.php:855
-msgid ""
-"If you enter your old GNU Social/Statusnet account name here (in the format "
-"user@domain.tld), your contacts will be added automatically. The field will "
-"be emptied when done."
-msgstr "Als je hier je oude GNU Social/Statusnet account naam invoert (in het formaat gebruiker@domein.tld), dan zullen je contacten automatisch toegevoegd worden. Het veld zal nadien leeg gemaakt worden."
+#: src/Content/Widget.php:38
+msgid "Add New Contact"
+msgstr "Nieuw Contact toevoegen"
 
-#: mod/settings.php:858
-msgid "Repair OStatus subscriptions"
-msgstr "Herstel OStatus inschrijvingen"
+#: src/Content/Widget.php:39
+msgid "Enter address or web location"
+msgstr "Voeg een webadres of -locatie in:"
 
-#: mod/settings.php:862
-msgid "Email/Mailbox Setup"
-msgstr "E-mail Instellen"
+#: src/Content/Widget.php:40
+msgid "Example: bob@example.com, http://example.com/barbara"
+msgstr "Voorbeeld: jan@voorbeeld.be, http://voorbeeld.nl/barbara"
 
-#: mod/settings.php:863
-msgid ""
-"If you wish to communicate with email contacts using this service "
-"(optional), please specify how to connect to your mailbox."
-msgstr "Als je wilt communiceren met e-mail contacten via deze dienst (optioneel), moet je hier opgeven hoe ik jouw mailbox kan bereiken."
+#: src/Content/Widget.php:58
+#, php-format
+msgid "%d invitation available"
+msgid_plural "%d invitations available"
+msgstr[0] "%d uitnodiging beschikbaar"
+msgstr[1] "%d uitnodigingen beschikbaar"
 
-#: mod/settings.php:864
-msgid "Last successful email check:"
-msgstr "Laatste succesvolle e-mail controle:"
+#: src/Content/Widget.php:193 src/Module/Contact.php:798
+#: src/Module/Profile/Contacts.php:127
+msgid "Following"
+msgstr ""
 
-#: mod/settings.php:866
-msgid "IMAP server name:"
-msgstr "IMAP server naam:"
+#: src/Content/Widget.php:194 src/Module/Contact.php:799
+#: src/Module/Profile/Contacts.php:128
+msgid "Mutual friends"
+msgstr ""
 
-#: mod/settings.php:867
-msgid "IMAP port:"
-msgstr "IMAP poort:"
+#: src/Content/Widget.php:199
+msgid "Relationships"
+msgstr ""
 
-#: mod/settings.php:868
-msgid "Security:"
-msgstr "Beveiliging:"
+#: src/Content/Widget.php:201 src/Module/Contact.php:694
+#: src/Module/Group.php:287
+msgid "All Contacts"
+msgstr "Alle Contacten"
 
-#: mod/settings.php:868 mod/settings.php:873
-msgid "None"
-msgstr "Geen"
+#: src/Content/Widget.php:244
+msgid "Protocols"
+msgstr "Protocollen"
 
-#: mod/settings.php:869
-msgid "Email login name:"
-msgstr "E-mail login naam:"
+#: src/Content/Widget.php:246
+msgid "All Protocols"
+msgstr "Alle protocollen"
 
-#: mod/settings.php:870
-msgid "Email password:"
-msgstr "E-mail wachtwoord:"
+#: src/Content/Widget.php:279
+msgid "Saved Folders"
+msgstr "Bewaarde Mappen"
 
-#: mod/settings.php:871
-msgid "Reply-to address:"
-msgstr "Antwoord adres:"
+#: src/Content/Widget.php:281 src/Content/Widget.php:320
+msgid "Everything"
+msgstr "Alles"
 
-#: mod/settings.php:872
-msgid "Send public posts to all email contacts:"
-msgstr "Openbare posts naar alle e-mail contacten versturen:"
+#: src/Content/Widget.php:318
+msgid "Categories"
+msgstr "Categorieën"
 
-#: mod/settings.php:873
-msgid "Action after import:"
-msgstr "Actie na importeren:"
+#: src/Content/Widget.php:402
+#, php-format
+msgid "%d contact in common"
+msgid_plural "%d contacts in common"
+msgstr[0] "%d gedeeld contact"
+msgstr[1] "%d gedeelde contacten"
 
-#: mod/settings.php:873 src/Content/Nav.php:246
-msgid "Mark as seen"
-msgstr "Als 'gelezen' markeren"
+#: src/Database/DBStructure.php:50
+msgid "There are no tables on MyISAM."
+msgstr "Er zijn geen MyISAM tabellen."
 
-#: mod/settings.php:873
-msgid "Move to folder"
-msgstr "Naar map verplaatsen"
+#: src/Database/DBStructure.php:74
+#, php-format
+msgid ""
+"\n"
+"Error %d occurred during database update:\n"
+"%s\n"
+msgstr "\nFout %d is opgetreden tijdens database update:\n%s\n"
 
-#: mod/settings.php:874
-msgid "Move to folder:"
-msgstr "Verplaatsen naar map:"
+#: src/Database/DBStructure.php:77
+msgid "Errors encountered performing database changes: "
+msgstr "Fouten opgetreden tijdens database aanpassingen:"
 
-#: mod/settings.php:917
+#: src/Database/DBStructure.php:266
 #, php-format
-msgid "%s - (Unsupported)"
-msgstr "%s - (Niet ondersteund)"
+msgid "%s: Database update"
+msgstr "%s: Database update"
 
-#: mod/settings.php:919
+#: src/Database/DBStructure.php:527
 #, php-format
-msgid "%s - (Experimental)"
-msgstr "%s - (Experimenteel)"
+msgid "%s: updating %s table."
+msgstr "%s: tabel %s aan het updaten."
 
-#: mod/settings.php:946 src/Core/L10n.php:359 src/Model/Event.php:396
-msgid "Sunday"
-msgstr "Zondag"
+#: src/Model/Storage/Filesystem.php:63
+#, php-format
+msgid "Filesystem storage failed to create \"%s\". Check you write permissions."
+msgstr ""
 
-#: mod/settings.php:946 src/Core/L10n.php:359 src/Model/Event.php:397
-msgid "Monday"
-msgstr "Maandag"
+#: src/Model/Storage/Filesystem.php:105
+#, php-format
+msgid ""
+"Filesystem storage failed to save data to \"%s\". Check your write "
+"permissions"
+msgstr ""
 
-#: mod/settings.php:962
-msgid "Display Settings"
-msgstr "Scherminstellingen"
+#: src/Model/Storage/Filesystem.php:126
+msgid "Storage base path"
+msgstr ""
 
-#: mod/settings.php:968
-msgid "Display Theme:"
-msgstr "Schermthema:"
+#: 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 ""
 
-#: mod/settings.php:969
-msgid "Mobile Theme:"
-msgstr "Mobiel thema:"
+#: src/Model/Storage/Filesystem.php:138
+msgid "Enter a valid existing folder"
+msgstr ""
 
-#: mod/settings.php:970
-msgid "Suppress warning of insecure networks"
-msgstr "Onderdruk waarschuwingen over onbeveiligde netwerken"
+#: src/Model/Storage/Database.php:36
+#, php-format
+msgid "Database storage failed to update %s"
+msgstr ""
 
-#: mod/settings.php:970
-msgid ""
-"Should the system suppress the warning that the current group contains "
-"members of networks that can't receive non public postings."
-msgstr "Moet het systeem waarschuwingen onderdrukken dat de huidige groep leden bevat van netwerken die geen niet-publieke berichten kunnen ontvangen."
+#: src/Model/Storage/Database.php:43
+msgid "Database storage failed to insert data"
+msgstr ""
 
-#: mod/settings.php:971
-msgid "Update browser every xx seconds"
-msgstr "Browser elke xx seconden verversen"
+#: src/Model/Contact.php:1203
+msgid "Drop Contact"
+msgstr "Verwijder contact"
 
-#: mod/settings.php:971
-msgid "Minimum of 10 seconds. Enter -1 to disable it."
-msgstr "Minimum 10 seconden. Geef -1 op om te deactiveren."
+#: src/Model/Contact.php:1705
+msgid "Organisation"
+msgstr "Organisatie"
 
-#: mod/settings.php:972
-msgid "Number of items to display per page:"
-msgstr "Aantal items te tonen per pagina:"
+#: src/Model/Contact.php:1709
+msgid "News"
+msgstr "Nieuws"
 
-#: mod/settings.php:972 mod/settings.php:973
-msgid "Maximum of 100 items"
-msgstr "Maximum 100 items"
+#: src/Model/Contact.php:1713
+msgid "Forum"
+msgstr "Forum"
 
-#: mod/settings.php:973
-msgid "Number of items to display per page when viewed from mobile device:"
-msgstr "Aantal items per pagina als je een mobiel toestel gebruikt:"
+#: src/Model/Contact.php:2109
+msgid "Connect URL missing."
+msgstr "Connectie URL ontbreekt."
 
-#: mod/settings.php:974
-msgid "Don't show emoticons"
-msgstr "Emoticons niet tonen"
+#: src/Model/Contact.php:2118
+msgid ""
+"The contact could not be added. Please check the relevant network "
+"credentials in your Settings -> Social Networks page."
+msgstr "Het contact kon niet toegevoegd worden. Gelieve de relevante netwerk gegevens na te kijken in Instellingen -> Sociale Netwerken."
 
-#: mod/settings.php:975
-msgid "Calendar"
-msgstr "Kalender"
+#: src/Model/Contact.php:2159
+msgid ""
+"This site is not configured to allow communications with other networks."
+msgstr "Deze website is niet geconfigureerd voor communicatie met andere netwerken."
 
-#: mod/settings.php:976
-msgid "Beginning of week:"
-msgstr "Begin van de week:"
+#: src/Model/Contact.php:2160 src/Model/Contact.php:2173
+msgid "No compatible communication protocols or feeds were discovered."
+msgstr "Er werden geen compatibele communicatieprotocols of feeds ontdekt."
 
-#: mod/settings.php:977
-msgid "Don't show notices"
-msgstr "Toon geen aankondigingen"
+#: src/Model/Contact.php:2171
+msgid "The profile address specified does not provide adequate information."
+msgstr "Het opgegeven profiel adres bevat geen adequate informatie."
 
-#: mod/settings.php:978
-msgid "Infinite scroll"
-msgstr "Oneindig scrollen"
+#: src/Model/Contact.php:2176
+msgid "An author or name was not found."
+msgstr "Er werd geen auteur of naam gevonden."
 
-#: mod/settings.php:979
-msgid "Automatic updates only at the top of the network page"
-msgstr "Automatische updates alleen bovenaan de netwerk pagina"
+#: src/Model/Contact.php:2179
+msgid "No browser URL could be matched to this address."
+msgstr "Er kan geen browser URL gematcht worden met dit adres."
 
-#: mod/settings.php:979
+#: src/Model/Contact.php:2182
 msgid ""
-"When disabled, the network page is updated all the time, which could be "
-"confusing while reading."
-msgstr "Als deze parameter gedeactiveerd is, dan wordt de netwerk pagina constant geüpdate, wat verwarrend zou kunnen zijn tijdens het lezen."
+"Unable to match @-style Identity Address with a known protocol or email "
+"contact."
+msgstr "Het @-stijl-identiteitsadres komt niet overeen met een nekend protocol of e-mailcontact."
 
-#: mod/settings.php:980
-msgid "Bandwidth Saver Mode"
-msgstr "Bandbreedte Besparen Mode"
+#: src/Model/Contact.php:2183
+msgid "Use mailto: in front of address to force email check."
+msgstr "Gebruik mailto: voor het adres om een e-mailcontrole af te dwingen."
 
-#: mod/settings.php:980
+#: src/Model/Contact.php:2189
 msgid ""
-"When enabled, embedded content is not displayed on automatic updates, they "
-"only show on page reload."
-msgstr "Als deze parameter geactiveerd is, dan wordt embedded content niet getoond bij automatische updates, ze worden alleen getoond bij het herladen van de pagina."
-
-#: mod/settings.php:981
-msgid "Smart Threading"
-msgstr "Slimme Gespreksstroom"
+"The profile address specified belongs to a network which has been disabled "
+"on this site."
+msgstr "Het opgegeven profiel adres behoort tot een netwerk dat gedeactiveerd is op deze site."
 
-#: mod/settings.php:981
+#: src/Model/Contact.php:2194
 msgid ""
-"When enabled, suppress extraneous thread indentation while keeping it where "
-"it matters. Only works if threading is available and enabled."
-msgstr "Als deze parameter geactiveerd is, dan dan wordt overbodig inspringen van reacties onderdrukt terwijl het behouden blijft waar het nodig is. Werkt alleen als gespreksstroom beschikbaar is en geactiveerd."
+"Limited profile. This person will be unable to receive direct/personal "
+"notifications from you."
+msgstr "Profiel met restricties. Deze peresoon zal geen directe/persoonlijke notificaties van jou kunnen ontvangen."
 
-#: mod/settings.php:983
-msgid "General Theme Settings"
-msgstr "Algemene Thema Instellingen"
+#: src/Model/Contact.php:2249
+msgid "Unable to retrieve contact information."
+msgstr "Het was niet mogelijk informatie over dit contact op te halen."
 
-#: mod/settings.php:984
-msgid "Custom Theme Settings"
-msgstr "Speciale Thema Instellingen"
+#: src/Model/Event.php:34 src/Model/Event.php:847
+#: src/Module/Debug/Localtime.php:17
+msgid "l F d, Y \\@ g:i A"
+msgstr "l F d, Y \\@ g:i A"
+
+#: src/Model/Event.php:61 src/Model/Event.php:78 src/Model/Event.php:435
+#: src/Model/Event.php:915
+msgid "Starts:"
+msgstr "Begint:"
+
+#: src/Model/Event.php:64 src/Model/Event.php:84 src/Model/Event.php:436
+#: src/Model/Event.php:919
+msgid "Finishes:"
+msgstr "Eindigt:"
+
+#: src/Model/Event.php:385
+msgid "all-day"
+msgstr "de hele dag"
+
+#: src/Model/Event.php:411
+msgid "Sept"
+msgstr "Sep"
+
+#: src/Model/Event.php:433
+msgid "No events to display"
+msgstr "Geen gebeurtenissen te tonen"
+
+#: src/Model/Event.php:561
+msgid "l, F j"
+msgstr "l j F"
+
+#: src/Model/Event.php:592
+msgid "Edit event"
+msgstr "Gebeurtenis bewerken"
+
+#: src/Model/Event.php:593
+msgid "Duplicate event"
+msgstr "Duplicate gebeurtenis"
+
+#: src/Model/Event.php:594
+msgid "Delete event"
+msgstr "Verwijder gebeurtenis"
+
+#: src/Model/Event.php:626 src/Model/Item.php:3569 src/Model/Item.php:3576
+msgid "link to source"
+msgstr "Verwijzing naar bron"
+
+#: src/Model/Event.php:848
+msgid "D g:i A"
+msgstr "D g:i A"
+
+#: src/Model/Event.php:849
+msgid "g:i A"
+msgstr "g:i A"
+
+#: src/Model/Event.php:934 src/Model/Event.php:936
+msgid "Show map"
+msgstr "Toon kaart"
+
+#: src/Model/Event.php:935
+msgid "Hide map"
+msgstr "Verberg kaart"
+
+#: src/Model/Event.php:1027
+#, php-format
+msgid "%s's birthday"
+msgstr "%s's verjaardag"
+
+#: src/Model/Event.php:1028
+#, php-format
+msgid "Happy Birthday %s"
+msgstr "Gefeliciteerd %s"
+
+#: src/Model/FileTag.php:265
+msgid "Item filed"
+msgstr "Item bewaard"
+
+#: src/Model/Group.php:77
+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 "Een verwijderde groep met deze naam is weer tot leven gewekt. Bestaande itemrechten <strong>kunnen</strong> voor deze groep en toekomstige leden gelden. Wanneer je niet zo had bedoeld kan je een andere groep met een andere naam creëren. "
+
+#: src/Model/Group.php:407
+msgid "Default privacy group for new contacts"
+msgstr "Standaard privacy groep voor nieuwe contacten"
+
+#: src/Model/Group.php:439
+msgid "Everybody"
+msgstr "Iedereen"
+
+#: src/Model/Group.php:458
+msgid "edit"
+msgstr "verander"
+
+#: src/Model/Group.php:484 src/Module/Contact.php:734
+#: src/Module/Welcome.php:57
+msgid "Groups"
+msgstr "Groepen"
+
+#: src/Model/Group.php:488
+msgid "Edit group"
+msgstr "Verander groep"
+
+#: src/Model/Group.php:489 src/Module/Group.php:186
+msgid "Contacts not in any group"
+msgstr "Contacten bestaan in geen enkele groep"
+
+#: src/Model/Group.php:491
+msgid "Create a new group"
+msgstr "Maak nieuwe groep"
+
+#: src/Model/Group.php:492 src/Module/Group.php:171 src/Module/Group.php:194
+#: src/Module/Group.php:271
+msgid "Group Name: "
+msgstr "Groepsnaam:"
+
+#: src/Model/Group.php:493
+msgid "Edit groups"
+msgstr "Bewerk groepen"
+
+#: src/Model/Item.php:3304
+msgid "activity"
+msgstr "activiteit"
+
+#: src/Model/Item.php:3306 src/Object/Post.php:473
+msgid "comment"
+msgid_plural "comments"
+msgstr[0] "reactie"
+msgstr[1] "reacties"
+
+#: src/Model/Item.php:3309
+msgid "post"
+msgstr "bericht"
+
+#: src/Model/Item.php:3408
+#, php-format
+msgid "Content warning: %s"
+msgstr "Waarschuwing inhoud: %s"
+
+#: src/Model/Item.php:3485
+msgid "bytes"
+msgstr "bytes"
+
+#: src/Model/Item.php:3563
+msgid "View on separate page"
+msgstr "Bekijk op aparte pagina"
+
+#: src/Model/Item.php:3564
+msgid "view on separate page"
+msgstr "bekijk op aparte pagina"
+
+#: src/Model/Mail.php:112 src/Model/Mail.php:247
+msgid "[no subject]"
+msgstr "[geen onderwerp]"
+
+#: src/Model/Profile.php:212 src/Model/Profile.php:428
+#: src/Model/Profile.php:877
+msgid "Edit profile"
+msgstr "Bewerk profiel"
+
+#: src/Model/Profile.php:402
+msgid "Manage/edit profiles"
+msgstr "Beheer/wijzig profielen"
+
+#: src/Model/Profile.php:451 src/Model/Profile.php:787
+#: src/Module/Directory.php:143
+msgid "Status:"
+msgstr "Tijdlijn:"
+
+#: src/Model/Profile.php:452 src/Model/Profile.php:804
+#: src/Module/Directory.php:144
+msgid "Homepage:"
+msgstr "Website:"
+
+#: src/Model/Profile.php:454 src/Module/Contact.php:647
+msgid "XMPP:"
+msgstr "XMPP:"
+
+#: src/Model/Profile.php:538 src/Module/Contact.php:337
+msgid "Unfollow"
+msgstr ""
+
+#: src/Model/Profile.php:540
+msgid "Atom feed"
+msgstr "Atom feed"
+
+#: src/Model/Profile.php:580 src/Model/Profile.php:677
+msgid "g A l F d"
+msgstr "G l j F"
+
+#: src/Model/Profile.php:581
+msgid "F d"
+msgstr "d F"
+
+#: src/Model/Profile.php:643 src/Model/Profile.php:728
+msgid "[today]"
+msgstr "[vandaag]"
+
+#: src/Model/Profile.php:653
+msgid "Birthday Reminders"
+msgstr "Verjaardagsherinneringen"
+
+#: src/Model/Profile.php:654
+msgid "Birthdays this week:"
+msgstr "Verjaardagen deze week:"
+
+#: src/Model/Profile.php:715
+msgid "[No description]"
+msgstr "[Geen omschrijving]"
+
+#: src/Model/Profile.php:741
+msgid "Event Reminders"
+msgstr "Gebeurtenisherinneringen"
+
+#: src/Model/Profile.php:742
+msgid "Upcoming events the next 7 days:"
+msgstr "Evenementen de komende 7 dagen:"
+
+#: src/Model/Profile.php:759
+msgid "Member since:"
+msgstr "Lid sinds:"
+
+#: src/Model/Profile.php:767
+msgid "j F, Y"
+msgstr "F j Y"
+
+#: src/Model/Profile.php:768
+msgid "j F"
+msgstr "F j"
+
+#: src/Model/Profile.php:783
+msgid "Age:"
+msgstr "Leeftijd:"
+
+#: src/Model/Profile.php:796
+#, php-format
+msgid "for %1$d %2$s"
+msgstr "voor %1$d %2$s"
+
+#: src/Model/Profile.php:820
+msgid "Religion:"
+msgstr "Religie:"
+
+#: src/Model/Profile.php:828
+msgid "Hobbies/Interests:"
+msgstr "Hobby:"
+
+#: src/Model/Profile.php:840
+msgid "Contact information and Social Networks:"
+msgstr "Contactinformatie en sociale netwerken:"
+
+#: src/Model/Profile.php:844
+msgid "Musical interests:"
+msgstr "Muzikale interesse "
+
+#: src/Model/Profile.php:848
+msgid "Books, literature:"
+msgstr "Boeken, literatuur:"
+
+#: src/Model/Profile.php:852
+msgid "Television:"
+msgstr "Televisie"
+
+#: src/Model/Profile.php:856
+msgid "Film/dance/culture/entertainment:"
+msgstr "Film/dans/cultuur/ontspanning:"
+
+#: src/Model/Profile.php:860
+msgid "Love/Romance:"
+msgstr "Liefde/romance:"
+
+#: src/Model/Profile.php:864
+msgid "Work/employment:"
+msgstr "Werk/beroep:"
+
+#: src/Model/Profile.php:868
+msgid "School/education:"
+msgstr "School/opleiding:"
+
+#: src/Model/Profile.php:873
+msgid "Forums:"
+msgstr "Fora:"
+
+#: src/Model/Profile.php:920 src/Module/Contact.php:875
+msgid "Profile Details"
+msgstr "Profieldetails"
+
+#: src/Model/Profile.php:970
+msgid "Only You Can See This"
+msgstr "Alleen jij kunt dit zien"
+
+#: src/Model/Profile.php:978 src/Model/Profile.php:981
+msgid "Tips for New Members"
+msgstr "Tips voor nieuwe leden"
+
+#: src/Model/Profile.php:1178
+#, php-format
+msgid "OpenWebAuth: %1$s welcomes %2$s"
+msgstr "OpenWebAuth: %1$s verwelkomt %2$s"
+
+#: src/Model/User.php:331
+msgid "Login failed"
+msgstr "Login mislukt"
+
+#: src/Model/User.php:362
+msgid "Not enough information to authenticate"
+msgstr "Niet genoeg informatie om te authentificeren"
+
+#: src/Model/User.php:440
+msgid "Password can't be empty"
+msgstr "Paswoord mag niet leeg zijn"
+
+#: src/Model/User.php:459
+msgid "Empty passwords are not allowed."
+msgstr ""
+
+#: src/Model/User.php:463
+msgid ""
+"The new password has been exposed in a public data dump, please choose "
+"another."
+msgstr "The nieuwe paswoord is gecompromitteerd in een publieke data dump, kies alsjeblieft een ander."
+
+#: src/Model/User.php:469
+msgid ""
+"The password can't contain accentuated letters, white spaces or colons (:)"
+msgstr ""
+
+#: src/Model/User.php:569
+msgid "Passwords do not match. Password unchanged."
+msgstr "Wachtwoorden komen niet overeen. Wachtwoord niet gewijzigd."
+
+#: src/Model/User.php:576
+msgid "An invitation is required."
+msgstr "Een uitnodiging is vereist."
+
+#: src/Model/User.php:580
+msgid "Invitation could not be verified."
+msgstr "Uitnodiging kon niet geverifieerd worden."
+
+#: src/Model/User.php:587
+msgid "Invalid OpenID url"
+msgstr "Ongeldige OpenID url"
+
+#: src/Model/User.php:600 src/Module/Login.php:102
+msgid ""
+"We encountered a problem while logging in with the OpenID you provided. "
+"Please check the correct spelling of the ID."
+msgstr "Er is een probleem opgetreden bij het inloggen met het opgegeven OpenID. Kijk alsjeblieft de spelling van deze ID na."
+
+#: src/Model/User.php:600 src/Module/Login.php:102
+msgid "The error message was:"
+msgstr "De foutboodschap was:"
+
+#: src/Model/User.php:606
+msgid "Please enter the required information."
+msgstr "Vul de vereiste informatie in."
+
+#: src/Model/User.php:620
+#, 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) en system.username_max_length (%s) sluiten elkaar uit. Waarden worden omgedraaid."
+
+#: src/Model/User.php:627
+#, php-format
+msgid "Username should be at least %s character."
+msgid_plural "Username should be at least %s characters."
+msgstr[0] "Gebruikersnaam moet minimaal %s tekens bevatten."
+msgstr[1] "Gebruikersnaam moet minimaal %s tekens bevatten"
+
+#: src/Model/User.php:631
+#, php-format
+msgid "Username should be at most %s character."
+msgid_plural "Username should be at most %s characters."
+msgstr[0] "Gebruikersnaam mag maximaal %s tekens bevatten."
+msgstr[1] "Gebruikersnaam mag maximaal %s tekens bevatten."
+
+#: src/Model/User.php:639
+msgid "That doesn't appear to be your full (First Last) name."
+msgstr "Dat lijkt niet je volledige naam (voor- en achternaam) te zijn."
 
-#: mod/settings.php:985
-msgid "Content Settings"
-msgstr "Content Instellingen"
+#: src/Model/User.php:644
+msgid "Your email domain is not among those allowed on this site."
+msgstr "Je e-maildomein is op deze website niet toegestaan."
 
-#: mod/settings.php:986 view/theme/duepuntozero/config.php:74
-#: view/theme/frio/config.php:121 view/theme/quattro/config.php:76
-#: view/theme/vier/config.php:122
-msgid "Theme settings"
-msgstr "Thema-instellingen"
+#: src/Model/User.php:648
+msgid "Not a valid email address."
+msgstr "Geen geldig e-mailadres."
 
-#: mod/settings.php:1000
-msgid "Unable to find your profile. Please contact your admin."
-msgstr "Kan je profiel niet vinden. Contacteer alsjeblieft je beheerder."
+#: src/Model/User.php:651
+msgid "The nickname was blocked from registration by the nodes admin."
+msgstr "De bijnaam werd geblokkeerd voor registratie door de node admin"
 
-#: mod/settings.php:1039
-msgid "Account Types"
-msgstr "Account Types"
+#: src/Model/User.php:655 src/Model/User.php:663
+msgid "Cannot use that email."
+msgstr "Ik kan die e-mail niet gebruiken."
 
-#: mod/settings.php:1040
-msgid "Personal Page Subtypes"
-msgstr "Persoonlijke Pagina Subtypes"
+#: src/Model/User.php:670
+msgid "Your nickname can only contain a-z, 0-9 and _."
+msgstr "Je bijnaam mag alleen a-z, 0-9 of _ bevatten."
 
-#: mod/settings.php:1041
-msgid "Community Forum Subtypes"
-msgstr "Groepsforum Subtypes"
+#: src/Model/User.php:677 src/Model/User.php:734
+msgid "Nickname is already registered. Please choose another."
+msgstr "Bijnaam is al geregistreerd. Kies een andere."
 
-#: mod/settings.php:1049
-msgid "Account for a personal profile."
-msgstr "Account voor een persoonlijk profiel"
+#: src/Model/User.php:687
+msgid "SERIOUS ERROR: Generation of security keys failed."
+msgstr "ERNSTIGE FOUT: aanmaken van beveiligingssleutels mislukt."
+
+#: src/Model/User.php:721 src/Model/User.php:725
+msgid "An error occurred during registration. Please try again."
+msgstr "Er is een fout opgetreden tijdens de registratie. Probeer opnieuw."
 
-#: mod/settings.php:1053
+#: src/Model/User.php:750
+msgid "An error occurred creating your default profile. Please try again."
+msgstr "Er is een fout opgetreden bij het aanmaken van je standaard profiel. Probeer opnieuw."
+
+#: src/Model/User.php:757
+msgid "An error occurred creating your self contact. Please try again."
+msgstr "Er is een fout opgetreden bij het aanmaken van je self contact. Probeer opnieuw."
+
+#: src/Model/User.php:766
 msgid ""
-"Account for an organisation that automatically approves contact requests as "
-"\"Followers\"."
-msgstr "Account voor een organisatie die automatisch contact aanvragen goedkeurt als \"Volgers\"."
+"An error occurred creating your default contact group. Please try again."
+msgstr "Er is een fout opgetreden bij het aanmaken van je standaard contact groep. Probeer opnieuw."
 
-#: mod/settings.php:1057
+#: src/Model/User.php:842
+#, php-format
 msgid ""
-"Account for a news reflector that automatically approves contact requests as"
-" \"Followers\"."
-msgstr "Account voor een nieuws reflector die automatisch contact aanvragen goedkeurt als \"Volgers\"."
+"\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 "\n\t\t\tHallo %1$s,\n\t\t\t\tBedankt om je te registreren op %2$s. Uw account is op dit moment wachten op bevestiging door de administrator.\n\n\t\t\tUw login details zijn:\n\n\t\t\tSite locatie:\t%3$s\n\t\t\tGebruikersnaam:\t\t%4$s\n\t\t\tWachtwoord:\t\t%5$s\n\t\t"
 
-#: mod/settings.php:1061
-msgid "Account for community discussions."
-msgstr "Account voor groepsdiscussies."
+#: src/Model/User.php:859
+#, php-format
+msgid "Registration at %s"
+msgstr "Registratie bij %s"
 
-#: mod/settings.php:1065
+#: src/Model/User.php:878
+#, php-format
 msgid ""
-"Account for a regular personal profile that requires manual approval of "
-"\"Friends\" and \"Followers\"."
-msgstr "Account voor een normaal persoonlijk profiel dat manuele goedkeuring vereist van \"Vrienden\" en \"Volgers\"."
+"\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 "\n\t\t\tBeste %1$s,\n\t\t\t\tBedankt voor je registratie bij %2$s. Je account is aangemaakt.\n\t\t"
 
-#: mod/settings.php:1069
+#: src/Model/User.php:884
+#, php-format
 msgid ""
-"Account for a public profile that automatically approves contact requests as"
-" \"Followers\"."
-msgstr "Account voor een publiek profiel dat automatisch contact aanvragen goedkeurt als \"Volgers\"."
+"\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 "\n\t\t\tDe login details zijn de volgende:\n\n\t\t\tSite Locatie:\t%3$s\n\t\t\tLogin Naam:\t\t%1$s\n\t\t\tPaswoord:\t\t%5$s\n\n\t\t\tJe kunt je paswoord in de \"Instellingen\" pagina veranderen nadat je bent ingelogd.\n\n\t\t\tNeem een ogenblik de tijd om je andere instellingen na te kijken op die pagina.\n\n\t\t\tJe kunt ook wat basis informatie toevoegen aan je standaard profiel\n\t\t\t(in de \"Profielen\" pagina) zodat anderen je gemakkelijk kunnen vinden.\n\n\t\t\tWe raden aan je volledige naam in te vullen, een profiel foto toe te voegen,\n\t\t\tenkele profiel \"sleutelwoorden\" (zeer handig om nieuwe vrienden te leren kennen) - en\n\t\t\tmisschien in welk land je woont; als je niet meer details wil geven.\n\t\t\tWe respecteren je privacy volledig, en geen van deze velden zijn verplicht.\n\t\t\tAls je nieuw bent en niemand kent, dan kunnen zij je misschien\n\t\t\thelpen om enkele nieuwe en interessante vrienden te leren kennen.\n\n\t\t\tAls je ooit je account wil verwijderen, dan kan je dat via %3$s/removeme\n\n\t\t\tBedankt en welkom bij %2$s."
 
-#: mod/settings.php:1073
-msgid "Automatically approves all contact requests."
-msgstr "Aanvaardt automatisch all contact aanvragen."
+#: src/Model/User.php:919 src/Module/Admin/Users.php:88
+#, php-format
+msgid "Registration details for %s"
+msgstr "Registratie details voor %s"
 
-#: mod/settings.php:1077
-msgid ""
-"Account for a popular profile that automatically approves contact requests "
-"as \"Friends\"."
-msgstr "Account voor een populair profiel dat automatisch contact aanvragen goedkeurt als \"Vrienden\"."
+#: src/Protocol/Diaspora.php:2495
+msgid "Sharing notification from Diaspora network"
+msgstr "Deelt notificatie van het Diaspora netwerk"
 
-#: mod/settings.php:1080
-msgid "Private Forum [Experimental]"
-msgstr "Privé-forum [experimenteel]"
+#: src/Protocol/Diaspora.php:3640
+msgid "Attachments:"
+msgstr "Bijlagen:"
 
-#: mod/settings.php:1081
-msgid "Requires manual approval of contact requests."
-msgstr "Vereist manuele goedkeuring van contact aanvragen."
+#: src/Protocol/OStatus.php:1300 src/Module/Profile.php:111
+#: src/Module/Profile.php:114
+#, php-format
+msgid "%s's timeline"
+msgstr "Tijdslijn van %s"
 
-#: mod/settings.php:1092
-msgid "OpenID:"
-msgstr "OpenID:"
+#: src/Protocol/OStatus.php:1304 src/Module/Profile.php:112
+#, php-format
+msgid "%s's posts"
+msgstr "Berichten van %s"
 
-#: mod/settings.php:1092
-msgid "(Optional) Allow this OpenID to login to this account."
-msgstr "(Optioneel) Laat dit OpenID toe om in te loggen op deze account."
+#: src/Protocol/OStatus.php:1307 src/Module/Profile.php:113
+#, php-format
+msgid "%s's comments"
+msgstr "reactie van %s"
 
-#: mod/settings.php:1100
-msgid "Publish your default profile in your local site directory?"
-msgstr "Je standaardprofiel in je lokale gids publiceren?"
+#: src/Protocol/OStatus.php:1861
+#, php-format
+msgid "%s is now following %s."
+msgstr "%s volgt nu %s."
+
+#: src/Protocol/OStatus.php:1862
+msgid "following"
+msgstr "volgend"
 
-#: mod/settings.php:1100
+#: src/Protocol/OStatus.php:1865
 #, php-format
+msgid "%s stopped following %s."
+msgstr "%s stopte %s te volgen."
+
+#: src/Protocol/OStatus.php:1866
+msgid "stopped following"
+msgstr "is gestopt met volgen"
+
+#: src/Worker/Delivery.php:461
+msgid "(no subject)"
+msgstr "(geen onderwerp)"
+
+#: src/Module/Tos.php:35 src/Module/Tos.php:77
 msgid ""
-"Your profile will be published in this node's <a href=\"%s\">local "
-"directory</a>. Your profile details may be publicly visible depending on the"
-" system settings."
-msgstr "Je profiel zal gepubliceerd worden de <a href=\"%s\">lokale gids</a> van deze node. Je profiel details kunnen publiek zichtbaar zijn afhankelijk van de systeem instellingen."
+"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 "Op het moment van de registratie, en om communicatie mogelijk te maken tussen de gebruikersaccount en zijn of haar contacten, moet de gebruiker een weergave naam opgeven, een gebruikersnaam (bijnaam) en een werkend email adres. De namen zullen toegankelijk zijn op de profiel pagina van het account voor elke bezoeker van de pagina, zelfs als andere profiel details niet getoond worden. Het email adres zal enkel gebruikt worden om de gebruiker notificaties te sturen over interacties, maar zal niet zichtbaar getoond worden. Het oplijsten van een account in de gids van de node van de gebruiker of in de globale gids is optioneel en kan beheerd worden in de gebruikersinstellingen, dit is niet nodig voor communicatie."
 
-#: mod/settings.php:1106
-msgid "Publish your default profile in the global social directory?"
-msgstr "Je standaardprofiel in de globale sociale gids publiceren?"
+#: 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 "Deze data is vereist voor communicatie en wordt doorgegeven aan de nodes van de communicatie partners en wordt daar opgeslagen. Gebruikers kunnen bijkomende privé data opgeven die mag doorgegeven worden aan de accounts van de communicatie partners."
 
-#: mod/settings.php:1106
+#: src/Module/Tos.php:37 src/Module/Tos.php:79
 #, php-format
 msgid ""
-"Your profile will be published in the global friendica directories (e.g. <a "
-"href=\"%s\">%s</a>). Your profile will be visible in public."
-msgstr "Je profiel zal gepubliceerd worden in de globale friendica gids (bvb. <a href=\"%s\">%s</a>). Je profiel zal publiek zichtbaar zijn."
+"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 "Een ingelogd gebruiker kan op elk moment zijn of haar account data exporteren via <a href=\"%1$s/settings/uexport\">account instellingen</a>. Een gebruiker kan ook zijn of haar account verwijderen via <a href=\"%1$s/removeme\">%1$s/removeme</a>. De verwijdering van het account is permanent. Ook zal aan andere nodes van communicatie partners gevraagd worden om de data te verwijderen."
 
-#: mod/settings.php:1113
-msgid "Hide your contact/friend list from viewers of your default profile?"
-msgstr "Je vrienden/contacten verbergen voor bezoekers van je standaard profiel?"
+#: src/Module/Tos.php:40 src/Module/Tos.php:76
+msgid "Privacy Statement"
+msgstr "Privacy Verklaring"
+
+#: src/Module/Apps.php:29
+msgid "No installed applications."
+msgstr "Geen toepassingen geïnstalleerd"
+
+#: src/Module/Apps.php:34
+msgid "Applications"
+msgstr "Toepassingen"
 
-#: mod/settings.php:1113
+#: src/Module/Credits.php:25
+msgid "Credits"
+msgstr "Credits"
+
+#: src/Module/Credits.php:26
 msgid ""
-"Your contact list won't be shown in your default profile page. You can "
-"decide to show your contact list separately for each additional profile you "
-"create"
-msgstr "Je contact lijst zal niet getoond worden in je standaard profiel pagina. Je kan beslissen om je contact lijst apart te tonen per bijkomend profiel dat je aanmaakt."
+"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!"
+msgstr "Friendica is een gemeenschapsproject dat niet mogelijk zou zijn zonder de hulp van vele mensen.  Hier is een lijst van alle mensen die aan de code of vertalingen van Friendica hebben meegewerkt.  Allen van harte bedankt!"
+
+#: src/Module/Admin/Addons/Details.php:51
+msgid "Addon not found."
+msgstr ""
+
+#: src/Module/Admin/Addons/Details.php:62 src/Module/Admin/Addons/Index.php:32
+#, php-format
+msgid "Addon %s disabled."
+msgstr "Addon %s gedeactiveerd"
+
+#: src/Module/Admin/Addons/Details.php:65 src/Module/Admin/Addons/Index.php:34
+#, php-format
+msgid "Addon %s enabled."
+msgstr "Addon %s geactiveerd"
+
+#: src/Module/Admin/Addons/Details.php:76
+#: src/Module/Admin/Themes/Details.php:60
+msgid "Disable"
+msgstr "Uitschakelen"
+
+#: src/Module/Admin/Addons/Details.php:79
+#: src/Module/Admin/Themes/Details.php:63
+msgid "Enable"
+msgstr "Inschakelen"
+
+#: src/Module/Admin/Addons/Details.php:99 src/Module/Admin/Addons/Index.php:50
+#: src/Module/Admin/Blocklist/Contact.php:61
+#: src/Module/Admin/Blocklist/Server.php:73
+#: src/Module/Admin/Federation.php:187 src/Module/Admin/Item/Delete.php:46
+#: src/Module/Admin/Logs/Settings.php:63 src/Module/Admin/Logs/View.php:46
+#: src/Module/Admin/Queue.php:56 src/Module/Admin/Site.php:567
+#: src/Module/Admin/Summary.php:175 src/Module/Admin/Themes/Details.php:104
+#: src/Module/Admin/Themes/Index.php:93 src/Module/Admin/Tos.php:42
+#: src/Module/Admin/Users.php:277
+msgid "Administration"
+msgstr "Beheer"
+
+#: src/Module/Admin/Addons/Details.php:101
+#: src/Module/Admin/Themes/Details.php:106
+msgid "Toggle"
+msgstr "Schakelaar"
+
+#: src/Module/Admin/Addons/Details.php:109
+#: src/Module/Admin/Themes/Details.php:115
+msgid "Author: "
+msgstr "Auteur:"
+
+#: src/Module/Admin/Addons/Details.php:110
+#: src/Module/Admin/Themes/Details.php:116
+msgid "Maintainer: "
+msgstr "Onderhoud:"
+
+#: src/Module/Admin/Addons/Index.php:36
+#, php-format
+msgid "Addon %s failed to install."
+msgstr ""
+
+#: src/Module/Admin/Addons/Index.php:53
+msgid "Reload active addons"
+msgstr "Herlaad actieve addons"
+
+#: src/Module/Admin/Addons/Index.php:58
+#, php-format
+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 "Er zijn op je node momenteel geen addons beschikbaar. Je kan de officiële addon repository vinden op %1$s en je kan mogelijks nog andere interessante addons vinden in de open addon registry op %2$s"
+
+#: src/Module/Admin/Blocklist/Contact.php:28
+#: src/Console/GlobalCommunityBlock.php:87
+msgid "The contact has been blocked from the node"
+msgstr "Het contact is geblokkeerd van deze node"
+
+#: src/Module/Admin/Blocklist/Contact.php:30
+#: src/Console/GlobalCommunityBlock.php:82
+#, php-format
+msgid "Could not find any contact entry for this URL (%s)"
+msgstr "Kon geen contact vinden op deze URL (%s)"
+
+#: src/Module/Admin/Blocklist/Contact.php:38
+#, php-format
+msgid "%s contact unblocked"
+msgid_plural "%s contacts unblocked"
+msgstr[0] "%s contact is niet langer geblokkeerd"
+msgstr[1] "%s contacten zijn niet langer geblokkeerd"
 
-#: mod/settings.php:1117
-msgid "Hide your profile details from anonymous viewers?"
-msgstr "Je profiel details verbergen voor anonieme bezoekers?"
+#: src/Module/Admin/Blocklist/Contact.php:62
+msgid "Remote Contact Blocklist"
+msgstr "Remote Contact Blokkeerlijst"
 
-#: mod/settings.php:1117
+#: src/Module/Admin/Blocklist/Contact.php:63
 msgid ""
-"Anonymous visitors will only see your profile picture, your display name and"
-" the nickname you are using on your profile page. Your public posts and "
-"replies will still be accessible by other means."
-msgstr "Anonieme bezoekers zullen alleen je profiel foto zien, je naam en de bijnaam die je gebruikt op je profiel pagina. Je publieke berichten en reacties zullen nog altijd toegankelijk zijn via andere wegen."
+"This page allows you to prevent any message from a remote contact to reach "
+"your node."
+msgstr "De pagina laat je toe om te vermijden dat boodschappen van een remote contact je node bereiken."
 
-#: mod/settings.php:1121
-msgid "Allow friends to post to your profile page?"
-msgstr "Vrienden toestaan om op jouw profielpagina te posten?"
+#: src/Module/Admin/Blocklist/Contact.php:64
+msgid "Block Remote Contact"
+msgstr "Blokkeer Remote Contact"
 
-#: mod/settings.php:1121
-msgid ""
-"Your contacts may write posts on your profile wall. These posts will be "
-"distributed to your contacts"
-msgstr "Je contacten kunnen berichten schrijven op je tijdslijn. Deze berichten zullen verspreid worden naar je contacten"
+#: src/Module/Admin/Blocklist/Contact.php:65 src/Module/Admin/Users.php:280
+msgid "select all"
+msgstr "Alles selecteren"
 
-#: mod/settings.php:1125
-msgid "Allow friends to tag your posts?"
-msgstr "Sta vrienden toe om jouw berichten te labelen?"
+#: src/Module/Admin/Blocklist/Contact.php:66
+msgid "select none"
+msgstr "selecteer geen"
 
-#: mod/settings.php:1125
-msgid "Your contacts can add additional tags to your posts."
-msgstr "Je contacten kunnen tags toevoegen aan je berichten."
+#: src/Module/Admin/Blocklist/Contact.php:68 src/Module/Admin/Users.php:291
+#: src/Module/Contact.php:623 src/Module/Contact.php:827
+#: src/Module/Contact.php:1076
+msgid "Unblock"
+msgstr "Blokkering opheffen"
 
-#: mod/settings.php:1129
-msgid "Allow us to suggest you as a potential friend to new members?"
-msgstr "Sta je mij toe om jou als mogelijke vriend  voor te stellen aan nieuwe leden?"
+#: src/Module/Admin/Blocklist/Contact.php:69
+msgid "No remote contact is blocked from this node."
+msgstr "Geen enkel remote contact is geblokkeerd van deze node."
 
-#: mod/settings.php:1129
-msgid ""
-"If you like, Friendica may suggest new members to add you as a contact."
-msgstr "Als je wil, kan Friendica je nieuwe leden suggereren als contacten."
+#: src/Module/Admin/Blocklist/Contact.php:71
+msgid "Blocked Remote Contacts"
+msgstr "Geblokkeerde Remote Contacts"
 
-#: mod/settings.php:1133
-msgid "Permit unknown people to send you private mail?"
-msgstr "Mogen onbekende personen jou privé berichten sturen?"
+#: src/Module/Admin/Blocklist/Contact.php:72
+msgid "Block New Remote Contact"
+msgstr "Blokkeer Nieuwe Remote Contacten"
 
-#: mod/settings.php:1133
-msgid ""
-"Friendica network users may send you private messages even if they are not "
-"in your contact list."
-msgstr "Friendica netwerk gebruikers kunnen je privé boodschappen sturen zelfs als ze niet in je contact lijst staan."
+#: src/Module/Admin/Blocklist/Contact.php:73
+msgid "Photo"
+msgstr "Foto"
 
-#: mod/settings.php:1137
-msgid "Profile is <strong>not published</strong>."
-msgstr "Profiel is <strong>niet gepubliceerd</strong>."
+#: src/Module/Admin/Blocklist/Contact.php:73
+msgid "Reason"
+msgstr ""
 
-#: mod/settings.php:1143
+#: src/Module/Admin/Blocklist/Contact.php:81
 #, php-format
-msgid "Your Identity Address is <strong>'%s'</strong> or '%s'."
-msgstr "Je Identiteit adres is <strong>'%s'</strong> of '%s'."
-
-#: mod/settings.php:1150
-msgid "Automatically expire posts after this many days:"
-msgstr "Laat berichten automatisch vervallen na zo veel dagen:"
+msgid "%s total blocked contact"
+msgid_plural "%s total blocked contacts"
+msgstr[0] "%s geblokkeerde contacten in totaal"
+msgstr[1] "%s geblokkeerde contacten in totaal"
 
-#: mod/settings.php:1150
-msgid "If empty, posts will not expire. Expired posts will be deleted"
-msgstr "Berichten zullen niet vervallen indien leeg. Vervallen berichten zullen worden verwijderd."
+#: src/Module/Admin/Blocklist/Contact.php:83
+msgid "URL of the remote contact to block."
+msgstr "URL van de remote contact die je wil blokkeren."
 
-#: mod/settings.php:1151
-msgid "Advanced expiration settings"
-msgstr "Geavanceerde instellingen voor vervallen"
+#: src/Module/Admin/Blocklist/Contact.php:84
+msgid "Block Reason"
+msgstr ""
 
-#: mod/settings.php:1152
-msgid "Advanced Expiration"
-msgstr "Geavanceerd Verval:"
+#: src/Module/Admin/Blocklist/Server.php:31
+msgid "Server domain pattern added to blocklist."
+msgstr ""
 
-#: mod/settings.php:1153
-msgid "Expire posts:"
-msgstr "Laat berichten vervallen:"
+#: src/Module/Admin/Blocklist/Server.php:47
+msgid "Site blocklist updated."
+msgstr "Site blokkeerlijst opgeslagen"
 
-#: mod/settings.php:1154
-msgid "Expire personal notes:"
-msgstr "Laat persoonlijke aantekeningen verlopen:"
+#: src/Module/Admin/Blocklist/Server.php:64
+#: src/Module/Admin/Blocklist/Server.php:89
+msgid "Blocked server domain pattern"
+msgstr ""
 
-#: mod/settings.php:1155
-msgid "Expire starred posts:"
-msgstr "Laat berichten met ster verlopen"
+#: src/Module/Admin/Blocklist/Server.php:65
+#: src/Module/Admin/Blocklist/Server.php:90 src/Module/Friendica.php:60
+msgid "Reason for the block"
+msgstr "Reden van de blokkering"
 
-#: mod/settings.php:1156
-msgid "Expire photos:"
-msgstr "Laat foto's vervallen:"
+#: src/Module/Admin/Blocklist/Server.php:66
+msgid "Delete server domain pattern"
+msgstr ""
 
-#: mod/settings.php:1157
-msgid "Only expire posts by others:"
-msgstr "Laat alleen berichten door anderen vervallen:"
+#: src/Module/Admin/Blocklist/Server.php:66
+msgid "Check to delete this entry from the blocklist"
+msgstr "Vink aan om dit item van de blokkeerlijst te verwijderen"
 
-#: mod/settings.php:1187
-msgid "Account Settings"
-msgstr "Account Instellingen"
+#: src/Module/Admin/Blocklist/Server.php:74
+msgid "Server Domain Pattern Blocklist"
+msgstr ""
 
-#: mod/settings.php:1195
-msgid "Password Settings"
-msgstr "Wachtwoord Instellingen"
+#: src/Module/Admin/Blocklist/Server.php:75
+msgid ""
+"This page can be used to define a blacklist of server domain patterns from "
+"the federated network that are not allowed to interact with your node. For "
+"each domain pattern you should also provide the reason why you block it."
+msgstr ""
 
-#: mod/settings.php:1197
-msgid "Leave password fields blank unless changing"
-msgstr "Laat de wachtwoord-velden leeg, tenzij je het wilt veranderen"
+#: src/Module/Admin/Blocklist/Server.php:76
+msgid ""
+"The list of blocked server domain patterns will be made publically available"
+" on the <a href=\"/friendica\">/friendica</a> page so that your users and "
+"people investigating communication problems can find the reason easily."
+msgstr ""
 
-#: mod/settings.php:1198
-msgid "Current Password:"
-msgstr "Huidig wachtwoord:"
+#: src/Module/Admin/Blocklist/Server.php:77
+msgid ""
+"<p>The server domain pattern syntax is case-insensitive shell wildcard, comprising the following special characters:</p>\n"
+"<ul>\n"
+"\t<li><code>*</code>: Any number of characters</li>\n"
+"\t<li><code>?</code>: Any single character</li>\n"
+"\t<li><code>[&lt;char1&gt;&lt;char2&gt;...]</code>: char1 or char2</li>\n"
+"</ul>"
+msgstr ""
 
-#: mod/settings.php:1198 mod/settings.php:1199
-msgid "Your current password to confirm the changes"
-msgstr "Je huidig wachtwoord om de wijzigingen te bevestigen"
+#: src/Module/Admin/Blocklist/Server.php:83
+msgid "Add new entry to block list"
+msgstr "Voeg nieuw item toe aan de blokkeerlijst"
 
-#: mod/settings.php:1199
-msgid "Password:"
-msgstr "Wachtwoord:"
+#: src/Module/Admin/Blocklist/Server.php:84
+msgid "Server Domain Pattern"
+msgstr ""
 
-#: mod/settings.php:1203
-msgid "Basic Settings"
-msgstr "Basis Instellingen"
+#: src/Module/Admin/Blocklist/Server.php:84
+msgid ""
+"The domain pattern of the new server to add to the block list. Do not "
+"include the protocol."
+msgstr ""
 
-#: mod/settings.php:1204 src/Model/Profile.php:751
-msgid "Full Name:"
-msgstr "Volledige Naam:"
+#: src/Module/Admin/Blocklist/Server.php:85
+msgid "Block reason"
+msgstr "Reden voor blokkering"
 
-#: mod/settings.php:1205
-msgid "Email Address:"
-msgstr "E-mailadres:"
+#: src/Module/Admin/Blocklist/Server.php:85
+msgid "The reason why you blocked this server domain pattern."
+msgstr ""
 
-#: mod/settings.php:1206
-msgid "Your Timezone:"
-msgstr "Je Tijdzone:"
+#: src/Module/Admin/Blocklist/Server.php:86
+msgid "Add Entry"
+msgstr "Voeg Item toe"
 
-#: mod/settings.php:1207
-msgid "Your Language:"
-msgstr "Je taal:"
+#: src/Module/Admin/Blocklist/Server.php:87
+msgid "Save changes to the blocklist"
+msgstr "Sla veranderingen in de blokkeerlijst op"
 
-#: mod/settings.php:1207
-msgid ""
-"Set the language we use to show you friendica interface and to send you "
-"emails"
-msgstr "Configureer de taal van die we gebruiken als friendica interface en om je emails te sturen"
+#: src/Module/Admin/Blocklist/Server.php:88
+msgid "Current Entries in the Blocklist"
+msgstr "Huidige Items in de blokkeerlijst"
 
-#: mod/settings.php:1208
-msgid "Default Post Location:"
-msgstr "Standaard locatie:"
+#: src/Module/Admin/Blocklist/Server.php:91
+msgid "Delete entry from blocklist"
+msgstr "Verwijder item uit de blokkeerlijst"
 
-#: mod/settings.php:1209
-msgid "Use Browser Location:"
-msgstr "Gebruik Webbrowser Locatie:"
+#: src/Module/Admin/Blocklist/Server.php:94
+msgid "Delete entry from blocklist?"
+msgstr "Item verwijderen uit de blokkeerlijst?"
 
-#: mod/settings.php:1212
-msgid "Security and Privacy Settings"
-msgstr "Instellingen voor Beveiliging en Privacy"
+#: src/Module/Admin/DBSync.php:32
+msgid "Update has been marked successful"
+msgstr "Wijziging succesvol gemarkeerd "
 
-#: mod/settings.php:1214
-msgid "Maximum Friend Requests/Day:"
-msgstr "Maximum aantal vriendschapsverzoeken per dag:"
+#: src/Module/Admin/DBSync.php:42
+#, php-format
+msgid "Database structure update %s was successfully applied."
+msgstr "Database structuur update %s werd met succes toegepast."
 
-#: mod/settings.php:1214 mod/settings.php:1243
-msgid "(to prevent spam abuse)"
-msgstr "(om spam misbruik te voorkomen)"
+#: src/Module/Admin/DBSync.php:46
+#, php-format
+msgid "Executing of database structure update %s failed with error: %s"
+msgstr "Uitvoering van de database structuur update %s is mislukt met fout: %s"
 
-#: mod/settings.php:1215
-msgid "Default Post Permissions"
-msgstr "Standaard rechten voor nieuwe berichten"
+#: src/Module/Admin/DBSync.php:63
+#, php-format
+msgid "Executing %s failed with error: %s"
+msgstr "Uitvoering van %s mislukt met fout: %s"
 
-#: mod/settings.php:1216
-msgid "(click to open/close)"
-msgstr "(klik om te openen/sluiten)"
+#: src/Module/Admin/DBSync.php:65
+#, php-format
+msgid "Update %s was successfully applied."
+msgstr "Wijziging %s geslaagd."
 
-#: mod/settings.php:1226
-msgid "Default Private Post"
-msgstr "Standaard Privé Post"
+#: src/Module/Admin/DBSync.php:68
+#, php-format
+msgid "Update %s did not return a status. Unknown if it succeeded."
+msgstr "Wijziging %s gaf geen status terug. We weten niet of de wijziging geslaagd is."
 
-#: mod/settings.php:1227
-msgid "Default Public Post"
-msgstr "Standaard Publieke Post"
+#: src/Module/Admin/DBSync.php:71
+#, php-format
+msgid "There was no additional update function %s that needed to be called."
+msgstr "Er was geen bijkomende update functie %s die moest opgeroepen worden."
 
-#: mod/settings.php:1231
-msgid "Default Permissions for New Posts"
-msgstr "Standaard rechten voor nieuwe berichten"
+#: src/Module/Admin/DBSync.php:91
+msgid "No failed updates."
+msgstr "Geen mislukte wijzigingen"
 
-#: mod/settings.php:1243
-msgid "Maximum private messages per day from unknown people:"
-msgstr "Maximum aantal privé-berichten per dag van onbekende personen:"
+#: src/Module/Admin/DBSync.php:92
+msgid "Check database structure"
+msgstr "Controleer de database structuur"
 
-#: mod/settings.php:1246
-msgid "Notification Settings"
-msgstr "Notificatie Instellingen"
+#: src/Module/Admin/DBSync.php:97
+msgid "Failed Updates"
+msgstr "Mislukte wijzigingen"
 
-#: mod/settings.php:1247
-msgid "Send a notification email when:"
-msgstr "Stuur een notificatie e-mail wanneer:"
+#: src/Module/Admin/DBSync.php:98
+msgid ""
+"This does not include updates prior to 1139, which did not return a status."
+msgstr "Dit is zonder de wijzigingen voor 1139, welke geen status teruggaven."
 
-#: mod/settings.php:1248
-msgid "You receive an introduction"
-msgstr "Je ontvangt een vriendschaps- of connectieverzoek"
+#: src/Module/Admin/DBSync.php:99
+msgid "Mark success (if update was manually applied)"
+msgstr "Markeren als succes (als aanpassing manueel doorgevoerd werd)"
 
-#: mod/settings.php:1249
-msgid "Your introductions are confirmed"
-msgstr "Jouw vriendschaps- of connectieverzoeken zijn bevestigd"
+#: src/Module/Admin/DBSync.php:100
+msgid "Attempt to execute this update step automatically"
+msgstr "Probeer deze stap automatisch uit te voeren"
 
-#: mod/settings.php:1250
-msgid "Someone writes on your profile wall"
-msgstr "Iemand iets op je tijdlijn schrijft"
+#: src/Module/Admin/Features.php:59
+#, php-format
+msgid "Lock feature %s"
+msgstr "Fixeer feature %s "
 
-#: mod/settings.php:1251
-msgid "Someone writes a followup comment"
-msgstr "Iemand een reactie schrijft"
+#: src/Module/Admin/Features.php:67
+msgid "Manage Additional Features"
+msgstr "Beheer Bijkomende Features"
 
-#: mod/settings.php:1252
-msgid "You receive a private message"
-msgstr "Je een privé-bericht ontvangt"
+#: src/Module/Admin/Federation.php:76
+msgid "unknown"
+msgstr "onbekend"
 
-#: mod/settings.php:1253
-msgid "You receive a friend suggestion"
-msgstr "Je een suggestie voor een vriendschap ontvangt"
+#: src/Module/Admin/Federation.php:181
+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 "Deze pagina toont je statistieken van het gekende deel van het gefedereerde sociale netwerk waarvan je Friendica node deel uitmaakt. Deze statistieken zijn niet volledig maar reflecteren het deel van het network dat jouw node kent."
 
-#: mod/settings.php:1254
-msgid "You are tagged in a post"
-msgstr "Je expliciet in een bericht bent genoemd"
+#: src/Module/Admin/Federation.php:182
+msgid ""
+"The <em>Auto Discovered Contact Directory</em> feature is not enabled, it "
+"will improve the data displayed here."
+msgstr "Het <em>Automatisch Achterhaalde Contact Gids</em> feature is niet geactiveerd, het zal de hier getoonde informatie verbeteren."
 
-#: mod/settings.php:1255
-msgid "You are poked/prodded/etc. in a post"
-msgstr "Je in een bericht bent aangestoten/gepord/etc."
+#: src/Module/Admin/Federation.php:188 src/Module/BaseAdminModule.php:77
+msgid "Federation Statistics"
+msgstr "Federatie Statistieken"
 
-#: mod/settings.php:1257
-msgid "Activate desktop notifications"
-msgstr "Activeer desktop notificaties"
+#: src/Module/Admin/Federation.php:194
+#, php-format
+msgid ""
+"Currently this node is aware of %d nodes with %d registered users from the "
+"following platforms:"
+msgstr "Op dit moment kent deze node %d nodes met %d geregistreerde gebruikers op basis van de volgende patformen:"
 
-#: mod/settings.php:1257
-msgid "Show desktop popup on new notifications"
-msgstr "Toon desktop pop-up bij nieuwe notificaties"
+#: src/Module/Admin/Item/Delete.php:35
+msgid "Item marked for deletion."
+msgstr "Item gemarkeerd om te verwijderen."
 
-#: mod/settings.php:1259
-msgid "Text-only notification emails"
-msgstr "Alleen-tekst notificatie emails"
+#: src/Module/Admin/Item/Delete.php:47 src/Module/BaseAdminModule.php:95
+msgid "Delete Item"
+msgstr "Verwijder Item"
 
-#: mod/settings.php:1261
-msgid "Send text only notification emails, without the html part"
-msgstr "Stuur alleen-tekst notificatie emails, zonder het html gedeelte"
+#: src/Module/Admin/Item/Delete.php:48
+msgid "Delete this Item"
+msgstr "Verwijder dit Item"
 
-#: mod/settings.php:1263
-msgid "Show detailled notifications"
-msgstr "Toon gedetailleerde notificaties"
+#: src/Module/Admin/Item/Delete.php:49
+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 "Op deze pagina kan je een item van je node verwijderen. Als het item een bericht is op het eerste niveau, dan zal de hele gesprek verwijderd worden."
 
-#: mod/settings.php:1265
+#: src/Module/Admin/Item/Delete.php:50
 msgid ""
-"Per default, notifications are condensed to a single notification per item. "
-"When enabled every notification is displayed."
-msgstr "Standaard worden notificaties samengevoegd in een enkele notificatie per item. Als je deze parameter activeert wordt elke notificatie getoond."
+"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 "Je moet de GUID van het item kennen. Je kan het terugvinden bvb. door te kijken naar de getoonde URL. Het laatste deel van http://example.com/display/123456 is de GUID, hier 123456."
 
-#: mod/settings.php:1267
-msgid "Advanced Account/Page Type Settings"
-msgstr "Geavanceerde Account/Pagina Type Instellingen"
+#: src/Module/Admin/Item/Delete.php:51
+msgid "GUID"
+msgstr "GUID"
 
-#: mod/settings.php:1268
-msgid "Change the behaviour of this account for special situations"
-msgstr "Pas het gedrag van dit account aan voor speciale situaties"
+#: src/Module/Admin/Item/Delete.php:51
+msgid "The GUID of the item you want to delete."
+msgstr "De GUID van het item dat je wil verwijderen."
 
-#: mod/settings.php:1271
-msgid "Relocate"
-msgstr "Verhuis"
+#: src/Module/Admin/Item/Source.php:46
+msgid "Item Guid"
+msgstr "Item identificatie"
 
-#: mod/settings.php:1272
-msgid ""
-"If you have moved this profile from another server, and some of your "
-"contacts don't receive your updates, try pushing this button."
-msgstr "Als je je profiel van een andere server hebt verhuisd, en er zijn contacten die geen updates van je ontvangen, probeer dan eens deze knop."
+#: src/Module/Admin/Logs/Settings.php:27 src/Module/Admin/Summary.php:83
+#: src/Module/Admin/Summary.php:90
+#, php-format
+msgid "The logfile '%s' is not writable. No logging possible"
+msgstr ""
 
-#: mod/settings.php:1273
-msgid "Resend relocate message to contacts"
-msgstr "Stuur verhuis boodschap naar contacten"
+#: src/Module/Admin/Logs/Settings.php:36
+msgid "Log settings updated."
+msgstr "Log instellingen opgeslagen"
 
-#: mod/subthread.php:106
-#, php-format
-msgid "%1$s is following %2$s's %3$s"
-msgstr "%1$s volgt %3$s van %2$s"
+#: src/Module/Admin/Logs/Settings.php:55
+msgid "PHP log currently enabled."
+msgstr "PHP log momenteel geactiveerd"
 
-#: mod/suggest.php:39
-msgid "Do you really want to delete this suggestion?"
-msgstr "Wil je echt dit voorstel verwijderen?"
+#: src/Module/Admin/Logs/Settings.php:57
+msgid "PHP log currently disabled."
+msgstr "PHP log momenteel gedeactiveerd"
 
-#: mod/suggest.php:75
-msgid ""
-"No suggestions available. If this is a new site, please try again in 24 "
-"hours."
-msgstr "Geen voorstellen beschikbaar. Als dit een nieuwe website is, kun je het over 24 uur nog eens proberen."
+#: src/Module/Admin/Logs/Settings.php:64 src/Module/BaseAdminModule.php:97
+#: src/Module/BaseAdminModule.php:98
+msgid "Logs"
+msgstr "Logs"
 
-#: mod/suggest.php:88 mod/suggest.php:108
-msgid "Ignore/Hide"
-msgstr "Negeren/Verbergen"
+#: src/Module/Admin/Logs/Settings.php:66
+msgid "Clear"
+msgstr "Wis"
 
-#: mod/suggest.php:118 src/Content/Widget.php:68 view/theme/vier/theme.php:204
-msgid "Friend Suggestions"
-msgstr "Vriendschapsvoorstellen"
+#: src/Module/Admin/Logs/Settings.php:70
+msgid "Enable Debugging"
+msgstr "Activeer Debugging"
 
-#: mod/tagrm.php:31
-msgid "Tag(s) removed"
-msgstr "Tag(s) verwijderd"
+#: src/Module/Admin/Logs/Settings.php:71
+msgid "Log file"
+msgstr "Logbestand"
 
-#: mod/tagrm.php:99
-msgid "Remove Item Tag"
-msgstr "Verwijder label van item"
+#: src/Module/Admin/Logs/Settings.php:71
+msgid ""
+"Must be writable by web server. Relative to your Friendica top-level "
+"directory."
+msgstr "De webserver moet hier kunnen schrijven. Relatief t.o.v. de hoogste folder binnen je Friendica-installatie."
 
-#: mod/tagrm.php:101
-msgid "Select a tag to remove: "
-msgstr "Selecteer een label om te verwijderen: "
+#: src/Module/Admin/Logs/Settings.php:72
+msgid "Log level"
+msgstr "Log niveau"
 
-#: mod/uexport.php:45
-msgid "Export account"
-msgstr "Account exporteren"
+#: src/Module/Admin/Logs/Settings.php:74
+msgid "PHP logging"
+msgstr "PHP logging"
 
-#: mod/uexport.php:45
+#: src/Module/Admin/Logs/Settings.php:75
 msgid ""
-"Export your account info and contacts. Use this to make a backup of your "
-"account and/or to move it to another server."
-msgstr "Je account informatie en contacten exporteren. Gebruik dit om een backup van je account te maken en/of om het te verhuizen naar een andere server."
-
-#: mod/uexport.php:46
-msgid "Export all"
-msgstr "Alles exporteren"
+"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."
+msgstr "Om logging van PHP fouten en waarschuwingen te activeren, kan je het volgende toevoegen aan het begin van je index.php bestand van je installatie. De naam van het bestand die ingesteld is in de 'error_log' lijn is relatief tegenover de friendica top-level folder en de server moet erin kunnen schrijven. De optie '1' voor 'log_errors' en 'display_errors' activeert deze opties, configureer '0' om ze te deactiveren. "
 
-#: mod/uexport.php:46
+#: src/Module/Admin/Logs/View.php:22
+#, php-format
 msgid ""
-"Export your accout info, contacts and all your items as json. Could be a "
-"very big file, and could take a lot of time. Use this to make a full backup "
-"of your account (photos are not exported)"
-msgstr "Je account info, contacten en al je items in json formaat exporteren. Dit kan een heel groot bestand worden, en kan lang duren. Gebruik dit om een volledige backup van je account te maken (foto's worden niet geexporteerd)"
+"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 "Fout bij het openen van log file <strong>%1$s</strong> .\\r\\n<br/>Kijk na of bestand %1$s bestaat en mag gelezen worden."
 
-#: mod/uimport.php:30
-msgid "User imports on closed servers can only be done by an administrator."
-msgstr "Importen van een gebruiker op een gesloten node kan enkel gedaan worden door een administrator"
+#: src/Module/Admin/Logs/View.php:26
+#, 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 "Kon log file <strong>%1$s</strong> niet openen.\\r\\n<br/>Kijk na of bestand %1$s mag gelezen worden."
 
-#: mod/uimport.php:56
-msgid "Move account"
-msgstr "Account verplaatsen"
+#: src/Module/Admin/Logs/View.php:47 src/Module/BaseAdminModule.php:99
+msgid "View Logs"
+msgstr "Bekijk Logs"
 
-#: mod/uimport.php:57
-msgid "You can import an account from another Friendica server."
-msgstr "Je kunt een account van een andere Friendica server importeren."
+#: src/Module/Admin/Queue.php:34
+msgid "Inspect Deferred Worker Queue"
+msgstr "Inspecteer wachtrij van uitgestelde workers"
 
-#: mod/uimport.php:58
+#: src/Module/Admin/Queue.php:35
 msgid ""
-"You need to export your account from the old server and upload it here. We "
-"will recreate your old account here with all your contacts. We will try also"
-" to inform your friends that you moved here."
-msgstr "Je moet je account bij de oude server exporteren, en hier uploaden. We zullen je oude account hier opnieuw aanmaken, met al je contacten. We zullen ook proberen om je vrienden in te lichten dat je naar hier verhuisd bent."
+"This page lists the deferred worker jobs. This are jobs that couldn't be "
+"executed at the first time."
+msgstr "Deze pagine geeft alle uitgestelde workertaken. Dit zijn taken die niet onmiddelijk konden worden uitgevoerd"
 
-#: mod/uimport.php:59
+#: src/Module/Admin/Queue.php:38
+msgid "Inspect Worker Queue"
+msgstr "Taakwachtrij inspecteren"
+
+#: src/Module/Admin/Queue.php:39
 msgid ""
-"This feature is experimental. We can't import contacts from the OStatus "
-"network (GNU Social/Statusnet) or from Diaspora"
-msgstr "Dit feature is experimenteel. We kunnen contacten van het OStatus netwerk (GNU Social/Statusnet) of van Diaspora niet importeren."
+"This page lists the currently queued worker jobs. These jobs are handled by "
+"the worker cronjob you've set up during install."
+msgstr "Deze pagina toont alle taken in de wachtrij. Deze taken worden behandeld door de geplande taak die je hebt ingesteld tijdens installatie."
 
-#: mod/uimport.php:60
-msgid "Account file"
-msgstr "Account bestand"
+#: src/Module/Admin/Queue.php:59
+msgid "ID"
+msgstr "ID"
 
-#: mod/uimport.php:60
-msgid ""
-"To export your account, go to \"Settings->Export your personal data\" and "
-"select \"Export account\""
-msgstr "Om je account te exporteren, ga naar \"Instellingen->Exporteer je persoonlijke data\" en selecteer \"Exporteer account\""
+#: src/Module/Admin/Queue.php:60
+msgid "Job Parameters"
+msgstr "Taak parameters"
 
-#: mod/unfollow.php:36 mod/unfollow.php:92
-msgid "You aren't following this contact."
-msgstr "Je volgt dit contact niet."
+#: src/Module/Admin/Queue.php:61
+msgid "Created"
+msgstr "Aangemaakt"
 
-#: mod/unfollow.php:46 mod/unfollow.php:98
-msgid "Unfollowing is currently not supported by your network."
-msgstr "Ontvolgen is momenteel niet gesupporteerd door je netwerk."
+#: src/Module/Admin/Queue.php:62
+msgid "Priority"
+msgstr "Prioriteit"
 
-#: mod/unfollow.php:67
-msgid "Contact unfollowed"
-msgstr "Contact ontvolgd."
+#: src/Module/Admin/Site.php:50
+msgid "Can not parse base url. Must have at least <scheme>://<domain>"
+msgstr "Kan de basis url niet verwerken. Moet minstens zijn <scheme>://<domain>"
 
-#: mod/unfollow.php:117 src/Module/Contact.php:576
-msgid "Disconnect/Unfollow"
-msgstr "Disconnecteer/stop met volgen"
+#: src/Module/Admin/Site.php:235
+msgid "Invalid storage backend setting value."
+msgstr ""
 
-#: mod/update_community.php:23 mod/update_contact.php:23
-#: mod/update_display.php:24 mod/update_network.php:33 mod/update_notes.php:36
-#: mod/update_profile.php:35
-msgid "[Embedded content - reload page to view]"
-msgstr "[Ingebedde inhoud - herlaad pagina om het te bekijken]"
+#: src/Module/Admin/Site.php:411
+msgid "Site settings updated."
+msgstr "Site instellingen opgeslagen"
 
-#: mod/videos.php:134
-msgid "Do you really want to delete this video?"
-msgstr "Wil je deze video echt verwijderen?"
+#: src/Module/Admin/Site.php:463
+msgid "No community page for local users"
+msgstr "Geen groepspagina voor lokale gebruikers"
+
+#: src/Module/Admin/Site.php:464
+msgid "No community page"
+msgstr "Geen groepspagina"
 
-#: mod/videos.php:139
-msgid "Delete Video"
-msgstr "Verwijder video"
+#: src/Module/Admin/Site.php:465
+msgid "Public postings from users of this site"
+msgstr "Publieke berichten van gebruikers van deze site"
 
-#: mod/videos.php:201
-msgid "No videos selected"
-msgstr "Geen video's geselecteerd"
+#: src/Module/Admin/Site.php:466
+msgid "Public postings from the federated network"
+msgstr "Publieke berichten van het gefedereerde netwerk"
 
-#: mod/videos.php:372 src/Model/Item.php:3430
-msgid "View Video"
-msgstr "Bekijk Video"
+#: src/Module/Admin/Site.php:467
+msgid "Public postings from local users and the federated network"
+msgstr "Publieke berichten van lokale gebruikers en van het gefedereerde netwerk"
 
-#: mod/videos.php:387
-msgid "Recent Videos"
-msgstr "Recente video's"
+#: src/Module/Admin/Site.php:471 src/Module/Admin/Site.php:666
+#: src/Module/Admin/Site.php:676 src/Module/Contact.php:563
+#: src/Module/Settings/TwoFactor/Index.php:97
+msgid "Disabled"
+msgstr "Uitgeschakeld"
 
-#: mod/videos.php:389
-msgid "Upload New Videos"
-msgstr "Nieuwe video's uploaden"
+#: src/Module/Admin/Site.php:472 src/Module/Admin/Users.php:278
+#: src/Module/Admin/Users.php:295 src/Module/BaseAdminModule.php:81
+msgid "Users"
+msgstr "Gebruiker"
 
-#: mod/viewcontacts.php:97
-msgid "No contacts."
-msgstr "Geen contacten."
+#: src/Module/Admin/Site.php:473
+msgid "Users, Global Contacts"
+msgstr "Gebruikers, Globale contacten"
 
-#: mod/viewcontacts.php:113 src/Module/Contact.php:609
-#: src/Module/Contact.php:1029
-#, php-format
-msgid "Visit %s's profile [%s]"
-msgstr "Bekijk het profiel van %s [%s]"
+#: src/Module/Admin/Site.php:474
+msgid "Users, Global Contacts/fallback"
+msgstr "Gebruikers, Globale Contacten/noodoplossing"
 
-#: mod/viewcontacts.php:132 src/Content/Nav.php:200 src/Content/Nav.php:266
-#: src/Content/Text/HTML.php:978 src/Model/Profile.php:980
-#: src/Model/Profile.php:983 src/Module/Contact.php:816
-#: src/Module/Contact.php:886 view/theme/frio/theme.php:284
-msgid "Contacts"
-msgstr "Contacten"
+#: src/Module/Admin/Site.php:478
+msgid "One month"
+msgstr "Een maand"
 
-#: mod/wallmessage.php:52 mod/wallmessage.php:115
-#, php-format
-msgid "Number of daily wall messages for %s exceeded. Message failed."
-msgstr "Maximum aantal dagelijkse tijdlijn boodschappen van %s overschreden. Kon boodschap niet plaatsen."
+#: src/Module/Admin/Site.php:479
+msgid "Three months"
+msgstr "Drie maanden"
 
-#: mod/wallmessage.php:63
-msgid "Unable to check your home location."
-msgstr "Niet in staat om je tijdlijn-locatie vast te stellen"
+#: src/Module/Admin/Site.php:480
+msgid "Half a year"
+msgstr "Een half jaar"
 
-#: mod/wallmessage.php:89 mod/wallmessage.php:98
-msgid "No recipient."
-msgstr "Geen ontvanger."
+#: src/Module/Admin/Site.php:481
+msgid "One year"
+msgstr "Een jaar"
 
-#: 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 "Als je wilt dat %s antwoordt moet je nakijken dat de privacy-instellingen op jouw website privéberichten van onbekende afzenders toelaat."
+#: src/Module/Admin/Site.php:487
+msgid "Multi user instance"
+msgstr "Server voor meerdere gebruikers"
 
-#: mod/wall_attach.php:28 mod/wall_attach.php:35 mod/wall_attach.php:90
-#: mod/wall_upload.php:41 mod/wall_upload.php:57 mod/wall_upload.php:115
-#: mod/wall_upload.php:166 mod/wall_upload.php:169
-msgid "Invalid request."
-msgstr "Ongeldige aanvraag."
+#: src/Module/Admin/Site.php:509
+msgid "Closed"
+msgstr "Gesloten"
 
-#: mod/wall_attach.php:108
-msgid "Sorry, maybe your upload is bigger than the PHP configuration allows"
-msgstr "Sorry, je op te laden bestand is groter dan deze PHP configuratie toelaat"
+#: src/Module/Admin/Site.php:510
+msgid "Requires approval"
+msgstr "Toestemming vereist"
 
-#: mod/wall_attach.php:108
-msgid "Or - did you try to upload an empty file?"
-msgstr "Of - probeerde je een lege file op te laden?"
+#: src/Module/Admin/Site.php:511
+msgid "Open"
+msgstr "Open"
 
-#: mod/wall_attach.php:119
-#, php-format
-msgid "File exceeds size limit of %s"
-msgstr "Bestand is groter dan de limiet ( %s )"
+#: src/Module/Admin/Site.php:515 src/Module/Install.php:183
+msgid "No SSL policy, links will track page SSL state"
+msgstr "Geen SSL beleid, links zullen SSL status van pagina volgen"
 
-#: mod/wall_attach.php:143 mod/wall_attach.php:159
-msgid "File upload failed."
-msgstr "Uploaden van bestand mislukt."
+#: src/Module/Admin/Site.php:516 src/Module/Install.php:184
+msgid "Force all links to use SSL"
+msgstr "Verplicht alle links om SSL te gebruiken"
 
-#: mod/wall_upload.php:242 src/Object/Image.php:968 src/Object/Image.php:984
-#: src/Object/Image.php:992 src/Object/Image.php:1017
-msgid "Wall Photos"
-msgstr "Tijdlijn foto's"
+#: src/Module/Admin/Site.php:517 src/Module/Install.php:185
+msgid "Self-signed certificate, use SSL for local links only (discouraged)"
+msgstr "Zelf-ondertekend certificaat, gebruik SSL alleen voor lokale links (afgeraden)"
 
-#: src/App.php:790
-msgid "Delete this item?"
-msgstr "Dit item verwijderen?"
+#: src/Module/Admin/Site.php:521
+msgid "Don't check"
+msgstr "Geen rekening mee houden"
 
-#: src/App.php:792
-msgid "show fewer"
-msgstr "Minder tonen"
+#: src/Module/Admin/Site.php:522
+msgid "check the stable version"
+msgstr "Neem de stabiele versie in rekening"
 
-#: src/App.php:834
-msgid "toggle mobile"
-msgstr "mobiel thema omwisselen"
+#: src/Module/Admin/Site.php:523
+msgid "check the development version"
+msgstr "Neem de ontwikkel versie in rekening"
 
-#: src/App.php:1383
-msgid "No system theme config value set."
-msgstr "Geen systeem thema configuratie ingesteld."
+#: src/Module/Admin/Site.php:543
+msgid "Database (legacy)"
+msgstr ""
 
-#: 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 "De beveiligingstoken van het formulier was foutief. Dit gebeurde waarschijnlijk omdat het formulier te lang (> 3 uur)  is blijven open staan voor het werd verstuurd."
+#: src/Module/Admin/Site.php:568 src/Module/BaseAdminModule.php:80
+msgid "Site"
+msgstr "Website"
 
-#: src/Content/ContactSelector.php:57
-msgid "Frequently"
-msgstr "Frequent"
+#: src/Module/Admin/Site.php:570
+msgid "Republish users to directory"
+msgstr "Opnieuw de gebruikers naar de gids publiceren"
 
-#: src/Content/ContactSelector.php:58
-msgid "Hourly"
-msgstr "Ieder uur"
+#: src/Module/Admin/Site.php:571 src/Module/Register.php:121
+msgid "Registration"
+msgstr "Registratie"
 
-#: src/Content/ContactSelector.php:59
-msgid "Twice daily"
-msgstr "Twee maal daags"
+#: src/Module/Admin/Site.php:572
+msgid "File upload"
+msgstr "Uploaden bestand"
 
-#: src/Content/ContactSelector.php:60
-msgid "Daily"
-msgstr "Dagelijks"
+#: src/Module/Admin/Site.php:573
+msgid "Policies"
+msgstr "Beleid"
 
-#: src/Content/ContactSelector.php:61
-msgid "Weekly"
-msgstr "Wekelijks"
+#: src/Module/Admin/Site.php:575
+msgid "Auto Discovered Contact Directory"
+msgstr "Automatisch Achterhaalde Contact Gids"
 
-#: src/Content/ContactSelector.php:62
-msgid "Monthly"
-msgstr "Maandelijks"
+#: src/Module/Admin/Site.php:576
+msgid "Performance"
+msgstr "Performantie"
 
-#: src/Content/ContactSelector.php:81
-msgid "DFRN"
-msgstr "DFRN"
+#: src/Module/Admin/Site.php:577
+msgid "Worker"
+msgstr "Worker"
 
-#: src/Content/ContactSelector.php:82
-msgid "OStatus"
-msgstr "OStatus"
+#: src/Module/Admin/Site.php:578
+msgid "Message Relay"
+msgstr "Boodschap Relais"
 
-#: src/Content/ContactSelector.php:83
-msgid "RSS/Atom"
-msgstr "RSS/Atom"
+#: src/Module/Admin/Site.php:579
+msgid "Relocate Instance"
+msgstr "Verhuis node"
 
-#: src/Content/ContactSelector.php:86
-msgid "Zot!"
-msgstr "Zot!"
+#: src/Module/Admin/Site.php:580
+msgid "Warning! Advanced function. Could make this server unreachable."
+msgstr "Waarschuwing! Geavanceerde functie. Dit kan u node onbereikbaar maken"
 
-#: src/Content/ContactSelector.php:87
-msgid "LinkedIn"
-msgstr "LinkedIn"
+#: src/Module/Admin/Site.php:584
+msgid "Site name"
+msgstr "Site naam"
 
-#: src/Content/ContactSelector.php:88
-msgid "XMPP/IM"
-msgstr "XMPP/Chat"
+#: src/Module/Admin/Site.php:585
+msgid "Sender Email"
+msgstr "Verzender Email"
 
-#: src/Content/ContactSelector.php:89
-msgid "MySpace"
-msgstr "MySpace"
+#: src/Module/Admin/Site.php:585
+msgid ""
+"The email address your server shall use to send notification emails from."
+msgstr "Het email adres als afzender van notificatie emails."
 
-#: src/Content/ContactSelector.php:90
-msgid "Google+"
-msgstr "Google+"
+#: src/Module/Admin/Site.php:586
+msgid "Banner/Logo"
+msgstr "Banner/Logo"
 
-#: src/Content/ContactSelector.php:91
-msgid "pump.io"
-msgstr "pump.io"
+#: src/Module/Admin/Site.php:587
+msgid "Shortcut icon"
+msgstr "Snelkoppeling icoon"
 
-#: src/Content/ContactSelector.php:92
-msgid "Twitter"
-msgstr "Twitter"
+#: src/Module/Admin/Site.php:587
+msgid "Link to an icon that will be used for browsers."
+msgstr "Link naar een icoon dat zal gebruikt worden voor browsers."
 
-#: src/Content/ContactSelector.php:93
-msgid "Diaspora Connector"
-msgstr "Diaspora Connector"
+#: src/Module/Admin/Site.php:588
+msgid "Touch icon"
+msgstr "Pictogram voor smartphones"
 
-#: src/Content/ContactSelector.php:94
-msgid "GNU Social Connector"
-msgstr "GNU Social Connector"
+#: src/Module/Admin/Site.php:588
+msgid "Link to an icon that will be used for tablets and mobiles."
+msgstr "Link naar een icoon dat zal gebruikt worden voor tablets en mobiele telefoons."
 
-#: src/Content/ContactSelector.php:95
-msgid "ActivityPub"
-msgstr "ActivityPub"
+#: src/Module/Admin/Site.php:589
+msgid "Additional Info"
+msgstr "Bijkomende Info"
 
-#: src/Content/ContactSelector.php:96
-msgid "pnut"
-msgstr "pnut"
+#: src/Module/Admin/Site.php:589
+#, php-format
+msgid ""
+"For public servers: you can add additional information here that will be "
+"listed at %s/servers."
+msgstr "Voor publieke servers: je kan bijkomende informatie hier toevoegen die zal opgelijst zijn op %s/servers."
 
-#: src/Content/ContactSelector.php:148
-msgid "Male"
-msgstr "Mannelijk"
+#: src/Module/Admin/Site.php:590
+msgid "System language"
+msgstr "Systeemtaal"
 
-#: src/Content/ContactSelector.php:148
-msgid "Female"
-msgstr "Vrouwelijk"
+#: src/Module/Admin/Site.php:591
+msgid "System theme"
+msgstr "Systeem thema"
 
-#: src/Content/ContactSelector.php:148
-msgid "Currently Male"
-msgstr "Momenteel mannelijk"
+#: src/Module/Admin/Site.php:591
+msgid ""
+"Default system theme - may be over-ridden by user profiles - <a "
+"href=\"/admin/themes\" id=\"cnftheme\">Change default theme settings</a>"
+msgstr ""
 
-#: src/Content/ContactSelector.php:148
-msgid "Currently Female"
-msgstr "Momenteel vrouwelijk"
+#: src/Module/Admin/Site.php:592
+msgid "Mobile system theme"
+msgstr "Mobiel systeem thema"
 
-#: src/Content/ContactSelector.php:148
-msgid "Mostly Male"
-msgstr "Hoofdzakelijk mannelijk"
+#: src/Module/Admin/Site.php:592
+msgid "Theme for mobile devices"
+msgstr "Thema voor mobiele apparaten"
 
-#: src/Content/ContactSelector.php:148
-msgid "Mostly Female"
-msgstr "Hoofdzakelijk vrouwelijk"
+#: src/Module/Admin/Site.php:593 src/Module/Install.php:193
+msgid "SSL link policy"
+msgstr "Beleid SSL-links"
 
-#: src/Content/ContactSelector.php:148
-msgid "Transgender"
-msgstr "Transgender"
+#: src/Module/Admin/Site.php:593 src/Module/Install.php:195
+msgid "Determines whether generated links should be forced to use SSL"
+msgstr "Bepaald of gegenereerde verwijzingen verplicht SSL moeten gebruiken"
 
-#: src/Content/ContactSelector.php:148
-msgid "Intersex"
-msgstr "Intersex"
+#: src/Module/Admin/Site.php:594
+msgid "Force SSL"
+msgstr "Dwing SSL af"
 
-#: src/Content/ContactSelector.php:148
-msgid "Transsexual"
-msgstr "Transeksueel"
+#: src/Module/Admin/Site.php:594
+msgid ""
+"Force all Non-SSL requests to SSL - Attention: on some systems it could lead"
+" to endless loops."
+msgstr "Forceer alle Niet-SSL aanvragen naar SSL - Pas op: dit kan op sommige systeem resulteren in oneindige lussen."
 
-#: src/Content/ContactSelector.php:148
-msgid "Hermaphrodite"
-msgstr "Hermafrodiet"
+#: src/Module/Admin/Site.php:595
+msgid "Hide help entry from navigation menu"
+msgstr "Verberg de 'help' uit het navigatiemenu"
 
-#: src/Content/ContactSelector.php:148
-msgid "Neuter"
-msgstr "Onzijdig"
+#: src/Module/Admin/Site.php:595
+msgid ""
+"Hides the menu entry for the Help pages from the navigation menu. You can "
+"still access it calling /help directly."
+msgstr "Verbergt het menu-item voor de Help pagina's uit het navigatiemenu. Je kunt ze nog altijd vinden door /help direct in te geven."
 
-#: src/Content/ContactSelector.php:148
-msgid "Non-specific"
-msgstr "Niet-specifiek"
+#: src/Module/Admin/Site.php:596
+msgid "Single user instance"
+msgstr "Server voor één gebruiker"
 
-#: src/Content/ContactSelector.php:148
-msgid "Other"
-msgstr "Anders"
+#: src/Module/Admin/Site.php:596
+msgid "Make this instance multi-user or single-user for the named user"
+msgstr "Stel deze server in voor meerdere gebruikers, of enkel voor de geselecteerde gebruiker."
 
-#: src/Content/ContactSelector.php:170
-msgid "Males"
-msgstr "Mannen"
+#: src/Module/Admin/Site.php:598
+msgid "File storage backend"
+msgstr ""
 
-#: src/Content/ContactSelector.php:170
-msgid "Females"
-msgstr "Vrouwen"
+#: src/Module/Admin/Site.php:598
+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 "
+"uploaded before the change will still be available at the old backend. "
+"Please see <a href=\"/help/Settings#1_2_3_1\">the settings documentation</a>"
+" for more information about the choices and the moving procedure."
+msgstr ""
 
-#: src/Content/ContactSelector.php:170
-msgid "Gay"
-msgstr "Homo"
+#: src/Module/Admin/Site.php:600
+msgid "Maximum image size"
+msgstr "Maximum afbeeldingsgrootte"
 
-#: src/Content/ContactSelector.php:170
-msgid "Lesbian"
-msgstr "Lesbienne"
+#: src/Module/Admin/Site.php:600
+msgid ""
+"Maximum size in bytes of uploaded images. Default is 0, which means no "
+"limits."
+msgstr "Maximum afmeting in bytes van afbeeldingen. Standaard is 0, dus geen beperking."
 
-#: src/Content/ContactSelector.php:170
-msgid "No Preference"
-msgstr "Geen voorkeur"
+#: src/Module/Admin/Site.php:601
+msgid "Maximum image length"
+msgstr "Maximum afbeeldingslengte"
 
-#: src/Content/ContactSelector.php:170
-msgid "Bisexual"
-msgstr "Biseksueel"
+#: src/Module/Admin/Site.php:601
+msgid ""
+"Maximum length in pixels of the longest side of uploaded images. Default is "
+"-1, which means no limits."
+msgstr "Maximum lengte in pixels van de langste kant van afbeeldingen. Standaard is -1, dus geen beperkingen."
 
-#: src/Content/ContactSelector.php:170
-msgid "Autosexual"
-msgstr "Autoseksueel"
+#: src/Module/Admin/Site.php:602
+msgid "JPEG image quality"
+msgstr "JPEG afbeeldingskwaliteit"
 
-#: src/Content/ContactSelector.php:170
-msgid "Abstinent"
-msgstr "Onthouder"
+#: src/Module/Admin/Site.php:602
+msgid ""
+"Uploaded JPEGS will be saved at this quality setting [0-100]. Default is "
+"100, which is full quality."
+msgstr "JPEGS zullen met deze kwaliteitsinstelling bewaard worden [0-100]. Standaard is 100, dit is volledige kwaliteit."
 
-#: src/Content/ContactSelector.php:170
-msgid "Virgin"
-msgstr "Maagd"
+#: src/Module/Admin/Site.php:604
+msgid "Register policy"
+msgstr "Registratiebeleid"
 
-#: src/Content/ContactSelector.php:170
-msgid "Deviant"
-msgstr "Afwijkend"
+#: src/Module/Admin/Site.php:605
+msgid "Maximum Daily Registrations"
+msgstr "Maximum aantal registraties per dag"
 
-#: src/Content/ContactSelector.php:170
-msgid "Fetish"
-msgstr "Fetisj"
+#: src/Module/Admin/Site.php:605
+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 "Als registratie hierboven is toegelaten, zet dit het maximum aantal registraties van nieuwe gebruikers per dag. Als registratie niet is toegelaten heeft deze instelling geen effect."
 
-#: src/Content/ContactSelector.php:170
-msgid "Oodles"
-msgstr "Veel"
+#: src/Module/Admin/Site.php:606
+msgid "Register text"
+msgstr "Registratietekst"
 
-#: src/Content/ContactSelector.php:170
-msgid "Nonsexual"
-msgstr "Niet seksueel"
+#: src/Module/Admin/Site.php:606
+msgid ""
+"Will be displayed prominently on the registration page. You can use BBCode "
+"here."
+msgstr "Zal prominent op de registratie pagina getoond worden. Je kan hierin BBCode gebruiken."
+
+#: src/Module/Admin/Site.php:607
+msgid "Forbidden Nicknames"
+msgstr "Verboden bijnamen"
 
-#: src/Content/ContactSelector.php:192
-msgid "Single"
-msgstr "Alleenstaand"
+#: src/Module/Admin/Site.php:607
+msgid ""
+"Comma separated list of nicknames that are forbidden from registration. "
+"Preset is a list of role names according RFC 2142."
+msgstr "Kommagescheiden lijst van bijnamen die verboden zijn voor registratie. De lijst uit RFC2142 is op voorhand ingesteld."
 
-#: src/Content/ContactSelector.php:192
-msgid "Lonely"
-msgstr "Eenzaam"
+#: src/Module/Admin/Site.php:608
+msgid "Accounts abandoned after x days"
+msgstr "Verlaten accounts na x dagen"
 
-#: src/Content/ContactSelector.php:192
-msgid "Available"
-msgstr "Beschikbaar"
+#: src/Module/Admin/Site.php:608
+msgid ""
+"Will not waste system resources polling external sites for abandonded "
+"accounts. Enter 0 for no time limit."
+msgstr "Dit zal geen systeembronnen verspillen aan het nakijken van externe sites voor verlaten accounts. Geef 0 is voor geen tijdslimiet."
 
-#: src/Content/ContactSelector.php:192
-msgid "Unavailable"
-msgstr "Onbeschikbaar"
+#: src/Module/Admin/Site.php:609
+msgid "Allowed friend domains"
+msgstr "Toegelaten vriend domeinen"
 
-#: src/Content/ContactSelector.php:192
-msgid "Has crush"
-msgstr "Verliefd"
+#: src/Module/Admin/Site.php:609
+msgid ""
+"Comma separated list of domains which are allowed to establish friendships "
+"with this site. Wildcards are accepted. Empty to allow any domains"
+msgstr "Komma-gescheiden lijst van domeinen die een vriendschapsband met deze website mogen aangaan. Jokers zijn toegelaten. Laat leeg om alle domeinen toe te laten."
 
-#: src/Content/ContactSelector.php:192
-msgid "Infatuated"
-msgstr "Smoorverliefd"
+#: src/Module/Admin/Site.php:610
+msgid "Allowed email domains"
+msgstr "Toegelaten e-mail domeinen"
 
-#: src/Content/ContactSelector.php:192
-msgid "Dating"
-msgstr "Aan het daten"
+#: src/Module/Admin/Site.php:610
+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 "Door komma's gescheiden lijst met e-maildomeinen die op deze website mogen registeren. Wildcards zijn toegestaan.\nLeeg laten om alle domeinen toe te staan."
 
-#: src/Content/ContactSelector.php:192
-msgid "Unfaithful"
-msgstr "Ontrouw"
+#: src/Module/Admin/Site.php:611
+msgid "No OEmbed rich content"
+msgstr "Geen OEmbed richt content"
 
-#: src/Content/ContactSelector.php:192
-msgid "Sex Addict"
-msgstr "Seksverslaafd"
+#: src/Module/Admin/Site.php:611
+msgid ""
+"Don't show the rich content (e.g. embedded PDF), except from the domains "
+"listed below."
+msgstr "Toon geen rich content (bvb. embedded PDF), behalve van domeinen hieronder opgelijst."
 
-#: src/Content/ContactSelector.php:192 src/Model/User.php:618
-msgid "Friends"
-msgstr "Vrienden"
+#: src/Module/Admin/Site.php:612
+msgid "Allowed OEmbed domains"
+msgstr "Sta OEmbed domeinen toe"
 
-#: src/Content/ContactSelector.php:192
-msgid "Friends/Benefits"
-msgstr "Vriendschap plus"
+#: src/Module/Admin/Site.php:612
+msgid ""
+"Comma separated list of domains which oembed content is allowed to be "
+"displayed. Wildcards are accepted."
+msgstr "Met komma's gescheiden lijst van domeinen waarvoor oembed content mag getoond worden. Wildcards zijn toegelaten."
 
-#: src/Content/ContactSelector.php:192
-msgid "Casual"
-msgstr "Ongebonden/vluchtig"
+#: src/Module/Admin/Site.php:613
+msgid "Block public"
+msgstr "Openbare toegang blokkeren"
 
-#: src/Content/ContactSelector.php:192
-msgid "Engaged"
-msgstr "Verloofd"
+#: src/Module/Admin/Site.php:613
+msgid ""
+"Check to block public access to all otherwise public personal pages on this "
+"site unless you are currently logged in."
+msgstr "Kruis dit aan om alle openbare persoonlijke pagina's alleen toegankelijk te maken voor ingelogde gebruikers."
 
-#: src/Content/ContactSelector.php:192
-msgid "Married"
-msgstr "Getrouwd"
+#: src/Module/Admin/Site.php:614
+msgid "Force publish"
+msgstr "Dwing publiceren af"
 
-#: src/Content/ContactSelector.php:192
-msgid "Imaginarily married"
-msgstr "Denkbeeldig getrouwd"
+#: src/Module/Admin/Site.php:614
+msgid ""
+"Check to force all profiles on this site to be listed in the site directory."
+msgstr "Kruis dit aan om af te dwingen dat alle profielen op deze website in de gids van deze website gepubliceerd worden."
 
-#: src/Content/ContactSelector.php:192
-msgid "Partners"
-msgstr "Partners"
+#: src/Module/Admin/Site.php:614
+msgid "Enabling this may violate privacy laws like the GDPR"
+msgstr "Dit activeren zou privacy wetten zoals GDPR (AVG) kunnen overtreden"
 
-#: src/Content/ContactSelector.php:192
-msgid "Cohabiting"
-msgstr "Samenwonend"
+#: src/Module/Admin/Site.php:615
+msgid "Global directory URL"
+msgstr "Algemene gids URL"
 
-#: src/Content/ContactSelector.php:192
-msgid "Common law"
-msgstr "getrouwd voor-de-wet"
+#: src/Module/Admin/Site.php:615
+msgid ""
+"URL to the global directory. If this is not set, the global directory is "
+"completely unavailable to the application."
+msgstr "URL naar de globale gids. Als dit niet geconfigureerd is, dan zal de globale gids volledig onbeschikbaar zijn voor de applicatie."
 
-#: src/Content/ContactSelector.php:192
-msgid "Happy"
-msgstr "Blij"
+#: src/Module/Admin/Site.php:616
+msgid "Private posts by default for new users"
+msgstr "Privéberichten als standaard voor nieuwe gebruikers"
 
-#: src/Content/ContactSelector.php:192
-msgid "Not looking"
-msgstr "Niet op zoek"
+#: src/Module/Admin/Site.php:616
+msgid ""
+"Set default post permissions for all new members to the default privacy "
+"group rather than public."
+msgstr "Stel de standaardrechten van berichten voor nieuwe leden op de standaard privacygroep in, in plaats van openbaar."
 
-#: src/Content/ContactSelector.php:192
-msgid "Swinger"
-msgstr "Swinger"
+#: src/Module/Admin/Site.php:617
+msgid "Don't include post content in email notifications"
+msgstr "De inhoud van het bericht niet insluiten bij e-mailnotificaties"
 
-#: src/Content/ContactSelector.php:192
-msgid "Betrayed"
-msgstr "Bedrogen"
+#: src/Module/Admin/Site.php:617
+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 "De inhoud van berichten/commentaar/privéberichten/enzovoort  niet insluiten in e-mailnotificaties die door deze website verzonden worden, voor de bescherming van je privacy."
 
-#: src/Content/ContactSelector.php:192
-msgid "Separated"
-msgstr "Uit elkaar"
+#: src/Module/Admin/Site.php:618
+msgid "Disallow public access to addons listed in the apps menu."
+msgstr "Publieke toegang ontzeggen tot addons die opgelijst zijn in het applicatie menu."
 
-#: src/Content/ContactSelector.php:192
-msgid "Unstable"
-msgstr "Onstabiel"
+#: src/Module/Admin/Site.php:618
+msgid ""
+"Checking this box will restrict addons listed in the apps menu to members "
+"only."
+msgstr "Dit vakje aanvinken zal de lijst van addons in het applicatie menu beperken tot alleen leden."
 
-#: src/Content/ContactSelector.php:192
-msgid "Divorced"
-msgstr "Gescheiden"
+#: src/Module/Admin/Site.php:619
+msgid "Don't embed private images in posts"
+msgstr "Privé beelden in berichten niet inwerken"
 
-#: src/Content/ContactSelector.php:192
-msgid "Imaginarily divorced"
-msgstr "Denkbeeldig gescheiden"
+#: src/Module/Admin/Site.php:619
+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 "
+"photos will have to authenticate and load each image, which may take a "
+"while."
+msgstr "Vervang lokaal gehoste privé foto's in berichten niet door een ingewerkte kopie van het beeld. Dit betekent dat contacten die berichten krijgen met privé foto's zullen moeten authentificeren en elk beeld apart laden, wat een tijdje kan duren."
 
-#: src/Content/ContactSelector.php:192
-msgid "Widowed"
-msgstr "Weduwnaar/weduwe"
+#: src/Module/Admin/Site.php:620
+msgid "Explicit Content"
+msgstr "Expliciete inhoud"
 
-#: src/Content/ContactSelector.php:192
-msgid "Uncertain"
-msgstr "Onzeker"
+#: src/Module/Admin/Site.php:620
+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 "
+"node information and might be used, e.g. by the global directory, to filter "
+"your node from listings of nodes to join. Additionally a note about this "
+"will be shown at the user registration page."
+msgstr "Vink dit aan om aan te duiden dat deze node veel expliciet materiaal verspreid en niet bedoeld is voor minderjarigen. Deze info zal gepubliceert worden bij de node-info en kan vb. gebruikt worden voor een filter in de globale lijst. Dit word ook getoont naar de gebruiker op de registratie pagina."
 
-#: src/Content/ContactSelector.php:192
-msgid "It's complicated"
-msgstr "Het is gecompliceerd"
+#: src/Module/Admin/Site.php:621
+msgid "Allow Users to set remote_self"
+msgstr "Sta Gebruikers toe om remote_self te configureren"
 
-#: src/Content/ContactSelector.php:192
-msgid "Don't care"
-msgstr "Kan me niet schelen"
+#: src/Module/Admin/Site.php:621
+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 "Als je dit aanvinkt, dan mag elke gebruiker elke contact als remote_self aanduiden in de 'herstel contact' dialoog. Deze vlag aanzetten voor een contact zorgt ervoor dat elke bericht van dit contact gespiegeld wordt in de gebruiker zijn of haar stroom. "
 
-#: src/Content/ContactSelector.php:192
-msgid "Ask me"
-msgstr "Vraag me"
+#: src/Module/Admin/Site.php:622
+msgid "Block multiple registrations"
+msgstr "Blokkeer meerdere registraties"
 
-#: src/Content/Feature.php:79
-msgid "General Features"
-msgstr "Algemene functies"
+#: src/Module/Admin/Site.php:622
+msgid "Disallow users to register additional accounts for use as pages."
+msgstr "Laat niet toe dat gebruikers meerdere accounts aanmaken."
 
-#: src/Content/Feature.php:81
-msgid "Multiple Profiles"
-msgstr "Meerdere profielen"
+#: src/Module/Admin/Site.php:623
+msgid "Disable OpenID"
+msgstr ""
 
-#: src/Content/Feature.php:81
-msgid "Ability to create multiple profiles"
-msgstr "Mogelijkheid om meerdere profielen aan te maken"
+#: src/Module/Admin/Site.php:623
+msgid "Disable OpenID support for registration and logins."
+msgstr ""
 
-#: src/Content/Feature.php:82
-msgid "Photo Location"
-msgstr "Foto Locatie"
+#: src/Module/Admin/Site.php:624
+msgid "No Fullname check"
+msgstr ""
 
-#: src/Content/Feature.php:82
+#: src/Module/Admin/Site.php:624
 msgid ""
-"Photo metadata is normally stripped. This extracts the location (if present)"
-" prior to stripping metadata and links it to a map."
-msgstr "Foto metadata wordt normaal verwijderd. Dit extraheert de locatie (indien aanwezig) vooraleer de metadata te verwijderen en verbindt die met een kaart."
-
-#: src/Content/Feature.php:83
-msgid "Export Public Calendar"
-msgstr "Exporteer Publieke Kalender"
+"Allow users to register without a space between the first name and the last "
+"name in their full name."
+msgstr ""
 
-#: src/Content/Feature.php:83
-msgid "Ability for visitors to download the public calendar"
-msgstr "Mogelijkheid voor bezoekers om de publieke kalender te downloaden"
+#: src/Module/Admin/Site.php:625
+msgid "Community pages for visitors"
+msgstr "Groepspagina voor bezoekers"
 
-#: src/Content/Feature.php:88
-msgid "Post Composition Features"
-msgstr "Functies voor het opstellen van berichten"
+#: src/Module/Admin/Site.php:625
+msgid ""
+"Which community pages should be available for visitors. Local users always "
+"see both pages."
+msgstr "Welke groepspagina's moeten beschikbaar zijn voor bezoekers. Lokale gebruikers zien altijd beide pagina's."
 
-#: src/Content/Feature.php:89
-msgid "Auto-mention Forums"
-msgstr "Auto-vermelding Forums"
+#: src/Module/Admin/Site.php:626
+msgid "Posts per user on community page"
+msgstr "Berichten per gebruiker op de groepspagina"
 
-#: src/Content/Feature.php:89
+#: src/Module/Admin/Site.php:626
 msgid ""
-"Add/remove mention when a forum page is selected/deselected in ACL window."
-msgstr "Voeg toe/verwijder vermelding wanneer een forum pagina geselecteerd/gedeselecteerd wordt in het ACL venster."
+"The maximum number of posts per user on the community page. (Not valid for "
+"\"Global Community\")"
+msgstr ""
 
-#: src/Content/Feature.php:94
-msgid "Network Sidebar"
-msgstr "Netwerk Zijbalk"
+#: src/Module/Admin/Site.php:627
+msgid "Disable OStatus support"
+msgstr ""
 
-#: src/Content/Feature.php:95
-msgid "Ability to select posts by date ranges"
-msgstr "Mogelijkheid om berichten te selecteren volgens datumbereik"
+#: src/Module/Admin/Site.php:627
+msgid ""
+"Disable built-in OStatus (StatusNet, GNU Social etc.) compatibility. All "
+"communications in OStatus are public, so privacy warnings will be "
+"occasionally displayed."
+msgstr ""
 
-#: src/Content/Feature.php:96
-msgid "Protocol Filter"
-msgstr "Proctocol Filter"
+#: src/Module/Admin/Site.php:628
+msgid "OStatus support can only be enabled if threading is enabled."
+msgstr "OStatus ondersteuning kan alleen geactiveerd worden als de gespreksstroom geactiveerd is."
 
-#: src/Content/Feature.php:96
-msgid "Enable widget to display Network posts only from selected protocols"
-msgstr "Sta de widget toe om netwerkberichten te tonen van bepaalde protocollen"
+#: src/Module/Admin/Site.php:630
+msgid ""
+"Diaspora support can't be enabled because Friendica was installed into a sub"
+" directory."
+msgstr "Diaspora ondersteuning is niet mogelijk omdat Friendica in een sub folder geïnstalleerd is."
 
-#: src/Content/Feature.php:101
-msgid "Network Tabs"
-msgstr "Netwerktabs"
+#: src/Module/Admin/Site.php:631
+msgid "Enable Diaspora support"
+msgstr "Diaspora ondersteuning activeren"
 
-#: src/Content/Feature.php:102
-msgid "Network New Tab"
-msgstr "Nieuwe netwerktab"
+#: src/Module/Admin/Site.php:631
+msgid "Provide built-in Diaspora network compatibility."
+msgstr "Bied ingebouwde ondersteuning voor het Diaspora netwerk."
 
-#: src/Content/Feature.php:102
-msgid "Enable tab to display only new Network posts (from the last 12 hours)"
-msgstr "Laat de tab alleen nieuwe netwerkberichten tonen (van de laatste 12 uur)"
+#: src/Module/Admin/Site.php:632
+msgid "Only allow Friendica contacts"
+msgstr "Laat alleen Friendica contacten toe"
 
-#: src/Content/Feature.php:103
-msgid "Network Shared Links Tab"
-msgstr "Netwerk Gedeelde Links Tab"
+#: src/Module/Admin/Site.php:632
+msgid ""
+"All contacts must use Friendica protocols. All other built-in communication "
+"protocols disabled."
+msgstr "Alle contacten moeten een Friendica protocol gebruiken. Alle andere ingebouwde communicatieprotocols worden uitgeschakeld."
 
-#: src/Content/Feature.php:103
-msgid "Enable tab to display only Network posts with links in them"
-msgstr "Activeer tab om alleen Netwerk berichten met links in te tonen"
+#: src/Module/Admin/Site.php:633
+msgid "Verify SSL"
+msgstr "Controleer SSL"
 
-#: src/Content/Feature.php:108
-msgid "Post/Comment Tools"
-msgstr "Bericht-/reactiehulpmiddelen"
+#: src/Module/Admin/Site.php:633
+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 "Als je wilt kun je striktere certificaat controle activeren. Dit betekent dat je (totaal) niet kunt connecteren met sites die zelf-ondertekende SSL certificaten gebruiken."
 
-#: src/Content/Feature.php:109
-msgid "Post Categories"
-msgstr "Categorieën berichten"
+#: src/Module/Admin/Site.php:634
+msgid "Proxy user"
+msgstr "Proxy-gebruiker"
 
-#: src/Content/Feature.php:109
-msgid "Add categories to your posts"
-msgstr "Voeg categorieën toe aan je berichten"
+#: src/Module/Admin/Site.php:635
+msgid "Proxy URL"
+msgstr "Proxy-URL"
+
+#: src/Module/Admin/Site.php:636
+msgid "Network timeout"
+msgstr "Netwerk timeout"
 
-#: src/Content/Feature.php:114
-msgid "Advanced Profile Settings"
-msgstr "Geavanceerde Profiel Instellingen"
+#: src/Module/Admin/Site.php:636
+msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
+msgstr "Waarde is in seconden. Zet op 0 voor onbeperkt (niet aanbevolen)."
 
-#: src/Content/Feature.php:115
-msgid "List Forums"
-msgstr "Lijst Fora op"
+#: src/Module/Admin/Site.php:637
+msgid "Maximum Load Average"
+msgstr "Maximum gemiddelde belasting"
 
-#: src/Content/Feature.php:115
-msgid "Show visitors public community forums at the Advanced Profile Page"
-msgstr "Toon bezoekers de publieke groepsfora in de Geavanceerde Profiel Pagina"
+#: src/Module/Admin/Site.php:637
+#, php-format
+msgid ""
+"Maximum system load before delivery and poll processes are deferred - "
+"default %d."
+msgstr ""
 
-#: src/Content/Feature.php:116
-msgid "Tag Cloud"
-msgstr "Tag Wolk"
+#: src/Module/Admin/Site.php:638
+msgid "Maximum Load Average (Frontend)"
+msgstr "Maximum Gemiddelde Belasting (Frontend)"
 
-#: src/Content/Feature.php:116
-msgid "Provide a personal tag cloud on your profile page"
-msgstr "Voorzie een persoonlijk tag wolk op je profiel pagina"
+#: src/Module/Admin/Site.php:638
+msgid "Maximum system load before the frontend quits service - default 50."
+msgstr "Maximum systeem belasting wanneer de frontend ermee ophoudt - standaard waarde 50."
 
-#: src/Content/Feature.php:117
-msgid "Display Membership Date"
-msgstr "Toon Lidmaatschap Datum"
+#: src/Module/Admin/Site.php:639
+msgid "Minimal Memory"
+msgstr "Minimaal Geheugen"
 
-#: src/Content/Feature.php:117
-msgid "Display membership date in profile"
-msgstr "Toon lidmaatschap datum in profiel"
+#: src/Module/Admin/Site.php:639
+msgid ""
+"Minimal free memory in MB for the worker. Needs access to /proc/meminfo - "
+"default 0 (deactivated)."
+msgstr "Minimum vrij geheugen in MB voor de worker. Toegang nodig tot /proc/meminfo - standaard waarde 0 (gedeactiveerd)."
 
-#: src/Content/ForumManager.php:128 src/Content/Nav.php:204
-#: src/Content/Text/HTML.php:981 view/theme/vier/theme.php:253
-msgid "Forums"
-msgstr "Forums"
+#: src/Module/Admin/Site.php:640
+msgid "Maximum table size for optimization"
+msgstr "Maximum tabel grootte voor optimisatie"
 
-#: src/Content/ForumManager.php:130 view/theme/vier/theme.php:255
-msgid "External link to forum"
-msgstr "Externe link naar het forum"
+#: src/Module/Admin/Site.php:640
+msgid ""
+"Maximum table size (in MB) for the automatic optimization. Enter -1 to "
+"disable it."
+msgstr "Maximum tabel grootte (in MB) voor de automatisch optimisatie. Geef -1 op om dit te deactiveren."
 
-#: src/Content/Nav.php:72
-msgid "Nothing new here"
-msgstr "Niets nieuw hier"
+#: src/Module/Admin/Site.php:641
+msgid "Minimum level of fragmentation"
+msgstr "Minimum niveau van fragmentatie"
 
-#: src/Content/Nav.php:76
-msgid "Clear notifications"
-msgstr "Notificaties verwijderen"
+#: src/Module/Admin/Site.php:641
+msgid ""
+"Minimum fragmenation level to start the automatic optimization - default "
+"value is 30%."
+msgstr "Minimum fragmentatie niveau om de automatische optimisatie te starten - standaard waarde is 30%."
 
-#: src/Content/Nav.php:77 src/Content/Text/HTML.php:970
-msgid "@name, !forum, #tags, content"
-msgstr "@naam, !forum, #labels, inhoud"
+#: src/Module/Admin/Site.php:643
+msgid "Periodical check of global contacts"
+msgstr "Regematige controle van de globale contacten"
 
-#: src/Content/Nav.php:150 src/Module/Login.php:321
-#: view/theme/frio/theme.php:270
-msgid "Logout"
-msgstr "Uitloggen"
+#: src/Module/Admin/Site.php:643
+msgid ""
+"If enabled, the global contacts are checked periodically for missing or "
+"outdated data and the vitality of the contacts and servers."
+msgstr "Als dit geactiveerd is, dan worden de globale contacten regelmatig gecheckt naar ontbrekende of verlopen data and the vitaliteit van de contacten en servers."
 
-#: src/Content/Nav.php:150 view/theme/frio/theme.php:270
-msgid "End this session"
-msgstr "Deze sessie beëindigen"
+#: src/Module/Admin/Site.php:644
+msgid "Days between requery"
+msgstr "Dagen tussen herbevraging"
 
-#: src/Content/Nav.php:153 src/Model/Profile.php:901
-#: src/Module/Contact.php:659 src/Module/Contact.php:858
-#: view/theme/frio/theme.php:273
-msgid "Status"
-msgstr "Tijdlijn"
+#: src/Module/Admin/Site.php:644
+msgid "Number of days after which a server is requeried for his contacts."
+msgstr "Aantal dagen waarna de server opnieuw bevraagd wordt naar zijn contacten."
 
-#: src/Content/Nav.php:153 src/Content/Nav.php:239
-#: view/theme/frio/theme.php:273
-msgid "Your posts and conversations"
-msgstr "Jouw berichten en gesprekken"
+#: src/Module/Admin/Site.php:645
+msgid "Discover contacts from other servers"
+msgstr "Ontdek contacten van andere servers"
 
-#: src/Content/Nav.php:154 view/theme/frio/theme.php:274
-msgid "Your profile page"
-msgstr "Jouw profiel pagina"
+#: src/Module/Admin/Site.php:645
+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 recommended "
+"setting is \"Users, Global Contacts\"."
+msgstr ""
 
-#: src/Content/Nav.php:155 view/theme/frio/theme.php:275
-msgid "Your photos"
-msgstr "Jouw foto's"
+#: src/Module/Admin/Site.php:646
+msgid "Timeframe for fetching global contacts"
+msgstr "Tijdspanne voor het ophalen van globale contacten"
 
-#: src/Content/Nav.php:156 src/Model/Profile.php:925 src/Model/Profile.php:928
-#: view/theme/frio/theme.php:276
-msgid "Videos"
-msgstr "Video's"
+#: src/Module/Admin/Site.php:646
+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 "Wanneer ontdekking is geactiveerd, dan definieert deze waarde de tijdspanne voor de activiteit van globale contacten die opgehaald worden van andere servers."
 
-#: src/Content/Nav.php:156 view/theme/frio/theme.php:276
-msgid "Your videos"
-msgstr "Je video's"
+#: src/Module/Admin/Site.php:647
+msgid "Search the local directory"
+msgstr "Doorzoek de lokale gids"
 
-#: src/Content/Nav.php:157 view/theme/frio/theme.php:277
-msgid "Your events"
-msgstr "Jouw gebeurtenissen"
+#: src/Module/Admin/Site.php:647
+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 "Doorzoek de lokale gids in plaats van de globale gids. Bij lokale doorzoeking wordt elke opzoeking in de globale gids op de achtergrond uitgevoerd. Dit verbetert de zoekresultaten wanneer de zoekopdracht herhaald wordt."
 
-#: src/Content/Nav.php:158
-msgid "Personal notes"
-msgstr "Persoonlijke nota's"
+#: src/Module/Admin/Site.php:649
+msgid "Publish server information"
+msgstr "Publiceer server informatie"
 
-#: src/Content/Nav.php:158
-msgid "Your personal notes"
-msgstr "Je persoonlijke nota's"
+#: src/Module/Admin/Site.php:649
+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 "
+"profiles, number of posts and the activated protocols and connectors. See <a"
+" href=\"http://the-federation.info/\">the-federation.info</a> for details."
+msgstr ""
 
-#: src/Content/Nav.php:167
-msgid "Sign in"
-msgstr "Inloggen"
+#: src/Module/Admin/Site.php:651
+msgid "Check upstream version"
+msgstr "Controleer upstream versie"
 
-#: src/Content/Nav.php:177 src/Content/Nav.php:239
-#: src/Core/NotificationsManager.php:194
-msgid "Home"
-msgstr "Tijdlijn"
+#: src/Module/Admin/Site.php:651
+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 "Activeer het controleren op nieuwe versies van Friendica bij github. Als er een nieuwe versie is, dan word je geïnformeerd in the administratie paneel."
 
-#: src/Content/Nav.php:177
-msgid "Home Page"
-msgstr "Jouw tijdlijn"
+#: src/Module/Admin/Site.php:652
+msgid "Suppress Tags"
+msgstr "Onderdruk Tags"
 
-#: src/Content/Nav.php:181
-msgid "Create an account"
-msgstr "Maak een accoount"
+#: src/Module/Admin/Site.php:652
+msgid "Suppress showing a list of hashtags at the end of the posting."
+msgstr "Onderdruk het tonen van een lijst van hastags op het einde van het bericht."
 
-#: src/Content/Nav.php:187
-msgid "Help and documentation"
-msgstr "Hulp en documentatie"
+#: src/Module/Admin/Site.php:653
+msgid "Clean database"
+msgstr "Database opruimen"
 
-#: src/Content/Nav.php:191
-msgid "Apps"
-msgstr "Apps"
+#: src/Module/Admin/Site.php:653
+msgid ""
+"Remove old remote items, orphaned database records and old content from some"
+" other helper tables."
+msgstr "Verwijder oude remote items, database weesrecords en oude content van andere helper tabellen."
 
-#: src/Content/Nav.php:191
-msgid "Addon applications, utilities, games"
-msgstr "Extra toepassingen, hulpmiddelen of spelletjes"
+#: src/Module/Admin/Site.php:654
+msgid "Lifespan of remote items"
+msgstr "Levensduur van remote items"
 
-#: src/Content/Nav.php:195
-msgid "Search site content"
-msgstr "Doorzoek de inhoud van de website"
+#: src/Module/Admin/Site.php:654
+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 "Als de database opruiming is geactiveerd, dan definieert dit na hoeveel dagen remote items verwijderd zullen worden. Eigen items, en gemarkeerde of opgeslagen items worden altijd behouden. 0 deactiveert dit gedrag."
 
-#: src/Content/Nav.php:198 src/Content/Text/HTML.php:976
-msgid "Full Text"
-msgstr "Volledige tekst"
+#: src/Module/Admin/Site.php:655
+msgid "Lifespan of unclaimed items"
+msgstr "Levensduur van niet geclaimde items"
 
-#: src/Content/Nav.php:199 src/Content/Text/HTML.php:977
-#: src/Content/Widget/TagCloud.php:55
-msgid "Tags"
-msgstr "Labels"
+#: src/Module/Admin/Site.php:655
+msgid ""
+"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."
+msgstr "Als de database opruiming geactiveerd is, dan definieert dit na hoeveel dagen ongeclaimde remote items (meestal content van een relais) zal verwijderd worden. Standaard waarde is 90 dagen. Als de waarde 0 is, dan is de waarde gelijk aan de algemene levensduur van remote items."
 
-#: src/Content/Nav.php:219
-msgid "Community"
-msgstr "Website"
+#: src/Module/Admin/Site.php:656
+msgid "Lifespan of raw conversation data"
+msgstr "Levenstijd van ruwe gespreksdata"
 
-#: src/Content/Nav.php:219
-msgid "Conversations on this and other servers"
-msgstr "Gesprekken op deze en andere servers"
+#: src/Module/Admin/Site.php:656
+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 "De gespreksdata word gebruikt voor ActivityPub, OStatus en voor debugging doeleinden. Het is veilig om dit na 14 dagen te verwijderen. Standaard staat dit op 90 dagen."
 
-#: src/Content/Nav.php:223 src/Model/Profile.php:940 src/Model/Profile.php:951
-#: view/theme/frio/theme.php:281
-msgid "Events and Calendar"
-msgstr "Gebeurtenissen en kalender"
+#: src/Module/Admin/Site.php:657
+msgid "Path to item cache"
+msgstr "Pad naar cache voor items"
 
-#: src/Content/Nav.php:226
-msgid "Directory"
-msgstr "Gids"
+#: src/Module/Admin/Site.php:657
+msgid "The item caches buffers generated bbcode and external images."
+msgstr "Item caches bufferen gegenereerde bbcodes en externe beelden."
 
-#: src/Content/Nav.php:226
-msgid "People directory"
-msgstr "Personengids"
+#: src/Module/Admin/Site.php:658
+msgid "Cache duration in seconds"
+msgstr "Cache tijdsduur in seconden"
 
-#: src/Content/Nav.php:228
-msgid "Information about this friendica instance"
-msgstr "informatie over deze friendica server"
+#: src/Module/Admin/Site.php:658
+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 "Hoe lang moeten de cache bestanden bijgehouden worden? Standaard waarde is 86400 seconden (een dag). Zet de waarde op -1 om de item cache te deactiveren."
 
-#: src/Content/Nav.php:231
-msgid "Terms of Service of this Friendica instance"
-msgstr "Gebruiksvoorwaarden op deze Friendica server"
+#: src/Module/Admin/Site.php:659
+msgid "Maximum numbers of comments per post"
+msgstr "Maximum aantal reacties per bericht"
 
-#: src/Content/Nav.php:236 view/theme/frio/theme.php:280
-msgid "Conversations from your friends"
-msgstr "Gesprekken van je vrienden"
+#: src/Module/Admin/Site.php:659
+msgid "How much comments should be shown for each post? Default value is 100."
+msgstr "Hoeveel reacties moeten getoond worden per bericht? Standaard waarde is 100."
 
-#: src/Content/Nav.php:237
-msgid "Network Reset"
-msgstr "Netwerkpagina opnieuw instellen"
+#: src/Module/Admin/Site.php:660
+msgid "Temp path"
+msgstr "Tijdelijk pad"
 
-#: src/Content/Nav.php:237
-msgid "Load Network page with no filters"
-msgstr "Laad de netwerkpagina zonder filters"
+#: src/Module/Admin/Site.php:660
+msgid ""
+"If you have a restricted system where the webserver can't access the system "
+"temp path, enter another path here."
+msgstr "Als je een systeem met restricties hebt waarbij de webserver geen toegang heeft tot het systeem pad, geef hier dan een ander pad in. "
 
-#: src/Content/Nav.php:243 src/Core/NotificationsManager.php:201
-msgid "Introductions"
-msgstr "Verzoeken"
+#: src/Module/Admin/Site.php:661
+msgid "Disable picture proxy"
+msgstr "Schakel beeld proxy uit"
 
-#: src/Content/Nav.php:243
-msgid "Friend Requests"
-msgstr "Vriendschapsverzoeken"
+#: src/Module/Admin/Site.php:661
+msgid ""
+"The picture proxy increases performance and privacy. It shouldn't be used on"
+" systems with very low bandwidth."
+msgstr "De beeld proxy verhoogt de performantie en privacy. Gebruik dit niet op systemen met erg lage bandbreedte."
 
-#: src/Content/Nav.php:245
-msgid "See all notifications"
-msgstr "Toon alle notificaties"
+#: src/Module/Admin/Site.php:662
+msgid "Only search in tags"
+msgstr "Zoek alleen in tags"
 
-#: src/Content/Nav.php:246
-msgid "Mark all system notifications seen"
-msgstr "Alle systeemnotificaties als gelezen markeren"
+#: src/Module/Admin/Site.php:662
+msgid "On large systems the text search can slow down the system extremely."
+msgstr "Het opzoeken van tekst kan grote systemen extreem vertragen."
 
-#: src/Content/Nav.php:249 view/theme/frio/theme.php:282
-msgid "Private mail"
-msgstr "Privéberichten"
+#: src/Module/Admin/Site.php:664
+msgid "New base url"
+msgstr "Nieuwe basis url"
 
-#: src/Content/Nav.php:250
-msgid "Inbox"
-msgstr "Inbox"
+#: src/Module/Admin/Site.php:664
+msgid ""
+"Change base url for this server. Sends relocate message to all Friendica and"
+" Diaspora* contacts of all users."
+msgstr "Verander de basis url voor deze server. Stuurt een verhuis boodschap naar all Friendica en Diaspora* contacten."
 
-#: src/Content/Nav.php:251
-msgid "Outbox"
-msgstr "Verzonden berichten"
+#: src/Module/Admin/Site.php:666
+msgid "RINO Encryption"
+msgstr "RINO encryptie"
 
-#: src/Content/Nav.php:255
-msgid "Manage"
-msgstr "Beheren"
+#: src/Module/Admin/Site.php:666
+msgid "Encryption layer between nodes."
+msgstr "Encryptie laag tussen nodes."
 
-#: src/Content/Nav.php:255
-msgid "Manage other pages"
-msgstr "Andere pagina's beheren"
+#: src/Module/Admin/Site.php:666
+msgid "Enabled"
+msgstr "Geactiveerd"
 
-#: src/Content/Nav.php:260 view/theme/frio/theme.php:283
-msgid "Account settings"
-msgstr "Account instellingen"
+#: src/Module/Admin/Site.php:668
+msgid "Maximum number of parallel workers"
+msgstr "Maximum aantal parallelle workers"
 
-#: src/Content/Nav.php:263
-msgid "Manage/Edit Profiles"
-msgstr "Beheer/Wijzig Profielen"
+#: src/Module/Admin/Site.php:668
+#, php-format
+msgid ""
+"On shared hosters set this to %d. On larger systems, values of %d are great."
+" Default value is %d."
+msgstr "Op gedeelde hosts zet dit op %d. Op grotere systemen, waarden als %d zijn goed. standaard waarde is %d"
 
-#: src/Content/Nav.php:266 view/theme/frio/theme.php:284
-msgid "Manage/edit friends and contacts"
-msgstr "Beheer/Wijzig vrienden en contacten"
+#: src/Module/Admin/Site.php:669
+msgid "Don't use \"proc_open\" with the worker"
+msgstr ""
 
-#: src/Content/Nav.php:271
-msgid "Site setup and configuration"
-msgstr "Website opzetten en configureren"
+#: src/Module/Admin/Site.php:669
+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 ""
 
-#: src/Content/Nav.php:274
-msgid "Navigation"
-msgstr "Navigatie"
+#: src/Module/Admin/Site.php:670
+msgid "Enable fastlane"
+msgstr "Activeer fastlane"
 
-#: src/Content/Nav.php:274
-msgid "Site map"
-msgstr "Sitemap"
+#: src/Module/Admin/Site.php:670
+msgid ""
+"When enabed, the fastlane mechanism starts an additional worker if processes"
+" with higher priority are blocked by processes of lower priority."
+msgstr "Als deze parameter geactiveerd is, dan start het fastlane mechanisme een bijkomende worker als processen met hogere prioriteit geblokkeerd worden door processen met een lagere prioriteit."
 
-#: src/Content/OEmbed.php:257
-msgid "Embedding disabled"
-msgstr "Inbedden uitgeschakeld"
+#: src/Module/Admin/Site.php:671
+msgid "Enable frontend worker"
+msgstr "Activeer frontend worker"
 
-#: src/Content/OEmbed.php:377
-msgid "Embedded content"
-msgstr "Ingebedde inhoud"
+#: src/Module/Admin/Site.php:671
+#, php-format
+msgid ""
+"When enabled the Worker process is triggered when backend access is "
+"performed (e.g. messages being delivered). 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."
+msgstr ""
 
-#: src/Content/Pager.php:166
-msgid "newer"
-msgstr "nieuwere berichten"
+#: src/Module/Admin/Site.php:673
+msgid "Subscribe to relay"
+msgstr "Schrijf in op relais"
 
-#: src/Content/Pager.php:171
-msgid "older"
-msgstr "oudere berichten"
+#: src/Module/Admin/Site.php:673
+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 "Activeert het ontvangen van publieke berichten vanwege de relais. Ze zullen inbegrepen zijn in de zoekresultaten, tags waarop je ingeschreven bent en op de globale groepspagina."
 
-#: src/Content/Pager.php:210
-msgid "first"
-msgstr "eerste"
+#: src/Module/Admin/Site.php:674
+msgid "Relay server"
+msgstr "Relais server"
 
-#: src/Content/Pager.php:215
-msgid "prev"
-msgstr "vorige"
+#: src/Module/Admin/Site.php:674
+msgid ""
+"Address of the relay server where public posts should be send to. For "
+"example https://relay.diasp.org"
+msgstr "Adres van de relais server waar publieke berichten naartoe moeten gezonden worden. Bijvoorbeeld https://relay.diasp.org"
 
-#: src/Content/Pager.php:270
-msgid "next"
-msgstr "volgende"
+#: src/Module/Admin/Site.php:675
+msgid "Direct relay transfer"
+msgstr "Directe relais transfer"
 
-#: src/Content/Pager.php:275
-msgid "last"
-msgstr "laatste"
+#: src/Module/Admin/Site.php:675
+msgid ""
+"Enables the direct transfer to other servers without using the relay servers"
+msgstr "Activeert directe relais transfer naar andere servers zonder gebruik van relais servers"
 
-#: src/Content/Text/BBCode.php:426
-msgid "view full size"
-msgstr "Volledig formaat"
+#: src/Module/Admin/Site.php:676
+msgid "Relay scope"
+msgstr "Scope van de relais"
 
-#: src/Content/Text/BBCode.php:858 src/Content/Text/BBCode.php:1583
-#: src/Content/Text/BBCode.php:1584
-msgid "Image/photo"
-msgstr "Afbeelding/foto"
+#: src/Module/Admin/Site.php:676
+msgid ""
+"Can be \"all\" or \"tags\". \"all\" means that every public post should be "
+"received. \"tags\" means that only posts with selected tags should be "
+"received."
+msgstr ""
 
-#: src/Content/Text/BBCode.php:961
-#, 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/Module/Admin/Site.php:676
+msgid "all"
+msgstr "alle"
 
-#: src/Content/Text/BBCode.php:1510 src/Content/Text/BBCode.php:1532
-msgid "$1 wrote:"
-msgstr "$1 schreef:"
+#: src/Module/Admin/Site.php:676
+msgid "tags"
+msgstr "tags"
 
-#: src/Content/Text/BBCode.php:1594 src/Content/Text/BBCode.php:1595
-msgid "Encrypted content"
-msgstr "Versleutelde inhoud"
+#: src/Module/Admin/Site.php:677
+msgid "Server tags"
+msgstr "Server tags"
 
-#: src/Content/Text/BBCode.php:1702
-msgid "Invalid source protocol"
-msgstr "Ongeldig bron protocol"
+#: src/Module/Admin/Site.php:677
+msgid "Comma separated list of tags for the \"tags\" subscription."
+msgstr ""
 
-#: src/Content/Text/BBCode.php:1713
-msgid "Invalid link protocol"
-msgstr "Ongeldig verbinding protocol"
+#: src/Module/Admin/Site.php:678
+msgid "Allow user tags"
+msgstr "Sta gebruiker tags toe."
 
-#: src/Content/Text/HTML.php:797
-msgid "Loading more entries..."
-msgstr "Meer berichten aan het laden..."
+#: src/Module/Admin/Site.php:678
+msgid ""
+"If enabled, the tags from the saved searches will used for the \"tags\" "
+"subscription in addition to the \"relay_server_tags\"."
+msgstr ""
 
-#: src/Content/Text/HTML.php:798
-msgid "The end"
-msgstr "Het einde"
+#: src/Module/Admin/Site.php:681
+msgid "Start Relocation"
+msgstr "Start verhuis"
 
-#: src/Content/Text/HTML.php:838
-msgid "No contacts"
-msgstr "Geen contacten"
+#: src/Module/Admin/Summary.php:30
+#, php-format
+msgid ""
+"Your DB still runs with MyISAM tables. You should change the engine type to "
+"InnoDB. As Friendica will use InnoDB only features in the future, you should"
+" change this! See <a href=\"%s\">here</a> for a guide that may be helpful "
+"converting the table engines. You may also use the command <tt>php "
+"bin/console.php dbstructure toinnodb</tt> of your Friendica installation for"
+" an automatic conversion.<br />"
+msgstr "Je DB opereert nog met MyISAM tabellen. Best is van engine te veranderen naar InnoDB. Aangezien Friendica in de toekomst gebruik zal maken van InnoDB features, zou je dit best aanpassen! Zie <a href=\"%s\">hier</a> voor een gids die je kan helpen om de tabel engines te converteren. Je kan ook het commando<tt>php bin/console.php dbstructure toinnodb</tt> van je Friendica installatie gebruiken voor een automatische conversie.<br />"
 
-#: src/Content/Text/HTML.php:865
+#: src/Module/Admin/Summary.php:38
 #, php-format
-msgid "%d Contact"
-msgid_plural "%d Contacts"
-msgstr[0] "%d contact"
-msgstr[1] "%d contacten"
+msgid ""
+"There is a new version of Friendica available for download. Your current "
+"version is %1$s, upstream version is %2$s"
+msgstr "Er is een nieuwe versie van Friendica beschikbaar om te downloaden. Je huidige versie is %1$s, upstream versie is %2$s"
 
-#: src/Content/Text/HTML.php:878
-msgid "View Contacts"
-msgstr "Bekijk contacten"
+#: src/Module/Admin/Summary.php:47
+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 "Database update is mislukt. Gelieve  \"php bin/console.php dbstructure update\" vanaf de command line uit te voeren en de foutmeldingen die zouden kunnen verschijnen na te kijken."
 
-#: src/Content/Text/HTML.php:961
-msgid "Follow"
-msgstr "Volg"
+#: src/Module/Admin/Summary.php:51
+msgid ""
+"The last update failed. Please run \"php bin/console.php dbstructure "
+"update\" from the command line and have a look at the errors that might "
+"appear. (Some of the errors are possibly inside the logfile.)"
+msgstr ""
 
-#: src/Content/Text/HTML.php:1016 src/Model/Item.php:3480
-#: src/Model/Item.php:3491
-msgid "Click to open/close"
-msgstr "klik om te openen/sluiten"
+#: src/Module/Admin/Summary.php:56
+msgid "The worker was never executed. Please check your database structure!"
+msgstr "De worker werd nooit uitgevoerd. Best je database structuur eens nakijken!"
 
-#: src/Content/Widget/CalendarExport.php:66
-msgid "Export"
-msgstr "Exporteer"
+#: src/Module/Admin/Summary.php:58
+#, php-format
+msgid ""
+"The last worker execution was on %s UTC. This is older than one hour. Please"
+" check your crontab settings."
+msgstr "De laatste worker uitvoering was op %s UTC. Dit is langer dan 1 uur geleden. Best je crontab instellingen nakijken."
 
-#: src/Content/Widget/CalendarExport.php:67
-msgid "Export calendar as ical"
-msgstr "Exporteer kalender als ical"
+#: src/Module/Admin/Summary.php:63
+#, php-format
+msgid ""
+"Friendica's configuration now is stored in config/local.config.php, please "
+"copy config/local-sample.config.php and move your config from "
+"<code>.htconfig.php</code>. See <a href=\"%s\">the Config help page</a> for "
+"help with the transition."
+msgstr "Het configuratiebestand bevind zich nu in config/local.config.php. Kopieer het bestand config/local-sample.config.php en verplaats je configuratie uit <code>.htconfig.php</code>. Ga naar de<a href=\"%s\">configuratie help pagina</a> voor hulp bij transitie."
 
-#: src/Content/Widget/CalendarExport.php:68
-msgid "Export calendar as csv"
-msgstr "Exporteer kalender als csv"
+#: src/Module/Admin/Summary.php:67
+#, php-format
+msgid ""
+"Friendica's configuration now is stored in config/local.config.php, please "
+"copy config/local-sample.config.php and move your config from "
+"<code>config/local.ini.php</code>. See <a href=\"%s\">the Config help "
+"page</a> for help with the transition."
+msgstr ""
 
-#: src/Content/Widget.php:37
-msgid "Add New Contact"
-msgstr "Nieuw Contact toevoegen"
+#: src/Module/Admin/Summary.php:73
+#, php-format
+msgid ""
+"<a href=\"%s\">%s</a> is not reachable on your system. This is a severe "
+"configuration issue that prevents server to server communication. See <a "
+"href=\"%s\">the installation page</a> for help."
+msgstr "<a href=\"%s\">%s</a> is niet bereikbaar. Dit is een belangrijk communicatieprobleem waardoor server-naar-server communicatie niet mogelijk is. Lees de <a href=\"%s\">the installatie pagina</a> voor hulp."
 
-#: src/Content/Widget.php:38
-msgid "Enter address or web location"
-msgstr "Voeg een webadres of -locatie in:"
+#: src/Module/Admin/Summary.php:106
+#, php-format
+msgid ""
+"Friendica's system.basepath was updated from '%s' to '%s'. Please remove the"
+" system.basepath from your db to avoid differences."
+msgstr ""
 
-#: src/Content/Widget.php:39
-msgid "Example: bob@example.com, http://example.com/barbara"
-msgstr "Voorbeeld: jan@voorbeeld.be, http://voorbeeld.nl/barbara"
+#: src/Module/Admin/Summary.php:114
+#, php-format
+msgid ""
+"Friendica's current system.basepath '%s' is wrong and the config file '%s' "
+"isn't used."
+msgstr ""
 
-#: src/Content/Widget.php:57
+#: src/Module/Admin/Summary.php:122
 #, php-format
-msgid "%d invitation available"
-msgid_plural "%d invitations available"
-msgstr[0] "%d uitnodiging beschikbaar"
-msgstr[1] "%d uitnodigingen beschikbaar"
+msgid ""
+"Friendica's current system.basepath '%s' is not equal to the config file "
+"'%s'. Please fix your configuration."
+msgstr ""
 
-#: src/Content/Widget.php:63 view/theme/vier/theme.php:199
-msgid "Find People"
-msgstr "Zoek mensen"
+#: src/Module/Admin/Summary.php:129
+msgid "Normal Account"
+msgstr "Normaal account"
 
-#: src/Content/Widget.php:64 view/theme/vier/theme.php:200
-msgid "Enter name or interest"
-msgstr "Vul naam of interesse in"
+#: src/Module/Admin/Summary.php:130
+msgid "Automatic Follower Account"
+msgstr "Automatische Volger Account"
 
-#: src/Content/Widget.php:66 view/theme/vier/theme.php:202
-msgid "Examples: Robert Morgenstein, Fishing"
-msgstr "Voorbeelden: Jan Peeters, Vissen"
+#: src/Module/Admin/Summary.php:131
+msgid "Public Forum Account"
+msgstr "Publiek Forum account"
 
-#: src/Content/Widget.php:69 view/theme/vier/theme.php:205
-msgid "Similar Interests"
-msgstr "Dezelfde interesses"
+#: src/Module/Admin/Summary.php:132
+msgid "Automatic Friend Account"
+msgstr "Automatisch Vriendschapsaccount"
 
-#: src/Content/Widget.php:70 view/theme/vier/theme.php:206
-msgid "Random Profile"
-msgstr "Willekeurig Profiel"
+#: src/Module/Admin/Summary.php:133
+msgid "Blog Account"
+msgstr "Blog Account"
 
-#: src/Content/Widget.php:71 view/theme/vier/theme.php:207
-msgid "Invite Friends"
-msgstr "Vrienden uitnodigen"
+#: src/Module/Admin/Summary.php:134
+msgid "Private Forum Account"
+msgstr "Privé Forum Account"
 
-#: src/Content/Widget.php:74 view/theme/vier/theme.php:210
-msgid "Local Directory"
-msgstr "Lokale gids"
+#: src/Module/Admin/Summary.php:156
+msgid "Message queues"
+msgstr "Bericht-wachtrijen"
 
-#: src/Content/Widget.php:158
-msgid "Protocols"
-msgstr "Protocollen"
+#: src/Module/Admin/Summary.php:162
+msgid "Server Settings"
+msgstr "Server instellingen."
 
-#: src/Content/Widget.php:161
-msgid "All Protocols"
-msgstr "Alle protocollen"
+#: src/Module/Admin/Summary.php:176
+msgid "Summary"
+msgstr "Samenvatting"
 
-#: src/Content/Widget.php:196
-msgid "Saved Folders"
-msgstr "Bewaarde Mappen"
+#: src/Module/Admin/Summary.php:178
+msgid "Registered users"
+msgstr "Geregistreerde gebruikers"
 
-#: src/Content/Widget.php:199 src/Content/Widget.php:239
-msgid "Everything"
-msgstr "Alles"
+#: src/Module/Admin/Summary.php:180
+msgid "Pending registrations"
+msgstr "Registraties die in de wacht staan"
 
-#: src/Content/Widget.php:236
-msgid "Categories"
-msgstr "Categorieën"
+#: src/Module/Admin/Summary.php:181
+msgid "Version"
+msgstr "Versie"
 
-#: src/Content/Widget.php:303
-#, php-format
-msgid "%d contact in common"
-msgid_plural "%d contacts in common"
-msgstr[0] "%d gedeeld contact"
-msgstr[1] "%d gedeelde contacten"
+#: src/Module/Admin/Summary.php:185
+msgid "Active addons"
+msgstr "Actieve addons"
 
-#: src/Core/ACL.php:285
-msgid "Post to Email"
-msgstr "Verzenden per e-mail"
+#: src/Module/Admin/Themes/Details.php:32 src/Module/Admin/Themes/Embed.php:46
+msgid "Theme settings updated."
+msgstr "Thema-instellingen opgeslagen"
 
-#: src/Core/ACL.php:291
-msgid "Hide your profile details from unknown viewers?"
-msgstr "Je profieldetails verbergen voor onbekende bezoekers?"
+#: src/Module/Admin/Themes/Details.php:71 src/Module/Admin/Themes/Index.php:47
+#, php-format
+msgid "Theme %s disabled."
+msgstr ""
 
-#: src/Core/ACL.php:290
+#: src/Module/Admin/Themes/Details.php:73 src/Module/Admin/Themes/Index.php:49
 #, php-format
-msgid "Connectors disabled, since \"%s\" is enabled."
-msgstr "Connectoren gedeactiveerd, aangezien \"%s\" geactiveerd is."
+msgid "Theme %s successfully enabled."
+msgstr ""
 
-#: src/Core/ACL.php:297
-msgid "Visible to everybody"
-msgstr "Zichtbaar voor iedereen"
+#: src/Module/Admin/Themes/Details.php:75 src/Module/Admin/Themes/Index.php:51
+#, php-format
+msgid "Theme %s failed to install."
+msgstr ""
 
-#: src/Core/ACL.php:298 view/theme/vier/config.php:116
-msgid "show"
-msgstr "tonen"
+#: src/Module/Admin/Themes/Details.php:97
+msgid "Screenshot"
+msgstr "Schermafdruk"
 
-#: src/Core/ACL.php:299 view/theme/vier/config.php:116
-msgid "don't show"
-msgstr "niet tonen"
+#: src/Module/Admin/Themes/Details.php:105
+#: src/Module/Admin/Themes/Index.php:94 src/Module/BaseAdminModule.php:83
+msgid "Themes"
+msgstr "Thema's"
 
-#: src/Core/ACL.php:309
-msgid "Close"
-msgstr "Afsluiten"
+#: src/Module/Admin/Themes/Embed.php:67
+msgid "Unknown theme."
+msgstr ""
 
-#: src/Core/Authentication.php:89
-msgid "Welcome "
-msgstr "Welkom"
+#: src/Module/Admin/Themes/Index.php:96
+msgid "Reload active themes"
+msgstr "Herlaad actieve thema's"
 
-#: src/Core/Authentication.php:90
-msgid "Please upload a profile photo."
-msgstr "Upload een profielfoto."
+#: src/Module/Admin/Themes/Index.php:101
+#, php-format
+msgid "No themes found on the system. They should be placed in %1$s"
+msgstr "Geen thema's gevonden op het systeem. Ze zouden zich moeten bevinden in %1$s"
 
-#: src/Core/Authentication.php:92
-msgid "Welcome back "
-msgstr "Welkom terug "
+#: src/Module/Admin/Themes/Index.php:102
+msgid "[Experimental]"
+msgstr "[Experimenteel]"
 
-#: src/Core/Console/ArchiveContact.php:66
-#, php-format
-msgid "Could not find any unarchived contact entry for this URL (%s)"
-msgstr "Kon geen niet-gearchiveerde contacten vinden voor deze URL (%s)"
+#: src/Module/Admin/Themes/Index.php:103
+msgid "[Unsupported]"
+msgstr "[Niet ondersteund]"
 
-#: src/Core/Console/ArchiveContact.php:71
-msgid "The contact entries have been archived"
-msgstr "The contacten zijn gearchiveerd"
+#: src/Module/Admin/Tos.php:30
+msgid "The Terms of Service settings have been updated."
+msgstr ""
 
-#: src/Core/Console/NewPassword.php:73
-msgid "Enter new password: "
-msgstr "Geef nieuw paswoord:"
+#: src/Module/Admin/Tos.php:44
+msgid "Display Terms of Service"
+msgstr "Toon Gebruiksvoorwaarden"
 
-#: src/Core/Console/NewPassword.php:78 src/Model/User.php:315
-msgid "Password can't be empty"
-msgstr "Paswoord mag niet leeg zijn"
+#: src/Module/Admin/Tos.php:44
+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 "Activeer de Gebruiksvoorwaarden pagina. Als deze geactiveerd is, dan zal er een link naar de voorwaarden toegevoegd worden aan het registratie formulier en de algemene informatie pagina."
 
-#: src/Core/Console/PostUpdate.php:50
-#, php-format
-msgid "Post update version number has been set to %s."
-msgstr "Bericht update versie is ingesteld op %s"
+#: src/Module/Admin/Tos.php:45
+msgid "Display Privacy Statement"
+msgstr "Toon Privacy Verklaring"
 
-#: src/Core/Console/PostUpdate.php:58
-msgid "Check for pending update actions."
-msgstr "Controleren op uitgestelde update acties."
+#: src/Module/Admin/Tos.php:45
+#, 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 "Toon wat inlichtigen over de nodige informatite om de node te beheren in overeenstemming met bvb. de <a href=\"%s\" target=\"_blank\">EU-GDPR</a> (EU-AVG)."
 
-#: src/Core/Console/PostUpdate.php:60
-msgid "Done."
-msgstr "Gedaan"
+#: src/Module/Admin/Tos.php:46
+msgid "Privacy Statement Preview"
+msgstr "Privacy Verklaring Voorbeeldweergave"
 
-#: src/Core/Console/PostUpdate.php:62
-msgid "Execute pending post updates."
-msgstr "uitgestelde bericht update acties uitvoeren"
+#: src/Module/Admin/Tos.php:48
+msgid "The Terms of Service"
+msgstr "De Gebruiksvoorwaarden"
 
-#: src/Core/Console/PostUpdate.php:68
-msgid "All pending post updates are done."
-msgstr "Alle uitgestelde bericht update acties zijn uitgevoerd"
+#: src/Module/Admin/Tos.php:48
+msgid ""
+"Enter the Terms of Service for your node here. You can use BBCode. Headers "
+"of sections should be [h2] and below."
+msgstr "Geef hier de Gebruiksvoorwaarden van je node op. Je kan BBCode gebruiken. Sectie headers moeten [h2] zijn of lager."
 
-#: src/Core/Installer.php:160
+#: src/Module/Admin/Users.php:48
+#, php-format
 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 "Het databaseconfiguratiebestand \"config/local.config.php\" kon niet worden weggeschreven. Je kunt de bijgevoegde tekst gebruiken om in een configuratiebestand aan te maken in de hoogste map van je webserver. "
+"\n"
+"\t\t\tDear %1$s,\n"
+"\t\t\t\tthe administrator of %2$s has set up an account for you."
+msgstr "\n\t\t\tBeste %1$s,\n\t\t\t\tde beheerder van %2$s heeft een account aangemaakt voor jou."
 
-#: src/Core/Installer.php:176
+#: src/Module/Admin/Users.php:51
+#, php-format
 msgid ""
-"You may need to import the file \"database.sql\" manually using phpmyadmin "
-"or mysql."
-msgstr "Het kan nodig zijn om het bestand \"database.sql\" manueel te importeren met phpmyadmin of mysql."
+"\n"
+"\t\t\tThe login details are as follows:\n"
+"\n"
+"\t\t\tSite Location:\t%1$s\n"
+"\t\t\tLogin Name:\t\t%2$s\n"
+"\t\t\tPassword:\t\t%3$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 %1$s/removeme\n"
+"\n"
+"\t\t\tThank you and welcome to %4$s."
+msgstr "\n\t\t\tDe login details zijn de volgende:\n\n\t\t\tSite Locatie:\t%1$s\n\t\t\tLogin Naam:\t\t%2$s\n\t\t\tPaswoord:\t\t%3$s\n\n\t\t\tJe kan je paswoord in je account \"Instellingen\" pagina aanpassen \nnadat je ingelogd bent\n\t\t\tNeem alstublieft een ogenblik om de andere account instellingen op die pagina na te kijken.\n\n\t\t\tMisschien wil je ook wat basis informatie toevoegen aan je standaard profiel\n\t\t\t(op de \"Profielen\" pagina) zodat anderen je gemakkelijk kunnen terugvinden.\n\n\t\t\tWe raden aan je volledige naam in te stellen, een profiel foto toe te voegen,\n\t\t\tenkele \"sleutelwoorden\" toe te voegen (zeer handig om nieuwe vrienden te maken) - en\n\t\t\tmisschien ook in welk land je woont; als je liever niet specifieker \nbent dan dat.\n\n\n\t\t\tWe respecteren ten volle je recht op privacy, en geen van deze items is verplicht.\n\t\t\tAls je nieuw bent hier en niemand kent, dan kunnen zij je mogelijks helpen\n\t\t\tom enkele nieuwe en interessante vrienden te leren kennen.\n\n\t\t\tAls je ooit je account wil verwijderen, dan kan dat via %1$s/removeme\n\n\t\t\tBedankt en welkom bij %4$s."
 
-#: src/Core/Installer.php:177 src/Module/Install.php:134
-#: src/Module/Install.php:264
-msgid "Please see the file \"INSTALL.txt\"."
-msgstr "Zie het bestand \"INSTALL.txt\"."
+#: src/Module/Admin/Users.php:96
+#, php-format
+msgid "%s user blocked"
+msgid_plural "%s users blocked"
+msgstr[0] ""
+msgstr[1] ""
 
-#: src/Core/Installer.php:239
-msgid "Could not find a command line version of PHP in the web server PATH."
-msgstr "Kan geen command-line-versie van PHP vinden in het PATH van de webserver."
+#: src/Module/Admin/Users.php:102
+#, php-format
+msgid "%s user unblocked"
+msgid_plural "%s users unblocked"
+msgstr[0] ""
+msgstr[1] ""
 
-#: src/Core/Installer.php:240
-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>"
-msgstr "Als je geen command line versie van PHP geïnstalleerd hebt op je server, dan kan je de achtergrondprocessen niet draaien. Zie <a href='https://github.com/friendica/friendica/blob/master/doc/Install.md#set-up-the-worker'>'Installatie van de worker'</a>"
+#: src/Module/Admin/Users.php:110 src/Module/Admin/Users.php:160
+msgid "You can't remove yourself"
+msgstr "Je kan jezelf niet verwijderen"
 
-#: src/Core/Installer.php:244
-msgid "PHP executable path"
-msgstr "PATH van het PHP commando"
+#: src/Module/Admin/Users.php:114
+#, php-format
+msgid "%s user deleted"
+msgid_plural "%s users deleted"
+msgstr[0] "%s gebruiker verwijderd"
+msgstr[1] "%s gebruikers verwijderd"
 
-#: src/Core/Installer.php:244
-msgid ""
-"Enter full path to php executable. You can leave this blank to continue the "
-"installation."
-msgstr "Vul het volledige pad in naar het php programma. Je kunt dit leeg laten om de installatie verder te zetten."
+#: src/Module/Admin/Users.php:158
+#, php-format
+msgid "User \"%s\" deleted"
+msgstr ""
 
-#: src/Core/Installer.php:249
-msgid "Command line PHP"
-msgstr "PHP-opdrachtregel"
+#: src/Module/Admin/Users.php:167
+#, php-format
+msgid "User \"%s\" blocked"
+msgstr ""
 
-#: src/Core/Installer.php:258
-msgid "PHP executable is not the php cli binary (could be cgi-fgci version)"
-msgstr "PHP uitvoerbaar bestand is niet de php cli binary (zou kunnen de cgi-fgci versie zijn)"
+#: src/Module/Admin/Users.php:173
+#, php-format
+msgid "User \"%s\" unblocked"
+msgstr ""
 
-#: src/Core/Installer.php:259
-msgid "Found PHP version: "
-msgstr "Gevonden PHP versie:"
+#: src/Module/Admin/Users.php:226
+msgid "Private Forum"
+msgstr "Privé Forum"
 
-#: src/Core/Installer.php:261
-msgid "PHP cli binary"
-msgstr "PHP cli binary"
+#: src/Module/Admin/Users.php:233
+msgid "Relay"
+msgstr ""
 
-#: src/Core/Installer.php:274
-msgid ""
-"The command line version of PHP on your system does not have "
-"\"register_argc_argv\" enabled."
-msgstr "De command-line versie van PHP op jouw systeem heeft \"register_argc_argv\" niet geactiveerd."
+#: src/Module/Admin/Users.php:272 src/Module/Admin/Users.php:297
+msgid "Register date"
+msgstr "Registratiedatum"
 
-#: src/Core/Installer.php:275
-msgid "This is required for message delivery to work."
-msgstr "Dit is nodig om het verzenden van berichten mogelijk te maken."
+#: src/Module/Admin/Users.php:272 src/Module/Admin/Users.php:297
+msgid "Last login"
+msgstr "Laatste login"
 
-#: src/Core/Installer.php:280
-msgid "PHP register_argc_argv"
-msgstr "PHP register_argc_argv"
+#: src/Module/Admin/Users.php:272 src/Module/Admin/Users.php:297
+msgid "Last item"
+msgstr "Laatste item"
 
-#: src/Core/Installer.php:312
-msgid ""
-"Error: the \"openssl_pkey_new\" function on this system is not able to "
-"generate encryption keys"
-msgstr "Fout: de \"openssl_pkey_new\" functie op dit systeem kan geen encryptie sleutels genereren"
+#: src/Module/Admin/Users.php:272
+msgid "Type"
+msgstr "Type"
 
-#: src/Core/Installer.php:313
-msgid ""
-"If running under Windows, please see "
-"\"http://www.php.net/manual/en/openssl.installation.php\"."
-msgstr "Zie \"http://www.php.net/manual/en/openssl.installation.php\" wanneer u Friendica onder Windows draait."
+#: src/Module/Admin/Users.php:279
+msgid "Add User"
+msgstr "Gebruiker toevoegen"
 
-#: src/Core/Installer.php:316
-msgid "Generate encryption keys"
-msgstr "Genereer encryptie sleutels"
+#: src/Module/Admin/Users.php:281
+msgid "User registrations waiting for confirm"
+msgstr "Gebruikersregistraties wachten op een bevestiging"
 
-#: src/Core/Installer.php:367
-msgid ""
-"Error: Apache webserver mod-rewrite module is required but not installed."
-msgstr "Fout: Apache-module mod-rewrite is vereist, maar niet geïnstalleerd."
+#: src/Module/Admin/Users.php:282
+msgid "User waiting for permanent deletion"
+msgstr "Gebruiker wacht op permanente verwijdering"
 
-#: src/Core/Installer.php:372
-msgid "Apache mod_rewrite module"
-msgstr "Apache mod_rewrite module"
+#: src/Module/Admin/Users.php:283
+msgid "Request date"
+msgstr "Registratiedatum"
 
-#: src/Core/Installer.php:378
-msgid "Error: PDO or MySQLi PHP module required but not installed."
-msgstr "Fout: PDO of MySQLi PHP module vereist maar niet geïnstalleerd."
+#: src/Module/Admin/Users.php:284
+msgid "No registrations."
+msgstr "Geen registraties."
 
-#: src/Core/Installer.php:383
-msgid "Error: The MySQL driver for PDO is not installed."
-msgstr "Fout: de MySQL driver voor PDO is niet geïnstalleerd."
+#: src/Module/Admin/Users.php:285
+msgid "Note from the user"
+msgstr "Nota van de gebruiker"
 
-#: src/Core/Installer.php:387
-msgid "PDO or MySQLi PHP module"
-msgstr "PDO of MySQLi PHP module"
+#: src/Module/Admin/Users.php:287
+msgid "Deny"
+msgstr "Weiger"
 
-#: src/Core/Installer.php:395
-msgid "Error, XML PHP module required but not installed."
-msgstr "Fout: XML PHP module vereist maar niet geinstalleerd."
+#: src/Module/Admin/Users.php:290
+msgid "User blocked"
+msgstr "Gebruiker geblokeerd"
 
-#: src/Core/Installer.php:399
-msgid "XML PHP module"
-msgstr "XML PHP module"
+#: src/Module/Admin/Users.php:292
+msgid "Site admin"
+msgstr "Sitebeheerder"
 
-#: src/Core/Installer.php:402
-msgid "libCurl PHP module"
-msgstr "libCurl PHP module"
+#: src/Module/Admin/Users.php:293
+msgid "Account expired"
+msgstr "Account verlopen"
 
-#: src/Core/Installer.php:403
-msgid "Error: libCURL PHP module required but not installed."
-msgstr "Fout: PHP-module libCURL is vereist, maar niet geïnstalleerd."
+#: src/Module/Admin/Users.php:296
+msgid "New User"
+msgstr "Nieuwe gebruiker"
 
-#: src/Core/Installer.php:409
-msgid "GD graphics PHP module"
-msgstr "GD graphics PHP module"
+#: src/Module/Admin/Users.php:297
+msgid "Permanent deletion"
+msgstr ""
 
-#: src/Core/Installer.php:410
+#: src/Module/Admin/Users.php:302
 msgid ""
-"Error: GD graphics PHP module with JPEG support required but not installed."
-msgstr "Fout: PHP-module GD graphics met JPEG support is vereist, maar niet geïnstalleerd."
+"Selected users will be deleted!\\n\\nEverything these users had posted on "
+"this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Geselecteerde gebruikers zullen verwijderd worden!\\n\\nAlles wat deze gebruikers gepost hebben op deze website zal permanent verwijderd worden!\\n\\nBen je zeker?"
 
-#: src/Core/Installer.php:416
-msgid "OpenSSL PHP module"
-msgstr "OpenSSL PHP module"
+#: src/Module/Admin/Users.php:303
+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 "De gebruiker {0} zal verwijderd worden!\\n\\nAlles wat deze gebruiker gepost heeft op deze website zal permanent verwijderd worden!\\n\\nBen je zeker?"
+
+#: src/Module/Admin/Users.php:313
+msgid "Name of the new user."
+msgstr "Naam van nieuwe gebruiker"
+
+#: src/Module/Admin/Users.php:314
+msgid "Nickname"
+msgstr "Bijnaam"
+
+#: src/Module/Admin/Users.php:314
+msgid "Nickname of the new user."
+msgstr "Bijnaam van nieuwe gebruiker"
+
+#: src/Module/Admin/Users.php:315
+msgid "Email address of the new user."
+msgstr "E-mailadres van nieuwe gebruiker"
+
+#: src/Module/AllFriends.php:55
+msgid "No friends to display."
+msgstr "Geen vrienden om te laten zien."
 
-#: src/Core/Installer.php:417
-msgid "Error: openssl PHP module required but not installed."
-msgstr "Fout: PHP-module openssl is vereist, maar niet geïnstalleerd."
+#: src/Module/Attach.php:36 src/Module/Attach.php:48
+msgid "Item was not found."
+msgstr "Item niet gevonden"
 
-#: src/Core/Installer.php:423
-msgid "mb_string PHP module"
-msgstr "mb_string PHP module"
+#: src/Module/BaseAdminModule.php:62
+msgid ""
+"Submanaged account can't access the administation pages. Please log back in "
+"as the master account."
+msgstr ""
 
-#: src/Core/Installer.php:424
-msgid "Error: mb_string PHP module required but not installed."
-msgstr "Fout: PHP-module mb_string is vereist, maar niet geïnstalleerd."
+#: src/Module/BaseAdminModule.php:76
+msgid "Overview"
+msgstr "Overzicht"
 
-#: src/Core/Installer.php:430
-msgid "iconv PHP module"
-msgstr "iconv PHP module"
+#: src/Module/BaseAdminModule.php:79
+msgid "Configuration"
+msgstr "Configuratie"
 
-#: src/Core/Installer.php:431
-msgid "Error: iconv PHP module required but not installed."
-msgstr "Fout: iconv PHP module vereist maar niet geïnstalleerd."
+#: src/Module/BaseAdminModule.php:87
+msgid "Database"
+msgstr "Database"
 
-#: src/Core/Installer.php:437
-msgid "POSIX PHP module"
-msgstr "POSIX PHP module"
+#: src/Module/BaseAdminModule.php:88
+msgid "DB updates"
+msgstr "DB aanpassingen"
 
-#: src/Core/Installer.php:438
-msgid "Error: POSIX PHP module required but not installed."
-msgstr "Fout: POSIX PHP module vereist maar niet geïnstalleerd."
+#: src/Module/BaseAdminModule.php:89
+msgid "Inspect Deferred Workers"
+msgstr "Inspecteer uitgestelde workers"
 
-#: src/Core/Installer.php:461
-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 "Het installatieprogramma moet een bestand \"local.config.php\" in de \"config\" map van je webserver aanmaken, maar kan dit niet doen. "
+#: src/Module/BaseAdminModule.php:90
+msgid "Inspect worker Queue"
+msgstr "Taakwachtrij inspecteren"
 
-#: src/Core/Installer.php:462
-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 "Dit is meestal een permissieprobleem, omdat de webserver niet in staat is om in deze map bestanden weg te schrijven - ook al kun je dit zelf wel."
+#: src/Module/BaseAdminModule.php:92
+msgid "Tools"
+msgstr "Hulpmiddelen"
 
-#: src/Core/Installer.php:463
-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 "Op het einde van deze procedure zal ik je een tekst geven om te bewaren in een bestand local.config.php in Friendica \"config\" map. "
+#: src/Module/BaseAdminModule.php:93
+msgid "Contact Blocklist"
+msgstr "Contact Blokkeerlijst"
 
-#: src/Core/Installer.php:464
-msgid ""
-"You can alternatively skip this procedure and perform a manual installation."
-" Please see the file \"INSTALL.txt\" for instructions."
-msgstr "Je kunt ook deze procedure overslaan, en een manuele installatie uitvoeren. Lees het bestand \"INSTALL.txt\" voor instructies."
+#: src/Module/BaseAdminModule.php:94
+msgid "Server Blocklist"
+msgstr "Server Blokkeerlijst"
 
-#: src/Core/Installer.php:467
-msgid "config/local.config.php is writable"
-msgstr "config/local.config.php is schrijfbaar "
+#: src/Module/BaseAdminModule.php:101
+msgid "Diagnostics"
+msgstr "Diagnostiek"
 
-#: src/Core/Installer.php:487
-msgid ""
-"Friendica uses the Smarty3 template engine to render its web views. Smarty3 "
-"compiles templates to PHP to speed up rendering."
-msgstr "Friendica gebruikt het Smarty3 sjabloon systeem om zijn webpagina's weer te geven. Smarty3 compileert sjablonen naar PHP om de weergave te versnellen."
+#: src/Module/BaseAdminModule.php:102
+msgid "PHP Info"
+msgstr "PHP Info"
 
-#: src/Core/Installer.php:488
-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 "Om deze gecompileerde sjablonen op te slaan moet de webserver schrijftoegang hebben tot de folder view/smarty3, t.o.v. van de hoogste folder van je Friendica-installatie."
+#: src/Module/BaseAdminModule.php:103
+msgid "probe address"
+msgstr "probe adres"
 
-#: src/Core/Installer.php:489
-msgid ""
-"Please ensure that the user that your web server runs as (e.g. www-data) has"
-" write access to this folder."
-msgstr "Zorg ervoor dat de gebruiker waaronder je webserver runt (bijv. www-data) schrijf-toegang heeft tot deze map."
+#: src/Module/BaseAdminModule.php:104
+msgid "check webfinger"
+msgstr "check webfinger"
 
-#: src/Core/Installer.php:490
-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 "Opmerking: voor een goede beveiliging zou je de webserver alleen schrijf-toegang moeten geven voor de map view/smarty3 -- niet voor de template bestanden (.tpl) die in die map zitten."
+#: src/Module/BaseAdminModule.php:105
+msgid "Item Source"
+msgstr ""
 
-#: src/Core/Installer.php:493
-msgid "view/smarty3 is writable"
-msgstr "view/smarty3 is schrijfbaar"
+#: src/Module/BaseAdminModule.php:106
+msgid "Babel"
+msgstr ""
 
-#: src/Core/Installer.php:521
-msgid ""
-"Url rewrite in .htaccess is not working. Make sure you copied .htaccess-dist"
-" to .htaccess."
-msgstr "Url rewrite in .htaccess werkt niet. Heb je .htaccess-dist gekopieerd naar .htaccess?"
+#: src/Module/BaseAdminModule.php:115
+msgid "Addon Features"
+msgstr "Addon Features"
 
-#: src/Core/Installer.php:523
-msgid "Error message from Curl when fetching"
-msgstr "Fout boodschap van Curl bij ophalen"
+#: src/Module/BaseAdminModule.php:116
+msgid "User registrations waiting for confirmation"
+msgstr "Gebruikersregistraties wachten op bevestiging"
 
-#: src/Core/Installer.php:528
-msgid "Url rewrite is working"
-msgstr "Url rewrite werkt correct"
+#: src/Module/BaseSearchModule.php:52
+#, php-format
+msgid "People Search - %s"
+msgstr "Mensen Zoeken - %s"
 
-#: src/Core/Installer.php:557
-msgid "ImageMagick PHP extension is not installed"
-msgstr "ImageMagick PHP extensie is niet geïnstalleerd"
+#: src/Module/BaseSearchModule.php:62
+#, php-format
+msgid "Forum Search - %s"
+msgstr "Forum doorzoeken - %s"
 
-#: src/Core/Installer.php:559
-msgid "ImageMagick PHP extension is installed"
-msgstr "ImageMagick PHP extensie is geïnstalleerd"
+#: src/Module/Bookmarklet.php:35
+msgid "This page is missing a url parameter."
+msgstr ""
 
-#: src/Core/Installer.php:561 tests/src/Core/InstallerTest.php:308
-#: tests/src/Core/InstallerTest.php:332
-msgid "ImageMagick supports GIF"
-msgstr "ImageMagick ondersteunt GIF"
+#: src/Module/Bookmarklet.php:57
+msgid "The post was created"
+msgstr "Het bericht is aangemaakt"
 
-#: src/Core/Installer.php:583
-msgid "Could not connect to database."
-msgstr "Kon geen toegang krijgen tot de database."
+#: src/Module/Contact.php:72
+#, php-format
+msgid "%d contact edited."
+msgid_plural "%d contacts edited."
+msgstr[0] "%d contact bewerkt."
+msgstr[1] "%d contacten bewerkt."
 
-#: src/Core/Installer.php:590
-msgid "Database already in use."
-msgstr "Database al in gebruik."
+#: src/Module/Contact.php:99
+msgid "Could not access contact record."
+msgstr "Kon geen toegang krijgen tot de contactgegevens"
 
-#: src/Core/L10n.php:359 src/Model/Event.php:398
-msgid "Tuesday"
-msgstr "Dinsdag"
+#: src/Module/Contact.php:109
+msgid "Could not locate selected profile."
+msgstr "Kon het geselecteerde profiel niet vinden."
 
-#: src/Core/L10n.php:359 src/Model/Event.php:399
-msgid "Wednesday"
-msgstr "Woensdag"
+#: src/Module/Contact.php:141
+msgid "Contact updated."
+msgstr "Contact opgeslagen"
 
-#: src/Core/L10n.php:359 src/Model/Event.php:400
-msgid "Thursday"
-msgstr "Donderdag"
+#: src/Module/Contact.php:393
+msgid "Contact not found"
+msgstr ""
 
-#: src/Core/L10n.php:359 src/Model/Event.php:401
-msgid "Friday"
-msgstr "Vrijdag"
+#: src/Module/Contact.php:412
+msgid "Contact has been blocked"
+msgstr "Contact is geblokkeerd"
 
-#: src/Core/L10n.php:359 src/Model/Event.php:402
-msgid "Saturday"
-msgstr "Zaterdag"
+#: src/Module/Contact.php:412
+msgid "Contact has been unblocked"
+msgstr "Contact is gedeblokkeerd"
 
-#: src/Core/L10n.php:363 src/Model/Event.php:417
-msgid "January"
-msgstr "Januari"
+#: src/Module/Contact.php:422
+msgid "Contact has been ignored"
+msgstr "Contact wordt genegeerd"
 
-#: src/Core/L10n.php:363 src/Model/Event.php:418
-msgid "February"
-msgstr "Februari"
+#: src/Module/Contact.php:422
+msgid "Contact has been unignored"
+msgstr "Contact wordt niet meer genegeerd"
 
-#: src/Core/L10n.php:363 src/Model/Event.php:419
-msgid "March"
-msgstr "Maart"
+#: src/Module/Contact.php:432
+msgid "Contact has been archived"
+msgstr "Contact is gearchiveerd"
 
-#: src/Core/L10n.php:363 src/Model/Event.php:420
-msgid "April"
-msgstr "April"
+#: src/Module/Contact.php:432
+msgid "Contact has been unarchived"
+msgstr "Contact is niet meer gearchiveerd"
 
-#: src/Core/L10n.php:363 src/Core/L10n.php:382 src/Model/Event.php:408
-#: src/Model/Event.php:421
-msgid "May"
-msgstr "Mei"
+#: src/Module/Contact.php:456
+msgid "Drop contact"
+msgstr "Contact vergeten"
 
-#: src/Core/L10n.php:363 src/Model/Event.php:422
-msgid "June"
-msgstr "Juni"
+#: src/Module/Contact.php:459 src/Module/Contact.php:823
+msgid "Do you really want to delete this contact?"
+msgstr "Wil je echt dit contact verwijderen?"
 
-#: src/Core/L10n.php:363 src/Model/Event.php:423
-msgid "July"
-msgstr "Juli"
+#: src/Module/Contact.php:473
+msgid "Contact has been removed."
+msgstr "Contact is verwijderd."
 
-#: src/Core/L10n.php:363 src/Model/Event.php:424
-msgid "August"
-msgstr "Augustus"
+#: src/Module/Contact.php:503
+#, php-format
+msgid "You are mutual friends with %s"
+msgstr "Je bent wederzijds bevriend met %s"
 
-#: src/Core/L10n.php:363 src/Model/Event.php:425
-msgid "September"
-msgstr "September"
+#: src/Module/Contact.php:508
+#, php-format
+msgid "You are sharing with %s"
+msgstr "Je deelt met %s"
 
-#: src/Core/L10n.php:363 src/Model/Event.php:426
-msgid "October"
-msgstr "Oktober"
+#: src/Module/Contact.php:513
+#, php-format
+msgid "%s is sharing with you"
+msgstr "%s deelt met jou"
 
-#: src/Core/L10n.php:363 src/Model/Event.php:427
-msgid "November"
-msgstr "November"
+#: src/Module/Contact.php:537
+msgid "Private communications are not available for this contact."
+msgstr "Privécommunicatie met dit contact is niet beschikbaar."
 
-#: src/Core/L10n.php:363 src/Model/Event.php:428
-msgid "December"
-msgstr "December"
+#: src/Module/Contact.php:539
+msgid "Never"
+msgstr "Nooit"
 
-#: src/Core/L10n.php:378 src/Model/Event.php:389
-msgid "Mon"
-msgstr "Maa"
+#: src/Module/Contact.php:542
+msgid "(Update was successful)"
+msgstr "(Wijziging is geslaagd)"
 
-#: src/Core/L10n.php:378 src/Model/Event.php:390
-msgid "Tue"
-msgstr "Din"
+#: src/Module/Contact.php:542
+msgid "(Update was not successful)"
+msgstr "(Wijziging is niet geslaagd)"
 
-#: src/Core/L10n.php:378 src/Model/Event.php:391
-msgid "Wed"
-msgstr "Woe"
+#: src/Module/Contact.php:544 src/Module/Contact.php:1057
+msgid "Suggest friends"
+msgstr "Stel vrienden voor"
 
-#: src/Core/L10n.php:378 src/Model/Event.php:392
-msgid "Thu"
-msgstr "Don"
+#: src/Module/Contact.php:548
+#, php-format
+msgid "Network type: %s"
+msgstr "Netwerk type: %s"
 
-#: src/Core/L10n.php:378 src/Model/Event.php:393
-msgid "Fri"
-msgstr "Vrij"
+#: src/Module/Contact.php:553
+msgid "Communications lost with this contact!"
+msgstr "Communicatie met dit contact is verbroken!"
 
-#: src/Core/L10n.php:378 src/Model/Event.php:394
-msgid "Sat"
-msgstr "Zat"
+#: src/Module/Contact.php:559
+msgid "Fetch further information for feeds"
+msgstr "Haal meer informatie op van de feeds"
 
-#: src/Core/L10n.php:378 src/Model/Event.php:388
-msgid "Sun"
-msgstr "Zon"
+#: src/Module/Contact.php:561
+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 "Haal informatie op zoals preview beelden, titel en teaser van het feed item. Je kan dit activeren als de feed niet veel tekst bevat. Sleutelwoorden worden opgepikt uit de meta header in het feed item en worden gepost als hash tags."
 
-#: src/Core/L10n.php:382 src/Model/Event.php:404
-msgid "Jan"
-msgstr "Jan"
+#: src/Module/Contact.php:564
+msgid "Fetch information"
+msgstr "Haal informatie op"
 
-#: src/Core/L10n.php:382 src/Model/Event.php:405
-msgid "Feb"
-msgstr "Feb"
+#: src/Module/Contact.php:565
+msgid "Fetch keywords"
+msgstr "Haal sleutelwoorden op"
 
-#: src/Core/L10n.php:382 src/Model/Event.php:406
-msgid "Mar"
-msgstr "Maa"
+#: src/Module/Contact.php:566
+msgid "Fetch information and keywords"
+msgstr "Haal informatie en sleutelwoorden op"
 
-#: src/Core/L10n.php:382 src/Model/Event.php:407
-msgid "Apr"
-msgstr "Apr"
+#: src/Module/Contact.php:585
+msgid "Profile Visibility"
+msgstr "Zichtbaarheid profiel"
+
+#: src/Module/Contact.php:586
+msgid "Contact Information / Notes"
+msgstr "Contactinformatie / aantekeningen"
 
-#: src/Core/L10n.php:382 src/Model/Event.php:410
-msgid "Jul"
-msgstr "Jul"
+#: src/Module/Contact.php:587
+msgid "Contact Settings"
+msgstr "Contact instellingen"
 
-#: src/Core/L10n.php:382 src/Model/Event.php:411
-msgid "Aug"
-msgstr "Aug"
+#: src/Module/Contact.php:596
+msgid "Contact"
+msgstr "Contact"
 
-#: src/Core/L10n.php:382
-msgid "Sep"
-msgstr "Sep"
+#: src/Module/Contact.php:600
+#, php-format
+msgid ""
+"Please choose the profile you would like to display to %s when viewing your "
+"profile securely."
+msgstr "Kies het profiel dat getoond moet worden wanneer %s je profiel bezoekt. "
 
-#: src/Core/L10n.php:382 src/Model/Event.php:413
-msgid "Oct"
-msgstr "Okt"
+#: src/Module/Contact.php:602
+msgid "Their personal note"
+msgstr "Hun persoonlijke nota"
 
-#: src/Core/L10n.php:382 src/Model/Event.php:414
-msgid "Nov"
-msgstr "Nov"
+#: src/Module/Contact.php:604
+msgid "Edit contact notes"
+msgstr "Wijzig aantekeningen over dit contact"
 
-#: src/Core/L10n.php:382 src/Model/Event.php:415
-msgid "Dec"
-msgstr "Dec"
+#: src/Module/Contact.php:607 src/Module/Contact.php:1023
+#: src/Module/Profile/Contacts.php:93
+#, php-format
+msgid "Visit %s's profile [%s]"
+msgstr "Bekijk het profiel van %s [%s]"
 
-#: src/Core/L10n.php:400
-msgid "poke"
-msgstr "por"
+#: src/Module/Contact.php:608
+msgid "Block/Unblock contact"
+msgstr "Blokkeer/deblokkeer contact"
 
-#: src/Core/L10n.php:400
-msgid "poked"
-msgstr "porde"
+#: src/Module/Contact.php:609
+msgid "Ignore contact"
+msgstr "Negeer contact"
 
-#: src/Core/L10n.php:401
-msgid "ping"
-msgstr "ping"
+#: src/Module/Contact.php:610
+msgid "Repair URL settings"
+msgstr "Repareer URL-instellingen"
 
-#: src/Core/L10n.php:401
-msgid "pinged"
-msgstr "gepingd"
+#: src/Module/Contact.php:611
+msgid "View conversations"
+msgstr "Toon gesprekken"
 
-#: src/Core/L10n.php:402
-msgid "prod"
-msgstr "porren"
+#: src/Module/Contact.php:616
+msgid "Last update:"
+msgstr "Laatste wijziging:"
 
-#: src/Core/L10n.php:402
-msgid "prodded"
-msgstr "gepord"
+#: src/Module/Contact.php:618
+msgid "Update public posts"
+msgstr "Openbare posts aanpassen"
 
-#: src/Core/L10n.php:403
-msgid "slap"
-msgstr "slaan"
+#: src/Module/Contact.php:620 src/Module/Contact.php:1067
+msgid "Update now"
+msgstr "Wijzig nu"
 
-#: src/Core/L10n.php:403
-msgid "slapped"
-msgstr "geslagen"
+#: src/Module/Contact.php:624 src/Module/Contact.php:828
+#: src/Module/Contact.php:1084
+msgid "Unignore"
+msgstr "Negeer niet meer"
 
-#: src/Core/L10n.php:404
-msgid "finger"
-msgstr "finger"
+#: src/Module/Contact.php:628
+msgid "Currently blocked"
+msgstr "Op dit moment geblokkeerd"
 
-#: src/Core/L10n.php:404
-msgid "fingered"
-msgstr "gerfingerd"
+#: src/Module/Contact.php:629
+msgid "Currently ignored"
+msgstr "Op dit moment genegeerd"
 
-#: src/Core/L10n.php:405
-msgid "rebuff"
-msgstr "afpoeieren"
+#: src/Module/Contact.php:630
+msgid "Currently archived"
+msgstr "Op dit moment gearchiveerd"
 
-#: src/Core/L10n.php:405
-msgid "rebuffed"
-msgstr "afgepoeierd"
+#: src/Module/Contact.php:631
+msgid "Awaiting connection acknowledge"
+msgstr "Wait op bevestiging van de connectie"
 
-#: src/Core/NotificationsManager.php:173
-msgid "System"
-msgstr "Systeem"
+#: src/Module/Contact.php:632
+msgid ""
+"Replies/likes to your public posts <strong>may</strong> still be visible"
+msgstr "Antwoorden of 'vind ik leuk's op je openbare posts <strong>kunnen</strong> nog zichtbaar zijn"
 
-#: src/Core/NotificationsManager.php:263 src/Core/NotificationsManager.php:275
-#, php-format
-msgid "%s commented on %s's post"
-msgstr "%s gaf een reactie op het bericht van %s"
+#: src/Module/Contact.php:633
+msgid "Notification for new posts"
+msgstr "Meldingen voor nieuwe berichten"
 
-#: src/Core/NotificationsManager.php:274
-#, php-format
-msgid "%s created a new post"
-msgstr "%s schreef een nieuw bericht"
+#: src/Module/Contact.php:633
+msgid "Send a notification of every new post of this contact"
+msgstr "Stuur een notificatie voor elk bericht van dit contact"
 
-#: src/Core/NotificationsManager.php:288
-#, php-format
-msgid "%s liked %s's post"
-msgstr "%s vond het bericht van %s leuk"
+#: src/Module/Contact.php:635
+msgid "Blacklisted keywords"
+msgstr "Sleutelwoorden op de zwarte lijst"
 
-#: src/Core/NotificationsManager.php:301
-#, php-format
-msgid "%s disliked %s's post"
-msgstr "%s vond het bericht van %s niet leuk"
+#: src/Module/Contact.php:635
+msgid ""
+"Comma separated list of keywords that should not be converted to hashtags, "
+"when \"Fetch information and keywords\" is selected"
+msgstr "Door komma's gescheiden lijst van sleutelwoorden die niet in hashtags mogen omgezet worden, wanneer \"Haal informatie en sleutelwoorden op\" is geselecteerd"
 
-#: src/Core/NotificationsManager.php:314
-#, php-format
-msgid "%s is attending %s's event"
-msgstr "%s woont het event van %s bij"
+#: src/Module/Contact.php:652 src/Module/Settings/TwoFactor/Index.php:111
+msgid "Actions"
+msgstr "Acties"
 
-#: src/Core/NotificationsManager.php:327
-#, php-format
-msgid "%s is not attending %s's event"
-msgstr "%s woont het event van %s niet bij"
+#: src/Module/Contact.php:697
+msgid "Show all contacts"
+msgstr "Toon alle contacten"
 
-#: src/Core/NotificationsManager.php:340
-#, php-format
-msgid "%s may attend %s's event"
-msgstr "%s woont het event van %s misschien bij"
+#: src/Module/Contact.php:702 src/Module/Contact.php:804
+msgid "Blocked"
+msgstr "Geblokkeerd"
 
-#: src/Core/NotificationsManager.php:373
-#, php-format
-msgid "%s is now friends with %s"
-msgstr "%s is nu bevriend met %s"
+#: src/Module/Contact.php:705
+msgid "Only show blocked contacts"
+msgstr "Toon alleen geblokkeerde contacten"
 
-#: src/Core/NotificationsManager.php:639
-msgid "Friend Suggestion"
-msgstr "Vriendschapsvoorstel"
+#: src/Module/Contact.php:710 src/Module/Contact.php:806
+msgid "Ignored"
+msgstr "Genegeerd"
 
-#: src/Core/NotificationsManager.php:673
-msgid "Friend/Connect Request"
-msgstr "Vriendschapsverzoek"
+#: src/Module/Contact.php:713
+msgid "Only show ignored contacts"
+msgstr "Toon alleen genegeerde contacten"
 
-#: src/Core/NotificationsManager.php:673
-msgid "New Follower"
-msgstr "Nieuwe Volger"
+#: src/Module/Contact.php:718 src/Module/Contact.php:807
+msgid "Archived"
+msgstr "Gearchiveerd"
 
-#: src/Core/Update.php:157
-#, php-format
-msgid "Update %s failed. See error logs."
-msgstr "Wijziging %s mislukt. Lees de error logbestanden."
+#: src/Module/Contact.php:721
+msgid "Only show archived contacts"
+msgstr "Toon alleen gearchiveerde contacten"
 
-#: src/Core/Update.php:213
-#, 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 "\n\t\t\t\tDe Friendica ontwikkelaars hebben recent update %svrijgegeven,\n \t\t\t\tmaar wanneer ik deze probeerde te installeren ging het verschrikkelijk fout.\n \t\t\t\tDit moet snel opgelost worden en ik kan het niet alleen. Contacteer alstublieft\n \t\t\t\teen Friendica ontwikkelaar als je mij zelf niet kan helpen. Mijn database kan ongeldig zijn."
+#: src/Module/Contact.php:726 src/Module/Contact.php:805
+msgid "Hidden"
+msgstr "Verborgen"
 
-#: src/Core/Update.php:219
-#, php-format
-msgid ""
-"The error message is\n"
-"[pre]%s[/pre]"
-msgstr "De foutboodschap is\n[pre]%s[/pre]"
+#: src/Module/Contact.php:729
+msgid "Only show hidden contacts"
+msgstr "Toon alleen verborgen contacten"
 
-#: src/Core/Update.php:248
-#, php-format
-msgid ""
-"\n"
-"\t\t\t\t\tThe friendica database was successfully updated from %s to %s."
-msgstr "\n\t\t\t\t\tDe Friendica database is succesvol geupdatet van %s naar %s"
+#: src/Module/Contact.php:737
+msgid "Organize your contact groups"
+msgstr "Organiseer je contact groepen"
 
-#: src/Core/UserImport.php:103
-msgid "Error decoding account file"
-msgstr "Fout bij decoderen van het account bestand"
+#: src/Module/Contact.php:818
+msgid "Search your contacts"
+msgstr "Doorzoek je contacten"
 
-#: src/Core/UserImport.php:109
-msgid "Error! No version data in file! This is not a Friendica account file?"
-msgstr "Fout! Geen versie data in het bestand! Is dit wel een Friendica account bestand?"
+#: src/Module/Contact.php:829 src/Module/Contact.php:1093
+msgid "Archive"
+msgstr "Archiveer"
 
-#: src/Core/UserImport.php:117
-#, php-format
-msgid "User '%s' already exists on this server!"
-msgstr "Gebruiker '%s' bestaat al op deze server!"
+#: src/Module/Contact.php:829 src/Module/Contact.php:1093
+msgid "Unarchive"
+msgstr "Archiveer niet meer"
 
-#: src/Core/UserImport.php:153
-msgid "User creation error"
-msgstr "Fout bij het aanmaken van de gebruiker"
+#: src/Module/Contact.php:832
+msgid "Batch Actions"
+msgstr "Bulk Acties"
 
-#: src/Core/UserImport.php:171
-msgid "User profile creation error"
-msgstr "Fout bij het aanmaken van het gebruikersprofiel"
+#: src/Module/Contact.php:859
+msgid "Conversations started by this contact"
+msgstr "Gesprekken gestart door dit contact"
 
-#: src/Core/UserImport.php:215
-#, php-format
-msgid "%d contact not imported"
-msgid_plural "%d contacts not imported"
-msgstr[0] "%d contact werd niet geïmporteerd"
-msgstr[1] "%d contacten werden niet geïmporteerd"
+#: src/Module/Contact.php:864
+msgid "Posts and Comments"
+msgstr "Berichten en reacties"
 
-#: src/Core/UserImport.php:280
-msgid "Done. You can now login with your username and password"
-msgstr "Gebeurd. Je kunt nu inloggen met je gebruikersnaam en wachtwoord"
+#: src/Module/Contact.php:887
+msgid "View all contacts"
+msgstr "Alle contacten zien"
 
-#: src/Database/DBStructure.php:45
-msgid "There are no tables on MyISAM."
-msgstr "Er zijn geen MyISAM tabellen."
+#: src/Module/Contact.php:898
+msgid "View all common friends"
+msgstr "Bekijk alle gemeenschappelijke vrienden"
 
-#: src/Database/DBStructure.php:153
-#, php-format
-msgid ""
-"\n"
-"Error %d occurred during database update:\n"
-"%s\n"
-msgstr "\nFout %d is opgetreden tijdens database update:\n%s\n"
+#: src/Module/Contact.php:908
+msgid "Advanced Contact Settings"
+msgstr "Geavanceerde instellingen voor contacten"
 
-#: src/Database/DBStructure.php:156
-msgid "Errors encountered performing database changes: "
-msgstr "Fouten opgetreden tijdens database aanpassingen:"
+#: src/Module/Contact.php:990
+msgid "Mutual Friendship"
+msgstr "Wederzijdse vriendschap"
 
-#: src/Database/DBStructure.php:172
-#, php-format
-msgid "%s: Database update"
-msgstr "%s: Database update"
+#: src/Module/Contact.php:995
+msgid "is a fan of yours"
+msgstr "Is een fan van jou"
 
-#: src/Database/DBStructure.php:435
-#, php-format
-msgid "%s: updating %s table."
-msgstr "%s: tabel %s aan het updaten."
+#: src/Module/Contact.php:1000
+msgid "you are a fan of"
+msgstr "Jij bent een fan van"
 
-#: src/LegacyModule.php:29
-#, php-format
-msgid "Legacy module file not found: %s"
-msgstr "Legacy module bestand niet gevonden: %s"
+#: src/Module/Contact.php:1024
+msgid "Edit contact"
+msgstr "Contact bewerken"
 
-#: src/Model/Contact.php:955
-msgid "Drop Contact"
-msgstr "Verwijder contact"
+#: src/Module/Contact.php:1078
+msgid "Toggle Blocked status"
+msgstr "Schakel geblokkeerde status"
 
-#: src/Model/Contact.php:1418
-msgid "Organisation"
-msgstr "Organisatie"
+#: src/Module/Contact.php:1086
+msgid "Toggle Ignored status"
+msgstr "Schakel negeerstatus"
 
-#: src/Model/Contact.php:1422
-msgid "News"
-msgstr "Nieuws"
+#: src/Module/Contact.php:1095
+msgid "Toggle Archive status"
+msgstr "Schakel archiveringsstatus"
 
-#: src/Model/Contact.php:1426
-msgid "Forum"
-msgstr "Forum"
+#: src/Module/Contact.php:1103
+msgid "Delete contact"
+msgstr "Verwijder contact"
 
-#: src/Model/Contact.php:1608
-msgid "Connect URL missing."
-msgstr "Connectie URL ontbreekt."
+#: src/Module/Debug/Babel.php:32
+msgid "Source input"
+msgstr "Bron input"
 
-#: src/Model/Contact.php:1617
-msgid ""
-"The contact could not be added. Please check the relevant network "
-"credentials in your Settings -> Social Networks page."
-msgstr "Het contact kon niet toegevoegd worden. Gelieve de relevante netwerk gegevens na te kijken in Instellingen -> Sociale Netwerken."
+#: src/Module/Debug/Babel.php:38
+msgid "BBCode::toPlaintext"
+msgstr "BBCode::toPlaintext"
 
-#: src/Model/Contact.php:1656
-msgid ""
-"This site is not configured to allow communications with other networks."
-msgstr "Deze website is niet geconfigureerd voor communicatie met andere netwerken."
+#: src/Module/Debug/Babel.php:44
+msgid "BBCode::convert (raw HTML)"
+msgstr "BBCode::convert (raw HTML)"
 
-#: src/Model/Contact.php:1657 src/Model/Contact.php:1671
-msgid "No compatible communication protocols or feeds were discovered."
-msgstr "Er werden geen compatibele communicatieprotocols of feeds ontdekt."
+#: src/Module/Debug/Babel.php:49
+msgid "BBCode::convert"
+msgstr "BBCode::convert"
 
-#: src/Model/Contact.php:1669
-msgid "The profile address specified does not provide adequate information."
-msgstr "Het opgegeven profiel adres bevat geen adequate informatie."
+#: src/Module/Debug/Babel.php:55
+msgid "BBCode::convert => HTML::toBBCode"
+msgstr "BBCode::convert => HTML::toBBCode"
 
-#: src/Model/Contact.php:1674
-msgid "An author or name was not found."
-msgstr "Er werd geen auteur of naam gevonden."
+#: src/Module/Debug/Babel.php:61
+msgid "BBCode::toMarkdown"
+msgstr "BBCode::toMarkdown"
 
-#: src/Model/Contact.php:1677
-msgid "No browser URL could be matched to this address."
-msgstr "Er kan geen browser URL gematcht worden met dit adres."
+#: src/Module/Debug/Babel.php:67
+msgid "BBCode::toMarkdown => Markdown::convert"
+msgstr "BBCode::toMarkdown => Markdown::convert"
 
-#: src/Model/Contact.php:1680
-msgid ""
-"Unable to match @-style Identity Address with a known protocol or email "
-"contact."
-msgstr "Het @-stijl-identiteitsadres komt niet overeen met een nekend protocol of e-mailcontact."
+#: src/Module/Debug/Babel.php:73
+msgid "BBCode::toMarkdown => Markdown::toBBCode"
+msgstr "BBCode::toMarkdown => Markdown::toBBCode"
 
-#: src/Model/Contact.php:1681
-msgid "Use mailto: in front of address to force email check."
-msgstr "Gebruik mailto: voor het adres om een e-mailcontrole af te dwingen."
+#: src/Module/Debug/Babel.php:79
+msgid "BBCode::toMarkdown =>  Markdown::convert => HTML::toBBCode"
+msgstr "BBCode::toMarkdown =>  Markdown::convert => HTML::toBBCode"
 
-#: src/Model/Contact.php:1687
-msgid ""
-"The profile address specified belongs to a network which has been disabled "
-"on this site."
-msgstr "Het opgegeven profiel adres behoort tot een netwerk dat gedeactiveerd is op deze site."
+#: src/Module/Debug/Babel.php:90
+msgid "Item Body"
+msgstr ""
 
-#: src/Model/Contact.php:1692
-msgid ""
-"Limited profile. This person will be unable to receive direct/personal "
-"notifications from you."
-msgstr "Profiel met restricties. Deze peresoon zal geen directe/persoonlijke notificaties van jou kunnen ontvangen."
+#: src/Module/Debug/Babel.php:94
+msgid "Item Tags"
+msgstr ""
 
-#: src/Model/Contact.php:1743
-msgid "Unable to retrieve contact information."
-msgstr "Het was niet mogelijk informatie over dit contact op te halen."
+#: src/Module/Debug/Babel.php:101
+msgid "Source input (Diaspora format)"
+msgstr "Bron ingave (Diaspora formaat):"
 
-#: src/Model/Event.php:63 src/Model/Event.php:80 src/Model/Event.php:437
-#: src/Model/Event.php:912
-msgid "Starts:"
-msgstr "Begint:"
+#: src/Module/Debug/Babel.php:107
+msgid "Markdown::convert (raw HTML)"
+msgstr "Markdown::convert (Ruwe HTML)"
 
-#: src/Model/Event.php:66 src/Model/Event.php:86 src/Model/Event.php:438
-#: src/Model/Event.php:916
-msgid "Finishes:"
-msgstr "Eindigt:"
+#: src/Module/Debug/Babel.php:112
+msgid "Markdown::convert"
+msgstr "Markdown::convert"
 
-#: src/Model/Event.php:386
-msgid "all-day"
-msgstr "de hele dag"
+#: src/Module/Debug/Babel.php:118
+msgid "Markdown::toBBCode"
+msgstr "Markdown::toBBCode"
 
-#: src/Model/Event.php:409
-msgid "Jun"
-msgstr "Jun"
+#: src/Module/Debug/Babel.php:125
+msgid "Raw HTML input"
+msgstr "Onverwerkte HTML input"
 
-#: src/Model/Event.php:412
-msgid "Sept"
-msgstr "Sep"
+#: src/Module/Debug/Babel.php:130
+msgid "HTML Input"
+msgstr "HTML Input"
 
-#: src/Model/Event.php:435
-msgid "No events to display"
-msgstr "Geen gebeurtenissen te tonen"
+#: src/Module/Debug/Babel.php:136
+msgid "HTML::toBBCode"
+msgstr "HTML::toBBCode"
 
-#: src/Model/Event.php:559
-msgid "l, F j"
-msgstr "l j F"
+#: src/Module/Debug/Babel.php:142
+msgid "HTML::toBBCode => BBCode::convert"
+msgstr "HTML::toBBCode => BBCode::convert"
 
-#: src/Model/Event.php:590
-msgid "Edit event"
-msgstr "Gebeurtenis bewerken"
+#: src/Module/Debug/Babel.php:147
+msgid "HTML::toBBCode => BBCode::convert (raw HTML)"
+msgstr "HTML::toBBCode => BBCode::convert (Ruwe HTML)"
 
-#: src/Model/Event.php:591
-msgid "Duplicate event"
-msgstr "Duplicate gebeurtenis"
+#: src/Module/Debug/Babel.php:153
+msgid "HTML::toBBCode => BBCode::toPlaintext"
+msgstr ""
 
-#: src/Model/Event.php:592
-msgid "Delete event"
-msgstr "Verwijder gebeurtenis"
+#: src/Module/Debug/Babel.php:159
+msgid "HTML::toMarkdown"
+msgstr "HTML::toMarkdown"
 
-#: src/Model/Event.php:624 src/Model/Item.php:3529 src/Model/Item.php:3536
-msgid "link to source"
-msgstr "Verwijzing naar bron"
+#: src/Module/Debug/Babel.php:165
+msgid "HTML::toPlaintext"
+msgstr "HTML::toPlaintext"
 
-#: src/Model/Event.php:845
-msgid "D g:i A"
-msgstr "D g:i A"
+#: src/Module/Debug/Babel.php:171
+msgid "HTML::toPlaintext (compact)"
+msgstr ""
 
-#: src/Model/Event.php:846
-msgid "g:i A"
-msgstr "g:i A"
+#: src/Module/Debug/Babel.php:179
+msgid "Source text"
+msgstr "Brontekst"
 
-#: src/Model/Event.php:931 src/Model/Event.php:933
-msgid "Show map"
-msgstr "Toon kaart"
+#: src/Module/Debug/Babel.php:180
+msgid "BBCode"
+msgstr "BBCode"
 
-#: src/Model/Event.php:932
-msgid "Hide map"
-msgstr "Verberg kaart"
+#: src/Module/Debug/Babel.php:181
+msgid "Markdown"
+msgstr "Markdown"
 
-#: src/Model/Event.php:1022
-#, php-format
-msgid "%s's birthday"
-msgstr "%s's verjaardag"
+#: src/Module/Debug/Babel.php:182
+msgid "HTML"
+msgstr "HTML"
 
-#: src/Model/Event.php:1023
-#, php-format
-msgid "Happy Birthday %s"
-msgstr "Gefeliciteerd %s"
+#: src/Module/Debug/Feed.php:20 src/Module/Filer/SaveTag.php:20
+msgid "You must be logged in to use this module"
+msgstr "Je moet ingelogd zijn om deze module te gebruiken"
 
-#: src/Model/FileTag.php:255
-msgid "Item filed"
-msgstr "Item bewaard"
+#: src/Module/Debug/Feed.php:49
+msgid "Source URL"
+msgstr "Bron URL"
 
-#: src/Model/Group.php:47
-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 "Een verwijderde groep met deze naam is weer tot leven gewekt. Bestaande itemrechten <strong>kunnen</strong> voor deze groep en toekomstige leden gelden. Wanneer je niet zo had bedoeld kan je een andere groep met een andere naam creëren. "
+#: src/Module/Debug/Localtime.php:30
+msgid "Time Conversion"
+msgstr "Tijdsconversie"
 
-#: src/Model/Group.php:333
-msgid "Default privacy group for new contacts"
-msgstr "Standaard privacy groep voor nieuwe contacten"
+#: src/Module/Debug/Localtime.php:31
+msgid ""
+"Friendica provides this service for sharing events with other networks and "
+"friends in unknown timezones."
+msgstr "Friendica biedt deze dienst aan om gebeurtenissen te delen met andere netwerken en vrienden in onbekende tijdzones."
 
-#: src/Model/Group.php:366
-msgid "Everybody"
-msgstr "Iedereen"
+#: src/Module/Debug/Localtime.php:32
+#, php-format
+msgid "UTC time: %s"
+msgstr "UTC tijd: %s"
 
-#: src/Model/Group.php:386
-msgid "edit"
-msgstr "verander"
+#: src/Module/Debug/Localtime.php:35
+#, php-format
+msgid "Current timezone: %s"
+msgstr "Huidige Tijdzone: %s"
 
-#: src/Model/Group.php:415
-msgid "Edit group"
-msgstr "Verander groep"
+#: src/Module/Debug/Localtime.php:39
+#, php-format
+msgid "Converted localtime: %s"
+msgstr "Omgerekende lokale tijd: %s"
 
-#: src/Model/Group.php:418
-msgid "Create a new group"
-msgstr "Maak nieuwe groep"
+#: src/Module/Debug/Localtime.php:43
+msgid "Please select your timezone:"
+msgstr "Selecteer je tijdzone:"
 
-#: src/Model/Group.php:420
-msgid "Edit groups"
-msgstr "Bewerk groepen"
+#: src/Module/Debug/Probe.php:19 src/Module/Debug/WebFinger.php:18
+msgid "Only logged in users are permitted to perform a probing."
+msgstr "Alleen ingelogde gebruikers hebben toelating om aan probing te doen."
 
-#: src/Model/Item.php:3267
-msgid "activity"
-msgstr "activiteit"
+#: src/Module/Debug/Probe.php:35
+msgid "Lookup address"
+msgstr ""
 
-#: src/Model/Item.php:3269 src/Object/Post.php:446 src/Object/Post.php:458
-msgid "comment"
-msgid_plural "comments"
-msgstr[0] "reactie"
-msgstr[1] "reacties"
+#: src/Module/Directory.php:61
+msgid "No entries (some entries may be hidden)."
+msgstr "Geen gegevens (sommige gegevens kunnen verborgen zijn)."
 
-#: src/Model/Item.php:3272
-msgid "post"
-msgstr "bericht"
+#: src/Module/Directory.php:80
+msgid "Find on this site"
+msgstr "Op deze website zoeken"
 
-#: src/Model/Item.php:3368
-#, php-format
-msgid "Content warning: %s"
-msgstr "Waarschuwing inhoud: %s"
+#: src/Module/Directory.php:82
+msgid "Results for:"
+msgstr "Resultaten voor:"
 
-#: src/Model/Item.php:3447
-msgid "bytes"
-msgstr "bytes"
+#: src/Module/Directory.php:84
+msgid "Site Directory"
+msgstr "Websitegids"
 
-#: src/Model/Item.php:3523
-msgid "View on separate page"
-msgstr "Bekijk op aparte pagina"
+#: src/Module/Filer/SaveTag.php:39
+#, php-format
+msgid "Filetag %s saved to item"
+msgstr ""
 
-#: src/Model/Item.php:3524
-msgid "view on separate page"
-msgstr "bekijk op aparte pagina"
+#: src/Module/Filer/SaveTag.php:48
+msgid "- select -"
+msgstr "- Kies -"
 
-#: src/Model/Mail.php:40 src/Model/Mail.php:172
-msgid "[no subject]"
-msgstr "[geen onderwerp]"
+#: src/Module/FollowConfirm.php:37
+msgid "No given contact."
+msgstr ""
 
-#: src/Model/Profile.php:114
-msgid "Requested account is not available."
-msgstr "Gevraagde account is niet beschikbaar."
+#: src/Module/Friendica.php:40
+msgid "Installed addons/apps:"
+msgstr "Geïnstalleerde addons/applicaties:"
 
-#: src/Model/Profile.php:180 src/Model/Profile.php:416
-#: src/Model/Profile.php:872
-msgid "Edit profile"
-msgstr "Bewerk profiel"
+#: src/Module/Friendica.php:45
+msgid "No installed addons/apps"
+msgstr "Geen geïnstalleerde addons/applicaties"
 
-#: src/Model/Profile.php:350
-msgid "Atom feed"
-msgstr "Atom feed"
+#: src/Module/Friendica.php:50
+#, php-format
+msgid "Read about the <a href=\"%1$s/tos\">Terms of Service</a> of this node."
+msgstr "Lees de <a href=\"%1$s/tos\">Gebruiksvoorwaarden</a> van deze node na."
 
-#: src/Model/Profile.php:389
-msgid "Manage/edit profiles"
-msgstr "Beheer/wijzig profielen"
+#: src/Module/Friendica.php:57
+msgid "On this server the following remote servers are blocked."
+msgstr "De volgende remote servers zijn geblokkeerd."
 
-#: src/Model/Profile.php:441 src/Module/Contact.php:652
-msgid "XMPP:"
-msgstr "XMPP:"
+#: src/Module/Friendica.php:75
+#, 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 "Dit is Friendica, versie %s en draait op op locatie %s. De databaseversie is %s, en de bericht update versie is %s."
 
-#: src/Model/Profile.php:567 src/Model/Profile.php:665
-msgid "g A l F d"
-msgstr "G l j F"
+#: src/Module/Friendica.php:80
+msgid ""
+"Please visit <a href=\"https://friendi.ca\">Friendi.ca</a> to learn more "
+"about the Friendica project."
+msgstr "Ga naar <a href=\"https://friendi.ca\">Friendi.ca</a> om meer te vernemen over het Friendica project."
 
-#: src/Model/Profile.php:568
-msgid "F d"
-msgstr "d F"
+#: src/Module/Friendica.php:81
+msgid "Bug reports and issues: please visit"
+msgstr "Bug rapporten en problemen: bezoek"
 
-#: src/Model/Profile.php:630 src/Model/Profile.php:716
-msgid "[today]"
-msgstr "[vandaag]"
+#: src/Module/Friendica.php:81
+msgid "the bugtracker at github"
+msgstr "de github bugtracker"
 
-#: src/Model/Profile.php:641
-msgid "Birthday Reminders"
-msgstr "Verjaardagsherinneringen"
+#: src/Module/Friendica.php:82
+msgid "Suggestions, praise, etc. - please email \"info\" at \"friendi - dot - ca"
+msgstr "Suggesties, appreciatie, enz. - aub stuur een email naar \"info\" at \"friendi - dot - ca"
 
-#: src/Model/Profile.php:642
-msgid "Birthdays this week:"
-msgstr "Verjaardagen deze week:"
+#: src/Module/Group.php:42
+msgid "Group created."
+msgstr "Groep aangemaakt."
 
-#: src/Model/Profile.php:703
-msgid "[No description]"
-msgstr "[Geen omschrijving]"
+#: src/Module/Group.php:48
+msgid "Could not create group."
+msgstr "Kon de groep niet aanmaken."
 
-#: src/Model/Profile.php:730
-msgid "Event Reminders"
-msgstr "Gebeurtenisherinneringen"
+#: src/Module/Group.php:59 src/Module/Group.php:207 src/Module/Group.php:233
+msgid "Group not found."
+msgstr "Groep niet gevonden."
 
-#: src/Model/Profile.php:731
-msgid "Upcoming events the next 7 days:"
-msgstr "Evenementen de komende 7 dagen:"
+#: src/Module/Group.php:65
+msgid "Group name changed."
+msgstr "Groepsnaam gewijzigd."
 
-#: src/Model/Profile.php:754
-msgid "Member since:"
-msgstr "Lid sinds:"
+#: src/Module/Group.php:87
+msgid "Unknown group."
+msgstr ""
 
-#: src/Model/Profile.php:762
-msgid "j F, Y"
-msgstr "F j Y"
+#: src/Module/Group.php:96
+msgid "Contact is unavailable."
+msgstr ""
 
-#: src/Model/Profile.php:763
-msgid "j F"
-msgstr "F j"
+#: src/Module/Group.php:100
+msgid "Contact is deleted."
+msgstr ""
 
-#: src/Model/Profile.php:771 src/Util/Temporal.php:149
-msgid "Birthday:"
-msgstr "Verjaardag:"
+#: src/Module/Group.php:106
+msgid "Contact is blocked, unable to add it to a group."
+msgstr ""
 
-#: src/Model/Profile.php:778
-msgid "Age:"
-msgstr "Leeftijd:"
+#: src/Module/Group.php:110
+msgid "Unable to add the contact to the group."
+msgstr ""
 
-#: src/Model/Profile.php:791
-#, php-format
-msgid "for %1$d %2$s"
-msgstr "voor %1$d %2$s"
+#: src/Module/Group.php:112
+msgid "Contact successfully added to group."
+msgstr ""
 
-#: src/Model/Profile.php:815
-msgid "Religion:"
-msgstr "Religie:"
+#: src/Module/Group.php:116
+msgid "Unable to remove the contact from the group."
+msgstr ""
 
-#: src/Model/Profile.php:823
-msgid "Hobbies/Interests:"
-msgstr "Hobby:"
+#: src/Module/Group.php:118
+msgid "Contact successfully removed from group."
+msgstr ""
 
-#: src/Model/Profile.php:835
-msgid "Contact information and Social Networks:"
-msgstr "Contactinformatie en sociale netwerken:"
+#: src/Module/Group.php:121
+msgid "Unknown group command."
+msgstr ""
 
-#: src/Model/Profile.php:839
-msgid "Musical interests:"
-msgstr "Muzikale interesse "
+#: src/Module/Group.php:124
+msgid "Bad request."
+msgstr ""
 
-#: src/Model/Profile.php:843
-msgid "Books, literature:"
-msgstr "Boeken, literatuur:"
+#: src/Module/Group.php:163
+msgid "Save Group"
+msgstr "Bewaar groep"
 
-#: src/Model/Profile.php:847
-msgid "Television:"
-msgstr "Televisie"
+#: src/Module/Group.php:164
+msgid "Filter"
+msgstr "filter"
 
-#: src/Model/Profile.php:851
-msgid "Film/dance/culture/entertainment:"
-msgstr "Film/dans/cultuur/ontspanning:"
+#: src/Module/Group.php:170
+msgid "Create a group of contacts/friends."
+msgstr "Maak een groep contacten/vrienden aan."
 
-#: src/Model/Profile.php:855
-msgid "Love/Romance:"
-msgstr "Liefde/romance:"
+#: src/Module/Group.php:212
+msgid "Group removed."
+msgstr "Groep verwijderd."
 
-#: src/Model/Profile.php:859
-msgid "Work/employment:"
-msgstr "Werk/beroep:"
+#: src/Module/Group.php:214
+msgid "Unable to remove group."
+msgstr "Niet in staat om groep te verwijderen."
 
-#: src/Model/Profile.php:863
-msgid "School/education:"
-msgstr "School/opleiding:"
+#: src/Module/Group.php:265
+msgid "Delete Group"
+msgstr "Verwijder Groep"
 
-#: src/Model/Profile.php:868
-msgid "Forums:"
-msgstr "Fora:"
+#: src/Module/Group.php:275
+msgid "Edit Group Name"
+msgstr "Bewerk Groep Naam"
 
-#: src/Model/Profile.php:912 src/Module/Contact.php:877
-msgid "Profile Details"
-msgstr "Profieldetails"
+#: src/Module/Group.php:285
+msgid "Members"
+msgstr "Leden"
 
-#: src/Model/Profile.php:962
-msgid "Only You Can See This"
-msgstr "Alleen jij kunt dit zien"
+#: src/Module/Group.php:301
+msgid "Remove contact from group"
+msgstr "Verwijder contact uit de groep"
 
-#: src/Model/Profile.php:970 src/Model/Profile.php:973
-msgid "Tips for New Members"
-msgstr "Tips voor nieuwe leden"
+#: src/Module/Group.php:335
+msgid "Add contact to group"
+msgstr "Voeg contact toe aan de groep"
+
+#: src/Module/Help.php:43
+msgid "Help:"
+msgstr "Help:"
 
-#: src/Model/Profile.php:1135
+#: src/Module/Home.php:42
 #, php-format
-msgid "OpenWebAuth: %1$s welcomes %2$s"
-msgstr "OpenWebAuth: %1$s verwelkomt %2$s"
+msgid "Welcome to %s"
+msgstr "Welkom op %s"
 
-#: src/Model/User.php:207
-msgid "Login failed"
-msgstr "Login mislukt"
+#: src/Module/Install.php:160
+msgid "Friendica Communications Server - Setup"
+msgstr "Friendica Communicatie Server - Setup"
 
-#: src/Model/User.php:238
-msgid "Not enough information to authenticate"
-msgstr "Niet genoeg informatie om te authentificeren"
+#: src/Module/Install.php:171
+msgid "System check"
+msgstr "Systeemcontrole"
 
-#: src/Model/User.php:430
-msgid "An invitation is required."
-msgstr "Een uitnodiging is vereist."
+#: src/Module/Install.php:176
+msgid "Check again"
+msgstr "Controleer opnieuw"
 
-#: src/Model/User.php:434
-msgid "Invitation could not be verified."
-msgstr "Uitnodiging kon niet geverifieerd worden."
+#: src/Module/Install.php:191
+msgid "Base settings"
+msgstr ""
 
-#: src/Model/User.php:441
-msgid "Invalid OpenID url"
-msgstr "Ongeldige OpenID url"
+#: src/Module/Install.php:198
+msgid "Host name"
+msgstr "Host naam"
 
-#: src/Model/User.php:454 src/Module/Login.php:108
+#: src/Module/Install.php:200
 msgid ""
-"We encountered a problem while logging in with the OpenID you provided. "
-"Please check the correct spelling of the ID."
-msgstr "Er is een probleem opgetreden bij het inloggen met het opgegeven OpenID. Kijk alsjeblieft de spelling van deze ID na."
-
-#: src/Model/User.php:454 src/Module/Login.php:108
-msgid "The error message was:"
-msgstr "De foutboodschap was:"
+"Overwrite this field in case the determinated hostname isn't right, "
+"otherweise leave it as is."
+msgstr ""
 
-#: src/Model/User.php:460
-msgid "Please enter the required information."
-msgstr "Vul de vereiste informatie in."
+#: src/Module/Install.php:203
+msgid "Base path to installation"
+msgstr "Basispad voor installatie"
 
-#: src/Model/User.php:476
-#, php-format
+#: src/Module/Install.php:205
 msgid ""
-"system.username_min_length (%s) and system.username_max_length (%s) are "
-"excluding each other, swapping values."
-msgstr "system.username_min_length (%s) en system.username_max_length (%s) sluiten elkaar uit. Waarden worden omgedraaid."
-
-#: src/Model/User.php:483
-#, php-format
-msgid "Username should be at least %s character."
-msgid_plural "Username should be at least %s characters."
-msgstr[0] "Gebruikersnaam moet minimaal %s tekens bevatten."
-msgstr[1] "Gebruikersnaam moet minimaal %s tekens bevatten"
+"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 "Als het systeem het correcte pad naar je installatie niet kan detecteren, geef hier dan het correcte pad in. Deze instelling zou alleen geconfigureerd moeten worden als je een systeem met restricties hebt en symbolische links naar je webroot."
 
-#: src/Model/User.php:487
-#, php-format
-msgid "Username should be at most %s character."
-msgid_plural "Username should be at most %s characters."
-msgstr[0] "Gebruikersnaam mag maximaal %s tekens bevatten."
-msgstr[1] "Gebruikersnaam mag maximaal %s tekens bevatten."
+#: src/Module/Install.php:208
+msgid "Sub path of the URL"
+msgstr ""
 
-#: src/Model/User.php:495
-msgid "That doesn't appear to be your full (First Last) name."
-msgstr "Dat lijkt niet je volledige naam (voor- en achternaam) te zijn."
+#: src/Module/Install.php:210
+msgid ""
+"Overwrite this field in case the sub path determination isn't right, "
+"otherwise leave it as is. Leaving this field blank means the installation is"
+" at the base URL without sub path."
+msgstr ""
 
-#: src/Model/User.php:500
-msgid "Your email domain is not among those allowed on this site."
-msgstr "Je e-maildomein is op deze website niet toegestaan."
+#: src/Module/Install.php:221
+msgid "Database connection"
+msgstr "Verbinding met database"
 
-#: src/Model/User.php:504
-msgid "Not a valid email address."
-msgstr "Geen geldig e-mailadres."
+#: src/Module/Install.php:222
+msgid ""
+"In order to install Friendica we need to know how to connect to your "
+"database."
+msgstr "Om Friendica te kunnen installeren moet ik weten hoe ik jouw database kan bereiken."
 
-#: src/Model/User.php:507
-msgid "The nickname was blocked from registration by the nodes admin."
-msgstr "De bijnaam werd geblokkeerd voor registratie door de node admin"
+#: src/Module/Install.php:223
+msgid ""
+"Please contact your hosting provider or site administrator if you have "
+"questions about these settings."
+msgstr "Neem contact op met jouw hostingprovider of websitebeheerder, wanneer je vragen hebt over deze instellingen. "
 
-#: src/Model/User.php:511 src/Model/User.php:519
-msgid "Cannot use that email."
-msgstr "Ik kan die e-mail niet gebruiken."
+#: src/Module/Install.php:224
+msgid ""
+"The database you specify below should already exist. If it does not, please "
+"create it before continuing."
+msgstr "De database die je hier opgeeft zou al moeten bestaan. Maak anders de database aan voordat je verder gaat."
 
-#: src/Model/User.php:526
-msgid "Your nickname can only contain a-z, 0-9 and _."
-msgstr "Je bijnaam mag alleen a-z, 0-9 of _ bevatten."
+#: src/Module/Install.php:231
+msgid "Database Server Name"
+msgstr "Servernaam database"
 
-#: src/Model/User.php:533 src/Model/User.php:590
-msgid "Nickname is already registered. Please choose another."
-msgstr "Bijnaam is al geregistreerd. Kies een andere."
+#: src/Module/Install.php:236
+msgid "Database Login Name"
+msgstr "Gebruikersnaam database"
 
-#: src/Model/User.php:543
-msgid "SERIOUS ERROR: Generation of security keys failed."
-msgstr "ERNSTIGE FOUT: aanmaken van beveiligingssleutels mislukt."
+#: src/Module/Install.php:242
+msgid "Database Login Password"
+msgstr "Wachtwoord database"
 
-#: src/Model/User.php:577 src/Model/User.php:581
-msgid "An error occurred during registration. Please try again."
-msgstr "Er is een fout opgetreden tijdens de registratie. Probeer opnieuw."
+#: src/Module/Install.php:244
+msgid "For security reasons the password must not be empty"
+msgstr "Om veiligheidsreden mag het paswoord niet leeg zijn"
 
-#: src/Model/User.php:601 view/theme/duepuntozero/config.php:55
-msgid "default"
-msgstr "standaard"
+#: src/Module/Install.php:247
+msgid "Database Name"
+msgstr "Naam database"
 
-#: src/Model/User.php:606
-msgid "An error occurred creating your default profile. Please try again."
-msgstr "Er is een fout opgetreden bij het aanmaken van je standaard profiel. Probeer opnieuw."
+#: src/Module/Install.php:251 src/Module/Install.php:280
+msgid "Please select a default timezone for your website"
+msgstr "Selecteer een standaard tijdzone voor je website"
 
-#: src/Model/User.php:613
-msgid "An error occurred creating your self contact. Please try again."
-msgstr "Er is een fout opgetreden bij het aanmaken van je self contact. Probeer opnieuw."
+#: src/Module/Install.php:265
+msgid "Site settings"
+msgstr "Website-instellingen"
 
-#: src/Model/User.php:622
-msgid ""
-"An error occurred creating your default contact group. Please try again."
-msgstr "Er is een fout opgetreden bij het aanmaken van je standaard contact groep. Probeer opnieuw."
+#: src/Module/Install.php:275
+msgid "Site administrator email address"
+msgstr "E-mailadres van de websitebeheerder"
 
-#: src/Model/User.php:697
-#, php-format
+#: src/Module/Install.php:277
 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 "\n\t\t\tHallo %1$s,\n\t\t\t\tBedankt om je te registreren op %2$s. Uw account is op dit moment wachten op bevestiging door de administrator.\n\n\t\t\tUw login details zijn:\n\n\t\t\tSite locatie:\t%3$s\n\t\t\tGebruikersnaam:\t\t%4$s\n\t\t\tWachtwoord:\t\t%5$s\n\t\t"
-
-#: src/Model/User.php:714
-#, php-format
-msgid "Registration at %s"
-msgstr "Registratie bij %s"
+"Your account email address must match this in order to use the web admin "
+"panel."
+msgstr "Het e-mailadres van je account moet hiermee overeenkomen om het administratiepaneel te kunnen gebruiken."
 
-#: src/Model/User.php:732
-#, 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 "\n\t\t\tBeste %1$s,\n\t\t\t\tBedankt voor je registratie bij %2$s. Je account is aangemaakt.\n\t\t"
+#: src/Module/Install.php:284
+msgid "System Language:"
+msgstr "Systeem taal:"
 
-#: src/Model/User.php:738
-#, php-format
+#: src/Module/Install.php:286
 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 "\n\t\t\tDe login details zijn de volgende:\n\n\t\t\tSite Locatie:\t%3$s\n\t\t\tLogin Naam:\t\t%1$s\n\t\t\tPaswoord:\t\t%5$s\n\n\t\t\tJe kunt je paswoord in de \"Instellingen\" pagina veranderen nadat je bent ingelogd.\n\n\t\t\tNeem een ogenblik de tijd om je andere instellingen na te kijken op die pagina.\n\n\t\t\tJe kunt ook wat basis informatie toevoegen aan je standaard profiel\n\t\t\t(in de \"Profielen\" pagina) zodat anderen je gemakkelijk kunnen vinden.\n\n\t\t\tWe raden aan je volledige naam in te vullen, een profiel foto toe te voegen,\n\t\t\tenkele profiel \"sleutelwoorden\" (zeer handig om nieuwe vrienden te leren kennen) - en\n\t\t\tmisschien in welk land je woont; als je niet meer details wil geven.\n\t\t\tWe respecteren je privacy volledig, en geen van deze velden zijn verplicht.\n\t\t\tAls je nieuw bent en niemand kent, dan kunnen zij je misschien\n\t\t\thelpen om enkele nieuwe en interessante vrienden te leren kennen.\n\n\t\t\tAls je ooit je account wil verwijderen, dan kan je dat via %3$s/removeme\n\n\t\t\tBedankt en welkom bij %2$s."
-
-#: src/Module/Contact.php:171
-#, php-format
-msgid "%d contact edited."
-msgid_plural "%d contacts edited."
-msgstr[0] "%d contact bewerkt."
-msgstr[1] "%d contacten bewerkt."
+"Set the default language for your Friendica installation interface and to "
+"send emails."
+msgstr "Stel de standaard taal in voor je Friendica installatie interface en emails."
 
-#: src/Module/Contact.php:196 src/Module/Contact.php:379
-msgid "Could not access contact record."
-msgstr "Kon geen toegang krijgen tot de contactgegevens"
+#: src/Module/Install.php:298
+msgid "Your Friendica site database has been installed."
+msgstr "De database van je Friendica-website is geïnstalleerd."
 
-#: src/Module/Contact.php:206
-msgid "Could not locate selected profile."
-msgstr "Kon het geselecteerde profiel niet vinden."
+#: src/Module/Install.php:306
+msgid "Installation finished"
+msgstr "Installaitie beëindigd"
 
-#: src/Module/Contact.php:238
-msgid "Contact updated."
-msgstr "Contact opgeslagen"
+#: src/Module/Install.php:328
+msgid "<h1>What next</h1>"
+msgstr "<h1>Wat nu</h1>"
 
-#: src/Module/Contact.php:400
-msgid "Contact has been blocked"
-msgstr "Contact is geblokkeerd"
+#: src/Module/Install.php:329
+msgid ""
+"IMPORTANT: You will need to [manually] setup a scheduled task for the "
+"worker."
+msgstr "BELANGRIJK: Je zal [manueel] een geplande taak moeten opzetten voor de worker."
 
-#: src/Module/Contact.php:400
-msgid "Contact has been unblocked"
-msgstr "Contact is gedeblokkeerd"
+#: src/Module/Install.php:332
+#, 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 "Go naar je nieuwe Friendica node <a href=\"%s/register\">registratie pagina</a> en registeer als nieuwe gebruiker. Vergeet niet hetzelfde email adres te gebruiken als wat je opgegeven hebt als administrator email. Dit zal je toelaten om het site administratie paneel te openen."
 
-#: src/Module/Contact.php:410
-msgid "Contact has been ignored"
-msgstr "Contact wordt genegeerd"
+#: src/Module/Invite.php:37
+msgid "Total invitation limit exceeded."
+msgstr "Totale uitnodigingslimiet overschreden."
 
-#: src/Module/Contact.php:410
-msgid "Contact has been unignored"
-msgstr "Contact wordt niet meer genegeerd"
+#: src/Module/Invite.php:60
+#, php-format
+msgid "%s : Not a valid email address."
+msgstr "%s: Geen geldig e-mailadres."
 
-#: src/Module/Contact.php:420
-msgid "Contact has been archived"
-msgstr "Contact is gearchiveerd"
+#: src/Module/Invite.php:87
+msgid "Please join us on Friendica"
+msgstr "Kom bij ons op Friendica"
 
-#: src/Module/Contact.php:420
-msgid "Contact has been unarchived"
-msgstr "Contact is niet meer gearchiveerd"
+#: src/Module/Invite.php:96
+msgid "Invitation limit exceeded. Please contact your site administrator."
+msgstr "Uitnodigingslimiet overschreden. Neem contact op met de beheerder van je website."
 
-#: src/Module/Contact.php:444
-msgid "Drop contact"
-msgstr "Contact vergeten"
+#: src/Module/Invite.php:100
+#, php-format
+msgid "%s : Message delivery failed."
+msgstr "%s : Aflevering van bericht mislukt."
 
-#: src/Module/Contact.php:447 src/Module/Contact.php:825
-msgid "Do you really want to delete this contact?"
-msgstr "Wil je echt dit contact verwijderen?"
+#: src/Module/Invite.php:104
+#, php-format
+msgid "%d message sent."
+msgid_plural "%d messages sent."
+msgstr[0] "%d bericht verzonden."
+msgstr[1] "%d berichten verzonden."
 
-#: src/Module/Contact.php:461
-msgid "Contact has been removed."
-msgstr "Contact is verwijderd."
+#: src/Module/Invite.php:122
+msgid "You have no more invitations available"
+msgstr "Je kunt geen uitnodigingen meer sturen"
 
-#: src/Module/Contact.php:492
+#: src/Module/Invite.php:129
 #, php-format
-msgid "You are mutual friends with %s"
-msgstr "Je bent wederzijds bevriend met %s"
+msgid ""
+"Visit %s for a list of public sites that you can join. Friendica members on "
+"other sites can all connect with each other, as well as with members of many"
+" other social networks."
+msgstr "Bezoek %s voor een lijst van openbare sites waar je je kunt aansluiten. Friendica leden op andere sites kunnen allemaal met elkaar verbonden worden, en ook met leden van verschillende andere sociale netwerken."
 
-#: src/Module/Contact.php:497
+#: src/Module/Invite.php:131
 #, php-format
-msgid "You are sharing with %s"
-msgstr "Je deelt met %s"
+msgid ""
+"To accept this invitation, please visit and register at %s or any other "
+"public Friendica website."
+msgstr "Om deze uitnodiging te accepteren kan je je op %s registreren of op een andere vrij toegankelijke Friendica-website."
 
-#: src/Module/Contact.php:502
+#: src/Module/Invite.php:132
 #, php-format
-msgid "%s is sharing with you"
-msgstr "%s deelt met jou"
+msgid ""
+"Friendica sites all inter-connect to create a huge privacy-enhanced social "
+"web that is owned and controlled by its members. They can also connect with "
+"many traditional social networks. See %s for a list of alternate Friendica "
+"sites you can join."
+msgstr "Friendica servers zijn allemaal onderling verbonden om een reusachtig sociaal web te maken met verbeterde privacy, dat eigendom is van en gecontroleerd door zijn leden. Ze kunnen ook verbindingen maken met verschillende traditionele sociale netwerken. Bekijk %s voor een lijst van alternatieve Friendica servers waar je aan kunt sluiten."
 
-#: src/Module/Contact.php:526
-msgid "Private communications are not available for this contact."
-msgstr "Privécommunicatie met dit contact is niet beschikbaar."
+#: src/Module/Invite.php:136
+msgid ""
+"Our apologies. This system is not currently configured to connect with other"
+" public sites or invite members."
+msgstr "Onze verontschuldigingen. Dit systeem is momenteel niet ingesteld om verbinding te maken met andere openbare plaatsen of leden uit te nodigen."
 
-#: src/Module/Contact.php:528
-msgid "Never"
-msgstr "Nooit"
+#: src/Module/Invite.php:139
+msgid ""
+"Friendica sites all inter-connect to create a huge privacy-enhanced social "
+"web that is owned and controlled by its members. They can also connect with "
+"many traditional social networks."
+msgstr "Friendica servers zijn allemaal onderling verbonden om een reusachtig sociaal web te maken met verbeterde privacy, dat eigendom is van en gecontroleerd door zijn leden. Ze kunnen ook verbindingen maken met verschillende traditionele sociale netwerken."
 
-#: src/Module/Contact.php:531
-msgid "(Update was successful)"
-msgstr "(Wijziging is geslaagd)"
+#: src/Module/Invite.php:138
+#, php-format
+msgid "To accept this invitation, please visit and register at %s."
+msgstr "Om deze uitnodiging te accepteren, ga naar en registreer op %s."
 
-#: src/Module/Contact.php:531
-msgid "(Update was not successful)"
-msgstr "(Wijziging is niet geslaagd)"
+#: src/Module/Invite.php:146
+msgid "Send invitations"
+msgstr "Verstuur uitnodigingen"
 
-#: src/Module/Contact.php:533 src/Module/Contact.php:1063
-msgid "Suggest friends"
-msgstr "Stel vrienden voor"
+#: src/Module/Invite.php:147
+msgid "Enter email addresses, one per line:"
+msgstr "Vul e-mailadressen in, één per lijn:"
 
-#: src/Module/Contact.php:537
-#, php-format
-msgid "Network type: %s"
-msgstr "Netwerk type: %s"
+#: src/Module/Invite.php:151
+msgid ""
+"You are cordially invited to join me and other close friends on Friendica - "
+"and help us to create a better social web."
+msgstr "Ik nodig je vriendelijk uit om bij mij en andere vrienden te komen op Friendica - en ons te helpen om een beter sociaal web te bouwen."
 
-#: src/Module/Contact.php:542
-msgid "Communications lost with this contact!"
-msgstr "Communicatie met dit contact is verbroken!"
+#: src/Module/Invite.php:153
+msgid "You will need to supply this invitation code: $invite_code"
+msgstr "Je zult deze uitnodigingscode moeten invullen: $invite_code"
 
-#: src/Module/Contact.php:548
-msgid "Fetch further information for feeds"
-msgstr "Haal meer informatie op van de feeds"
+#: src/Module/Invite.php:153
+msgid ""
+"Once you have registered, please connect with me via my profile page at:"
+msgstr "Eens je geregistreerd bent kun je contact leggen met mij via mijn profielpagina op:"
 
-#: src/Module/Contact.php:550
+#: src/Module/Invite.php:155
 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 "Haal informatie op zoals preview beelden, titel en teaser van het feed item. Je kan dit activeren als de feed niet veel tekst bevat. Sleutelwoorden worden opgepikt uit de meta header in het feed item en worden gepost als hash tags."
+"For more information about the Friendica project and why we feel it is "
+"important, please visit http://friendi.ca"
+msgstr "Voor meer informatie over het Friendica project en waarom wij denken dat het belangrijk is kun je http://friendi.ca/ bezoeken"
 
-#: src/Module/Contact.php:553
-msgid "Fetch information"
-msgstr "Haal informatie op"
+#: src/Module/Item/Compose.php:30
+msgid "Please enter a post body."
+msgstr ""
 
-#: src/Module/Contact.php:554
-msgid "Fetch keywords"
-msgstr "Haal sleutelwoorden op"
+#: src/Module/Item/Compose.php:43
+msgid "This feature is only available with the frio theme."
+msgstr ""
 
-#: src/Module/Contact.php:555
-msgid "Fetch information and keywords"
-msgstr "Haal informatie en sleutelwoorden op"
+#: src/Module/Item/Compose.php:63
+msgid "Compose new personal note"
+msgstr ""
 
-#: src/Module/Contact.php:587
-msgid "Profile Visibility"
-msgstr "Zichtbaarheid profiel"
+#: src/Module/Item/Compose.php:70
+msgid "Compose new post"
+msgstr ""
 
-#: src/Module/Contact.php:588
-msgid "Contact Information / Notes"
-msgstr "Contactinformatie / aantekeningen"
+#: src/Module/Item/Compose.php:190
+msgid "Clear the location"
+msgstr ""
 
-#: src/Module/Contact.php:589
-msgid "Contact Settings"
-msgstr "Contact instellingen"
+#: src/Module/Item/Compose.php:191
+msgid "Location services are unavailable on your device"
+msgstr ""
 
-#: src/Module/Contact.php:598
-msgid "Contact"
-msgstr "Contact"
+#: src/Module/Item/Compose.php:192
+msgid ""
+"Location services are disabled. Please check the website's permissions on "
+"your device"
+msgstr ""
 
-#: src/Module/Contact.php:602
-#, php-format
+#: src/Module/Item/Compose.php:196
+msgid "Public"
+msgstr ""
+
+#: src/Module/Item/Compose.php:197
 msgid ""
-"Please choose the profile you would like to display to %s when viewing your "
-"profile securely."
-msgstr "Kies het profiel dat getoond moet worden wanneer %s je profiel bezoekt. "
+"This post will be sent to all your followers and can be seen in the "
+"community pages and by anyone with its link."
+msgstr ""
 
-#: src/Module/Contact.php:604
-msgid "Their personal note"
-msgstr "Hun persoonlijke nota"
+#: src/Module/Item/Compose.php:198
+msgid "Limited/Private"
+msgstr ""
 
-#: src/Module/Contact.php:606
-msgid "Edit contact notes"
-msgstr "Wijzig aantekeningen over dit contact"
+#: src/Module/Item/Compose.php:199
+msgid ""
+"This post will be sent only to the people in the first box, to the exception"
+" of the people mentioned in the second box. It won't appear anywhere public."
+msgstr ""
 
-#: src/Module/Contact.php:610
-msgid "Block/Unblock contact"
-msgstr "Blokkeer/deblokkeer contact"
+#: src/Module/Login.php:286
+msgid "Create a New Account"
+msgstr "Nieuwe account aanmaken"
 
-#: src/Module/Contact.php:611
-msgid "Ignore contact"
-msgstr "Negeer contact"
+#: src/Module/Login.php:319
+msgid "Password: "
+msgstr "Wachtwoord:"
 
-#: src/Module/Contact.php:612
-msgid "Repair URL settings"
-msgstr "Repareer URL-instellingen"
+#: src/Module/Login.php:320
+msgid "Remember me"
+msgstr "Onthou me"
 
-#: src/Module/Contact.php:613
-msgid "View conversations"
-msgstr "Toon gesprekken"
+#: src/Module/Login.php:323
+msgid "Or login using OpenID: "
+msgstr "Of log in met OpenID:"
 
-#: src/Module/Contact.php:618
-msgid "Last update:"
-msgstr "Laatste wijziging:"
+#: src/Module/Login.php:329
+msgid "Forgot your password?"
+msgstr "Wachtwoord vergeten?"
 
-#: src/Module/Contact.php:620
-msgid "Update public posts"
-msgstr "Openbare posts aanpassen"
+#: src/Module/Login.php:332
+msgid "Website Terms of Service"
+msgstr "Gebruikersvoorwaarden website"
 
-#: src/Module/Contact.php:622 src/Module/Contact.php:1073
-msgid "Update now"
-msgstr "Wijzig nu"
+#: src/Module/Login.php:333
+msgid "terms of service"
+msgstr "servicevoorwaarden"
 
-#: src/Module/Contact.php:628 src/Module/Contact.php:830
-#: src/Module/Contact.php:1090
-msgid "Unignore"
-msgstr "Negeer niet meer"
+#: src/Module/Login.php:335
+msgid "Website Privacy Policy"
+msgstr "Privacybeleid website"
 
-#: src/Module/Contact.php:632
-msgid "Currently blocked"
-msgstr "Op dit moment geblokkeerd"
+#: src/Module/Login.php:336
+msgid "privacy policy"
+msgstr "privacybeleid"
 
-#: src/Module/Contact.php:633
-msgid "Currently ignored"
-msgstr "Op dit moment genegeerd"
+#: src/Module/Logout.php:38
+msgid "Logged out."
+msgstr "Uitgelogd."
 
-#: src/Module/Contact.php:634
-msgid "Currently archived"
-msgstr "Op dit moment gearchiveerd"
+#: src/Module/Maintenance.php:29
+msgid "System down for maintenance"
+msgstr "Systeem onbeschikbaar wegens onderhoud"
 
-#: src/Module/Contact.php:635
-msgid "Awaiting connection acknowledge"
-msgstr "Wait op bevestiging van de connectie"
+#: src/Module/PageNotFound.php:13
+msgid "Page not found."
+msgstr "Pagina niet gevonden"
 
-#: src/Module/Contact.php:636
-msgid ""
-"Replies/likes to your public posts <strong>may</strong> still be visible"
-msgstr "Antwoorden of 'vind ik leuk's op je openbare posts <strong>kunnen</strong> nog zichtbaar zijn"
+#: src/Module/Photo.php:87
+#, php-format
+msgid "Invalid photo with id %s."
+msgstr ""
 
-#: src/Module/Contact.php:637
-msgid "Notification for new posts"
-msgstr "Meldingen voor nieuwe berichten"
+#: src/Module/Profile/Contacts.php:23 src/Module/Profile/Contacts.php:36
+msgid "User not found."
+msgstr ""
 
-#: src/Module/Contact.php:637
-msgid "Send a notification of every new post of this contact"
-msgstr "Stuur een notificatie voor elk bericht van dit contact"
+#: src/Module/Profile/Contacts.php:78
+msgid "No contacts."
+msgstr "Geen contacten."
 
-#: src/Module/Contact.php:640
-msgid "Blacklisted keywords"
-msgstr "Sleutelwoorden op de zwarte lijst"
+#: src/Module/Profile/Contacts.php:112
+#, php-format
+msgid "Follower (%s)"
+msgid_plural "Followers (%s)"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Module/Profile/Contacts.php:113
+#, php-format
+msgid "Following (%s)"
+msgid_plural "Following (%s)"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Module/Profile/Contacts.php:114
+#, php-format
+msgid "Mutual friend (%s)"
+msgid_plural "Mutual friends (%s)"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Module/Profile/Contacts.php:116
+#, php-format
+msgid "Contact (%s)"
+msgid_plural "Contacts (%s)"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Module/Profile/Contacts.php:125
+msgid "All contacts"
+msgstr ""
 
-#: src/Module/Contact.php:640
+#: 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 "Door komma's gescheiden lijst van sleutelwoorden die niet in hashtags mogen omgezet worden, wanneer \"Haal informatie en sleutelwoorden op\" is geselecteerd"
+"You may (optionally) fill in this form via OpenID by supplying your OpenID "
+"and clicking \"Register\"."
+msgstr ""
 
-#: src/Module/Contact.php:657
-msgid "Actions"
-msgstr "Acties"
+#: 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 "Laat dit veld leeg als je niet vertrouwd bent met OpenID, en vul de rest van de items in."
 
-#: src/Module/Contact.php:703
-msgid "Suggestions"
-msgstr "Voorstellen"
+#: src/Module/Register.php:85
+msgid "Your OpenID (optional): "
+msgstr "Je OpenID (optioneel):"
 
-#: src/Module/Contact.php:706
-msgid "Suggest potential friends"
-msgstr "Stel vrienden voor"
+#: src/Module/Register.php:94
+msgid "Include your profile in member directory?"
+msgstr "Je profiel in de ledengids opnemen?"
 
-#: src/Module/Contact.php:714
-msgid "Show all contacts"
-msgstr "Toon alle contacten"
+#: src/Module/Register.php:117
+msgid "Note for the admin"
+msgstr "Nota voor de beheerder"
 
-#: src/Module/Contact.php:719
-msgid "Unblocked"
-msgstr "Niet geblokkeerd"
+#: src/Module/Register.php:117
+msgid "Leave a message for the admin, why you want to join this node"
+msgstr "Laat een boodschap na voor de beheerder, waarom je bij deze node wil komen"
 
-#: src/Module/Contact.php:722
-msgid "Only show unblocked contacts"
-msgstr "Toon alleen niet-geblokkeerde contacten"
+#: src/Module/Register.php:118
+msgid "Membership on this site is by invitation only."
+msgstr "Lidmaatschap van deze website is uitsluitend op uitnodiging."
 
-#: src/Module/Contact.php:727
-msgid "Blocked"
-msgstr "Geblokkeerd"
+#: src/Module/Register.php:119
+msgid "Your invitation code: "
+msgstr "Je uitnodigingscode:"
 
-#: src/Module/Contact.php:730
-msgid "Only show blocked contacts"
-msgstr "Toon alleen geblokkeerde contacten"
+#: src/Module/Register.php:127
+msgid "Your Full Name (e.g. Joe Smith, real or real-looking): "
+msgstr "Je volledige naam (bvb. Jan Smit, echt of echt lijkend):"
 
-#: src/Module/Contact.php:735
-msgid "Ignored"
-msgstr "Genegeerd"
+#: src/Module/Register.php:128
+msgid ""
+"Your Email Address: (Initial information will be send there, so this has to "
+"be an existing address.)"
+msgstr "Je Email Adres: (Initiële informatie zal hier naartoe gezonden worden, dus dit moet een bestaand adres zijn.)"
 
-#: src/Module/Contact.php:738
-msgid "Only show ignored contacts"
-msgstr "Toon alleen genegeerde contacten"
+#: src/Module/Register.php:130
+msgid "Leave empty for an auto generated password."
+msgstr "Laat leeg voor een automatisch gegenereerd paswoord."
 
-#: src/Module/Contact.php:743
-msgid "Archived"
-msgstr "Gearchiveerd"
+#: 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:746
-msgid "Only show archived contacts"
-msgstr "Toon alleen gearchiveerde contacten"
+#: src/Module/Register.php:133
+msgid "Choose a nickname: "
+msgstr "Kies een bijnaam:"
 
-#: src/Module/Contact.php:751
-msgid "Hidden"
-msgstr "Verborgen"
+#: src/Module/Register.php:142
+msgid "Import your profile to this friendica instance"
+msgstr "Importeer je profiel op deze friendica server"
 
-#: src/Module/Contact.php:754
-msgid "Only show hidden contacts"
-msgstr "Toon alleen verborgen contacten"
+#: src/Module/Register.php:149
+msgid "Note: This node explicitly contains adult content"
+msgstr "Waarschuwing: Deze node heeft inhoud enkel bedoeld voor volwassenen."
 
-#: src/Module/Contact.php:762
-msgid "Organize your contact groups"
-msgstr "Organiseer je contact groepen"
+#: src/Module/Register.php:242
+msgid ""
+"Registration successful. Please check your email for further instructions."
+msgstr "Registratie geslaagd. Kijk je e-mail na voor verdere instructies."
 
-#: src/Module/Contact.php:820
-msgid "Search your contacts"
-msgstr "Doorzoek je contacten"
+#: src/Module/Register.php:246
+#, 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 "Kon email niet verzenden. Hier zijn je account details: <br> login: %s <br> paswoord: %s<br><br> Je kan je paswoord aanpassen nadat je ingelogd bent."
 
-#: src/Module/Contact.php:831 src/Module/Contact.php:1099
-msgid "Archive"
-msgstr "Archiveer"
+#: src/Module/Register.php:253
+msgid "Registration successful."
+msgstr "Registratie succes."
 
-#: src/Module/Contact.php:831 src/Module/Contact.php:1099
-msgid "Unarchive"
-msgstr "Archiveer niet meer"
+#: src/Module/Register.php:258
+msgid "Your registration can not be processed."
+msgstr "Je registratie kan niet verwerkt worden."
 
-#: src/Module/Contact.php:834
-msgid "Batch Actions"
-msgstr "Bulk Acties"
+#: src/Module/Register.php:304
+msgid "Your registration is pending approval by the site owner."
+msgstr "Jouw registratie wacht op goedkeuring van de beheerder."
 
-#: src/Module/Contact.php:861
-msgid "Conversations started by this contact"
-msgstr "Gesprekken gestart door dit contact"
+#: src/Module/Settings/TwoFactor/AppSpecific.php:36
+#: src/Module/Settings/TwoFactor/Recovery.php:34
+#: src/Module/Settings/TwoFactor/Verify.php:41
+msgid "Please enter your password to access this page."
+msgstr ""
 
-#: src/Module/Contact.php:866
-msgid "Posts and Comments"
-msgstr "Berichten en reacties"
+#: src/Module/Settings/TwoFactor/AppSpecific.php:54
+msgid "App-specific password generation failed: The description is empty."
+msgstr ""
 
-#: src/Module/Contact.php:889
-msgid "View all contacts"
-msgstr "Alle contacten zien"
+#: src/Module/Settings/TwoFactor/AppSpecific.php:57
+msgid ""
+"App-specific password generation failed: This description already exists."
+msgstr ""
 
-#: src/Module/Contact.php:900
-msgid "View all common friends"
-msgstr "Bekijk alle gemeenschappelijke vrienden"
+#: src/Module/Settings/TwoFactor/AppSpecific.php:61
+msgid "New app-specific password generated."
+msgstr ""
 
-#: src/Module/Contact.php:910
-msgid "Advanced Contact Settings"
-msgstr "Geavanceerde instellingen voor contacten"
+#: src/Module/Settings/TwoFactor/AppSpecific.php:67
+msgid "App-specific passwords successfully revoked."
+msgstr ""
 
-#: src/Module/Contact.php:996
-msgid "Mutual Friendship"
-msgstr "Wederzijdse vriendschap"
+#: src/Module/Settings/TwoFactor/AppSpecific.php:77
+msgid "App-specific password successfully revoked."
+msgstr ""
 
-#: src/Module/Contact.php:1001
-msgid "is a fan of yours"
-msgstr "Is een fan van jou"
+#: src/Module/Settings/TwoFactor/AppSpecific.php:98
+msgid "Two-factor app-specific passwords"
+msgstr ""
 
-#: src/Module/Contact.php:1006
-msgid "you are a fan of"
-msgstr "Jij bent een fan van"
+#: src/Module/Settings/TwoFactor/AppSpecific.php:100
+msgid ""
+"<p>App-specific passwords are randomly generated passwords used instead your"
+" regular password to authenticate your account on third-party applications "
+"that don't support two-factor authentication.</p>"
+msgstr ""
 
-#: src/Module/Contact.php:1030
-msgid "Edit contact"
-msgstr "Contact bewerken"
+#: src/Module/Settings/TwoFactor/AppSpecific.php:101
+msgid ""
+"Make sure to copy your new app-specific password now. You won’t be able to "
+"see it again!"
+msgstr ""
 
-#: src/Module/Contact.php:1084
-msgid "Toggle Blocked status"
-msgstr "Schakel geblokkeerde status"
+#: src/Module/Settings/TwoFactor/AppSpecific.php:104
+msgid "Description"
+msgstr ""
 
-#: src/Module/Contact.php:1092
-msgid "Toggle Ignored status"
-msgstr "Schakel negeerstatus"
+#: src/Module/Settings/TwoFactor/AppSpecific.php:105
+msgid "Last Used"
+msgstr ""
 
-#: src/Module/Contact.php:1101
-msgid "Toggle Archive status"
-msgstr "Schakel archiveringsstatus"
+#: src/Module/Settings/TwoFactor/AppSpecific.php:106
+msgid "Revoke"
+msgstr ""
 
-#: src/Module/Contact.php:1109
-msgid "Delete contact"
-msgstr "Verwijder contact"
+#: src/Module/Settings/TwoFactor/AppSpecific.php:107
+msgid "Revoke All"
+msgstr ""
 
-#: src/Module/Install.php:120
-msgid "Friendica Communications Server - Setup"
-msgstr "Friendica Communicatie Server - Setup"
+#: src/Module/Settings/TwoFactor/AppSpecific.php:110
+msgid ""
+"When you generate a new app-specific password, you must use it right away, "
+"it will be shown to you once after you generate it."
+msgstr ""
 
-#: src/Module/Install.php:131
-msgid "System check"
-msgstr "Systeemcontrole"
+#: src/Module/Settings/TwoFactor/AppSpecific.php:111
+msgid "Generate new app-specific password"
+msgstr ""
 
-#: src/Module/Install.php:136
-msgid "Check again"
-msgstr "Controleer opnieuw"
+#: src/Module/Settings/TwoFactor/AppSpecific.php:112
+msgid "Friendiqa on my Fairphone 2..."
+msgstr ""
 
-#: src/Module/Install.php:153
-msgid "Database connection"
-msgstr "Verbinding met database"
+#: src/Module/Settings/TwoFactor/AppSpecific.php:113
+msgid "Generate"
+msgstr ""
 
-#: src/Module/Install.php:154
-msgid ""
-"In order to install Friendica we need to know how to connect to your "
-"database."
-msgstr "Om Friendica te kunnen installeren moet ik weten hoe ik jouw database kan bereiken."
+#: src/Module/Settings/TwoFactor/Index.php:51
+msgid "Two-factor authentication successfully disabled."
+msgstr ""
 
-#: src/Module/Install.php:155
+#: src/Module/Settings/TwoFactor/Index.php:92
 msgid ""
-"Please contact your hosting provider or site administrator if you have "
-"questions about these settings."
-msgstr "Neem contact op met jouw hostingprovider of websitebeheerder, wanneer je vragen hebt over deze instellingen. "
+"<p>Use an application on a mobile device to get two-factor authentication "
+"codes when prompted on login.</p>"
+msgstr ""
 
-#: src/Module/Install.php:156
-msgid ""
-"The database you specify below should already exist. If it does not, please "
-"create it before continuing."
-msgstr "De database die je hier opgeeft zou al moeten bestaan. Maak anders de database aan voordat je verder gaat."
+#: src/Module/Settings/TwoFactor/Index.php:96
+msgid "Authenticator app"
+msgstr ""
 
-#: src/Module/Install.php:159
-msgid "Database Server Name"
-msgstr "Servernaam database"
+#: src/Module/Settings/TwoFactor/Index.php:97
+msgid "Configured"
+msgstr ""
 
-#: src/Module/Install.php:164
-msgid "Database Login Name"
-msgstr "Gebruikersnaam database"
+#: src/Module/Settings/TwoFactor/Index.php:97
+msgid "Not Configured"
+msgstr ""
 
-#: src/Module/Install.php:170
-msgid "Database Login Password"
-msgstr "Wachtwoord database"
+#: src/Module/Settings/TwoFactor/Index.php:98
+msgid "<p>You haven't finished configuring your authenticator app.</p>"
+msgstr ""
 
-#: src/Module/Install.php:172
-msgid "For security reasons the password must not be empty"
-msgstr "Om veiligheidsreden mag het paswoord niet leeg zijn"
+#: src/Module/Settings/TwoFactor/Index.php:99
+msgid "<p>Your authenticator app is correctly configured.</p>"
+msgstr ""
 
-#: src/Module/Install.php:175
-msgid "Database Name"
-msgstr "Naam database"
+#: src/Module/Settings/TwoFactor/Index.php:101
+msgid "Recovery codes"
+msgstr ""
 
-#: src/Module/Install.php:180 src/Module/Install.php:216
-msgid "Site administrator email address"
-msgstr "E-mailadres van de websitebeheerder"
+#: src/Module/Settings/TwoFactor/Index.php:102
+msgid "Remaining valid codes"
+msgstr ""
 
-#: src/Module/Install.php:182 src/Module/Install.php:216
+#: src/Module/Settings/TwoFactor/Index.php:104
 msgid ""
-"Your account email address must match this in order to use the web admin "
-"panel."
-msgstr "Het e-mailadres van je account moet hiermee overeenkomen om het administratiepaneel te kunnen gebruiken."
-
-#: src/Module/Install.php:186 src/Module/Install.php:217
-msgid "Please select a default timezone for your website"
-msgstr "Selecteer een standaard tijdzone voor je website"
+"<p>These one-use codes can replace an authenticator app code in case you "
+"have lost access to it.</p>"
+msgstr ""
 
-#: src/Module/Install.php:210
-msgid "Site settings"
-msgstr "Website-instellingen"
+#: src/Module/Settings/TwoFactor/Index.php:106
+msgid "App-specific passwords"
+msgstr ""
 
-#: src/Module/Install.php:219
-msgid "System Language:"
-msgstr "Systeem taal:"
+#: src/Module/Settings/TwoFactor/Index.php:107
+msgid "Generated app-specific passwords"
+msgstr ""
 
-#: src/Module/Install.php:221
+#: src/Module/Settings/TwoFactor/Index.php:109
 msgid ""
-"Set the default language for your Friendica installation interface and to "
-"send emails."
-msgstr "Stel de standaard taal in voor je Friendica installatie interface en emails."
-
-#: src/Module/Install.php:233
-msgid "Your Friendica site database has been installed."
-msgstr "De database van je Friendica-website is geïnstalleerd."
-
-#: src/Module/Install.php:241
-msgid "Installation finished"
-msgstr "Installaitie beëindigd"
+"<p>These randomly generated passwords allow you to authenticate on apps not "
+"supporting two-factor authentication.</p>"
+msgstr ""
 
-#: src/Module/Install.php:262
-msgid "<h1>What next</h1>"
-msgstr "<h1>Wat nu</h1>"
+#: src/Module/Settings/TwoFactor/Index.php:112
+msgid "Current password:"
+msgstr ""
 
-#: src/Module/Install.php:263
+#: src/Module/Settings/TwoFactor/Index.php:112
 msgid ""
-"IMPORTANT: You will need to [manually] setup a scheduled task for the "
-"worker."
-msgstr "BELANGRIJK: Je zal [manueel] een geplande taak moeten opzetten voor de worker."
+"You need to provide your current password to change two-factor "
+"authentication settings."
+msgstr ""
 
-#: src/Module/Install.php:266
-#, 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 "Go naar je nieuwe Friendica node <a href=\"%s/register\">registratie pagina</a> en registeer als nieuwe gebruiker. Vergeet niet hetzelfde email adres te gebruiken als wat je opgegeven hebt als administrator email. Dit zal je toelaten om het site administratie paneel te openen."
+#: src/Module/Settings/TwoFactor/Index.php:113
+msgid "Enable two-factor authentication"
+msgstr ""
 
-#: src/Module/Itemsource.php:33
-msgid "Item Guid"
-msgstr "Item identificatie"
+#: src/Module/Settings/TwoFactor/Index.php:114
+msgid "Disable two-factor authentication"
+msgstr ""
 
-#: src/Module/Login.php:292
-msgid "Create a New Account"
-msgstr "Nieuwe account aanmaken"
+#: src/Module/Settings/TwoFactor/Index.php:115
+msgid "Show recovery codes"
+msgstr ""
 
-#: src/Module/Login.php:325
-msgid "Password: "
-msgstr "Wachtwoord:"
+#: src/Module/Settings/TwoFactor/Index.php:116
+msgid "Manage app-specific passwords"
+msgstr ""
 
-#: src/Module/Login.php:326
-msgid "Remember me"
-msgstr "Onthou me"
+#: src/Module/Settings/TwoFactor/Index.php:117
+msgid "Finish app configuration"
+msgstr ""
 
-#: src/Module/Login.php:329
-msgid "Or login using OpenID: "
-msgstr "Of log in met OpenID:"
+#: src/Module/Settings/TwoFactor/Recovery.php:50
+msgid "New recovery codes successfully generated."
+msgstr ""
 
-#: src/Module/Login.php:335
-msgid "Forgot your password?"
-msgstr "Wachtwoord vergeten?"
+#: src/Module/Settings/TwoFactor/Recovery.php:76
+msgid "Two-factor recovery codes"
+msgstr ""
 
-#: src/Module/Login.php:338
-msgid "Website Terms of Service"
-msgstr "Gebruikersvoorwaarden website"
+#: src/Module/Settings/TwoFactor/Recovery.php:78
+msgid ""
+"<p>Recovery codes can be used to access your account in the event you lose "
+"access to your device and cannot receive two-factor authentication "
+"codes.</p><p><strong>Put these in a safe spot!</strong> If you lose your "
+"device and don’t have the recovery codes you will lose access to your "
+"account.</p>"
+msgstr ""
 
-#: src/Module/Login.php:339
-msgid "terms of service"
-msgstr "servicevoorwaarden"
+#: src/Module/Settings/TwoFactor/Recovery.php:80
+msgid ""
+"When you generate new recovery codes, you must copy the new codes. Your old "
+"codes won’t work anymore."
+msgstr ""
 
-#: src/Module/Login.php:341
-msgid "Website Privacy Policy"
-msgstr "Privacybeleid website"
+#: src/Module/Settings/TwoFactor/Recovery.php:81
+msgid "Generate new recovery codes"
+msgstr ""
 
-#: src/Module/Login.php:342
-msgid "privacy policy"
-msgstr "privacybeleid"
+#: src/Module/Settings/TwoFactor/Recovery.php:83
+msgid "Next: Verification"
+msgstr ""
 
-#: src/Module/Logout.php:29
-msgid "Logged out."
-msgstr "Uitgelogd."
+#: src/Module/Settings/TwoFactor/Verify.php:63
+msgid "Two-factor authentication successfully activated."
+msgstr ""
 
-#: src/Module/Proxy.php:136
-msgid "Bad Request."
-msgstr "Bad Request"
+#: src/Module/Settings/TwoFactor/Verify.php:67
+#: src/Module/TwoFactor/Recovery.php:46 src/Module/TwoFactor/Verify.php:43
+msgid "Invalid code, please retry."
+msgstr ""
 
-#: src/Module/Tos.php:35 src/Module/Tos.php:75
-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 "Op het moment van de registratie, en om communicatie mogelijk te maken tussen de gebruikersaccount en zijn of haar contacten, moet de gebruiker een weergave naam opgeven, een gebruikersnaam (bijnaam) en een werkend email adres. De namen zullen toegankelijk zijn op de profiel pagina van het account voor elke bezoeker van de pagina, zelfs als andere profiel details niet getoond worden. Het email adres zal enkel gebruikt worden om de gebruiker notificaties te sturen over interacties, maar zal niet zichtbaar getoond worden. Het oplijsten van een account in de gids van de node van de gebruiker of in de globale gids is optioneel en kan beheerd worden in de gebruikersinstellingen, dit is niet nodig voor communicatie."
+#: src/Module/Settings/TwoFactor/Verify.php:96
+#, php-format
+msgid ""
+"<p>Or you can submit the authentication settings manually:</p>\n"
+"<dl>\n"
+"\t<dt>Issuer</dt>\n"
+"\t<dd>%s</dd>\n"
+"\t<dt>Account Name</dt>\n"
+"\t<dd>%s</dd>\n"
+"\t<dt>Secret Key</dt>\n"
+"\t<dd>%s</dd>\n"
+"\t<dt>Type</dt>\n"
+"\t<dd>Time-based</dd>\n"
+"\t<dt>Number of digits</dt>\n"
+"\t<dd>6</dd>\n"
+"\t<dt>Hashing algorithm</dt>\n"
+"\t<dd>SHA-1</dd>\n"
+"</dl>"
+msgstr ""
 
-#: src/Module/Tos.php:36 src/Module/Tos.php:76
+#: src/Module/Settings/TwoFactor/Verify.php:116
+msgid "Two-factor code verification"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/Verify.php:118
 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 "Deze data is vereist voor communicatie en wordt doorgegeven aan de nodes van de communicatie partners en wordt daar opgeslagen. Gebruikers kunnen bijkomende privé data opgeven die mag doorgegeven worden aan de accounts van de communicatie partners."
+"<p>Please scan this QR Code with your authenticator app and submit the "
+"provided code.</p>"
+msgstr ""
 
-#: src/Module/Tos.php:37 src/Module/Tos.php:77
+#: src/Module/Settings/TwoFactor/Verify.php:120
 #, 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 "Een ingelogd gebruiker kan op elk moment zijn of haar account data exporteren via <a href=\"%1$s/settings/uexport\">account instellingen</a>. Een gebruiker kan ook zijn of haar account verwijderen via <a href=\"%1$s/removeme\">%1$s/removeme</a>. De verwijdering van het account is permanent. Ook zal aan andere nodes van communicatie partners gevraagd worden om de data te verwijderen."
+"<p>Or you can open the following URL in your mobile devicde:</p><p><a "
+"href=\"%s\">%s</a></p>"
+msgstr ""
 
-#: src/Module/Tos.php:40 src/Module/Tos.php:74
-msgid "Privacy Statement"
-msgstr "Privacy Verklaring"
+#: src/Module/Settings/TwoFactor/Verify.php:126
+#: src/Module/TwoFactor/Verify.php:67
+msgid "Please enter a code from your authentication app"
+msgstr ""
 
-#: src/Object/Post.php:134
-msgid "This entry was edited"
-msgstr "Deze entry werd bewerkt"
+#: src/Module/Settings/TwoFactor/Verify.php:127
+msgid "Verify code and enable two-factor authentication"
+msgstr ""
 
-#: src/Object/Post.php:197
-msgid "Delete locally"
-msgstr "Verwijder lokaal"
+#: src/Module/Special/HTTPException.php:32
+msgid "Bad Request"
+msgstr "Bad Request"
 
-#: src/Object/Post.php:200
-msgid "Delete globally"
-msgstr "Verwijder globaal"
+#: src/Module/Special/HTTPException.php:33
+msgid "Unauthorized"
+msgstr ""
 
-#: src/Object/Post.php:200
-msgid "Remove locally"
-msgstr "Verwijder lokaal"
+#: src/Module/Special/HTTPException.php:34
+msgid "Forbidden"
+msgstr ""
 
-#: src/Object/Post.php:214
-msgid "save to folder"
-msgstr "Bewaren in map"
+#: src/Module/Special/HTTPException.php:35
+msgid "Not Found"
+msgstr "Niet gevonden"
 
-#: src/Object/Post.php:249
-msgid "I will attend"
-msgstr "Ik zal er zijn"
+#: src/Module/Special/HTTPException.php:36
+msgid "Internal Server Error"
+msgstr ""
 
-#: src/Object/Post.php:249
-msgid "I will not attend"
-msgstr "Ik zal er niet zijn"
+#: src/Module/Special/HTTPException.php:37
+msgid "Service Unavailable"
+msgstr ""
 
-#: src/Object/Post.php:249
-msgid "I might attend"
-msgstr "Ik ga misschien"
+#: src/Module/Special/HTTPException.php:44
+msgid ""
+"The server cannot or will not process the request due to an apparent client "
+"error."
+msgstr ""
 
-#: src/Object/Post.php:277
-msgid "ignore thread"
-msgstr "Negeer gesprek"
+#: src/Module/Special/HTTPException.php:45
+msgid ""
+"Authentication is required and has failed or has not yet been provided."
+msgstr ""
 
-#: src/Object/Post.php:278
-msgid "unignore thread"
-msgstr "Stop met gesprek te negeren"
+#: src/Module/Special/HTTPException.php:46
+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/Object/Post.php:279
-msgid "toggle ignore status"
-msgstr "verwissel negeer status"
+#: src/Module/Special/HTTPException.php:47
+msgid ""
+"The requested resource could not be found but may be available in the "
+"future."
+msgstr ""
 
-#: src/Object/Post.php:290
-msgid "add star"
-msgstr "ster toevoegen"
+#: src/Module/Special/HTTPException.php:48
+msgid ""
+"An unexpected condition was encountered and no more specific message is "
+"suitable."
+msgstr ""
 
-#: src/Object/Post.php:291
-msgid "remove star"
-msgstr "ster verwijderen"
+#: src/Module/Special/HTTPException.php:49
+msgid ""
+"The server is currently unavailable (because it is overloaded or down for "
+"maintenance). Please try again later."
+msgstr ""
 
-#: src/Object/Post.php:292
-msgid "toggle star status"
-msgstr "ster toevoegen of verwijderen"
+#: src/Module/Special/HTTPException.php:55
+msgid "Go back"
+msgstr ""
 
-#: src/Object/Post.php:295
-msgid "starred"
-msgstr "met ster"
+#: src/Module/TwoFactor/Recovery.php:41
+#, php-format
+msgid "Remaining recovery codes: %d"
+msgstr ""
 
-#: src/Object/Post.php:299
-msgid "add tag"
-msgstr "label toevoegen"
+#: src/Module/TwoFactor/Recovery.php:65
+msgid "Two-factor recovery"
+msgstr ""
 
-#: src/Object/Post.php:310
-msgid "like"
-msgstr "leuk"
+#: src/Module/TwoFactor/Recovery.php:66
+msgid ""
+"<p>You can enter one of your one-time recovery codes in case you lost access"
+" to your mobile device.</p>"
+msgstr ""
 
-#: src/Object/Post.php:311
-msgid "dislike"
-msgstr "niet leuk"
+#: src/Module/TwoFactor/Recovery.php:67 src/Module/TwoFactor/Verify.php:66
+#, php-format
+msgid "Don’t have your phone? <a href=\"%s\">Enter a two-factor recovery code</a>"
+msgstr ""
 
-#: src/Object/Post.php:314
-msgid "Share this"
-msgstr "Delen"
+#: src/Module/TwoFactor/Recovery.php:68
+msgid "Please enter a recovery code"
+msgstr ""
 
-#: src/Object/Post.php:314
-msgid "share"
-msgstr "Delen"
+#: src/Module/TwoFactor/Recovery.php:69
+msgid "Submit recovery code and complete login"
+msgstr ""
 
-#: src/Object/Post.php:381
-msgid "to"
-msgstr "aan"
+#: src/Module/TwoFactor/Verify.php:63
+msgid ""
+"<p>Open the two-factor authentication app on your device to get an "
+"authentication code and verify your identity.</p>"
+msgstr ""
 
-#: src/Object/Post.php:382
-msgid "via"
-msgstr "via"
+#: src/Module/TwoFactor/Verify.php:68
+msgid "Verify code and complete login"
+msgstr ""
 
-#: src/Object/Post.php:383
-msgid "Wall-to-Wall"
-msgstr "wall-to-wall"
+#: src/Module/Welcome.php:25
+msgid "Welcome to Friendica"
+msgstr "Welkom bij Friendica"
 
-#: src/Object/Post.php:384
-msgid "via Wall-To-Wall:"
-msgstr "via wall-to-wall"
+#: src/Module/Welcome.php:26
+msgid "New Member Checklist"
+msgstr "Checklist voor nieuwe leden"
 
-#: src/Object/Post.php:444
-#, php-format
-msgid "%d comment"
-msgid_plural "%d comments"
-msgstr[0] "%d reactie"
-msgstr[1] "%d reacties"
+#: src/Module/Welcome.php:27
+msgid ""
+"We would like to offer some tips and links to help make your experience "
+"enjoyable. Click any item to visit the relevant page. A link to this page "
+"will be visible from your home page for two weeks after your initial "
+"registration and then will quietly disappear."
+msgstr "We willen je een paar tips en verwijzingen aanreiken om je een aangename ervaring te bezorgen. Klik op een item om de relevante pagina's te bezoeken. Een verwijzing naar deze pagina zal twee weken lang na je registratie zichtbaar zijn op je tijdlijn. Daarna zal de verwijzing stilletjes verdwijnen."
 
-#: src/Protocol/Diaspora.php:2434
-msgid "Sharing notification from Diaspora network"
-msgstr "Deelt notificatie van het Diaspora netwerk"
+#: src/Module/Welcome.php:29
+msgid "Getting Started"
+msgstr "Aan de slag"
 
-#: src/Protocol/Diaspora.php:3528
-msgid "Attachments:"
-msgstr "Bijlagen:"
+#: src/Module/Welcome.php:30
+msgid "Friendica Walk-Through"
+msgstr "Doorloop Friendica"
 
-#: src/Protocol/OStatus.php:1839
-#, php-format
-msgid "%s is now following %s."
-msgstr "%s volgt nu %s."
+#: src/Module/Welcome.php:31
+msgid ""
+"On your <em>Quick Start</em> page - find a brief introduction to your "
+"profile and network tabs, make some new connections, and find some groups to"
+" join."
+msgstr "Op je <em>Snelstart</em> pagina kun je een korte inleiding vinden over je profiel en netwerk tabs, om enkele nieuwe connecties te leggen en groepen te vinden om lid van te worden."
 
-#: src/Protocol/OStatus.php:1840
-msgid "following"
-msgstr "volgend"
+#: src/Module/Welcome.php:34
+msgid "Go to Your Settings"
+msgstr "Ga naar je instellingen"
 
-#: src/Protocol/OStatus.php:1843
-#, php-format
-msgid "%s stopped following %s."
-msgstr "%s stopte %s te volgen."
+#: src/Module/Welcome.php:35
+msgid ""
+"On your <em>Settings</em> page -  change your initial password. Also make a "
+"note of your Identity Address. This looks just like an email address - and "
+"will be useful in making friends on the free social web."
+msgstr "Verander je initieel wachtwoord op je <em>instellingenpagina</em>. Noteer ook het adres van je identiteit. Dit ziet er uit als een e-mailadres - en zal nuttig zijn om vrienden te maken op het vrije sociale web."
 
-#: src/Protocol/OStatus.php:1844
-msgid "stopped following"
-msgstr "is gestopt met volgen"
+#: src/Module/Welcome.php:36
+msgid ""
+"Review the other settings, particularly the privacy settings. An unpublished"
+" directory listing is like having an unlisted phone number. In general, you "
+"should probably publish your listing - unless all of your friends and "
+"potential friends know exactly how to find you."
+msgstr "Controleer ook de andere instellingen, in het bijzonder de privacy-instellingen. Een niet-gepubliceerd adres is zoals een privé-telefoonnummer. In het algemeen wil je waarschijnlijk je adres publiceren - tenzij al je vrienden en mogelijke vrienden precies weten hoe je te vinden."
 
-#: src/Util/Temporal.php:153
-msgid "YYYY-MM-DD or MM-DD"
-msgstr "JJJJ-MM-DD of MM-DD"
+#: src/Module/Welcome.php:40
+msgid ""
+"Upload a profile photo if you have not done so already. Studies have shown "
+"that people with real photos of themselves are ten times more likely to make"
+" friends than people who do not."
+msgstr "Upload een profielfoto, als je dat nog niet gedaan hebt. Studies tonen aan dat mensen met echte foto's van zichzelf tien keer gemakkelijker vrienden maken dan mensen die dat niet doen."
 
-#: src/Util/Temporal.php:296
-msgid "never"
-msgstr "nooit"
+#: src/Module/Welcome.php:41
+msgid "Edit Your Profile"
+msgstr "Bewerk je profiel"
 
-#: src/Util/Temporal.php:303
-msgid "less than a second ago"
-msgstr "minder dan een seconde geleden"
+#: src/Module/Welcome.php:42
+msgid ""
+"Edit your <strong>default</strong> profile to your liking. Review the "
+"settings for hiding your list of friends and hiding the profile from unknown"
+" visitors."
+msgstr "Bewerk je <strong>standaard</strong> profiel zoals je wilt. Controleer de instellingen om je vriendenlijst te verbergen, en om je profiel voor ongekende bezoekers te verbergen."
 
-#: src/Util/Temporal.php:311
-msgid "year"
-msgstr "jaar"
+#: src/Module/Welcome.php:43
+msgid "Profile Keywords"
+msgstr "Sleutelwoorden voor dit profiel"
 
-#: src/Util/Temporal.php:311
-msgid "years"
-msgstr "jaren"
+#: src/Module/Welcome.php:44
+msgid ""
+"Set some public keywords for your default profile which describe your "
+"interests. We may be able to find other people with similar interests and "
+"suggest friendships."
+msgstr "Stel enkele openbare sleutelwoorden in voor je standaard profiel die je interesses beschrijven. We kunnen dan misschien mensen vinden met gelijkaardige interesses, en vrienden voorstellen."
 
-#: src/Util/Temporal.php:312
-msgid "months"
-msgstr "maanden"
+#: src/Module/Welcome.php:46
+msgid "Connecting"
+msgstr "Verbinding aan het maken"
 
-#: src/Util/Temporal.php:313
-msgid "weeks"
-msgstr "weken"
+#: src/Module/Welcome.php:48
+msgid "Importing Emails"
+msgstr "E-mails importeren"
 
-#: src/Util/Temporal.php:314
-msgid "days"
-msgstr "dagen"
+#: src/Module/Welcome.php:49
+msgid ""
+"Enter your email access information on your Connector Settings page if you "
+"wish to import and interact with friends or mailing lists from your email "
+"INBOX"
+msgstr "Vul je e-mailtoegangsinformatie in op je pagina met verbindingsinstellingen als je vrienden of mailinglijsten uit je e-mail-inbox wilt importeren, en met hen wilt communiceren"
 
-#: src/Util/Temporal.php:315
-msgid "hour"
-msgstr "uur"
+#: src/Module/Welcome.php:50
+msgid "Go to Your Contacts Page"
+msgstr "Ga naar je contactenpagina"
 
-#: src/Util/Temporal.php:315
-msgid "hours"
-msgstr "uren"
+#: src/Module/Welcome.php:51
+msgid ""
+"Your Contacts page is your gateway to managing friendships and connecting "
+"with friends on other networks. Typically you enter their address or site "
+"URL in the <em>Add New Contact</em> dialog."
+msgstr "Je contactenpagina is jouw poort om vriendschappen te beheren en verbinding te leggen met vrienden op andere netwerken. Je kunt hun adres of URL toevoegen in de <em>Voeg nieuw contact toe</em> dialoog."
 
-#: src/Util/Temporal.php:316
-msgid "minute"
-msgstr "minuut"
+#: src/Module/Welcome.php:52
+msgid "Go to Your Site's Directory"
+msgstr "Ga naar de gids van je website"
 
-#: src/Util/Temporal.php:316
-msgid "minutes"
-msgstr "minuten"
+#: src/Module/Welcome.php:53
+msgid ""
+"The Directory page lets you find other people in this network or other "
+"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
+"their profile page. Provide your own Identity Address if requested."
+msgstr "In de gids vind je andere mensen in dit netwerk of op andere federatieve sites. Zoek naar het woord <em>Connect</em> of <em>Follow</em> op hun profielpagina (meestal aan de linkerkant). Vul je eigen identiteitsadres in wanneer daar om wordt gevraagd."
+
+#: src/Module/Welcome.php:54
+msgid "Finding New People"
+msgstr "Nieuwe mensen vinden"
+
+#: src/Module/Welcome.php:55
+msgid ""
+"On the side panel of the Contacts page are several tools to find new "
+"friends. We can match people by interest, look up people by name or "
+"interest, and provide suggestions based on network relationships. On a brand"
+" new site, friend suggestions will usually begin to be populated within 24 "
+"hours."
+msgstr "Op het zijpaneel van de Contacten pagina vind je verschillende tools om nieuwe vrienden te zoeken. We kunnen mensen op interesses matchen, mensen opzoeken op naam of hobby, en suggesties doen gebaseerd op netwerk-relaties. Op een nieuwe webstek beginnen vriendschapssuggesties meestal binnen de 24 uur beschikbaar te worden."
+
+#: src/Module/Welcome.php:58
+msgid "Group Your Contacts"
+msgstr "Groepeer je contacten"
+
+#: src/Module/Welcome.php:59
+msgid ""
+"Once you have made some friends, organize them into private conversation "
+"groups from the sidebar of your Contacts page and then you can interact with"
+" each group privately on your Network page."
+msgstr "Als je een aantal vrienden gemaakt hebt kun je ze in je eigen gespreksgroepen indelen vanuit de zijbalk van je 'Contacten' pagina, en dan kun je met elke groep apart contact houden op je Netwerk pagina. "
+
+#: src/Module/Welcome.php:61
+msgid "Why Aren't My Posts Public?"
+msgstr "Waarom zijn mijn berichten niet openbaar?"
+
+#: src/Module/Welcome.php:62
+msgid ""
+"Friendica respects your privacy. By default, your posts will only show up to"
+" people you've added as friends. For more information, see the help section "
+"from the link above."
+msgstr "Friendica respecteert je privacy. Standaard zullen je berichten alleen zichtbaar zijn voor personen die jij als vriend hebt toegevoegd. Lees de help (zie de verwijzing hierboven) voor meer informatie."
 
-#: src/Util/Temporal.php:317
-msgid "second"
-msgstr "seconde"
+#: src/Module/Welcome.php:64
+msgid "Getting Help"
+msgstr "Hulp krijgen"
 
-#: src/Util/Temporal.php:317
-msgid "seconds"
-msgstr "seconden"
+#: src/Module/Welcome.php:65
+msgid "Go to the Help Section"
+msgstr "Ga naar de help"
 
-#: src/Util/Temporal.php:327
-#, php-format
-msgid "in %1$d %2$s"
-msgstr "in %1$d%2$s"
+#: src/Module/Welcome.php:66
+msgid ""
+"Our <strong>help</strong> pages may be consulted for detail on other program"
+" features and resources."
+msgstr "Je kunt onze <strong>help</strong> pagina's raadplegen voor gedetailleerde informatie over andere functies van dit programma."
 
-#: src/Util/Temporal.php:330
-#, php-format
-msgid "%1$d %2$s ago"
-msgstr "%1$d %2$s geleden"
+#: src/Object/Post.php:138
+msgid "This entry was edited"
+msgstr "Deze entry werd bewerkt"
 
-#: src/Worker/Delivery.php:433
-msgid "(no subject)"
-msgstr "(geen onderwerp)"
+#: src/Object/Post.php:158
+msgid "Private Message"
+msgstr "Privébericht"
 
-#: update.php:195
-#, php-format
-msgid "%s: Updating author-id and owner-id in item and thread table. "
-msgstr "%s: author-id en owner-id in item en gesprekstabel aan het updaten."
+#: src/Object/Post.php:200
+msgid "Delete locally"
+msgstr "Verwijder lokaal"
 
-#: update.php:241
-#, php-format
-msgid "%s: Updating post-type."
-msgstr "%s: bericht-type bewerken"
+#: src/Object/Post.php:203
+msgid "Delete globally"
+msgstr "Verwijder globaal"
 
-#: view/theme/duepuntozero/config.php:56
-msgid "greenzero"
-msgstr "greenzero"
+#: src/Object/Post.php:203
+msgid "Remove locally"
+msgstr "Verwijder lokaal"
 
-#: view/theme/duepuntozero/config.php:57
-msgid "purplezero"
-msgstr "purplezero"
+#: src/Object/Post.php:217
+msgid "save to folder"
+msgstr "Bewaren in map"
 
-#: view/theme/duepuntozero/config.php:58
-msgid "easterbunny"
-msgstr "easterbunny"
+#: src/Object/Post.php:252
+msgid "I will attend"
+msgstr "Ik zal er zijn"
 
-#: view/theme/duepuntozero/config.php:59
-msgid "darkzero"
-msgstr "darkzero"
+#: src/Object/Post.php:252
+msgid "I will not attend"
+msgstr "Ik zal er niet zijn"
 
-#: view/theme/duepuntozero/config.php:60
-msgid "comix"
-msgstr "comix"
+#: src/Object/Post.php:252
+msgid "I might attend"
+msgstr "Ik ga misschien"
 
-#: view/theme/duepuntozero/config.php:61
-msgid "slackr"
-msgstr "slackr"
+#: src/Object/Post.php:280
+msgid "ignore thread"
+msgstr "Negeer gesprek"
 
-#: view/theme/duepuntozero/config.php:75
-msgid "Variations"
-msgstr "Variaties"
+#: src/Object/Post.php:281
+msgid "unignore thread"
+msgstr "Stop met gesprek te negeren"
 
-#: view/theme/frio/config.php:103
-msgid "Custom"
-msgstr "Aangepast"
+#: src/Object/Post.php:282
+msgid "toggle ignore status"
+msgstr "verwissel negeer status"
 
-#: view/theme/frio/config.php:115
-msgid "Note"
-msgstr "Nota"
+#: src/Object/Post.php:293
+msgid "add star"
+msgstr "ster toevoegen"
 
-#: view/theme/frio/config.php:115
-msgid "Check image permissions if all users are allowed to see the image"
-msgstr "Controleer of alle gebruikers permissie hebben om het beeld te zien "
+#: src/Object/Post.php:294
+msgid "remove star"
+msgstr "ster verwijderen"
 
-#: view/theme/frio/config.php:122
-msgid "Select color scheme"
-msgstr "Selecteer kleurschema"
+#: src/Object/Post.php:295
+msgid "toggle star status"
+msgstr "ster toevoegen of verwijderen"
 
-#: view/theme/frio/config.php:123
-msgid "Navigation bar background color"
-msgstr "Navigatie balk achtergrondkleur"
+#: src/Object/Post.php:298
+msgid "starred"
+msgstr "met ster"
 
-#: view/theme/frio/config.php:124
-msgid "Navigation bar icon color "
-msgstr "Navigatie balk icoon kleur"
+#: src/Object/Post.php:302
+msgid "add tag"
+msgstr "label toevoegen"
 
-#: view/theme/frio/config.php:125
-msgid "Link color"
-msgstr "Link kleur"
+#: src/Object/Post.php:313
+msgid "like"
+msgstr "leuk"
 
-#: view/theme/frio/config.php:126
-msgid "Set the background color"
-msgstr "Stel de achtergrondkleur in"
+#: src/Object/Post.php:314
+msgid "dislike"
+msgstr "niet leuk"
 
-#: view/theme/frio/config.php:127
-msgid "Content background opacity"
-msgstr "Content achtergrond opaciteit"
+#: src/Object/Post.php:317
+msgid "Share this"
+msgstr "Delen"
 
-#: view/theme/frio/config.php:128
-msgid "Set the background image"
-msgstr "Stel het achtergrondbeeld in"
+#: src/Object/Post.php:317
+msgid "share"
+msgstr "Delen"
 
-#: view/theme/frio/config.php:129
-msgid "Background image style"
-msgstr "Achtergrond beeld stijl"
+#: src/Object/Post.php:385
+msgid "to"
+msgstr "aan"
 
-#: view/theme/frio/config.php:134
-msgid "Login page background image"
-msgstr "Achtergrondafbeelding aanmeldpagina"
+#: src/Object/Post.php:386
+msgid "via"
+msgstr "via"
 
-#: view/theme/frio/config.php:138
-msgid "Login page background color"
-msgstr "Achtergrondkleur aanmeldpagina"
+#: src/Object/Post.php:387
+msgid "Wall-to-Wall"
+msgstr "wall-to-wall"
 
-#: view/theme/frio/config.php:138
-msgid "Leave background image and color empty for theme defaults"
-msgstr "Laat de achtergrondafbeelding en kleur leeg om de standaard van het thema te gebruiken"
+#: src/Object/Post.php:388
+msgid "via Wall-To-Wall:"
+msgstr "via wall-to-wall"
 
-#: view/theme/frio/php/Image.php:24
-msgid "Top Banner"
-msgstr "Banner Bovenaan"
+#: src/Object/Post.php:421
+#, php-format
+msgid "Reply to %s"
+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 "Pas het beeld aan aan de breedte van het scherm en toon achtergrondkleur onder lange pagina's"
+#: src/Object/Post.php:436
+msgid "Notifier task is pending"
+msgstr ""
 
-#: view/theme/frio/php/Image.php:25
-msgid "Full screen"
-msgstr "Volledig scherm"
+#: src/Object/Post.php:437
+msgid "Delivery to remote servers is pending"
+msgstr ""
 
-#: view/theme/frio/php/Image.php:25
-msgid ""
-"Resize image to fill entire screen, clipping either the right or the bottom."
-msgstr "Pas het beeld aan om het hele scherm te vullen, met ofwel de rechter- of de onderkant afgeknipt."
+#: src/Object/Post.php:438
+msgid "Delivery to remote servers is underway"
+msgstr ""
 
-#: view/theme/frio/php/Image.php:26
-msgid "Single row mosaic"
-msgstr "Enkele rij mozaïek"
+#: src/Object/Post.php:439
+msgid "Delivery to remote servers is mostly done"
+msgstr ""
 
-#: view/theme/frio/php/Image.php:26
-msgid ""
-"Resize image to repeat it on a single row, either vertical or horizontal."
-msgstr "Pas het beeld aan zodat het herhaald wordt op een enkele rij, ofwel vertikaal ofwel horizontaal"
+#: src/Object/Post.php:440
+msgid "Delivery to remote servers is done"
+msgstr ""
 
-#: view/theme/frio/php/Image.php:27
-msgid "Mosaic"
-msgstr "Mozaïek"
+#: src/Object/Post.php:460
+#, php-format
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] "%d reactie"
+msgstr[1] "%d reacties"
 
-#: view/theme/frio/php/Image.php:27
-msgid "Repeat image to fill the screen."
-msgstr "Herhaal beeld om het scherm te vullen."
+#: src/Object/Post.php:461
+msgid "Show more"
+msgstr ""
 
-#: view/theme/frio/theme.php:252
-msgid "Guest"
-msgstr "Gast"
+#: src/Object/Post.php:462
+msgid "Show fewer"
+msgstr ""
 
-#: view/theme/frio/theme.php:257
-msgid "Visitor"
-msgstr "Bezoeker"
+#: src/LegacyModule.php:30
+#, php-format
+msgid "Legacy module file not found: %s"
+msgstr "Legacy module bestand niet gevonden: %s"
 
-#: view/theme/quattro/config.php:77
-msgid "Alignment"
-msgstr "Uitlijning"
+#: src/App.php:505
+msgid "Delete this item?"
+msgstr "Dit item verwijderen?"
 
-#: view/theme/quattro/config.php:77
-msgid "Left"
-msgstr "Links"
+#: src/App.php:547
+msgid "toggle mobile"
+msgstr "mobiel thema omwisselen"
 
-#: view/theme/quattro/config.php:77
-msgid "Center"
-msgstr "Gecentreerd"
+#: src/App.php:863
+msgid "No system theme config value set."
+msgstr "Geen systeem thema configuratie ingesteld."
 
-#: view/theme/quattro/config.php:78
-msgid "Color scheme"
-msgstr "Kleurschema"
+#: src/App.php:1151
+msgid "You must be logged in to use addons. "
+msgstr "Je moet ingelogd zijn om deze addons te kunnen gebruiken. "
 
-#: view/theme/quattro/config.php:79
-msgid "Posts font size"
-msgstr "Lettergrootte berichten"
+#: src/BaseModule.php:135
+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 "De beveiligingstoken van het formulier was foutief. Dit gebeurde waarschijnlijk omdat het formulier te lang (> 3 uur)  is blijven open staan voor het werd verstuurd."
 
-#: view/theme/quattro/config.php:80
-msgid "Textareas font size"
-msgstr "Lettergrootte tekstgebieden"
+#: src/Console/ArchiveContact.php:86
+#, php-format
+msgid "Could not find any unarchived contact entry for this URL (%s)"
+msgstr "Kon geen niet-gearchiveerde contacten vinden voor deze URL (%s)"
 
-#: view/theme/vier/config.php:76
-msgid "Comma separated list of helper forums"
-msgstr "Kommagescheiden lijst van de helper forums"
+#: src/Console/ArchiveContact.php:89
+msgid "The contact entries have been archived"
+msgstr "The contacten zijn gearchiveerd"
 
-#: view/theme/vier/config.php:123
-msgid "Set style"
-msgstr "Stijl instellen"
+#: src/Console/NewPassword.php:93
+msgid "Enter new password: "
+msgstr "Geef nieuw paswoord:"
 
-#: view/theme/vier/config.php:124
-msgid "Community Pages"
-msgstr "Forum/groepspagina's"
+#: src/Console/PostUpdate.php:73
+#, php-format
+msgid "Post update version number has been set to %s."
+msgstr "Bericht update versie is ingesteld op %s"
 
-#: view/theme/vier/config.php:125 view/theme/vier/theme.php:151
-msgid "Community Profiles"
-msgstr "Forum/groepsprofielen"
+#: src/Console/PostUpdate.php:81
+msgid "Check for pending update actions."
+msgstr "Controleren op uitgestelde update acties."
 
-#: view/theme/vier/config.php:126
-msgid "Help or @NewHere ?"
-msgstr "Help of @NewHere ?"
+#: src/Console/PostUpdate.php:83
+msgid "Done."
+msgstr "Gedaan"
 
-#: view/theme/vier/config.php:127 view/theme/vier/theme.php:388
-msgid "Connect Services"
-msgstr "Diensten verbinden"
+#: src/Console/PostUpdate.php:85
+msgid "Execute pending post updates."
+msgstr "uitgestelde bericht update acties uitvoeren"
 
-#: view/theme/vier/config.php:128
-msgid "Find Friends"
-msgstr "Zoek vrienden"
+#: src/Console/PostUpdate.php:91
+msgid "All pending post updates are done."
+msgstr "Alle uitgestelde bericht update acties zijn uitgevoerd"
 
-#: view/theme/vier/config.php:129 view/theme/vier/theme.php:181
-msgid "Last users"
-msgstr "Laatste gebruikers"
+#: update.php:218
+#, php-format
+msgid "%s: Updating author-id and owner-id in item and thread table. "
+msgstr "%s: author-id en owner-id in item en gesprekstabel aan het updaten."
 
-#: view/theme/vier/theme.php:291
-msgid "Quick Start"
-msgstr "Snelstart"
+#: update.php:273
+#, php-format
+msgid "%s: Updating post-type."
+msgstr "%s: bericht-type bewerken"
index a698291dfe37c398b895cbe030cff4ee03df5098..56d4439c638f12aec6af59ba7f29fe6d6562727a 100644 (file)
@@ -6,6 +6,69 @@ function string_plural_select_nl($n){
        return ($n != 1);;
 }}
 ;
+$a->strings["Friendica Notification"] = "Friendica Notificatie";
+$a->strings["Thank You,"] = "Bedankt";
+$a->strings["%1\$s, %2\$s Administrator"] = "%1\$s, %2\$s Beheerder";
+$a->strings["%s Administrator"] = "%s Beheerder";
+$a->strings["[Friendica:Notify] New mail received at %s"] = "[Friendica:Notificatie] Nieuw bericht ontvangen op %s";
+$a->strings["%1\$s sent you a new private message at %2\$s."] = "%1\$s sent you a new private message at %2\$s.";
+$a->strings["a private message"] = "een prive bericht";
+$a->strings["%1\$s sent you %2\$s."] = "%1\$s stuurde jou %2\$s.";
+$a->strings["Please visit %s to view and/or reply to your private messages."] = "Bezoek %s om je privé-berichten te bekijken en/of te beantwoorden.";
+$a->strings["%1\$s tagged you on [url=%2\$s]a %3\$s[/url]"] = "%1\$s heeft je getagd op [url=%2\$s]een %3\$s[/url]";
+$a->strings["%1\$s commented on [url=%2\$s]a %3\$s[/url]"] = "%1\$s gaf een reactie op [url=%2\$s]a %3\$s[/url]";
+$a->strings["%1\$s tagged you on [url=%2\$s]%3\$s's %4\$s[/url]"] = "%1\$s heeft je getagd op [url=%2\$s]%3\$s's %4\$s[/url]";
+$a->strings["%1\$s commented on [url=%2\$s]%3\$s's %4\$s[/url]"] = "%1\$s gaf een reactie op [url=%2\$s]%3\$s's %4\$s[/url]";
+$a->strings["%1\$s tagged you on [url=%2\$s]your %3\$s[/url]"] = "%1\$s heeft je getagd op [url=%2\$s]jouw %3\$s[/url]";
+$a->strings["%1\$s commented on [url=%2\$s]your %3\$s[/url]"] = "%1\$s gaf een reactie op [url=%2\$s]jouw %3\$s[/url]";
+$a->strings["%1\$s tagged you on [url=%2\$s]their %3\$s[/url]"] = "%1\$s heeft je getagd op [url=%2\$s]zijn %3\$s[/url]";
+$a->strings["%1\$s commented on [url=%2\$s]their %3\$s[/url]"] = "%1\$s heeft gereageerd op [url=%2\$s]zijn %3\$s[/url]";
+$a->strings["[Friendica:Notify] %s tagged you"] = "[Friendica:Notificatie] %s heeft jou genoemd";
+$a->strings["%1\$s tagged you at %2\$s"] = "%1\$s heeft jou in %2\$s genoemd";
+$a->strings["[Friendica:Notify] Comment to conversation #%1\$d by %2\$s"] = "[Friendica:Notificatie] Reactie op gesprek #%1\$d door %2\$s";
+$a->strings["%s commented on an item/conversation you have been following."] = "%s gaf een reactie op een bericht/gesprek die jij volgt.";
+$a->strings["Please visit %s to view and/or reply to the conversation."] = "Bezoek %s om het gesprek te bekijken en/of te beantwoorden.";
+$a->strings["[Friendica:Notify] %s posted to your profile wall"] = "[Friendica:Melding] %s plaatste een bericht op je tijdlijn";
+$a->strings["%1\$s posted to your profile wall at %2\$s"] = "%1\$splaatste een bericht op je tijdlijn op %2\$s";
+$a->strings["%1\$s posted to [url=%2\$s]your wall[/url]"] = "%1\$s schreef op [url=%2\$s]jouw tijdlijn[/url]";
+$a->strings["[Friendica:Notify] %s shared a new post"] = "[Friendica:Melding] %s deelde een nieuw bericht";
+$a->strings["%1\$s shared a new post at %2\$s"] = "%1\$s deelde een nieuw bericht op %2\$s";
+$a->strings["%1\$s [url=%2\$s]shared a post[/url]."] = "%1\$s [url=%2\$s]deelde een bericht[/url].";
+$a->strings["[Friendica:Notify] %1\$s poked you"] = "[Friendica:Melding] %1\$s heeft jou gepord";
+$a->strings["%1\$s poked you at %2\$s"] = "%1\$s heeft jou gepord op %2\$s";
+$a->strings["%1\$s [url=%2\$s]poked you[/url]."] = "%1\$s [url=%2\$s]porde jou[/url]";
+$a->strings["[Friendica:Notify] %s tagged your post"] = "[Friendica:Notificatie] %s heeft jouw bericht gelabeld";
+$a->strings["%1\$s tagged your post at %2\$s"] = "%1\$s heeft jouw bericht gelabeld in %2\$s";
+$a->strings["%1\$s tagged [url=%2\$s]your post[/url]"] = "%1\$s labelde [url=%2\$s]jouw bericht[/url]";
+$a->strings["[Friendica:Notify] Introduction received"] = "[Friendica:Notificatie] Vriendschaps-/connectieverzoek ontvangen";
+$a->strings["You've received an introduction from '%1\$s' at %2\$s"] = "Je hebt een vriendschaps- of connectieverzoek ontvangen van '%1\$s' om %2\$s";
+$a->strings["You've received [url=%1\$s]an introduction[/url] from %2\$s."] = "Je ontving [url=%1\$s]een vriendschaps- of connectieverzoek[/url] van %2\$s.";
+$a->strings["You may visit their profile at %s"] = "Je kunt hun profiel bezoeken op %s";
+$a->strings["Please visit %s to approve or reject the introduction."] = "Bezoek %s om het verzoek goed of af te keuren.";
+$a->strings["[Friendica:Notify] A new person is sharing with you"] = "[Friendica:Melding]  Iemand nieuw deelt met jou.";
+$a->strings["%1\$s is sharing with you at %2\$s"] = "%1\$s deelt met jou in %2\$s";
+$a->strings["[Friendica:Notify] You have a new follower"] = "[Friendica:Melding] Je hebt een nieuwe volger";
+$a->strings["You have a new follower at %2\$s : %1\$s"] = "Je hebt een nieuwe volger op %2\$s: %1\$s";
+$a->strings["[Friendica:Notify] Friend suggestion received"] = "[Friendica:Melding] Vriendschapsvoorstel ontvangen";
+$a->strings["You've received a friend suggestion from '%1\$s' at %2\$s"] = "Je kreeg een vriendschapssuggestie van '%1\$s' op %2\$s";
+$a->strings["You've received [url=%1\$s]a friend suggestion[/url] for %2\$s from %3\$s."] = "Je kreeg een [url=%1\$s]vriendschapssuggestie[/url] voor %2\$s op %3\$s.";
+$a->strings["Name:"] = "Naam:";
+$a->strings["Photo:"] = "Foto: ";
+$a->strings["Please visit %s to approve or reject the suggestion."] = "Bezoek %s om de suggestie goed of af te keuren.";
+$a->strings["[Friendica:Notify] Connection accepted"] = "[Friendica:Melding] Verbinding aanvaard";
+$a->strings["'%1\$s' has accepted your connection request at %2\$s"] = "'%1\$s' aanvaarde je contactaanvraag op %2\$s";
+$a->strings["%2\$s has accepted your [url=%1\$s]connection request[/url]."] = "%2\$saanvaardde jouw [url=%1\$s]contactaanvraag[/url].";
+$a->strings["You are now mutual friends and may exchange status updates, photos, and email without restriction."] = "Jullie zijn nu in contact met elkaar en kunnen statusberichten, foto's en email delen zonder beperkingen.";
+$a->strings["Please visit %s if you wish to make any changes to this relationship."] = "Bezoek alstublieft %s als je deze relatie wil wijzigen.";
+$a->strings["'%1\$s' has chosen to accept you a fan, which restricts some forms of communication - such as private messaging and some profile interactions. If this is a celebrity or community page, these settings were applied automatically."] = "'%1\$s' koos om je te accepteren als fan, wat sommige communicatievormen beperkt - zoals privéberichten en sommige profielfuncties.  Als dit een beroemdheid- of groepspagina is, werd dit automatisch toegepast.";
+$a->strings["'%1\$s' may choose to extend this into a two-way or more permissive relationship in the future."] = "'%1\$s' kan er later voor kiezen om deze beperkingen aan te passen.";
+$a->strings["Please visit %s  if you wish to make any changes to this relationship."] = "Bezoek %s wanneer je deze relatie wil wijzigen.";
+$a->strings["[Friendica System Notify]"] = "[Friendica systeem notificatie]";
+$a->strings["registration request"] = "registratie verzoek";
+$a->strings["You've received a registration request from '%1\$s' at %2\$s"] = "Je kreeg een registratieaanvraag van '%1\$s' op %2\$s";
+$a->strings["You've received a [url=%1\$s]registration request[/url] from %2\$s."] = "Je kreeg een [url=%1\$s]registratieaanvraag[/url] van %2\$s.";
+$a->strings["Full Name:\t%s\nSite Location:\t%s\nLogin Name:\t%s (%s)"] = "Volledige naam:\t%s\nAdres van de site:\t%s\nLoginnaam:\t%s (%s)";
+$a->strings["Please visit %s to approve or reject the request."] = "Bezoek %s om de aanvraag goed of af te keuren.";
 $a->strings["Daily posting limit of %d post reached. The post was rejected."] = [
        0 => "De dagelijkse limiet van %d bericht is bereikt. Dit bericht werd niet aanvaard.",
        1 => "De dagelijkse limiet van %d berichten is bereikt.  Dit bericht werd niet aanvaard.",
@@ -37,6 +100,7 @@ $a->strings["Attending"] = [
 ];
 $a->strings["Not attending"] = "Nemen niet deel";
 $a->strings["Might attend"] = "Nemen misschien deel";
+$a->strings["Reshares"] = "Delingen";
 $a->strings["Select"] = "Kies";
 $a->strings["Delete"] = "Verwijder";
 $a->strings["View %s's profile @ %s"] = "Bekijk het profiel van %s @ %s";
@@ -54,6 +118,8 @@ $a->strings["View Photos"] = "Bekijk foto's";
 $a->strings["Network Posts"] = "Netwerkberichten";
 $a->strings["View Contact"] = "Bekijk contact";
 $a->strings["Send PM"] = "Stuur een privébericht";
+$a->strings["Block"] = "Blokkeren";
+$a->strings["Ignore"] = "Negeren";
 $a->strings["Poke"] = "Porren";
 $a->strings["Connect/Follow"] = "Verbind/Volg";
 $a->strings["%s likes this."] = "%s vindt dit leuk.";
@@ -61,6 +127,7 @@ $a->strings["%s doesn't like this."] = "%s vindt dit niet leuk.";
 $a->strings["%s attends."] = "%s neemt deel";
 $a->strings["%s doesn't attend."] = "%s neemt niet deel";
 $a->strings["%s attends maybe."] = "%s neemt misschien deel";
+$a->strings["%s reshared this."] = "%s heeft dit gedeeld";
 $a->strings["and"] = "en";
 $a->strings["and %d other people"] = "en %d anderen";
 $a->strings["<span  %1\$s>%2\$d people</span> like this"] = "<span  %1\$s>%2\$d mensen</span> vinden dit leuk";
@@ -73,6 +140,7 @@ $a->strings["<span  %1\$s>%2\$d people</span> don't attend"] = "<span %1\$s>%2\$
 $a->strings["%s don't attend."] = "%s nemen niet deel.";
 $a->strings["<span  %1\$s>%2\$d people</span> attend maybe"] = "<span %1\$s>%2\$d mensen</span> nemen misschien deel";
 $a->strings["%s attend maybe."] = "%s neemt misschien deel.";
+$a->strings["<span  %1\$s>%2\$d people</span> reshared this"] = "<span  %1\$s>%2\$d mensen</span> hebben dit gedeeld";
 $a->strings["Visible to <strong>everybody</strong>"] = "Zichtbaar voor <strong>iedereen</strong>";
 $a->strings["Please enter a image/video/audio/webpage URL:"] = "Geef een afbeelding/video/audio/webpagina in:";
 $a->strings["Tag term:"] = "Label:";
@@ -126,534 +194,198 @@ $a->strings["Undecided"] = [
        0 => "Onbeslist",
        1 => "Onbeslist",
 ];
-$a->strings["Friendica Notification"] = "Friendica Notificatie";
-$a->strings["Thank You,"] = "Bedankt";
-$a->strings["%1\$s, %2\$s Administrator"] = "%1\$s, %2\$s Beheerder";
-$a->strings["%s Administrator"] = "%s Beheerder";
-$a->strings["[Friendica:Notify] New mail received at %s"] = "[Friendica:Notificatie] Nieuw bericht ontvangen op %s";
-$a->strings["%1\$s sent you a new private message at %2\$s."] = "%1\$s sent you a new private message at %2\$s.";
-$a->strings["a private message"] = "een prive bericht";
-$a->strings["%1\$s sent you %2\$s."] = "%1\$s stuurde jou %2\$s.";
-$a->strings["Please visit %s to view and/or reply to your private messages."] = "Bezoek %s om je privé-berichten te bekijken en/of te beantwoorden.";
-$a->strings["%1\$s commented on [url=%2\$s]a %3\$s[/url]"] = "%1\$s gaf een reactie op [url=%2\$s]a %3\$s[/url]";
-$a->strings["%1\$s commented on [url=%2\$s]%3\$s's %4\$s[/url]"] = "%1\$s gaf een reactie op [url=%2\$s]%3\$s's %4\$s[/url]";
-$a->strings["%1\$s commented on [url=%2\$s]your %3\$s[/url]"] = "%1\$s gaf een reactie op [url=%2\$s]jouw %3\$s[/url]";
-$a->strings["[Friendica:Notify] Comment to conversation #%1\$d by %2\$s"] = "[Friendica:Notificatie] Reactie op gesprek #%1\$d door %2\$s";
-$a->strings["%s commented on an item/conversation you have been following."] = "%s gaf een reactie op een bericht/gesprek die jij volgt.";
-$a->strings["Please visit %s to view and/or reply to the conversation."] = "Bezoek %s om het gesprek te bekijken en/of te beantwoorden.";
-$a->strings["[Friendica:Notify] %s posted to your profile wall"] = "[Friendica:Melding] %s plaatste een bericht op je tijdlijn";
-$a->strings["%1\$s posted to your profile wall at %2\$s"] = "%1\$splaatste een bericht op je tijdlijn op %2\$s";
-$a->strings["%1\$s posted to [url=%2\$s]your wall[/url]"] = "%1\$s schreef op [url=%2\$s]jouw tijdlijn[/url]";
-$a->strings["[Friendica:Notify] %s tagged you"] = "[Friendica:Notificatie] %s heeft jou genoemd";
-$a->strings["%1\$s tagged you at %2\$s"] = "%1\$s heeft jou in %2\$s genoemd";
-$a->strings["%1\$s [url=%2\$s]tagged you[/url]."] = "%1\$s [url=%2\$s]heeft jou genoemd[/url].";
-$a->strings["[Friendica:Notify] %s shared a new post"] = "[Friendica:Melding] %s deelde een nieuw bericht";
-$a->strings["%1\$s shared a new post at %2\$s"] = "%1\$s deelde een nieuw bericht op %2\$s";
-$a->strings["%1\$s [url=%2\$s]shared a post[/url]."] = "%1\$s [url=%2\$s]deelde een bericht[/url].";
-$a->strings["[Friendica:Notify] %1\$s poked you"] = "[Friendica:Melding] %1\$s heeft jou gepord";
-$a->strings["%1\$s poked you at %2\$s"] = "%1\$s heeft jou gepord op %2\$s";
-$a->strings["%1\$s [url=%2\$s]poked you[/url]."] = "%1\$s [url=%2\$s]porde jou[/url]";
-$a->strings["[Friendica:Notify] %s tagged your post"] = "[Friendica:Notificatie] %s heeft jouw bericht gelabeld";
-$a->strings["%1\$s tagged your post at %2\$s"] = "%1\$s heeft jouw bericht gelabeld in %2\$s";
-$a->strings["%1\$s tagged [url=%2\$s]your post[/url]"] = "%1\$s labelde [url=%2\$s]jouw bericht[/url]";
-$a->strings["[Friendica:Notify] Introduction received"] = "[Friendica:Notificatie] Vriendschaps-/connectieverzoek ontvangen";
-$a->strings["You've received an introduction from '%1\$s' at %2\$s"] = "Je hebt een vriendschaps- of connectieverzoek ontvangen van '%1\$s' om %2\$s";
-$a->strings["You've received [url=%1\$s]an introduction[/url] from %2\$s."] = "Je ontving [url=%1\$s]een vriendschaps- of connectieverzoek[/url] van %2\$s.";
-$a->strings["You may visit their profile at %s"] = "Je kunt hun profiel bezoeken op %s";
-$a->strings["Please visit %s to approve or reject the introduction."] = "Bezoek %s om het verzoek goed of af te keuren.";
-$a->strings["[Friendica:Notify] A new person is sharing with you"] = "[Friendica:Melding]  Iemand nieuw deelt met jou.";
-$a->strings["%1\$s is sharing with you at %2\$s"] = "%1\$s deelt met jou in %2\$s";
-$a->strings["[Friendica:Notify] You have a new follower"] = "[Friendica:Melding] Je hebt een nieuwe volger";
-$a->strings["You have a new follower at %2\$s : %1\$s"] = "Je hebt een nieuwe volger op %2\$s: %1\$s";
-$a->strings["[Friendica:Notify] Friend suggestion received"] = "[Friendica:Melding] Vriendschapsvoorstel ontvangen";
-$a->strings["You've received a friend suggestion from '%1\$s' at %2\$s"] = "Je kreeg een vriendschapssuggestie van '%1\$s' op %2\$s";
-$a->strings["You've received [url=%1\$s]a friend suggestion[/url] for %2\$s from %3\$s."] = "Je kreeg een [url=%1\$s]vriendschapssuggestie[/url] voor %2\$s op %3\$s.";
-$a->strings["Name:"] = "Naam:";
-$a->strings["Photo:"] = "Foto: ";
-$a->strings["Please visit %s to approve or reject the suggestion."] = "Bezoek %s om de suggestie goed of af te keuren.";
-$a->strings["[Friendica:Notify] Connection accepted"] = "[Friendica:Melding] Verbinding aanvaard";
-$a->strings["'%1\$s' has accepted your connection request at %2\$s"] = "'%1\$s' aanvaarde je contactaanvraag op %2\$s";
-$a->strings["%2\$s has accepted your [url=%1\$s]connection request[/url]."] = "%2\$saanvaardde jouw [url=%1\$s]contactaanvraag[/url].";
-$a->strings["You are now mutual friends and may exchange status updates, photos, and email without restriction."] = "Jullie zijn nu in contact met elkaar en kunnen statusberichten, foto's en email delen zonder beperkingen.";
-$a->strings["Please visit %s if you wish to make any changes to this relationship."] = "Bezoek alstublieft %s als je deze relatie wil wijzigen.";
-$a->strings["'%1\$s' has chosen to accept you a fan, which restricts some forms of communication - such as private messaging and some profile interactions. If this is a celebrity or community page, these settings were applied automatically."] = "'%1\$s' koos om je te accepteren als fan, wat sommige communicatievormen beperkt - zoals privéberichten en sommige profielfuncties.  Als dit een beroemdheid- of groepspagina is, werd dit automatisch toegepast.";
-$a->strings["'%1\$s' may choose to extend this into a two-way or more permissive relationship in the future."] = "'%1\$s' kan er later voor kiezen om deze beperkingen aan te passen.";
-$a->strings["Please visit %s  if you wish to make any changes to this relationship."] = "Bezoek %s wanneer je deze relatie wil wijzigen.";
-$a->strings["[Friendica System Notify]"] = "[Friendica systeem notificatie]";
-$a->strings["registration request"] = "registratie verzoek";
-$a->strings["You've received a registration request from '%1\$s' at %2\$s"] = "Je kreeg een registratieaanvraag van '%1\$s' op %2\$s";
-$a->strings["You've received a [url=%1\$s]registration request[/url] from %2\$s."] = "Je kreeg een [url=%1\$s]registratieaanvraag[/url] van %2\$s.";
-$a->strings["Full Name:\t%s\nSite Location:\t%s\nLogin Name:\t%s (%s)"] = "Volledige naam:\t%s\nAdres van de site:\t%s\nLoginnaam:\t%s (%s)";
-$a->strings["Please visit %s to approve or reject the request."] = "Bezoek %s om de aanvraag goed of af te keuren.";
 $a->strings["Item not found."] = "Item niet gevonden.";
 $a->strings["Do you really want to delete this item?"] = "Wil je echt dit item verwijderen?";
 $a->strings["Yes"] = "Ja";
 $a->strings["Permission denied."] = "Toegang geweigerd";
-$a->strings["Archives"] = "Archieven";
-$a->strings["show more"] = "toon meer";
-$a->strings["Theme settings updated."] = "Thema-instellingen opgeslagen";
-$a->strings["Information"] = "Informatie";
-$a->strings["Overview"] = "Overzicht";
-$a->strings["Federation Statistics"] = "Federatie Statistieken";
-$a->strings["Configuration"] = "Configuratie";
-$a->strings["Site"] = "Website";
-$a->strings["Users"] = "Gebruiker";
-$a->strings["Addons"] = "Addons";
-$a->strings["Themes"] = "Thema's";
-$a->strings["Additional features"] = "Extra functies";
-$a->strings["Terms of Service"] = "Gebruiksvoorwaarden";
-$a->strings["Database"] = "Database";
-$a->strings["DB updates"] = "DB aanpassingen";
-$a->strings["Inspect Queue"] = "Wachtrij Inspecteren";
-$a->strings["Inspect Deferred Workers"] = "Inspecteer uitgestelde workers";
-$a->strings["Inspect worker Queue"] = "Taakwachtrij inspecteren";
-$a->strings["Tools"] = "Hulpmiddelen";
-$a->strings["Contact Blocklist"] = "Contact Blokkeerlijst";
-$a->strings["Server Blocklist"] = "Server Blokkeerlijst";
-$a->strings["Delete Item"] = "Verwijder Item";
-$a->strings["Logs"] = "Logs";
-$a->strings["View Logs"] = "Bekijk Logs";
-$a->strings["Diagnostics"] = "Diagnostiek";
-$a->strings["PHP Info"] = "PHP Info";
-$a->strings["probe address"] = "probe adres";
-$a->strings["check webfinger"] = "check webfinger";
-$a->strings["Admin"] = "Beheer";
-$a->strings["Addon Features"] = "Addon Features";
-$a->strings["User registrations waiting for confirmation"] = "Gebruikersregistraties wachten op bevestiging";
-$a->strings["Administration"] = "Beheer";
-$a->strings["Display Terms of Service"] = "Toon Gebruiksvoorwaarden";
-$a->strings["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."] = "Activeer de Gebruiksvoorwaarden pagina. Als deze geactiveerd is, dan zal er een link naar de voorwaarden toegevoegd worden aan het registratie formulier en de algemene informatie pagina.";
-$a->strings["Display Privacy Statement"] = "Toon Privacy Verklaring";
-$a->strings["Show some informations regarding the needed information to operate the node according e.g. to <a href=\"%s\" target=\"_blank\">EU-GDPR</a>."] = "Toon wat inlichtigen over de nodige informatite om de node te beheren in overeenstemming met bvb. de <a href=\"%s\" target=\"_blank\">EU-GDPR</a> (EU-AVG).";
-$a->strings["Privacy Statement Preview"] = "Privacy Verklaring Voorbeeldweergave";
-$a->strings["The Terms of Service"] = "De Gebruiksvoorwaarden";
-$a->strings["Enter the Terms of Service for your node here. You can use BBCode. Headers of sections should be [h2] and below."] = "Geef hier de Gebruiksvoorwaarden van je node op. Je kan BBCode gebruiken. Sectie headers moeten [h2] zijn of lager.";
+$a->strings["Authorize application connection"] = "Verbinding met de applicatie goedkeuren";
+$a->strings["Return to your app and insert this Securty Code:"] = "Keer terug naar jouw app en voeg deze beveiligingscode in:";
+$a->strings["Please login to continue."] = "Log in om verder te gaan.";
+$a->strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Wil je deze toepassing toestemming geven om jouw berichten en contacten in te kijken, en/of nieuwe berichten in jouw plaats aan te maken?";
+$a->strings["No"] = "Nee";
+$a->strings["Parent user not found."] = "Ouderlijke gebruiker niet gevonden.";
+$a->strings["No parent user"] = "Ouderlijke gebruiker ontbreekt";
+$a->strings["Parent Password:"] = "Ouderlijk paswoord:";
+$a->strings["Please enter the password of the parent account to legitimize your request."] = "Geef alstublieft het paswoord van het ouderlijke account om je verzoek te legitimeren.";
+$a->strings["Parent User"] = "Ouderlijke gebruiker";
+$a->strings["Parent users have total control about this account, including the account settings. Please double check whom you give this access."] = "Ouderlijke gebruikers hebben totale controle over dit account, de account instellingen inbegrepen. Dubbel check dus alstublieft aan wie je deze toegang geeft.";
 $a->strings["Save Settings"] = "Instellingen opslaan";
-$a->strings["Blocked domain"] = "Domein geblokeerd";
-$a->strings["The blocked domain"] = "Het geblokkeerde domein";
-$a->strings["Reason for the block"] = "Reden van de blokkering";
-$a->strings["The reason why you blocked this domain."] = "De reden waarom je dit domein geblokkeerd hebt.";
-$a->strings["Delete domain"] = "Verwijder domein";
-$a->strings["Check to delete this entry from the blocklist"] = "Vink aan om dit item van de blokkeerlijst te verwijderen";
-$a->strings["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 domains you should also give a reason why you have blocked the remote server."] = "Deze pagina kan je gebruiken om een zwarte lijst van servers aan te leggen van het gefedereerde netwerk die niet met jouw node mogen interageren. Voor alle domeine die je opgeeft moet je ook een reden geven waarom je die remote server geblokkeerd hebt.";
-$a->strings["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."] = "De lijst van geblokkeerde servers zal publiek beschikbaar gemaakt worden op de /friendica pagina zodat je gebruikers en personen die communicatie problemen onderzoeken gemakkelijk de reden kunnen vinden.";
-$a->strings["Add new entry to block list"] = "Voeg nieuw item toe aan de blokkeerlijst";
-$a->strings["Server Domain"] = "Server Domein";
-$a->strings["The domain of the new server to add to the block list. Do not include the protocol."] = "Het domein van de nieuwe server om toe te voegen aan de blokkeerlijst. Laat het protocol weg.";
-$a->strings["Block reason"] = "Reden voor blokkering";
-$a->strings["Add Entry"] = "Voeg Item toe";
-$a->strings["Save changes to the blocklist"] = "Sla veranderingen in de blokkeerlijst op";
-$a->strings["Current Entries in the Blocklist"] = "Huidige Items in de blokkeerlijst";
-$a->strings["Delete entry from blocklist"] = "Verwijder item uit de blokkeerlijst";
-$a->strings["Delete entry from blocklist?"] = "Item verwijderen uit de blokkeerlijst?";
-$a->strings["Server added to blocklist."] = "Server toegevoegd aan blokkeerlijst.";
-$a->strings["Site blocklist updated."] = "Site blokkeerlijst opgeslagen";
-$a->strings["The contact has been blocked from the node"] = "Het contact is geblokkeerd van deze node";
-$a->strings["Could not find any contact entry for this URL (%s)"] = "Kon geen contact vinden op deze URL (%s)";
-$a->strings["%s contact unblocked"] = [
-       0 => "%s contact is niet langer geblokkeerd",
-       1 => "%s contacten zijn niet langer geblokkeerd",
+$a->strings["Delegate Page Management"] = "Paginabeheer uitbesteden";
+$a->strings["Delegates"] = "Gemachtigden";
+$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."] = "Personen waaraan het beheer is uitbesteed kunnen alle onderdelen van een account/pagina beheren, behalve de basisinstellingen van een account. Besteed je persoonlijke account daarom niet uit aan personen die je niet volledig vertrouwt.";
+$a->strings["Existing Page Delegates"] = "Bestaande personen waaraan het paginabeheer is uitbesteed";
+$a->strings["Potential Delegates"] = "Mogelijke personen waaraan het paginabeheer kan worden uitbesteed ";
+$a->strings["Remove"] = "Verwijderen";
+$a->strings["Add"] = "Toevoegen";
+$a->strings["No entries."] = "Geen gegevens.";
+$a->strings["Post successful."] = "Bericht succesvol geplaatst.";
+$a->strings["Subscribing to OStatus contacts"] = "Inschrijven bij OStatus contacten";
+$a->strings["No contact provided."] = "Geen contact opgegeven.";
+$a->strings["Couldn't fetch information for contact."] = "Kon de informatie voor het contact niet ophalen.";
+$a->strings["Couldn't fetch friends for contact."] = "Kon de vrienden van contact niet ophalen.";
+$a->strings["Done"] = "Klaar";
+$a->strings["success"] = "Succesvol";
+$a->strings["failed"] = "Mislukt";
+$a->strings["ignored"] = "Verboden";
+$a->strings["Keep this window open until done."] = "Houd dit scherm open tot het klaar is";
+$a->strings["Permission denied"] = "Toegang geweigerd";
+$a->strings["Invalid profile identifier."] = "Ongeldige profiel-identificatie.";
+$a->strings["Profile Visibility Editor"] = "Profiel Zichtbaarheid Editor";
+$a->strings["Profile"] = "Profiel";
+$a->strings["Click on a contact to add or remove."] = "Klik op een contact om het toe te voegen of te verwijderen.";
+$a->strings["Visible To"] = "Zichtbaar voor";
+$a->strings["All Contacts (with secure profile access)"] = "Alle contacten (met veilige profieltoegang)";
+$a->strings["Account approved."] = "Account goedgekeurd.";
+$a->strings["Registration revoked for %s"] = "Registratie ingetrokken voor %s";
+$a->strings["Please login."] = "Inloggen.";
+$a->strings["User deleted their account"] = "Gebruiker verwijderde zijn of haar account";
+$a->strings["On your Friendica node an user deleted their account. Please ensure that their data is removed from the backups."] = "Een gebruiker heeft zijn of haar account verwijderd op je Friendica node. Zorg er zeker voor dat zijn of haar data verwijderd is uit de backups.";
+$a->strings["The user id is %d"] = "De gebruikers id is %d";
+$a->strings["Remove My Account"] = "Verwijder mijn account";
+$a->strings["This will completely remove your account. Once this has been done it is not recoverable."] = "Dit zal je account volledig verwijderen. Dit kan niet hersteld worden als het eenmaal uitgevoerd is.";
+$a->strings["Please enter your password for verification:"] = "Voer je wachtwoord in voor verificatie:";
+$a->strings["Resubscribing to OStatus contacts"] = "Opnieuw inschrijven bij OStatus contacten";
+$a->strings["Error"] = [
+       0 => "Fout",
+       1 => "Fouten",
 ];
-$a->strings["Remote Contact Blocklist"] = "Remote Contact Blokkeerlijst";
-$a->strings["This page allows you to prevent any message from a remote contact to reach your node."] = "De pagina laat je toe om te vermijden dat boodschappen van een remote contact je node bereiken.";
-$a->strings["Block Remote Contact"] = "Blokkeer Remote Contact";
-$a->strings["select all"] = "Alles selecteren";
-$a->strings["select none"] = "selecteer geen";
-$a->strings["Block"] = "Blokkeren";
-$a->strings["Unblock"] = "Blokkering opheffen";
-$a->strings["No remote contact is blocked from this node."] = "Geen enkel remote contact is geblokkeerd van deze node.";
-$a->strings["Blocked Remote Contacts"] = "Geblokkeerde Remote Contacts";
-$a->strings["Block New Remote Contact"] = "Blokkeer Nieuwe Remote Contacten";
-$a->strings["Photo"] = "Foto";
-$a->strings["Name"] = "Naam";
-$a->strings["Address"] = "Adres";
+$a->strings["Tag(s) removed"] = "Tag(s) verwijderd";
+$a->strings["Remove Item Tag"] = "Verwijder label van item";
+$a->strings["Select a tag to remove: "] = "Selecteer een label om te verwijderen: ";
+$a->strings["User imports on closed servers can only be done by an administrator."] = "Importen van een gebruiker op een gesloten node kan enkel gedaan worden door een administrator";
+$a->strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Deze website heeft het toegelaten dagelijkse aantal registraties overschreden. Probeer morgen opnieuw.";
+$a->strings["Import"] = "Importeren";
+$a->strings["Move account"] = "Account verplaatsen";
+$a->strings["You can import an account from another Friendica server."] = "Je kunt een account van een andere Friendica server importeren.";
+$a->strings["You need to export your account from the old server and upload it here. We will recreate your old account here with all your contacts. We will try also to inform your friends that you moved here."] = "Je moet je account bij de oude server exporteren, en hier uploaden. We zullen je oude account hier opnieuw aanmaken, met al je contacten. We zullen ook proberen om je vrienden in te lichten dat je naar hier verhuisd bent.";
+$a->strings["This feature is experimental. We can't import contacts from the OStatus network (GNU Social/Statusnet) or from Diaspora"] = "Dit feature is experimenteel. We kunnen contacten van het OStatus netwerk (GNU Social/Statusnet) of van Diaspora niet importeren.";
+$a->strings["Account file"] = "Account bestand";
+$a->strings["To export your account, go to \"Settings->Export your personal data\" and select \"Export account\""] = "Om je account te exporteren, ga naar \"Instellingen->Exporteer je persoonlijke data\" en selecteer \"Exporteer account\"";
+$a->strings["You aren't following this contact."] = "Je volgt dit contact niet.";
+$a->strings["Unfollowing is currently not supported by your network."] = "Ontvolgen is momenteel niet gesupporteerd door je netwerk.";
+$a->strings["Contact unfollowed"] = "Contact ontvolgd.";
+$a->strings["Disconnect/Unfollow"] = "Disconnecteer/stop met volgen";
+$a->strings["Your Identity Address:"] = "Adres van je identiteit:";
+$a->strings["Submit Request"] = "Aanvraag indienen";
 $a->strings["Profile URL"] = "Profiel url";
-$a->strings["%s total blocked contact"] = [
-       0 => "%s geblokkeerde contacten in totaal",
-       1 => "%s geblokkeerde contacten in totaal",
-];
-$a->strings["URL of the remote contact to block."] = "URL van de remote contact die je wil blokkeren.";
-$a->strings["Delete this Item"] = "Verwijder dit Item";
-$a->strings["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."] = "Op deze pagina kan je een item van je node verwijderen. Als het item een bericht is op het eerste niveau, dan zal de hele gesprek verwijderd worden.";
-$a->strings["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."] = "Je moet de GUID van het item kennen. Je kan het terugvinden bvb. door te kijken naar de getoonde URL. Het laatste deel van http://example.com/display/123456 is de GUID, hier 123456.";
-$a->strings["GUID"] = "GUID";
-$a->strings["The GUID of the item you want to delete."] = "De GUID van het item dat je wil verwijderen.";
-$a->strings["Item marked for deletion."] = "Item gemarkeerd om te verwijderen.";
-$a->strings["unknown"] = "onbekend";
-$a->strings["This page offers you some numbers to the known part of the federated social network your Friendica node is part of. These numbers are not complete but only reflect the part of the network your node is aware of."] = "Deze pagina toont je statistieken van het gekende deel van het gefedereerde sociale netwerk waarvan je Friendica node deel uitmaakt. Deze statistieken zijn niet volledig maar reflecteren het deel van het network dat jouw node kent.";
-$a->strings["The <em>Auto Discovered Contact Directory</em> feature is not enabled, it will improve the data displayed here."] = "Het <em>Automatisch Achterhaalde Contact Gids</em> feature is niet geactiveerd, het zal de hier getoonde informatie verbeteren.";
-$a->strings["Currently this node is aware of %d nodes with %d registered users from the following platforms:"] = "Op dit moment kent deze node %d nodes met %d geregistreerde gebruikers op basis van de volgende patformen:";
-$a->strings["ID"] = "ID";
-$a->strings["Recipient Name"] = "Naam van de Ontvanger";
-$a->strings["Recipient Profile"] = "Profiel van de Ontvanger";
-$a->strings["Network"] = "Netwerk";
-$a->strings["Created"] = "Aangemaakt";
-$a->strings["Last Tried"] = "Laatste poging";
-$a->strings["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."] = "Deze pagina lijst de inhoud van de wachtrij op voor uitgaande berichten. Dit zijn berichten waarvoor de initiële aflevering faalde. Ze zullen later opnieuw verzonden worden en uiteindelijk verwijderd worden als de aflevering permanent faalt.";
-$a->strings["Inspect Deferred Worker Queue"] = "Inspecteer wachtrij van uitgestelde workers";
-$a->strings["This page lists the deferred worker jobs. This are jobs that couldn't be executed at the first time."] = "Deze pagine geeft alle uitgestelde workertaken. Dit zijn taken die niet onmiddelijk konden worden uitgevoerd";
-$a->strings["Inspect Worker Queue"] = "Taakwachtrij inspecteren";
-$a->strings["This page lists the currently queued worker jobs. These jobs are handled by the worker cronjob you've set up during install."] = "Deze pagina toont alle taken in de wachtrij. Deze taken worden behandeld door de geplande taak die je hebt ingesteld tijdens installatie.";
-$a->strings["Job Parameters"] = "Taak parameters";
-$a->strings["Priority"] = "Prioriteit";
-$a->strings["Your DB still runs with MyISAM tables. You should change the engine type to InnoDB. As Friendica will use InnoDB only features in the future, you should change this! See <a href=\"%s\">here</a> for a guide that may be helpful converting the table engines. You may also use the command <tt>php bin/console.php dbstructure toinnodb</tt> of your Friendica installation for an automatic conversion.<br />"] = "Je DB opereert nog met MyISAM tabellen. Best is van engine te veranderen naar InnoDB. Aangezien Friendica in de toekomst gebruik zal maken van InnoDB features, zou je dit best aanpassen! Zie <a href=\"%s\">hier</a> voor een gids die je kan helpen om de tabel engines te converteren. Je kan ook het commando<tt>php bin/console.php dbstructure toinnodb</tt> van je Friendica installatie gebruiken voor een automatische conversie.<br />";
-$a->strings["There is a new version of Friendica available for download. Your current version is %1\$s, upstream version is %2\$s"] = "Er is een nieuwe versie van Friendica beschikbaar om te downloaden. Je huidige versie is %1\$s, upstream versie is %2\$s";
-$a->strings["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."] = "Database update is mislukt. Gelieve  \"php bin/console.php dbstructure update\" vanaf de command line uit te voeren en de foutmeldingen die zouden kunnen verschijnen na te kijken.";
-$a->strings["The worker was never executed. Please check your database structure!"] = "De worker werd nooit uitgevoerd. Best je database structuur eens nakijken!";
-$a->strings["The last worker execution was on %s UTC. This is older than one hour. Please check your crontab settings."] = "De laatste worker uitvoering was op %s UTC. Dit is langer dan 1 uur geleden. Best je crontab instellingen nakijken.";
-$a->strings["Friendica's configuration now is stored in config/local.config.php, please copy config/local-sample.config.php and move your config from <code>.htconfig.php</code>. See <a href=\"%s\">the Config help page</a> for help with the transition."] = "Het configuratiebestand bevind zich nu in config/local.config.php. Kopieer het bestand config/local-sample.config.php en verplaats je configuratie uit <code>.htconfig.php</code>. Ga naar de<a href=\"%s\">configuratie help pagina</a> voor hulp bij transitie.";
-$a->strings["<a href=\"%s\">%s</a> is not reachable on your system. This is a severe configuration issue that prevents server to server communication. See <a href=\"%s\">the installation page</a> for help."] = "<a href=\"%s\">%s</a> is niet bereikbaar. Dit is een belangrijk communicatieprobleem waardoor server-naar-server communicatie niet mogelijk is. Lees de <a href=\"%s\">the installatie pagina</a> voor hulp.";
-$a->strings["Normal Account"] = "Normaal account";
-$a->strings["Automatic Follower Account"] = "Automatische Volger Account";
-$a->strings["Public Forum Account"] = "Publiek Forum account";
-$a->strings["Automatic Friend Account"] = "Automatisch Vriendschapsaccount";
-$a->strings["Blog Account"] = "Blog Account";
-$a->strings["Private Forum Account"] = "Privé Forum Account";
-$a->strings["Message queues"] = "Bericht-wachtrijen";
-$a->strings["Server Settings"] = "Server instellingen.";
-$a->strings["Summary"] = "Samenvatting";
-$a->strings["Registered users"] = "Geregistreerde gebruikers";
-$a->strings["Pending registrations"] = "Registraties die in de wacht staan";
-$a->strings["Version"] = "Versie";
-$a->strings["Active addons"] = "Actieve addons";
-$a->strings["Can not parse base url. Must have at least <scheme>://<domain>"] = "Kan de basis url niet verwerken. Moet minstens zijn <scheme>://<domain>";
-$a->strings["Site settings updated."] = "Site instellingen opgeslagen";
-$a->strings["No special theme for mobile devices"] = "Geen speciaal thema voor mobiele apparaten";
-$a->strings["No community page for local users"] = "Geen groepspagina voor lokale gebruikers";
-$a->strings["No community page"] = "Geen groepspagina";
-$a->strings["Public postings from users of this site"] = "Publieke berichten van gebruikers van deze site";
-$a->strings["Public postings from the federated network"] = "Publieke berichten van het gefedereerde netwerk";
-$a->strings["Public postings from local users and the federated network"] = "Publieke berichten van lokale gebruikers en van het gefedereerde netwerk";
-$a->strings["Disabled"] = "Uitgeschakeld";
-$a->strings["Users, Global Contacts"] = "Gebruikers, Globale contacten";
-$a->strings["Users, Global Contacts/fallback"] = "Gebruikers, Globale Contacten/noodoplossing";
-$a->strings["One month"] = "Een maand";
-$a->strings["Three months"] = "Drie maanden";
-$a->strings["Half a year"] = "Een half jaar";
-$a->strings["One year"] = "Een jaar";
-$a->strings["Multi user instance"] = "Server voor meerdere gebruikers";
-$a->strings["Closed"] = "Gesloten";
-$a->strings["Requires approval"] = "Toestemming vereist";
-$a->strings["Open"] = "Open";
-$a->strings["No SSL policy, links will track page SSL state"] = "Geen SSL beleid, links zullen SSL status van pagina volgen";
-$a->strings["Force all links to use SSL"] = "Verplicht alle links om SSL te gebruiken";
-$a->strings["Self-signed certificate, use SSL for local links only (discouraged)"] = "Zelf-ondertekend certificaat, gebruik SSL alleen voor lokale links (afgeraden)";
-$a->strings["Don't check"] = "Geen rekening mee houden";
-$a->strings["check the stable version"] = "Neem de stabiele versie in rekening";
-$a->strings["check the development version"] = "Neem de ontwikkel versie in rekening";
-$a->strings["Republish users to directory"] = "Opnieuw de gebruikers naar de gids publiceren";
-$a->strings["Registration"] = "Registratie";
-$a->strings["File upload"] = "Uploaden bestand";
-$a->strings["Policies"] = "Beleid";
-$a->strings["Advanced"] = "Geavanceerd";
-$a->strings["Auto Discovered Contact Directory"] = "Automatisch Achterhaalde Contact Gids";
-$a->strings["Performance"] = "Performantie";
-$a->strings["Worker"] = "Worker";
-$a->strings["Message Relay"] = "Boodschap Relais";
-$a->strings["Relocate Instance"] = "Verhuis node";
-$a->strings["Warning! Advanced function. Could make this server unreachable."] = "Waarschuwing! Geavanceerde functie. Dit kan u node onbereikbaar maken";
-$a->strings["Site name"] = "Site naam";
-$a->strings["Host name"] = "Host naam";
-$a->strings["Sender Email"] = "Verzender Email";
-$a->strings["The email address your server shall use to send notification emails from."] = "Het email adres als afzender van notificatie emails.";
-$a->strings["Banner/Logo"] = "Banner/Logo";
-$a->strings["Shortcut icon"] = "Snelkoppeling icoon";
-$a->strings["Link to an icon that will be used for browsers."] = "Link naar een icoon dat zal gebruikt worden voor browsers.";
-$a->strings["Touch icon"] = "Pictogram voor smartphones";
-$a->strings["Link to an icon that will be used for tablets and mobiles."] = "Link naar een icoon dat zal gebruikt worden voor tablets en mobiele telefoons.";
-$a->strings["Additional Info"] = "Bijkomende Info";
-$a->strings["For public servers: you can add additional information here that will be listed at %s/servers."] = "Voor publieke servers: je kan bijkomende informatie hier toevoegen die zal opgelijst zijn op %s/servers.";
-$a->strings["System language"] = "Systeemtaal";
-$a->strings["System theme"] = "Systeem thema";
-$a->strings["Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"] = "Standaard systeem thema - kan door gebruikersprofielen veranderd worden - <a href='#' id='cnftheme'>verander thema instellingen</a>";
-$a->strings["Mobile system theme"] = "Mobiel systeem thema";
-$a->strings["Theme for mobile devices"] = "Thema voor mobiele apparaten";
-$a->strings["SSL link policy"] = "Beleid SSL-links";
-$a->strings["Determines whether generated links should be forced to use SSL"] = "Bepaald of gegenereerde verwijzingen verplicht SSL moeten gebruiken";
-$a->strings["Force SSL"] = "Dwing SSL af";
-$a->strings["Force all Non-SSL requests to SSL - Attention: on some systems it could lead to endless loops."] = "Forceer alle Niet-SSL aanvragen naar SSL - Pas op: dit kan op sommige systeem resulteren in oneindige lussen.";
-$a->strings["Hide help entry from navigation menu"] = "Verberg de 'help' uit het navigatiemenu";
-$a->strings["Hides the menu entry for the Help pages from the navigation menu. You can still access it calling /help directly."] = "Verbergt het menu-item voor de Help pagina's uit het navigatiemenu. Je kunt ze nog altijd vinden door /help direct in te geven.";
-$a->strings["Single user instance"] = "Server voor één gebruiker";
-$a->strings["Make this instance multi-user or single-user for the named user"] = "Stel deze server in voor meerdere gebruikers, of enkel voor de geselecteerde gebruiker.";
-$a->strings["Maximum image size"] = "Maximum afbeeldingsgrootte";
-$a->strings["Maximum size in bytes of uploaded images. Default is 0, which means no limits."] = "Maximum afmeting in bytes van afbeeldingen. Standaard is 0, dus geen beperking.";
-$a->strings["Maximum image length"] = "Maximum afbeeldingslengte";
-$a->strings["Maximum length in pixels of the longest side of uploaded images. Default is -1, which means no limits."] = "Maximum lengte in pixels van de langste kant van afbeeldingen. Standaard is -1, dus geen beperkingen.";
-$a->strings["JPEG image quality"] = "JPEG afbeeldingskwaliteit";
-$a->strings["Uploaded JPEGS will be saved at this quality setting [0-100]. Default is 100, which is full quality."] = "JPEGS zullen met deze kwaliteitsinstelling bewaard worden [0-100]. Standaard is 100, dit is volledige kwaliteit.";
-$a->strings["Register policy"] = "Registratiebeleid";
-$a->strings["Maximum Daily Registrations"] = "Maximum aantal registraties per dag";
-$a->strings["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."] = "Als registratie hierboven is toegelaten, zet dit het maximum aantal registraties van nieuwe gebruikers per dag. Als registratie niet is toegelaten heeft deze instelling geen effect.";
-$a->strings["Register text"] = "Registratietekst";
-$a->strings["Will be displayed prominently on the registration page. You can use BBCode here."] = "Zal prominent op de registratie pagina getoond worden. Je kan hierin BBCode gebruiken.";
-$a->strings["Forbidden Nicknames"] = "Verboden bijnamen";
-$a->strings["Comma separated list of nicknames that are forbidden from registration. Preset is a list of role names according RFC 2142."] = "Kommagescheiden lijst van bijnamen die verboden zijn voor registratie. De lijst uit RFC2142 is op voorhand ingesteld.";
-$a->strings["Accounts abandoned after x days"] = "Verlaten accounts na x dagen";
-$a->strings["Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit."] = "Dit zal geen systeembronnen verspillen aan het nakijken van externe sites voor verlaten accounts. Geef 0 is voor geen tijdslimiet.";
-$a->strings["Allowed friend domains"] = "Toegelaten vriend domeinen";
-$a->strings["Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains"] = "Komma-gescheiden lijst van domeinen die een vriendschapsband met deze website mogen aangaan. Jokers zijn toegelaten. Laat leeg om alle domeinen toe te laten.";
-$a->strings["Allowed email domains"] = "Toegelaten e-mail domeinen";
-$a->strings["Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains"] = "Door komma's gescheiden lijst met e-maildomeinen die op deze website mogen registeren. Wildcards zijn toegestaan.\nLeeg laten om alle domeinen toe te staan.";
-$a->strings["No OEmbed rich content"] = "Geen OEmbed richt content";
-$a->strings["Don't show the rich content (e.g. embedded PDF), except from the domains listed below."] = "Toon geen rich content (bvb. embedded PDF), behalve van domeinen hieronder opgelijst.";
-$a->strings["Allowed OEmbed domains"] = "Sta OEmbed domeinen toe";
-$a->strings["Comma separated list of domains which oembed content is allowed to be displayed. Wildcards are accepted."] = "Met komma's gescheiden lijst van domeinen waarvoor oembed content mag getoond worden. Wildcards zijn toegelaten.";
-$a->strings["Block public"] = "Openbare toegang blokkeren";
-$a->strings["Check to block public access to all otherwise public personal pages on this site unless you are currently logged in."] = "Kruis dit aan om alle openbare persoonlijke pagina's alleen toegankelijk te maken voor ingelogde gebruikers.";
-$a->strings["Force publish"] = "Dwing publiceren af";
-$a->strings["Check to force all profiles on this site to be listed in the site directory."] = "Kruis dit aan om af te dwingen dat alle profielen op deze website in de gids van deze website gepubliceerd worden.";
-$a->strings["Enabling this may violate privacy laws like the GDPR"] = "Dit activeren zou privacy wetten zoals GDPR (AVG) kunnen overtreden";
-$a->strings["Global directory URL"] = "Algemene gids URL";
-$a->strings["URL to the global directory. If this is not set, the global directory is completely unavailable to the application."] = "URL naar de globale gids. Als dit niet geconfigureerd is, dan zal de globale gids volledig onbeschikbaar zijn voor de applicatie.";
-$a->strings["Private posts by default for new users"] = "Privéberichten als standaard voor nieuwe gebruikers";
-$a->strings["Set default post permissions for all new members to the default privacy group rather than public."] = "Stel de standaardrechten van berichten voor nieuwe leden op de standaard privacygroep in, in plaats van openbaar.";
-$a->strings["Don't include post content in email notifications"] = "De inhoud van het bericht niet insluiten bij e-mailnotificaties";
-$a->strings["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."] = "De inhoud van berichten/commentaar/privéberichten/enzovoort  niet insluiten in e-mailnotificaties die door deze website verzonden worden, voor de bescherming van je privacy.";
-$a->strings["Disallow public access to addons listed in the apps menu."] = "Publieke toegang ontzeggen tot addons die opgelijst zijn in het applicatie menu.";
-$a->strings["Checking this box will restrict addons listed in the apps menu to members only."] = "Dit vakje aanvinken zal de lijst van addons in het applicatie menu beperken tot alleen leden.";
-$a->strings["Don't embed private images in posts"] = "Privé beelden in berichten niet inwerken";
-$a->strings["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 photos will have to authenticate and load each image, which may take a while."] = "Vervang lokaal gehoste privé foto's in berichten niet door een ingewerkte kopie van het beeld. Dit betekent dat contacten die berichten krijgen met privé foto's zullen moeten authentificeren en elk beeld apart laden, wat een tijdje kan duren.";
-$a->strings["Explicit Content"] = "Expliciete inhoud";
-$a->strings["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 node information and might be used, e.g. by the global directory, to filter your node from listings of nodes to join. Additionally a note about this will be shown at the user registration page."] = "Vink dit aan om aan te duiden dat deze node veel expliciet materiaal verspreid en niet bedoeld is voor minderjarigen. Deze info zal gepubliceert worden bij de node-info en kan vb. gebruikt worden voor een filter in de globale lijst. Dit word ook getoont naar de gebruiker op de registratie pagina.";
-$a->strings["Allow Users to set remote_self"] = "Sta Gebruikers toe om remote_self te configureren";
-$a->strings["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."] = "Als je dit aanvinkt, dan mag elke gebruiker elke contact als remote_self aanduiden in de 'herstel contact' dialoog. Deze vlag aanzetten voor een contact zorgt ervoor dat elke bericht van dit contact gespiegeld wordt in de gebruiker zijn of haar stroom. ";
-$a->strings["Block multiple registrations"] = "Blokkeer meerdere registraties";
-$a->strings["Disallow users to register additional accounts for use as pages."] = "Laat niet toe dat gebruikers meerdere accounts aanmaken.";
-$a->strings["OpenID support"] = "OpenID ondersteuning";
-$a->strings["OpenID support for registration and logins."] = "OpenID ondersteuning voor registraties en logins.";
-$a->strings["Fullname check"] = "Controleer volledige naam";
-$a->strings["Force users to register with a space between firstname and lastname in Full name, as an antispam measure"] = "Verplicht gebruikers om zich te registreren met een spatie tussen voornaam en achternaam, als anti-spam maatregel";
-$a->strings["Community pages for visitors"] = "Groepspagina voor bezoekers";
-$a->strings["Which community pages should be available for visitors. Local users always see both pages."] = "Welke groepspagina's moeten beschikbaar zijn voor bezoekers. Lokale gebruikers zien altijd beide pagina's.";
-$a->strings["Posts per user on community page"] = "Berichten per gebruiker op de groepspagina";
-$a->strings["The maximum number of posts per user on the community page. (Not valid for 'Global Community')"] = "Het maximum aantal berichten per gebruiker op de groepspagina. (Niet geldig voor 'Globale Gemeenschap')";
-$a->strings["Enable OStatus support"] = "OStatus ondersteuning activeren";
-$a->strings["Provide built-in OStatus (StatusNet, GNU Social etc.) compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed."] = "Verschaf ingebouwde OStatus (StatusNet, GNU Social enz.) compatibiliteit. Alle communicatie in OStatus is publiek, dus privacy waarschuwingen zullen occasioneel getoond worden.";
-$a->strings["Only import OStatus/ActivityPub threads from our contacts"] = "Importeer enkel OStatus/ActivityPub gesprekken van contacten.";
-$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."] = "Normaal importeren we alle inhoud van OStatus en ActivityPub contacten. Met deze optie slaan we enkel gesprekken op die zijn gestart door een contact dat gekend is op deze server.";
-$a->strings["OStatus support can only be enabled if threading is enabled."] = "OStatus ondersteuning kan alleen geactiveerd worden als de gespreksstroom geactiveerd is.";
-$a->strings["Diaspora support can't be enabled because Friendica was installed into a sub directory."] = "Diaspora ondersteuning is niet mogelijk omdat Friendica in een sub folder geïnstalleerd is.";
-$a->strings["Enable Diaspora support"] = "Diaspora ondersteuning activeren";
-$a->strings["Provide built-in Diaspora network compatibility."] = "Bied ingebouwde ondersteuning voor het Diaspora netwerk.";
-$a->strings["Only allow Friendica contacts"] = "Laat alleen Friendica contacten toe";
-$a->strings["All contacts must use Friendica protocols. All other built-in communication protocols disabled."] = "Alle contacten moeten een Friendica protocol gebruiken. Alle andere ingebouwde communicatieprotocols worden uitgeschakeld.";
-$a->strings["Verify SSL"] = "Controleer SSL";
-$a->strings["If you wish, you can turn on strict certificate checking. This will mean you cannot connect (at all) to self-signed SSL sites."] = "Als je wilt kun je striktere certificaat controle activeren. Dit betekent dat je (totaal) niet kunt connecteren met sites die zelf-ondertekende SSL certificaten gebruiken.";
-$a->strings["Proxy user"] = "Proxy-gebruiker";
-$a->strings["Proxy URL"] = "Proxy-URL";
-$a->strings["Network timeout"] = "Netwerk timeout";
-$a->strings["Value is in seconds. Set to 0 for unlimited (not recommended)."] = "Waarde is in seconden. Zet op 0 voor onbeperkt (niet aanbevolen).";
-$a->strings["Maximum Load Average"] = "Maximum gemiddelde belasting";
-$a->strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "Maximum systeembelasting voordat aflever- en poll-processen uitgesteld worden - standaard 50.";
-$a->strings["Maximum Load Average (Frontend)"] = "Maximum Gemiddelde Belasting (Frontend)";
-$a->strings["Maximum system load before the frontend quits service - default 50."] = "Maximum systeem belasting wanneer de frontend ermee ophoudt - standaard waarde 50.";
-$a->strings["Minimal Memory"] = "Minimaal Geheugen";
-$a->strings["Minimal free memory in MB for the worker. Needs access to /proc/meminfo - default 0 (deactivated)."] = "Minimum vrij geheugen in MB voor de worker. Toegang nodig tot /proc/meminfo - standaard waarde 0 (gedeactiveerd).";
-$a->strings["Maximum table size for optimization"] = "Maximum tabel grootte voor optimisatie";
-$a->strings["Maximum table size (in MB) for the automatic optimization. Enter -1 to disable it."] = "Maximum tabel grootte (in MB) voor de automatisch optimisatie. Geef -1 op om dit te deactiveren.";
-$a->strings["Minimum level of fragmentation"] = "Minimum niveau van fragmentatie";
-$a->strings["Minimum fragmenation level to start the automatic optimization - default value is 30%."] = "Minimum fragmentatie niveau om de automatische optimisatie te starten - standaard waarde is 30%.";
-$a->strings["Periodical check of global contacts"] = "Regematige controle van de globale contacten";
-$a->strings["If enabled, the global contacts are checked periodically for missing or outdated data and the vitality of the contacts and servers."] = "Als dit geactiveerd is, dan worden de globale contacten regelmatig gecheckt naar ontbrekende of verlopen data and the vitaliteit van de contacten en servers.";
-$a->strings["Days between requery"] = "Dagen tussen herbevraging";
-$a->strings["Number of days after which a server is requeried for his contacts."] = "Aantal dagen waarna de server opnieuw bevraagd wordt naar zijn contacten.";
-$a->strings["Discover contacts from other servers"] = "Ontdek contacten van andere servers";
-$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'."] = "Bevraag andere servers regelmatig naar contacten. Je kan kiezen tussen 'gebruikers': de gebruikers op het remote systeem, 'Globale contacten': actieve contacten die gekend zijn op het systeem. De noodoplossing is bedoeld voor Redmatrix servers en oude Friendica servers, waarop globale contacten niet bestonden. De noodoplossing veroorzaakt meer belasting van de server, dus de aanbevolen configuratie is 'Gebruikers, Globale contacten'.";
-$a->strings["Timeframe for fetching global contacts"] = "Tijdspanne voor het ophalen van globale contacten";
-$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."] = "Wanneer ontdekking is geactiveerd, dan definieert deze waarde de tijdspanne voor de activiteit van globale contacten die opgehaald worden van andere servers.";
-$a->strings["Search the local directory"] = "Doorzoek de lokale gids";
-$a->strings["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."] = "Doorzoek de lokale gids in plaats van de globale gids. Bij lokale doorzoeking wordt elke opzoeking in de globale gids op de achtergrond uitgevoerd. Dit verbetert de zoekresultaten wanneer de zoekopdracht herhaald wordt.";
-$a->strings["Publish server information"] = "Publiceer server informatie";
-$a->strings["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 profiles, number of posts and the activated protocols and connectors. See <a href='http://the-federation.info/'>the-federation.info</a> for details."] = "Als deze optie geactiveerd is, dan zal algemene server en gebruiksdata gepubliceerd worden. De data bevat de naam en versie van de server, het aantal gebruikers met publieke profielen, het aantal berichten en de geactiveerd protocollen en connectoren. Zie <a href='http://the-federation.info/'>the-federation.info</a> voor details.";
-$a->strings["Check upstream version"] = "Controleer upstream versie";
-$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."] = "Activeer het controleren op nieuwe versies van Friendica bij github. Als er een nieuwe versie is, dan word je geïnformeerd in the administratie paneel.";
-$a->strings["Suppress Tags"] = "Onderdruk Tags";
-$a->strings["Suppress showing a list of hashtags at the end of the posting."] = "Onderdruk het tonen van een lijst van hastags op het einde van het bericht.";
-$a->strings["Clean database"] = "Database opruimen";
-$a->strings["Remove old remote items, orphaned database records and old content from some other helper tables."] = "Verwijder oude remote items, database weesrecords en oude content van andere helper tabellen.";
-$a->strings["Lifespan of remote items"] = "Levensduur van 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."] = "Als de database opruiming is geactiveerd, dan definieert dit na hoeveel dagen remote items verwijderd zullen worden. Eigen items, en gemarkeerde of opgeslagen items worden altijd behouden. 0 deactiveert dit gedrag.";
-$a->strings["Lifespan of unclaimed items"] = "Levensduur van niet geclaimde 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."] = "Als de database opruiming geactiveerd is, dan definieert dit na hoeveel dagen ongeclaimde remote items (meestal content van een relais) zal verwijderd worden. Standaard waarde is 90 dagen. Als de waarde 0 is, dan is de waarde gelijk aan de algemene levensduur van remote items.";
-$a->strings["Lifespan of raw conversation data"] = "Levenstijd van ruwe gespreksdata";
-$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."] = "De gespreksdata word gebruikt voor ActivityPub, OStatus en voor debugging doeleinden. Het is veilig om dit na 14 dagen te verwijderen. Standaard staat dit op 90 dagen.";
-$a->strings["Path to item cache"] = "Pad naar cache voor items";
-$a->strings["The item caches buffers generated bbcode and external images."] = "Item caches bufferen gegenereerde bbcodes en externe beelden.";
-$a->strings["Cache duration in seconds"] = "Cache tijdsduur in seconden";
-$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."] = "Hoe lang moeten de cache bestanden bijgehouden worden? Standaard waarde is 86400 seconden (een dag). Zet de waarde op -1 om de item cache te deactiveren.";
-$a->strings["Maximum numbers of comments per post"] = "Maximum aantal reacties per bericht";
-$a->strings["How much comments should be shown for each post? Default value is 100."] = "Hoeveel reacties moeten getoond worden per bericht? Standaard waarde is 100.";
-$a->strings["Temp path"] = "Tijdelijk pad";
-$a->strings["If you have a restricted system where the webserver can't access the system temp path, enter another path here."] = "Als je een systeem met restricties hebt waarbij de webserver geen toegang heeft tot het systeem pad, geef hier dan een ander pad in. ";
-$a->strings["Base path to installation"] = "Basispad voor installatie";
-$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."] = "Als het systeem het correcte pad naar je installatie niet kan detecteren, geef hier dan het correcte pad in. Deze instelling zou alleen geconfigureerd moeten worden als je een systeem met restricties hebt en symbolische links naar je webroot.";
-$a->strings["Disable picture proxy"] = "Schakel beeld proxy uit";
-$a->strings["The picture proxy increases performance and privacy. It shouldn't be used on systems with very low bandwidth."] = "De beeld proxy verhoogt de performantie en privacy. Gebruik dit niet op systemen met erg lage bandbreedte.";
-$a->strings["Only search in tags"] = "Zoek alleen in tags";
-$a->strings["On large systems the text search can slow down the system extremely."] = "Het opzoeken van tekst kan grote systemen extreem vertragen.";
-$a->strings["New base url"] = "Nieuwe basis url";
-$a->strings["Change base url for this server. Sends relocate message to all Friendica and Diaspora* contacts of all users."] = "Verander de basis url voor deze server. Stuurt een verhuis boodschap naar all Friendica en Diaspora* contacten.";
-$a->strings["RINO Encryption"] = "RINO encryptie";
-$a->strings["Encryption layer between nodes."] = "Encryptie laag tussen nodes.";
-$a->strings["Enabled"] = "Geactiveerd";
-$a->strings["Maximum number of parallel workers"] = "Maximum aantal parallelle workers";
-$a->strings["On shared hosters set this to %d. On larger systems, values of %d are great. Default value is %d."] = "Op gedeelde hosts zet dit op %d. Op grotere systemen, waarden als %d zijn goed. standaard waarde is %d";
-$a->strings["Don't use 'proc_open' with the worker"] = "Gebruik 'proc_open' niet met de worker";
-$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."] = "Activeer dit als je systeem het gebruik van 'proc_open' niet toelaat. Dit kan het geval zijn op gedeelde hosts. Als dit geactiveerd is, dan verhoog je best ook de frequentie van de oproepen naar de workers in je crontab.";
-$a->strings["Enable fastlane"] = "Activeer fastlane";
-$a->strings["When enabed, the fastlane mechanism starts an additional worker if processes with higher priority are blocked by processes of lower priority."] = "Als deze parameter geactiveerd is, dan start het fastlane mechanisme een bijkomende worker als processen met hogere prioriteit geblokkeerd worden door processen met een lagere prioriteit.";
-$a->strings["Enable frontend worker"] = "Activeer 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."] = "Als deze parameter geactiveerd is, dan wordt het Worker proces getriggerd wanneer toegang wordt verkregen tot de backend \\x28bvb. boodschappen die geleverd worden\\x29. Op kleinere sites zal je mogelijks opteren om %s/worker op regelmatige basis via een externe geplande taak op te roepen. Activeer deze optie alleen als je cron/geplande taken op je server niet kan gebruiken.";
-$a->strings["Subscribe to relay"] = "Schrijf in op relais";
-$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."] = "Activeert het ontvangen van publieke berichten vanwege de relais. Ze zullen inbegrepen zijn in de zoekresultaten, tags waarop je ingeschreven bent en op de globale groepspagina.";
-$a->strings["Relay server"] = "Relais server";
-$a->strings["Address of the relay server where public posts should be send to. For example https://relay.diasp.org"] = "Adres van de relais server waar publieke berichten naartoe moeten gezonden worden. Bijvoorbeeld https://relay.diasp.org";
-$a->strings["Direct relay transfer"] = "Directe relais transfer";
-$a->strings["Enables the direct transfer to other servers without using the relay servers"] = "Activeert directe relais transfer naar andere servers zonder gebruik van relais servers";
-$a->strings["Relay scope"] = "Scope van de relais";
-$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."] = "Kan 'alle' of 'tags' zijn. 'alle' betekent dat elk publiek bericht ontvangen moet worden. 'tags' betekent dat alleen berichten met geselecteerde tags moeten ontvangen worden.";
-$a->strings["all"] = "alle";
-$a->strings["tags"] = "tags";
-$a->strings["Server tags"] = "Server tags";
-$a->strings["Comma separated list of tags for the 'tags' subscription."] = "Door komma's gescheiden lijst van tags voor de 'tags' inschrijving.";
-$a->strings["Allow user tags"] = "Sta gebruiker tags toe.";
-$a->strings["If enabled, the tags from the saved searches will used for the 'tags' subscription in addition to the 'relay_server_tags'."] = "Als deze parameter geactiveerd is, dan zullen de tags uit de opgeslagen zoekresultaten gebruikt worden voor de 'tags' inschrijving bovenop de 'relais_server_tags'.";
-$a->strings["Start Relocation"] = "Start verhuis";
-$a->strings["Update has been marked successful"] = "Wijziging succesvol gemarkeerd ";
-$a->strings["Database structure update %s was successfully applied."] = "Database structuur update %s werd met succes toegepast.";
-$a->strings["Executing of database structure update %s failed with error: %s"] = "Uitvoering van de database structuur update %s is mislukt met fout: %s";
-$a->strings["Executing %s failed with error: %s"] = "Uitvoering van %s mislukt met fout: %s";
-$a->strings["Update %s was successfully applied."] = "Wijziging %s geslaagd.";
-$a->strings["Update %s did not return a status. Unknown if it succeeded."] = "Wijziging %s gaf geen status terug. We weten niet of de wijziging geslaagd is.";
-$a->strings["There was no additional update function %s that needed to be called."] = "Er was geen bijkomende update functie %s die moest opgeroepen worden.";
-$a->strings["No failed updates."] = "Geen mislukte wijzigingen";
-$a->strings["Check database structure"] = "Controleer de database structuur";
-$a->strings["Failed Updates"] = "Mislukte wijzigingen";
-$a->strings["This does not include updates prior to 1139, which did not return a status."] = "Dit is zonder de wijzigingen voor 1139, welke geen status teruggaven.";
-$a->strings["Mark success (if update was manually applied)"] = "Markeren als succes (als aanpassing manueel doorgevoerd werd)";
-$a->strings["Attempt to execute this update step automatically"] = "Probeer deze stap automatisch uit te voeren";
-$a->strings["\n\t\t\tDear %1\$s,\n\t\t\t\tthe administrator of %2\$s has set up an account for you."] = "\n\t\t\tBeste %1\$s,\n\t\t\t\tde beheerder van %2\$s heeft een account aangemaakt voor jou.";
-$a->strings["\n\t\t\tThe login details are as follows:\n\n\t\t\tSite Location:\t%1\$s\n\t\t\tLogin Name:\t\t%2\$s\n\t\t\tPassword:\t\t%3\$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 %1\$s/removeme\n\n\t\t\tThank you and welcome to %4\$s."] = "\n\t\t\tDe login details zijn de volgende:\n\n\t\t\tSite Locatie:\t%1\$s\n\t\t\tLogin Naam:\t\t%2\$s\n\t\t\tPaswoord:\t\t%3\$s\n\n\t\t\tJe kan je paswoord in je account \"Instellingen\" pagina aanpassen \nnadat je ingelogd bent\n\t\t\tNeem alstublieft een ogenblik om de andere account instellingen op die pagina na te kijken.\n\n\t\t\tMisschien wil je ook wat basis informatie toevoegen aan je standaard profiel\n\t\t\t(op de \"Profielen\" pagina) zodat anderen je gemakkelijk kunnen terugvinden.\n\n\t\t\tWe raden aan je volledige naam in te stellen, een profiel foto toe te voegen,\n\t\t\tenkele \"sleutelwoorden\" toe te voegen (zeer handig om nieuwe vrienden te maken) - en\n\t\t\tmisschien ook in welk land je woont; als je liever niet specifieker \nbent dan dat.\n\n\n\t\t\tWe respecteren ten volle je recht op privacy, en geen van deze items is verplicht.\n\t\t\tAls je nieuw bent hier en niemand kent, dan kunnen zij je mogelijks helpen\n\t\t\tom enkele nieuwe en interessante vrienden te leren kennen.\n\n\t\t\tAls je ooit je account wil verwijderen, dan kan dat via %1\$s/removeme\n\n\t\t\tBedankt en welkom bij %4\$s.";
-$a->strings["Registration details for %s"] = "Registratie details voor %s";
-$a->strings["%s user blocked/unblocked"] = [
-       0 => "%s gebruiker geblokkeerd/niet geblokkeerd",
-       1 => "%s gebruikers geblokkeerd/niet geblokkeerd",
-];
-$a->strings["You can't remove yourself"] = "Je kan jezelf niet verwijderen";
-$a->strings["%s user deleted"] = [
-       0 => "%s gebruiker verwijderd",
-       1 => "%s gebruikers verwijderd",
-];
-$a->strings["User '%s' deleted"] = "Gebruiker '%s' verwijderd";
-$a->strings["User '%s' unblocked"] = "Gebruiker '%s' niet meer geblokkeerd";
-$a->strings["User '%s' blocked"] = "Gebruiker '%s' geblokkeerd";
-$a->strings["Normal Account Page"] = "Normale accountpagina";
-$a->strings["Soapbox Page"] = "Zeepkist-pagina";
-$a->strings["Public Forum"] = "Publiek Forum";
-$a->strings["Automatic Friend Page"] = "Automatisch Vriendschapspagina";
-$a->strings["Private Forum"] = "Privé Forum";
-$a->strings["Personal Page"] = "Persoonlijke pagina";
-$a->strings["Organisation Page"] = "Organisatie Pagina";
-$a->strings["News Page"] = "Nieuws pagina";
-$a->strings["Community Forum"] = "Groepsforum";
-$a->strings["Email"] = "E-mail";
-$a->strings["Register date"] = "Registratiedatum";
-$a->strings["Last login"] = "Laatste login";
-$a->strings["Last item"] = "Laatste item";
-$a->strings["Type"] = "Type";
-$a->strings["Add User"] = "Gebruiker toevoegen";
-$a->strings["User registrations waiting for confirm"] = "Gebruikersregistraties wachten op een bevestiging";
-$a->strings["User waiting for permanent deletion"] = "Gebruiker wacht op permanente verwijdering";
-$a->strings["Request date"] = "Registratiedatum";
-$a->strings["No registrations."] = "Geen registraties.";
-$a->strings["Note from the user"] = "Nota van de gebruiker";
-$a->strings["Approve"] = "Goedkeuren";
-$a->strings["Deny"] = "Weiger";
-$a->strings["User blocked"] = "Gebruiker geblokeerd";
-$a->strings["Site admin"] = "Sitebeheerder";
-$a->strings["Account expired"] = "Account verlopen";
-$a->strings["New User"] = "Nieuwe gebruiker";
-$a->strings["Delete in"] = "Verwijderen in ";
-$a->strings["Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Geselecteerde gebruikers zullen verwijderd worden!\\n\\nAlles wat deze gebruikers gepost hebben op deze website zal permanent verwijderd worden!\\n\\nBen je zeker?";
-$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?"] = "De gebruiker {0} zal verwijderd worden!\\n\\nAlles wat deze gebruiker gepost heeft op deze website zal permanent verwijderd worden!\\n\\nBen je zeker?";
-$a->strings["Name of the new user."] = "Naam van nieuwe gebruiker";
-$a->strings["Nickname"] = "Bijnaam";
-$a->strings["Nickname of the new user."] = "Bijnaam van nieuwe gebruiker";
-$a->strings["Email address of the new user."] = "E-mailadres van nieuwe gebruiker";
-$a->strings["Addon %s disabled."] = "Addon %s gedeactiveerd";
-$a->strings["Addon %s enabled."] = "Addon %s geactiveerd";
-$a->strings["Disable"] = "Uitschakelen";
-$a->strings["Enable"] = "Inschakelen";
-$a->strings["Toggle"] = "Schakelaar";
-$a->strings["Settings"] = "Instellingen";
-$a->strings["Author: "] = "Auteur:";
-$a->strings["Maintainer: "] = "Onderhoud:";
-$a->strings["Reload active addons"] = "Herlaad actieve 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"] = "Er zijn op je node momenteel geen addons beschikbaar. Je kan de officiële addon repository vinden op %1\$s en je kan mogelijks nog andere interessante addons vinden in de open addon registry op %2\$s";
-$a->strings["No themes found."] = "Geen thema's gevonden.";
-$a->strings["Screenshot"] = "Schermafdruk";
-$a->strings["Reload active themes"] = "Herlaad actieve thema's";
-$a->strings["No themes found on the system. They should be placed in %1\$s"] = "Geen thema's gevonden op het systeem. Ze zouden zich moeten bevinden in %1\$s";
-$a->strings["[Experimental]"] = "[Experimenteel]";
-$a->strings["[Unsupported]"] = "[Niet ondersteund]";
-$a->strings["Log settings updated."] = "Log instellingen opgeslagen";
-$a->strings["PHP log currently enabled."] = "PHP log momenteel geactiveerd";
-$a->strings["PHP log currently disabled."] = "PHP log momenteel gedeactiveerd";
-$a->strings["Clear"] = "Wis";
-$a->strings["Enable Debugging"] = "Activeer Debugging";
-$a->strings["Log file"] = "Logbestand";
-$a->strings["Must be writable by web server. Relative to your Friendica top-level directory."] = "De webserver moet hier kunnen schrijven. Relatief t.o.v. de hoogste folder binnen je Friendica-installatie.";
-$a->strings["Log level"] = "Log niveau";
-$a->strings["PHP logging"] = "PHP logging";
-$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."] = "Om logging van PHP fouten en waarschuwingen te activeren, kan je het volgende toevoegen aan het begin van je index.php bestand van je installatie. De naam van het bestand die ingesteld is in de 'error_log' lijn is relatief tegenover de friendica top-level folder en de server moet erin kunnen schrijven. De optie '1' voor 'log_errors' en 'display_errors' activeert deze opties, configureer '0' om ze te deactiveren. ";
-$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."] = "Fout bij het openen van log file <strong>%1\$s</strong> .\\r\\n<br/>Kijk na of bestand %1\$s bestaat en mag gelezen worden.";
-$a->strings["Couldn't open <strong>%1\$s</strong> log file.\\r\\n<br/>Check to see if file %1\$s is readable."] = "Kon log file <strong>%1\$s</strong> niet openen.\\r\\n<br/>Kijk na of bestand %1\$s mag gelezen worden.";
-$a->strings["Off"] = "Uit";
-$a->strings["On"] = "Aan";
-$a->strings["Lock feature %s"] = "Fixeer feature %s ";
-$a->strings["Manage Additional Features"] = "Beheer Bijkomende Features";
-$a->strings["No friends to display."] = "Geen vrienden om te laten zien.";
+$a->strings["Status Messages and Posts"] = "Berichten op jouw tijdlijn";
+$a->strings["[Embedded content - reload page to view]"] = "[Ingebedde inhoud - herlaad pagina om het te bekijken]";
+$a->strings["Invalid request."] = "Ongeldige aanvraag.";
+$a->strings["Sorry, maybe your upload is bigger than the PHP configuration allows"] = "Sorry, je op te laden bestand is groter dan deze PHP configuratie toelaat";
+$a->strings["Or - did you try to upload an empty file?"] = "Of - probeerde je een lege file op te laden?";
+$a->strings["File exceeds size limit of %s"] = "Bestand is groter dan de limiet ( %s )";
+$a->strings["File upload failed."] = "Uploaden van bestand mislukt.";
+$a->strings["Image exceeds size limit of %s"] = "Beeld is groter dan de limiet ( %s )";
+$a->strings["Unable to process image."] = "Niet in staat om de afbeelding te verwerken";
+$a->strings["Wall Photos"] = "Tijdlijn foto's";
+$a->strings["Image upload failed."] = "Uploaden van afbeelding mislukt.";
+$a->strings["Number of daily wall messages for %s exceeded. Message failed."] = "Maximum aantal dagelijkse tijdlijn boodschappen van %s overschreden. Kon boodschap niet plaatsen.";
+$a->strings["No recipient selected."] = "Geen ontvanger geselecteerd.";
+$a->strings["Unable to check your home location."] = "Niet in staat om je tijdlijn-locatie vast te stellen";
+$a->strings["Message could not be sent."] = "Bericht kon niet verzonden worden.";
+$a->strings["Message collection failure."] = "Fout bij het verzamelen van berichten.";
+$a->strings["Message sent."] = "Bericht verzonden.";
+$a->strings["No recipient."] = "Geen ontvanger.";
+$a->strings["Please enter a link URL:"] = "Vul een internetadres/URL in:";
+$a->strings["Send Private Message"] = "Verstuur privébericht";
+$a->strings["If you wish for %s to respond, please check that the privacy settings on your site allow private mail from unknown senders."] = "Als je wilt dat %s antwoordt moet je nakijken dat de privacy-instellingen op jouw website privéberichten van onbekende afzenders toelaat.";
+$a->strings["To:"] = "Aan:";
+$a->strings["Subject:"] = "Onderwerp:";
+$a->strings["Your message:"] = "Jouw bericht:";
+$a->strings["Insert web link"] = "Voeg een webadres in";
+$a->strings["No keywords to match. Please add keywords to your default profile."] = "Geen sleutelwoorden om te zoeken. Voeg sleutelwoorden toe aan je standaard profiel.";
 $a->strings["Connect"] = "Verbinden";
-$a->strings["Authorize application connection"] = "Verbinding met de applicatie goedkeuren";
-$a->strings["Return to your app and insert this Securty Code:"] = "Keer terug naar jouw app en voeg deze beveiligingscode in:";
-$a->strings["Please login to continue."] = "Log in om verder te gaan.";
-$a->strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Wil je deze toepassing toestemming geven om jouw berichten en contacten in te kijken, en/of nieuwe berichten in jouw plaats aan te maken?";
-$a->strings["No"] = "Nee";
-$a->strings["You must be logged in to use addons. "] = "Je moet ingelogd zijn om deze addons te kunnen gebruiken. ";
-$a->strings["Applications"] = "Toepassingen";
-$a->strings["No installed applications."] = "Geen toepassingen geïnstalleerd";
-$a->strings["Item not available."] = "Item niet beschikbaar";
-$a->strings["Item was not found."] = "Item niet gevonden";
-$a->strings["Source input"] = "Bron input";
-$a->strings["BBCode::toPlaintext"] = "BBCode::toPlaintext";
-$a->strings["BBCode::convert (raw HTML)"] = "BBCode::convert (raw 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["Source input (Diaspora format)"] = "Bron ingave (Diaspora formaat):";
-$a->strings["Markdown::convert (raw HTML)"] = "Markdown::convert (Ruwe HTML)";
-$a->strings["Markdown::convert"] = "Markdown::convert";
-$a->strings["Markdown::toBBCode"] = "Markdown::toBBCode";
-$a->strings["Raw HTML input"] = "Onverwerkte HTML input";
-$a->strings["HTML Input"] = "HTML Input";
-$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 (Ruwe HTML)";
-$a->strings["HTML::toMarkdown"] = "HTML::toMarkdown";
-$a->strings["HTML::toPlaintext"] = "HTML::toPlaintext";
-$a->strings["Source text"] = "Brontekst";
-$a->strings["BBCode"] = "BBCode";
-$a->strings["Markdown"] = "Markdown";
-$a->strings["HTML"] = "HTML";
-$a->strings["Login"] = "Login";
-$a->strings["Bad Request"] = "Bad Request";
-$a->strings["The post was created"] = "Het bericht is aangemaakt";
+$a->strings["first"] = "eerste";
+$a->strings["next"] = "volgende";
+$a->strings["No matches"] = "Geen resultaten";
+$a->strings["Profile Match"] = "Profielmatch";
+$a->strings["Profile not found."] = "Profiel niet gevonden";
+$a->strings["Profile deleted."] = "Profiel verwijderd";
+$a->strings["Profile-"] = "Profiel-";
+$a->strings["New profile created."] = "Nieuw profiel aangemaakt.";
+$a->strings["Profile unavailable to clone."] = "Profiel niet beschikbaar om te klonen.";
+$a->strings["Profile Name is required."] = "Profielnaam is vereist.";
+$a->strings["Marital Status"] = "Echtelijke staat";
+$a->strings["Romantic Partner"] = "Romantische Partner";
+$a->strings["Work/Employment"] = "Werk";
+$a->strings["Religion"] = "Godsdienst";
+$a->strings["Political Views"] = "Politieke standpunten";
+$a->strings["Gender"] = "Geslacht";
+$a->strings["Sexual Preference"] = "Seksuele Voorkeur";
+$a->strings["XMPP"] = "XMPP";
+$a->strings["Homepage"] = "Tijdlijn";
+$a->strings["Interests"] = "Interesses";
+$a->strings["Address"] = "Adres";
+$a->strings["Location"] = "Plaats";
+$a->strings["Profile updated."] = "Profiel opgeslagen";
+$a->strings["Hide contacts and friends:"] = "Verberg contacten en vrienden:";
+$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Je vrienden/contacten verbergen voor bezoekers van dit profiel?";
+$a->strings["Show more profile fields:"] = "Toon meer profiel velden:";
+$a->strings["Profile Actions"] = "Profiel Acties";
+$a->strings["Edit Profile Details"] = "Profieldetails bewerken";
+$a->strings["Submit"] = "Opslaan";
+$a->strings["Change Profile Photo"] = "Profielfoto wijzigen";
+$a->strings["View this profile"] = "Dit profiel bekijken";
+$a->strings["View all profiles"] = "Toon alle profielen";
+$a->strings["Edit visibility"] = "Pas zichtbaarheid aan";
+$a->strings["Create a new profile using these settings"] = "Nieuw profiel aanmaken met deze instellingen";
+$a->strings["Clone this profile"] = "Dit profiel klonen";
+$a->strings["Delete this profile"] = "Dit profiel verwijderen";
+$a->strings["Basic information"] = "Basis informatie";
+$a->strings["Profile picture"] = "Profiel foto";
+$a->strings["Preferences"] = "Voorkeuren";
+$a->strings["Status information"] = "Status informatie";
+$a->strings["Additional information"] = "Bijkomende informatie";
+$a->strings["Personal"] = "Persoonlijk";
+$a->strings["Relation"] = "Relatie";
+$a->strings["Miscellaneous"] = "Diversen";
+$a->strings["Upload Profile Photo"] = "Profielfoto uploaden";
+$a->strings["Your Gender:"] = "Je Geslacht:";
+$a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "<span class=\"heart\">&hearts;</span> Echtelijke Staat:";
+$a->strings["Sexual Preference:"] = "Seksuele Voorkeur:";
+$a->strings["Example: fishing photography software"] = "Voorbeeld: vissen fotografie software";
+$a->strings["Profile Name:"] = "Profiel Naam:";
+$a->strings["Required"] = "Vereist";
+$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "Dit is jouw <strong>publiek</strong> profiel.<br />Het <strong>kan</strong> zichtbaar zijn voor iedereen op het internet.";
+$a->strings["Your Full Name:"] = "Je volledige naam:";
+$a->strings["Title/Description:"] = "Titel/Beschrijving:";
+$a->strings["Street Address:"] = "Postadres:";
+$a->strings["Locality/City:"] = "Gemeente/Stad:";
+$a->strings["Region/State:"] = "Regio/Staat:";
+$a->strings["Postal/Zip Code:"] = "Postcode:";
+$a->strings["Country:"] = "Land:";
+$a->strings["Age: "] = "Leeftijd:";
+$a->strings["Who: (if applicable)"] = "Wie: (indien toepasbaar)";
+$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Voorbeelden: Kathleen123, Kathleen Peeters, kathleen@voorbeeld.nl";
+$a->strings["Since [date]:"] = "Sinds [datum]:";
+$a->strings["Tell us about yourself..."] = "Vertel iets over jezelf...";
+$a->strings["XMPP (Jabber) address:"] = "XMPP (Jabber) adres:";
+$a->strings["The XMPP address will be propagated to your contacts so that they can follow you."] = "Het XMPP adres zal doorgegeven worden aan je contacten zodat zij je kunnen volgen.";
+$a->strings["Homepage URL:"] = "Adres tijdlijn:";
+$a->strings["Hometown:"] = "Woonplaats:";
+$a->strings["Political Views:"] = "Politieke standpunten:";
+$a->strings["Religious Views:"] = "Geloof:";
+$a->strings["Public Keywords:"] = "Publieke Sleutelwoorden:";
+$a->strings["(Used for suggesting potential friends, can be seen by others)"] = "(Gebruikt om mogelijke vrienden voor te stellen, kan door anderen gezien worden)";
+$a->strings["Private Keywords:"] = "Privé Sleutelwoorden:";
+$a->strings["(Used for searching profiles, never shown to others)"] = "(Gebruikt om profielen te zoeken, nooit aan anderen getoond)";
+$a->strings["Likes:"] = "Houdt van:";
+$a->strings["Dislikes:"] = "Houdt niet van:";
+$a->strings["Musical interests"] = "Muzikale interesses";
+$a->strings["Books, literature"] = "Boeken, literatuur";
+$a->strings["Television"] = "Televisie";
+$a->strings["Film/dance/culture/entertainment"] = "Film/dans/cultuur/ontspanning";
+$a->strings["Hobbies/Interests"] = "Hobby's/Interesses";
+$a->strings["Love/romance"] = "Liefde/romance";
+$a->strings["Work/employment"] = "Werk";
+$a->strings["School/education"] = "School/opleiding";
+$a->strings["Contact information and Social Networks"] = "Contactinformatie en sociale netwerken";
+$a->strings["Profile Image"] = "Profiel afbeelding";
+$a->strings["visible to everybody"] = "zichtbaar voor iedereen";
+$a->strings["Edit/Manage Profiles"] = "Wijzig/Beheer Profielen";
+$a->strings["Change profile photo"] = "Profiel foto wijzigen";
+$a->strings["Create New Profile"] = "Maak nieuw profiel";
 $a->strings["Access denied."] = "Toegang geweigerd";
-$a->strings["Page not found."] = "Pagina niet gevonden";
 $a->strings["Access to this profile has been restricted."] = "Toegang tot dit profiel is beperkt.";
 $a->strings["Events"] = "Gebeurtenissen";
 $a->strings["View"] = "Beeld";
@@ -679,8 +411,6 @@ $a->strings["Global Community"] = "Globale gemeenschap";
 $a->strings["Posts from users of the whole federated network"] = "Berichten van gebruikers van het hele gefedereerde netwerk";
 $a->strings["No results."] = "Geen resultaten.";
 $a->strings["This community stream shows all public posts received by this node. They may not reflect the opinions of this node’s users."] = "Deze groepsstroom toont alle publieke berichten die deze node ontvangen heeft. Ze kunnen mogelijks niet de mening van de gebruikers van deze node weerspiegelen.";
-$a->strings["Credits"] = "Credits";
-$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 is een gemeenschapsproject dat niet mogelijk zou zijn zonder de hulp van vele mensen.  Hier is een lijst van alle mensen die aan de code of vertalingen van Friendica hebben meegewerkt.  Allen van harte bedankt!";
 $a->strings["Contact settings applied."] = "Contactinstellingen toegepast.";
 $a->strings["Contact update failed."] = "Aanpassen van contact mislukt.";
 $a->strings["Contact not found."] = "Contact niet gevonden";
@@ -691,33 +421,19 @@ $a->strings["Mirror as forwarded posting"] = "Spiegel als geforward bericht";
 $a->strings["Mirror as my own posting"] = "Spiegel als mijn eigen bericht";
 $a->strings["Return to contact editor"] = "Ga terug naar contactbewerker";
 $a->strings["Refetch contact data"] = "Contact data opnieuw ophalen";
-$a->strings["Submit"] = "Opslaan";
 $a->strings["Remote Self"] = "Mijn identiteit elders";
 $a->strings["Mirror postings from this contact"] = "Berichten van dit contact spiegelen";
 $a->strings["Mark this contact as remote_self, this will cause friendica to repost new entries from this contact."] = "Markeer dit contact als remote_self, hierdoor zal friendica nieuwe berichten van dit contact opnieuw posten.";
+$a->strings["Name"] = "Naam";
 $a->strings["Account Nickname"] = "Bijnaam account";
 $a->strings["@Tagname - overrides Name/Nickname"] = "@Labelnaam - krijgt voorrang op naam/bijnaam";
 $a->strings["Account URL"] = "URL account";
+$a->strings["Account URL Alias"] = "Account URL Alias";
 $a->strings["Friend Request URL"] = "URL vriendschapsverzoek";
 $a->strings["Friend Confirm URL"] = "URL vriendschapsbevestiging";
 $a->strings["Notification Endpoint URL"] = "Notificatie Endpoint URL";
 $a->strings["Poll/Feed URL"] = "URL poll/feed";
 $a->strings["New photo from this URL"] = "Nieuwe foto van deze URL";
-$a->strings["Parent user not found."] = "Ouderlijke gebruiker niet gevonden.";
-$a->strings["No parent user"] = "Ouderlijke gebruiker ontbreekt";
-$a->strings["Parent Password:"] = "Ouderlijk paswoord:";
-$a->strings["Please enter the password of the parent account to legitimize your request."] = "Geef alstublieft het paswoord van het ouderlijke account om je verzoek te legitimeren.";
-$a->strings["Parent User"] = "Ouderlijke gebruiker";
-$a->strings["Parent users have total control about this account, including the account settings. Please double check whom you give this access."] = "Ouderlijke gebruikers hebben totale controle over dit account, de account instellingen inbegrepen. Dubbel check dus alstublieft aan wie je deze toegang geeft.";
-$a->strings["Delegate Page Management"] = "Paginabeheer uitbesteden";
-$a->strings["Delegates"] = "Gemachtigden";
-$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."] = "Personen waaraan het beheer is uitbesteed kunnen alle onderdelen van een account/pagina beheren, behalve de basisinstellingen van een account. Besteed je persoonlijke account daarom niet uit aan personen die je niet volledig vertrouwt.";
-$a->strings["Existing Page Delegates"] = "Bestaande personen waaraan het paginabeheer is uitbesteed";
-$a->strings["Potential Delegates"] = "Mogelijke personen waaraan het paginabeheer kan worden uitbesteed ";
-$a->strings["Remove"] = "Verwijderen";
-$a->strings["Add"] = "Toevoegen";
-$a->strings["No entries."] = "Geen gegevens.";
-$a->strings["Profile not found."] = "Profiel niet gevonden";
 $a->strings["This may occasionally happen if contact was requested by both persons and it has already been approved."] = "Dit kan soms gebeuren als het contact door beide personen werd gevraagd, en het werd al goedgekeurd.";
 $a->strings["Response from remote site was not understood."] = "Antwoord van de website op afstand werd niet begrepen.";
 $a->strings["Unexpected response from remote site: "] = "Onverwacht antwoord van website op afstand:";
@@ -725,7 +441,6 @@ $a->strings["Confirmation completed successfully."] = "Bevestiging werd correct
 $a->strings["Temporary failure. Please wait and try again."] = "Tijdelijke fout. Wacht even en probeer opnieuw.";
 $a->strings["Introduction failed or was revoked."] = "Verzoek mislukt of herroepen.";
 $a->strings["Remote site reported: "] = "Website op afstand berichtte: ";
-$a->strings["Unable to set contact photo."] = "Ik kan geen contact foto instellen.";
 $a->strings["No user record found for '%s' "] = "Geen gebruiker gevonden voor '%s'";
 $a->strings["Our site encryption key is apparently messed up."] = "De encryptie-sleutel van onze webstek is blijkbaar beschadigd.";
 $a->strings["Empty site URL was provided or URL could not be decrypted by us."] = "Er werd een lege URL gegeven, of de URL kon niet ontcijferd worden door ons.";
@@ -755,6 +470,7 @@ $a->strings["You have already introduced yourself here."] = "Je hebt jezelf hier
 $a->strings["Apparently you are already friends with %s."] = "Blijkbaar ben je al bevriend met %s.";
 $a->strings["Invalid profile URL."] = "Ongeldig profiel adres.";
 $a->strings["Disallowed profile URL."] = "Niet toegelaten profiel adres.";
+$a->strings["Blocked domain"] = "Domein geblokeerd";
 $a->strings["Failed to update contact record."] = "Ik kon de contactgegevens niet aanpassen.";
 $a->strings["Your introduction has been sent."] = "Je verzoek is verzonden.";
 $a->strings["Remote subscription can't be done for your network. Please subscribe directly on your system."] = "Remote inschrijving kan niet op jouw netwerk. Gelieve direct op je systeem in te schrijven.";
@@ -775,26 +491,11 @@ $a->strings["Friendica"] = "Friendica";
 $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."] = "- Gebruik niet dit formulier. Vul %s in in je Diaspora zoekbalk.";
-$a->strings["Your Identity Address:"] = "Adres van je identiteit:";
-$a->strings["Submit Request"] = "Aanvraag indienen";
-$a->strings["Location:"] = "Plaats:";
-$a->strings["Gender:"] = "Geslacht:";
-$a->strings["Status:"] = "Tijdlijn:";
-$a->strings["Homepage:"] = "Website:";
-$a->strings["About:"] = "Over:";
-$a->strings["Global Directory"] = "Globale gids";
-$a->strings["Find on this site"] = "Op deze website zoeken";
-$a->strings["Results for:"] = "Resultaten voor:";
-$a->strings["Site Directory"] = "Websitegids";
-$a->strings["Find"] = "Zoek";
-$a->strings["No entries (some entries may be hidden)."] = "Geen gegevens (sommige gegevens kunnen verborgen zijn).";
-$a->strings["People Search - %s"] = "Mensen Zoeken - %s";
-$a->strings["Forum Search - %s"] = "Forum doorzoeken - %s";
-$a->strings["No matches"] = "Geen resultaten";
+$a->strings["The requested item doesn't exist or has been deleted."] = "Het gevraagde item bestaat niet of is verwijderd";
+$a->strings["The feed for this item is unavailable."] = "De tijdlijn voor dit item is niet beschikbaar";
 $a->strings["Item not found"] = "Item niet gevonden";
 $a->strings["Edit post"] = "Bericht bewerken";
 $a->strings["Save"] = "Bewaren";
-$a->strings["Insert web link"] = "Voeg een webadres in";
 $a->strings["web link"] = "webadres";
 $a->strings["Insert video link"] = "Voeg video toe";
 $a->strings["video link"] = "video adres";
@@ -808,14 +509,15 @@ $a->strings["Create New Event"] = "Maak een nieuwe gebeurtenis";
 $a->strings["Event details"] = "Gebeurtenis details";
 $a->strings["Starting date and Title are required."] = "Start datum en Titel zijn verplicht.";
 $a->strings["Event Starts:"] = "Gebeurtenis begint:";
-$a->strings["Required"] = "Vereist";
 $a->strings["Finish date/time is not known or not relevant"] = "Einddatum/tijd is niet gekend of niet relevant";
 $a->strings["Event Finishes:"] = "Gebeurtenis eindigt:";
 $a->strings["Adjust for viewer timezone"] = "Pas aan aan de tijdzone van de gebruiker";
 $a->strings["Description:"] = "Beschrijving:";
+$a->strings["Location:"] = "Plaats:";
 $a->strings["Title:"] = "Titel:";
 $a->strings["Share this event"] = "Deel deze gebeurtenis";
 $a->strings["Basic"] = "Basis";
+$a->strings["Advanced"] = "Geavanceerd";
 $a->strings["Permissions"] = "Rechten";
 $a->strings["Failed to remove event"] = "Kon remote event niet verwijderen";
 $a->strings["Event removed"] = "Gebeurtenis verwijderd";
@@ -823,91 +525,27 @@ $a->strings["Photos"] = "Foto's";
 $a->strings["Contact Photos"] = "Contactfoto's";
 $a->strings["Upload"] = "Uploaden";
 $a->strings["Files"] = "Bestanden";
-$a->strings["You must be logged in to use this module"] = "Je moet ingelogd zijn om deze module te gebruiken";
-$a->strings["Source URL"] = "Bron URL";
-$a->strings["Not Found"] = "Niet gevonden";
-$a->strings["- select -"] = "- Kies -";
 $a->strings["The contact could not be added."] = "Het contact kon niet toegevoegd worden.";
 $a->strings["You already added this contact."] = "Je hebt deze kontakt al toegevoegd";
 $a->strings["Diaspora support isn't enabled. Contact can't be added."] = "Diaspora ondersteuning is niet geactiveerd. Contact kan niet toegevoegd worden.";
 $a->strings["OStatus support is disabled. Contact can't be added."] = "OStatus ondersteuning is niet geactiveerd. Contact kan niet toegevoegd woren.";
 $a->strings["The network type couldn't be detected. Contact can't be added."] = "Het type netwerk kon niet gedetecteerd worden. Contact kan niet toegevoegd worden.";
 $a->strings["Tags:"] = "Labels:";
-$a->strings["Status Messages and Posts"] = "Berichten op jouw tijdlijn";
-$a->strings["This is Friendica, version %s that is running at the web location %s. The database version is %s, the post update version is %s."] = "Dit is Friendica, versie %s en draait op op locatie %s. De databaseversie is %s, en de bericht update versie is %s.";
-$a->strings["Please visit <a href=\"https://friendi.ca\">Friendi.ca</a> to learn more about the Friendica project."] = "Ga naar <a href=\"https://friendi.ca\">Friendi.ca</a> om meer te vernemen over het Friendica project.";
-$a->strings["Bug reports and issues: please visit"] = "Bug rapporten en problemen: bezoek";
-$a->strings["the bugtracker at github"] = "de github bugtracker";
-$a->strings["Suggestions, praise, etc. - please email \"info\" at \"friendi - dot - ca"] = "Suggesties, appreciatie, enz. - aub stuur een email naar \"info\" at \"friendi - dot - ca";
-$a->strings["Installed addons/apps:"] = "Geïnstalleerde addons/applicaties:";
-$a->strings["No installed addons/apps"] = "Geen geïnstalleerde addons/applicaties";
-$a->strings["Read about the <a href=\"%1\$s/tos\">Terms of Service</a> of this node."] = "Lees de <a href=\"%1\$s/tos\">Gebruiksvoorwaarden</a> van deze node na.";
-$a->strings["On this server the following remote servers are blocked."] = "De volgende remote servers zijn geblokkeerd.";
+$a->strings["Suggested contact not found."] = "Voorgesteld contact werd niet gevonden";
 $a->strings["Friend suggestion sent."] = "Vriendschapsvoorstel verzonden.";
 $a->strings["Suggest Friends"] = "Stel vrienden voor";
 $a->strings["Suggest a friend for %s"] = "Stel een vriend voor aan %s";
-$a->strings["Group created."] = "Groep aangemaakt.";
-$a->strings["Could not create group."] = "Kon de groep niet aanmaken.";
-$a->strings["Group not found."] = "Groep niet gevonden.";
-$a->strings["Group name changed."] = "Groepsnaam gewijzigd.";
-$a->strings["Permission denied"] = "Toegang geweigerd";
-$a->strings["Save Group"] = "Bewaar groep";
-$a->strings["Filter"] = "filter";
-$a->strings["Create a group of contacts/friends."] = "Maak een groep contacten/vrienden aan.";
-$a->strings["Group Name: "] = "Groepsnaam:";
-$a->strings["Contacts not in any group"] = "Contacten bestaan in geen enkele groep";
-$a->strings["Group removed."] = "Groep verwijderd.";
-$a->strings["Unable to remove group."] = "Niet in staat om groep te verwijderen.";
-$a->strings["Delete Group"] = "Verwijder Groep";
-$a->strings["Edit Group Name"] = "Bewerk Groep Naam";
-$a->strings["Members"] = "Leden";
-$a->strings["All Contacts"] = "Alle Contacten";
-$a->strings["Group is empty"] = "De groep is leeg";
-$a->strings["Remove contact from group"] = "Verwijder contact uit de groep";
-$a->strings["Click on a contact to add or remove."] = "Klik op een contact om het toe te voegen of te verwijderen.";
-$a->strings["Add contact to group"] = "Voeg contact toe aan de groep";
 $a->strings["No profile"] = "Geen profiel";
-$a->strings["Help:"] = "Help:";
-$a->strings["Help"] = "Help";
-$a->strings["Welcome to %s"] = "Welkom op %s";
-$a->strings["Total invitation limit exceeded."] = "Totale uitnodigingslimiet overschreden.";
-$a->strings["%s : Not a valid email address."] = "%s: Geen geldig e-mailadres.";
-$a->strings["Please join us on Friendica"] = "Kom bij ons op Friendica";
-$a->strings["Invitation limit exceeded. Please contact your site administrator."] = "Uitnodigingslimiet overschreden. Neem contact op met de beheerder van je website.";
-$a->strings["%s : Message delivery failed."] = "%s : Aflevering van bericht mislukt.";
-$a->strings["%d message sent."] = [
-       0 => "%d bericht verzonden.",
-       1 => "%d berichten verzonden.",
-];
-$a->strings["You have no more invitations available"] = "Je kunt geen uitnodigingen meer sturen";
-$a->strings["Visit %s for a list of public sites that you can join. Friendica members on other sites can all connect with each other, as well as with members of many other social networks."] = "Bezoek %s voor een lijst van openbare sites waar je je kunt aansluiten. Friendica leden op andere sites kunnen allemaal met elkaar verbonden worden, en ook met leden van verschillende andere sociale netwerken.";
-$a->strings["To accept this invitation, please visit and register at %s or any other public Friendica website."] = "Om deze uitnodiging te accepteren kan je je op %s registreren of op een andere vrij toegankelijke Friendica-website.";
-$a->strings["Friendica sites all inter-connect to create a huge privacy-enhanced social web that is owned and controlled by its members. They can also connect with many traditional social networks. See %s for a list of alternate Friendica sites you can join."] = "Friendica servers zijn allemaal onderling verbonden om een reusachtig sociaal web te maken met verbeterde privacy, dat eigendom is van en gecontroleerd door zijn leden. Ze kunnen ook verbindingen maken met verschillende traditionele sociale netwerken. Bekijk %s voor een lijst van alternatieve Friendica servers waar je aan kunt sluiten.";
-$a->strings["Our apologies. This system is not currently configured to connect with other public sites or invite members."] = "Onze verontschuldigingen. Dit systeem is momenteel niet ingesteld om verbinding te maken met andere openbare plaatsen of leden uit te nodigen.";
-$a->strings["Friendica sites all inter-connect to create a huge privacy-enhanced social web that is owned and controlled by its members. They can also connect with many traditional social networks."] = "Friendica servers zijn allemaal onderling verbonden om een reusachtig sociaal web te maken met verbeterde privacy, dat eigendom is van en gecontroleerd door zijn leden. Ze kunnen ook verbindingen maken met verschillende traditionele sociale netwerken.";
-$a->strings["To accept this invitation, please visit and register at %s."] = "Om deze uitnodiging te accepteren, ga naar en registreer op %s.";
-$a->strings["Send invitations"] = "Verstuur uitnodigingen";
-$a->strings["Enter email addresses, one per line:"] = "Vul e-mailadressen in, één per lijn:";
-$a->strings["Your message:"] = "Jouw bericht:";
-$a->strings["You are cordially invited to join me and other close friends on Friendica - and help us to create a better social web."] = "Ik nodig je vriendelijk uit om bij mij en andere vrienden te komen op Friendica - en ons te helpen om een beter sociaal web te bouwen.";
-$a->strings["You will need to supply this invitation code: \$invite_code"] = "Je zult deze uitnodigingscode moeten invullen: \$invite_code";
-$a->strings["Once you have registered, please connect with me via my profile page at:"] = "Eens je geregistreerd bent kun je contact leggen met mij via mijn profielpagina op:";
-$a->strings["For more information about the Friendica project and why we feel it is important, please visit http://friendi.ca"] = "Voor meer informatie over het Friendica project en waarom wij denken dat het belangrijk is kun je http://friendi.ca/ bezoeken";
 $a->strings["Unable to locate original post."] = "Ik kan de originele post niet meer vinden.";
 $a->strings["Empty post discarded."] = "Lege post weggegooid.";
 $a->strings["This message was sent to you by %s, a member of the Friendica social network."] = "Dit bericht werd naar jou gestuurd door %s, een lid van het Friendica sociale netwerk.";
 $a->strings["You may visit them online at %s"] = "Je kunt ze online bezoeken op %s";
 $a->strings["Please contact the sender by replying to this post if you do not wish to receive these messages."] = "Contacteer de afzender door op dit bericht te antwoorden als je deze berichten niet wilt ontvangen.";
 $a->strings["%s posted an update."] = "%s heeft een wijziging geplaatst.";
-$a->strings["l F d, Y \\@ g:i A"] = "l F d, Y \\@ g:i A";
-$a->strings["Time Conversion"] = "Tijdsconversie";
-$a->strings["Friendica provides this service for sharing events with other networks and friends in unknown timezones."] = "Friendica biedt deze dienst aan om gebeurtenissen te delen met andere netwerken en vrienden in onbekende tijdzones.";
-$a->strings["UTC time: %s"] = "UTC tijd: %s";
-$a->strings["Current timezone: %s"] = "Huidige Tijdzone: %s";
-$a->strings["Converted localtime: %s"] = "Omgerekende lokale tijd: %s";
-$a->strings["Please select your timezone:"] = "Selecteer je tijdzone:";
 $a->strings["Remote privacy information not available."] = "Privacyinformatie op afstand niet beschikbaar.";
 $a->strings["Visible to:"] = "Zichtbaar voor:";
+$a->strings["Followers"] = "Volgers";
+$a->strings["Mutuals"] = "Gemeenschappelijk";
 $a->strings["No valid account found."] = "Geen geldige account gevonden.";
 $a->strings["Password reset request issued. Check your email."] = "Verzoek om wachtwoord opnieuw in te stellen werd verstuurd. Kijk uw e-mail na.";
 $a->strings["\n\t\tDear %1\$s,\n\t\t\tA request was recently received at \"%2\$s\" to reset your account\n\t\tpassword. In order to confirm this request, please select the verification link\n\t\tbelow or paste it into your web browser address bar.\n\n\t\tIf you did NOT request this change, please DO NOT follow the link\n\t\tprovided and ignore and/or delete this email, the request will expire shortly.\n\n\t\tYour password will not be changed unless we can verify that you\n\t\tissued this request."] = "\n\t\tBeste %1\$s,\n\t\t\tEr is recent om \"%2\$s\" een verzoek gekomen om je paswoord te resetten.\n\t\tOm dit verzoek te bevestigen, gelieve de verificatie link hieronder te volgen of in je browser te kopiëren.\n\n\t\tAls je dit verzoek NIET hebt gedaan, volg deze link dan NIET en negeer \n\t\ten/of verwijder deze email, het verzoek zal binnenkort vanzelf ongeldig worden.\n\n\t\tJe paswoord zal niet aangepast worden tenzij we kunnen verifiëren\n\t\tdat je dit verzoek verzonden hebt.";
@@ -928,29 +566,17 @@ $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"] = "\n\t\t\tBeste %1\$s,\n\t\t\t\tJe paswoord is aangepast zoals je gevraagd hebt. Hou deze informatie\n\t\t\talstublieft bij (of pas je paswoord onmiddellijk aan\n\t\t\tnaar iets wat je je kan herinneren).\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"] = "\n\t\t\tJe login details zijn de volgende:\n\n\t\t\tSite Locatie:\t%1\$s\n\t\t\tLogin Naam:\t%2\$s\n\t\t\tPaswoord:\t%3\$s\n\n\t\t\tJe kan dit paswoord in het account instellingen aanpassen nadat je ingelogd bent.\n\t\t";
 $a->strings["Your password has been changed at %s"] = "Je wachtwoord is veranderd op %s";
-$a->strings["System down for maintenance"] = "Systeem onbeschikbaar wegens onderhoud";
 $a->strings["Manage Identities and/or Pages"] = "Beheer Identiteiten en/of Pagina's";
 $a->strings["Toggle between different identities or community/group pages which share your account details or which you have been granted \"manage\" permissions"] = "Wissel tussen verschillende identiteiten of forum/groeppagina's die jouw accountdetails delen of waar je \"beheerdersrechten\" hebt gekregen.";
 $a->strings["Select an identity to manage: "] = "Selecteer een identiteit om te beheren:";
-$a->strings["No keywords to match. Please add keywords to your default profile."] = "Geen sleutelwoorden om te zoeken. Voeg sleutelwoorden toe aan je standaard profiel.";
-$a->strings["is interested in:"] = "Is geïnteresseerd in:";
-$a->strings["Profile Match"] = "Profielmatch";
 $a->strings["New Message"] = "Nieuw Bericht";
-$a->strings["No recipient selected."] = "Geen ontvanger geselecteerd.";
 $a->strings["Unable to locate contact information."] = "Ik kan geen contact informatie vinden.";
-$a->strings["Message could not be sent."] = "Bericht kon niet verzonden worden.";
-$a->strings["Message collection failure."] = "Fout bij het verzamelen van berichten.";
-$a->strings["Message sent."] = "Bericht verzonden.";
 $a->strings["Discard"] = "Verwerpen";
 $a->strings["Messages"] = "Privéberichten";
 $a->strings["Do you really want to delete this message?"] = "Wil je echt dit bericht verwijderen?";
 $a->strings["Conversation not found."] = "Gesprek niet gevonden.";
 $a->strings["Message deleted."] = "Bericht verwijderd.";
 $a->strings["Conversation removed."] = "Gesprek verwijderd.";
-$a->strings["Please enter a link URL:"] = "Vul een internetadres/URL in:";
-$a->strings["Send Private Message"] = "Verstuur privébericht";
-$a->strings["To:"] = "Aan:";
-$a->strings["Subject:"] = "Onderwerp:";
 $a->strings["No messages."] = "Geen berichten.";
 $a->strings["Message not available."] = "Bericht niet beschikbaar.";
 $a->strings["Delete message"] = "Verwijder bericht";
@@ -974,6 +600,7 @@ $a->strings["Warning: This group contains %s member from a network that doesn't
 ];
 $a->strings["Messages in this group won't be send to these receivers."] = "Boodschappen in deze groep zullen niet verzonden worden naar deze ontvangers.";
 $a->strings["No such group"] = "Zo'n groep bestaat niet";
+$a->strings["Group is empty"] = "De groep is leeg";
 $a->strings["Group: %s"] = "Groep: %s";
 $a->strings["Private messages to this person are at risk of public disclosure."] = "Privéberichten naar deze persoon kunnen openbaar gemaakt worden.";
 $a->strings["Invalid contact."] = "Ongeldig contact.";
@@ -981,7 +608,6 @@ $a->strings["Commented Order"] = "Nieuwe reacties bovenaan";
 $a->strings["Sort by Comment Date"] = "Berichten met nieuwe reacties bovenaan";
 $a->strings["Posted Order"] = "Nieuwe berichten bovenaan";
 $a->strings["Sort by Post Date"] = "Nieuwe berichten bovenaan";
-$a->strings["Personal"] = "Persoonlijk";
 $a->strings["Posts that mention or involve you"] = "Alleen berichten die jou vermelden of op jou betrekking hebben";
 $a->strings["New"] = "Nieuw";
 $a->strings["Activity Stream - by date"] = "Activiteitenstroom - volgens datum";
@@ -989,42 +615,8 @@ $a->strings["Shared Links"] = "Gedeelde links";
 $a->strings["Interesting Links"] = "Interessante links";
 $a->strings["Starred"] = "Met ster";
 $a->strings["Favourite Posts"] = "Favoriete berichten";
-$a->strings["Welcome to Friendica"] = "Welkom bij Friendica";
-$a->strings["New Member Checklist"] = "Checklist voor nieuwe leden";
-$a->strings["We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page. A link to this page will be visible from your home page for two weeks after your initial registration and then will quietly disappear."] = "We willen je een paar tips en verwijzingen aanreiken om je een aangename ervaring te bezorgen. Klik op een item om de relevante pagina's te bezoeken. Een verwijzing naar deze pagina zal twee weken lang na je registratie zichtbaar zijn op je tijdlijn. Daarna zal de verwijzing stilletjes verdwijnen.";
-$a->strings["Getting Started"] = "Aan de slag";
-$a->strings["Friendica Walk-Through"] = "Doorloop Friendica";
-$a->strings["On your <em>Quick Start</em> page - find a brief introduction to your profile and network tabs, make some new connections, and find some groups to join."] = "Op je <em>Snelstart</em> pagina kun je een korte inleiding vinden over je profiel en netwerk tabs, om enkele nieuwe connecties te leggen en groepen te vinden om lid van te worden.";
-$a->strings["Go to Your Settings"] = "Ga naar je instellingen";
-$a->strings["On your <em>Settings</em> page -  change your initial password. Also make a note of your Identity Address. This looks just like an email address - and will be useful in making friends on the free social web."] = "Verander je initieel wachtwoord op je <em>instellingenpagina</em>. Noteer ook het adres van je identiteit. Dit ziet er uit als een e-mailadres - en zal nuttig zijn om vrienden te maken op het vrije sociale web.";
-$a->strings["Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you."] = "Controleer ook de andere instellingen, in het bijzonder de privacy-instellingen. Een niet-gepubliceerd adres is zoals een privé-telefoonnummer. In het algemeen wil je waarschijnlijk je adres publiceren - tenzij al je vrienden en mogelijke vrienden precies weten hoe je te vinden.";
-$a->strings["Profile"] = "Profiel";
-$a->strings["Upload Profile Photo"] = "Profielfoto uploaden";
-$a->strings["Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not."] = "Upload een profielfoto, als je dat nog niet gedaan hebt. Studies tonen aan dat mensen met echte foto's van zichzelf tien keer gemakkelijker vrienden maken dan mensen die dat niet doen.";
-$a->strings["Edit Your Profile"] = "Bewerk je profiel";
-$a->strings["Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors."] = "Bewerk je <strong>standaard</strong> profiel zoals je wilt. Controleer de instellingen om je vriendenlijst te verbergen, en om je profiel voor ongekende bezoekers te verbergen.";
-$a->strings["Profile Keywords"] = "Sleutelwoorden voor dit profiel";
-$a->strings["Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships."] = "Stel enkele openbare sleutelwoorden in voor je standaard profiel die je interesses beschrijven. We kunnen dan misschien mensen vinden met gelijkaardige interesses, en vrienden voorstellen.";
-$a->strings["Connecting"] = "Verbinding aan het maken";
-$a->strings["Importing Emails"] = "E-mails importeren";
-$a->strings["Enter your email access information on your Connector Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = "Vul je e-mailtoegangsinformatie in op je pagina met verbindingsinstellingen als je vrienden of mailinglijsten uit je e-mail-inbox wilt importeren, en met hen wilt communiceren";
-$a->strings["Go to Your Contacts Page"] = "Ga naar je contactenpagina";
-$a->strings["Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Add New Contact</em> dialog."] = "Je contactenpagina is jouw poort om vriendschappen te beheren en verbinding te leggen met vrienden op andere netwerken. Je kunt hun adres of URL toevoegen in de <em>Voeg nieuw contact toe</em> dialoog.";
-$a->strings["Go to Your Site's Directory"] = "Ga naar de gids van je website";
-$a->strings["The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested."] = "In de gids vind je andere mensen in dit netwerk of op andere federatieve sites. Zoek naar het woord <em>Connect</em> of <em>Follow</em> op hun profielpagina (meestal aan de linkerkant). Vul je eigen identiteitsadres in wanneer daar om wordt gevraagd.";
-$a->strings["Finding New People"] = "Nieuwe mensen vinden";
-$a->strings["On the side panel of the Contacts page are several tools to find new friends. We can match people by interest, look up people by name or interest, and provide suggestions based on network relationships. On a brand new site, friend suggestions will usually begin to be populated within 24 hours."] = "Op het zijpaneel van de Contacten pagina vind je verschillende tools om nieuwe vrienden te zoeken. We kunnen mensen op interesses matchen, mensen opzoeken op naam of hobby, en suggesties doen gebaseerd op netwerk-relaties. Op een nieuwe webstek beginnen vriendschapssuggesties meestal binnen de 24 uur beschikbaar te worden.";
-$a->strings["Groups"] = "Groepen";
-$a->strings["Group Your Contacts"] = "Groepeer je contacten";
-$a->strings["Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page."] = "Als je een aantal vrienden gemaakt hebt kun je ze in je eigen gespreksgroepen indelen vanuit de zijbalk van je 'Contacten' pagina, en dan kun je met elke groep apart contact houden op je Netwerk pagina. ";
-$a->strings["Why Aren't My Posts Public?"] = "Waarom zijn mijn berichten niet openbaar?";
-$a->strings["Friendica respects your privacy. By default, your posts will only show up to people you've added as friends. For more information, see the help section from the link above."] = "Friendica respecteert je privacy. Standaard zullen je berichten alleen zichtbaar zijn voor personen die jij als vriend hebt toegevoegd. Lees de help (zie de verwijzing hierboven) voor meer informatie.";
-$a->strings["Getting Help"] = "Hulp krijgen";
-$a->strings["Go to the Help Section"] = "Ga naar de help";
-$a->strings["Our <strong>help</strong> pages may be consulted for detail on other program features and resources."] = "Je kunt onze <strong>help</strong> pagina's raadplegen voor gedetailleerde informatie over andere functies van dit programma.";
 $a->strings["Personal Notes"] = "Persoonlijke Nota's";
 $a->strings["Invalid request identifier."] = "Ongeldige <em>request identifier</em>.";
-$a->strings["Ignore"] = "Negeren";
 $a->strings["Notifications"] = "Notificaties";
 $a->strings["Network Notifications"] = "Netwerknotificaties";
 $a->strings["System Notifications"] = "Systeemnotificaties";
@@ -1037,6 +629,7 @@ $a->strings["Hide Ignored Requests"] = "Verberg genegeerde verzoeken";
 $a->strings["Notification type:"] = "Notificatiesoort:";
 $a->strings["Suggested by:"] = "Voorgesteld door:";
 $a->strings["Hide this contact from others"] = "Verberg dit contact voor anderen";
+$a->strings["Approve"] = "Goedkeuren";
 $a->strings["Claims to be known to you: "] = "Denkt dat je hem of haar kent:";
 $a->strings["yes"] = "Ja";
 $a->strings["no"] = "Nee";
@@ -1047,42 +640,28 @@ $a->strings["Accepting %s as a sharer allows them to subscribe to your posts, bu
 $a->strings["Friend"] = "Vriend";
 $a->strings["Sharer"] = "Deler";
 $a->strings["Subscriber"] = "Volger";
+$a->strings["About:"] = "Over:";
+$a->strings["Gender:"] = "Geslacht:";
 $a->strings["Network:"] = "Netwerk:";
 $a->strings["No introductions."] = "Geen vriendschaps- of connectieverzoeken.";
 $a->strings["No more %s notifications."] = "Geen %s notificaties meer.";
-$a->strings["No more system notifications."] = "Geen systeemnotificaties meer.";
-$a->strings["Post successful."] = "Bericht succesvol geplaatst.";
 $a->strings["OpenID protocol error. No ID returned."] = "OpenID protocol fout. Geen ID Gevonden.";
 $a->strings["Account not found and OpenID registration is not permitted on this site."] = "Account niet gevonden, en OpenID-registratie is niet toegelaten op deze website.";
 $a->strings["Login failed."] = "Login mislukt.";
-$a->strings["Subscribing to OStatus contacts"] = "Inschrijven bij OStatus contacten";
-$a->strings["No contact provided."] = "Geen contact opgegeven.";
-$a->strings["Couldn't fetch information for contact."] = "Kon de informatie voor het contact niet ophalen.";
-$a->strings["Couldn't fetch friends for contact."] = "Kon de vrienden van contact niet ophalen.";
-$a->strings["Done"] = "Klaar";
-$a->strings["success"] = "Succesvol";
-$a->strings["failed"] = "Mislukt";
-$a->strings["ignored"] = "Verboden";
-$a->strings["Keep this window open until done."] = "Houd dit scherm open tot het klaar is";
 $a->strings["Photo Albums"] = "Fotoalbums";
 $a->strings["Recent Photos"] = "Recente foto's";
 $a->strings["Upload New Photos"] = "Nieuwe foto's uploaden";
 $a->strings["everybody"] = "iedereen";
 $a->strings["Contact information unavailable"] = "Contactinformatie niet beschikbaar";
 $a->strings["Album not found."] = "Album niet gevonden";
-$a->strings["Delete Album"] = "Verwijder album";
-$a->strings["Do you really want to delete this photo album and all its photos?"] = "Wil je echt dit fotoalbum en alle foto's erin verwijderen?";
-$a->strings["Delete Photo"] = "Verwijder foto";
-$a->strings["Do you really want to delete this photo?"] = "Wil je echt deze foto verwijderen?";
+$a->strings["Album successfully deleted"] = "Album succesvol gedeeld";
+$a->strings["Album was empty."] = "Het album was leeg";
 $a->strings["a photo"] = "een foto";
 $a->strings["%1\$s was tagged in %2\$s by %3\$s"] = "%1\$s is gelabeld in %2\$s door %3\$s";
-$a->strings["Image exceeds size limit of %s"] = "Beeld is groter dan de limiet ( %s )";
 $a->strings["Image upload didn't complete, please try again"] = "Opladen van het beeld is niet compleet, probeer het opnieuw";
 $a->strings["Image file is missing"] = "Beeld bestand ontbreekt";
 $a->strings["Server can't accept new file upload at this time, please contact your administrator"] = "De server kan op dit moment geen nieuw bestand opladen, contacteer alsjeblieft je beheerder";
 $a->strings["Image file is empty."] = "Afbeeldingsbestand is leeg.";
-$a->strings["Unable to process image."] = "Niet in staat om de afbeelding te verwerken";
-$a->strings["Image upload failed."] = "Uploaden van afbeelding mislukt.";
 $a->strings["No photos selected"] = "Geen foto's geselecteerd";
 $a->strings["Access to this item is restricted."] = "Toegang tot dit item is beperkt.";
 $a->strings["Upload Photos"] = "Upload foto's";
@@ -1091,16 +670,22 @@ $a->strings["or select existing album:"] = "Of selecteer bestaand album:";
 $a->strings["Do not show a status post for this upload"] = "Toon geen bericht op je tijdlijn van deze upload";
 $a->strings["Show to Groups"] = "Tonen aan groepen";
 $a->strings["Show to Contacts"] = "Tonen aan contacten";
+$a->strings["Do you really want to delete this photo album and all its photos?"] = "Wil je echt dit fotoalbum en alle foto's erin verwijderen?";
+$a->strings["Delete Album"] = "Verwijder album";
 $a->strings["Edit Album"] = "Album wijzigen";
+$a->strings["Drop Album"] = "Album verwijderen";
 $a->strings["Show Newest First"] = "Toon niewste eerst";
 $a->strings["Show Oldest First"] = "Toon oudste eerst";
 $a->strings["View Photo"] = "Bekijk foto";
 $a->strings["Permission denied. Access to this item may be restricted."] = "Toegang geweigerd. Toegang tot dit item is mogelijk beperkt.";
 $a->strings["Photo not available"] = "Foto is niet beschikbaar";
+$a->strings["Do you really want to delete this photo?"] = "Wil je echt deze foto verwijderen?";
+$a->strings["Delete Photo"] = "Verwijder foto";
 $a->strings["View photo"] = "Bekijk foto";
 $a->strings["Edit photo"] = "Bewerk foto";
+$a->strings["Delete photo"] = "Foto verwijderen";
 $a->strings["Use as profile photo"] = "Gebruik als profielfoto";
-$a->strings["Private Message"] = "Privébericht";
+$a->strings["Private Photo"] = "Privé foto";
 $a->strings["View Full Size"] = "Bekijk in volledig formaat";
 $a->strings["Tags: "] = "Labels: ";
 $a->strings["[Select tags to remove]"] = "[Selecteer tags om te verwijderen]";
@@ -1118,98 +703,12 @@ $a->strings["Comment"] = "Reacties";
 $a->strings["Map"] = "Kaart";
 $a->strings["View Album"] = "Album bekijken";
 $a->strings["{0} wants to be your friend"] = "{0} wilt je vriend worden";
-$a->strings["{0} sent you a message"] = "{0} stuurde jou een bericht";
 $a->strings["{0} requested registration"] = "{0} vroeg om zich te registreren";
 $a->strings["Poke/Prod"] = "Aanstoten/porren";
 $a->strings["poke, prod or do other things to somebody"] = "aanstoten, porren of andere dingen met iemand doen";
 $a->strings["Recipient"] = "Ontvanger";
 $a->strings["Choose what you wish to do to recipient"] = "Kies wat je met de ontvanger wil doen";
 $a->strings["Make this post private"] = "Dit bericht privé maken";
-$a->strings["Only logged in users are permitted to perform a probing."] = "Alleen ingelogde gebruikers hebben toelating om aan probing te doen.";
-$a->strings["Requested profile is not available."] = "Gevraagde profiel is niet beschikbaar.";
-$a->strings["%s's timeline"] = "Tijdslijn van %s";
-$a->strings["%s's posts"] = "Berichten van %s";
-$a->strings["%s's comments"] = "reactie van %s";
-$a->strings["Profile deleted."] = "Profiel verwijderd";
-$a->strings["Profile-"] = "Profiel-";
-$a->strings["New profile created."] = "Nieuw profiel aangemaakt.";
-$a->strings["Profile unavailable to clone."] = "Profiel niet beschikbaar om te klonen.";
-$a->strings["Profile Name is required."] = "Profielnaam is vereist.";
-$a->strings["Marital Status"] = "Echtelijke staat";
-$a->strings["Romantic Partner"] = "Romantische Partner";
-$a->strings["Work/Employment"] = "Werk";
-$a->strings["Religion"] = "Godsdienst";
-$a->strings["Political Views"] = "Politieke standpunten";
-$a->strings["Gender"] = "Geslacht";
-$a->strings["Sexual Preference"] = "Seksuele Voorkeur";
-$a->strings["XMPP"] = "XMPP";
-$a->strings["Homepage"] = "Tijdlijn";
-$a->strings["Interests"] = "Interesses";
-$a->strings["Location"] = "Plaats";
-$a->strings["Profile updated."] = "Profiel opgeslagen";
-$a->strings["Hide contacts and friends:"] = "Verberg contacten en vrienden:";
-$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Je vrienden/contacten verbergen voor bezoekers van dit profiel?";
-$a->strings["Show more profile fields:"] = "Toon meer profiel velden:";
-$a->strings["Profile Actions"] = "Profiel Acties";
-$a->strings["Edit Profile Details"] = "Profieldetails bewerken";
-$a->strings["Change Profile Photo"] = "Profielfoto wijzigen";
-$a->strings["View this profile"] = "Dit profiel bekijken";
-$a->strings["View all profiles"] = "Toon alle profielen";
-$a->strings["Edit visibility"] = "Pas zichtbaarheid aan";
-$a->strings["Create a new profile using these settings"] = "Nieuw profiel aanmaken met deze instellingen";
-$a->strings["Clone this profile"] = "Dit profiel klonen";
-$a->strings["Delete this profile"] = "Dit profiel verwijderen";
-$a->strings["Basic information"] = "Basis informatie";
-$a->strings["Profile picture"] = "Profiel foto";
-$a->strings["Preferences"] = "Voorkeuren";
-$a->strings["Status information"] = "Status informatie";
-$a->strings["Additional information"] = "Bijkomende informatie";
-$a->strings["Relation"] = "Relatie";
-$a->strings["Miscellaneous"] = "Diversen";
-$a->strings["Your Gender:"] = "Je Geslacht:";
-$a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "<span class=\"heart\">&hearts;</span> Echtelijke Staat:";
-$a->strings["Sexual Preference:"] = "Seksuele Voorkeur:";
-$a->strings["Example: fishing photography software"] = "Voorbeeld: vissen fotografie software";
-$a->strings["Profile Name:"] = "Profiel Naam:";
-$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "Dit is jouw <strong>publiek</strong> profiel.<br />Het <strong>kan</strong> zichtbaar zijn voor iedereen op het internet.";
-$a->strings["Your Full Name:"] = "Je volledige naam:";
-$a->strings["Title/Description:"] = "Titel/Beschrijving:";
-$a->strings["Street Address:"] = "Postadres:";
-$a->strings["Locality/City:"] = "Gemeente/Stad:";
-$a->strings["Region/State:"] = "Regio/Staat:";
-$a->strings["Postal/Zip Code:"] = "Postcode:";
-$a->strings["Country:"] = "Land:";
-$a->strings["Age: "] = "Leeftijd:";
-$a->strings["Who: (if applicable)"] = "Wie: (indien toepasbaar)";
-$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Voorbeelden: Kathleen123, Kathleen Peeters, kathleen@voorbeeld.nl";
-$a->strings["Since [date]:"] = "Sinds [datum]:";
-$a->strings["Tell us about yourself..."] = "Vertel iets over jezelf...";
-$a->strings["XMPP (Jabber) address:"] = "XMPP (Jabber) adres:";
-$a->strings["The XMPP address will be propagated to your contacts so that they can follow you."] = "Het XMPP adres zal doorgegeven worden aan je contacten zodat zij je kunnen volgen.";
-$a->strings["Homepage URL:"] = "Adres tijdlijn:";
-$a->strings["Hometown:"] = "Woonplaats:";
-$a->strings["Political Views:"] = "Politieke standpunten:";
-$a->strings["Religious Views:"] = "Geloof:";
-$a->strings["Public Keywords:"] = "Publieke Sleutelwoorden:";
-$a->strings["(Used for suggesting potential friends, can be seen by others)"] = "(Gebruikt om mogelijke vrienden voor te stellen, kan door anderen gezien worden)";
-$a->strings["Private Keywords:"] = "Privé Sleutelwoorden:";
-$a->strings["(Used for searching profiles, never shown to others)"] = "(Gebruikt om profielen te zoeken, nooit aan anderen getoond)";
-$a->strings["Likes:"] = "Houdt van:";
-$a->strings["Dislikes:"] = "Houdt niet van:";
-$a->strings["Musical interests"] = "Muzikale interesses";
-$a->strings["Books, literature"] = "Boeken, literatuur";
-$a->strings["Television"] = "Televisie";
-$a->strings["Film/dance/culture/entertainment"] = "Film/dans/cultuur/ontspanning";
-$a->strings["Hobbies/Interests"] = "Hobby's/Interesses";
-$a->strings["Love/romance"] = "Liefde/romance";
-$a->strings["Work/employment"] = "Werk";
-$a->strings["School/education"] = "School/opleiding";
-$a->strings["Contact information and Social Networks"] = "Contactinformatie en sociale netwerken";
-$a->strings["Profile Image"] = "Profiel afbeelding";
-$a->strings["visible to everybody"] = "zichtbaar voor iedereen";
-$a->strings["Edit/Manage Profiles"] = "Wijzig/Beheer Profielen";
-$a->strings["Change profile photo"] = "Profiel foto wijzigen";
-$a->strings["Create New Profile"] = "Maak nieuw profiel";
 $a->strings["Image uploaded but image cropping failed."] = "Afbeelding opgeladen, maar bijsnijden mislukt.";
 $a->strings["Image size reduction [%s] failed."] = "Verkleining van de afbeelding [%s] mislukt.";
 $a->strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Shift-herlaad de pagina, of maak de browser cache leeg als nieuwe foto's niet onmiddellijk verschijnen.";
@@ -1223,72 +722,34 @@ $a->strings["Crop Image"] = "Afbeelding bijsnijden";
 $a->strings["Please adjust the image cropping for optimum viewing."] = "Pas het afsnijden van de afbeelding aan voor het beste resultaat.";
 $a->strings["Done Editing"] = "Wijzigingen compleet";
 $a->strings["Image uploaded successfully."] = "Uploaden van afbeelding gelukt.";
-$a->strings["Invalid profile identifier."] = "Ongeldige profiel-identificatie.";
-$a->strings["Profile Visibility Editor"] = "Profiel Zichtbaarheid Editor";
-$a->strings["Visible To"] = "Zichtbaar voor";
-$a->strings["All Contacts (with secure profile access)"] = "Alle contacten (met veilige profieltoegang)";
-$a->strings["Registration successful. Please check your email for further instructions."] = "Registratie geslaagd. Kijk je e-mail na voor verdere instructies.";
-$a->strings["Failed to send email message. Here your accout details:<br> login: %s<br> password: %s<br><br>You can change your password after login."] = "Kon email niet verzenden. Hier zijn je account details: <br> login: %s <br> paswoord: %s<br><br> Je kan je paswoord aanpassen nadat je ingelogd bent.";
-$a->strings["Registration successful."] = "Registratie succes.";
-$a->strings["Your registration can not be processed."] = "Je registratie kan niet verwerkt worden.";
-$a->strings["Your registration is pending approval by the site owner."] = "Jouw registratie wacht op goedkeuring van de beheerder.";
-$a->strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Deze website heeft het toegelaten dagelijkse aantal registraties overschreden. Probeer morgen opnieuw.";
-$a->strings["You may (optionally) fill in this form via OpenID by supplying your OpenID and clicking 'Register'."] = "Je kunt (optioneel) dit formulier invullen via OpenID door je OpenID in te geven en op 'Registreren' te klikken.";
-$a->strings["If you are not familiar with OpenID, please leave that field blank and fill in the rest of the items."] = "Laat dit veld leeg als je niet vertrouwd bent met OpenID, en vul de rest van de items in.";
-$a->strings["Your OpenID (optional): "] = "Je OpenID (optioneel):";
-$a->strings["Include your profile in member directory?"] = "Je profiel in de ledengids opnemen?";
-$a->strings["Note for the admin"] = "Nota voor de beheerder";
-$a->strings["Leave a message for the admin, why you want to join this node"] = "Laat een boodschap na voor de beheerder, waarom je bij deze node wil komen";
-$a->strings["Membership on this site is by invitation only."] = "Lidmaatschap van deze website is uitsluitend op uitnodiging.";
-$a->strings["Your invitation code: "] = "Je uitnodigingscode:";
-$a->strings["Your Full Name (e.g. Joe Smith, real or real-looking): "] = "Je volledige naam (bvb. Jan Smit, echt of echt lijkend):";
-$a->strings["Your Email Address: (Initial information will be send there, so this has to be an existing address.)"] = "Je Email Adres: (Initiële informatie zal hier naartoe gezonden worden, dus dit moet een bestaand adres zijn.)";
-$a->strings["New Password:"] = "Nieuw Wachtwoord:";
-$a->strings["Leave empty for an auto generated password."] = "Laat leeg voor een automatisch gegenereerd paswoord.";
-$a->strings["Confirm:"] = "Bevestig:";
-$a->strings["Choose a profile nickname. This must begin with a text character. Your profile address on this site will then be '<strong>nickname@%s</strong>'."] = "Kies een bijnaam. Deze moet beginnen met een letter. Je profiel adres op deze site zal dan '<strong>nickname@%s</strong>' zijn.";
-$a->strings["Choose a nickname: "] = "Kies een bijnaam:";
-$a->strings["Register"] = "Registreer";
-$a->strings["Import"] = "Importeren";
-$a->strings["Import your profile to this friendica instance"] = "Importeer je profiel op deze friendica server";
-$a->strings["Note: This node explicitly contains adult content"] = "Waarschuwing: Deze node heeft inhoud enkel bedoeld voor volwassenen.";
-$a->strings["Account approved."] = "Account goedgekeurd.";
-$a->strings["Registration revoked for %s"] = "Registratie ingetrokken voor %s";
-$a->strings["Please login."] = "Inloggen.";
-$a->strings["User deleted their account"] = "Gebruiker verwijderde zijn of haar account";
-$a->strings["On your Friendica node an user deleted their account. Please ensure that their data is removed from the backups."] = "Een gebruiker heeft zijn of haar account verwijderd op je Friendica node. Zorg er zeker voor dat zijn of haar data verwijderd is uit de backups.";
-$a->strings["The user id is %d"] = "De gebruikers id is %d";
-$a->strings["Remove My Account"] = "Verwijder mijn account";
-$a->strings["This will completely remove your account. Once this has been done it is not recoverable."] = "Dit zal je account volledig verwijderen. Dit kan niet hersteld worden als het eenmaal uitgevoerd is.";
-$a->strings["Please enter your password for verification:"] = "Voer je wachtwoord in voor verificatie:";
-$a->strings["Resubscribing to OStatus contacts"] = "Opnieuw inschrijven bij OStatus contacten";
-$a->strings["Error"] = "Fout";
 $a->strings["Only logged in users are permitted to perform a search."] = "Alleen ingelogde gebruikers mogen een zoekopdracht starten.";
-$a->strings["Too Many Requests"] = "Teveel aanvragen";
 $a->strings["Only one search per minute is permitted for not logged in users."] = "Niet ingelogde gebruikers mogen slechts 1 opzoeking doen per minuut";
 $a->strings["Search"] = "Zoeken";
 $a->strings["Items tagged with: %s"] = "Items getagd met: %s";
 $a->strings["Results for: %s"] = "Resultaten voor: %s";
 $a->strings["Account"] = "Account";
+$a->strings["Two-factor authentication"] = "2-factor authenticatie";
 $a->strings["Profiles"] = "Profielen";
+$a->strings["Additional features"] = "Extra functies";
 $a->strings["Display"] = "Weergave";
 $a->strings["Social Networks"] = "Sociale netwerken";
+$a->strings["Addons"] = "Addons";
 $a->strings["Delegations"] = "Delegaties";
 $a->strings["Connected apps"] = "Verbonden applicaties";
 $a->strings["Export personal data"] = "Persoonlijke gegevens exporteren";
 $a->strings["Remove account"] = "Account verwijderen";
+$a->strings["Settings"] = "Instellingen";
 $a->strings["Missing some important data!"] = "Een belangrijk gegeven ontbreekt!";
 $a->strings["Update"] = "Wijzigen";
 $a->strings["Failed to connect with email account using the settings provided."] = "Ik kon geen verbinding maken met het e-mail account met de gegeven instellingen.";
 $a->strings["Email settings updated."] = "E-mail instellingen opgeslagen";
 $a->strings["Features updated"] = "Functies opgeslagen";
+$a->strings["The theme you chose isn't available."] = "Het thema dat je koos is niet beschikbaar";
 $a->strings["Relocate message has been send to your contacts"] = "Verhuis boodschap is verzonden naar je contacten";
-$a->strings["Passwords do not match. Password unchanged."] = "Wachtwoorden komen niet overeen. Wachtwoord niet gewijzigd.";
-$a->strings["Empty passwords are not allowed. Password unchanged."] = "Lege wachtwoorden zijn niet toegelaten. Wachtwoord niet gewijzigd.";
-$a->strings["The new password has been exposed in a public data dump, please choose another."] = "The nieuwe paswoord is gecompromitteerd in een publieke data dump, kies alsjeblieft een ander.";
-$a->strings["Wrong password."] = "Verkeerd wachtwoord.";
-$a->strings["Password changed."] = "Wachtwoord gewijzigd.";
+$a->strings["Passwords do not match."] = "Wachtwoorden zijn niet gelijk";
 $a->strings["Password update failed. Please try again."] = "Wachtwoord-)wijziging mislukt. Probeer opnieuw.";
+$a->strings["Password changed."] = "Wachtwoord gewijzigd.";
+$a->strings["Password unchanged."] = "Wachtwoord ongewijzigd";
 $a->strings[" Please use a shorter name."] = "Gebruik een kortere naam.";
 $a->strings[" Name too short."] = "Naam te kort.";
 $a->strings["Wrong Password"] = "Verkeerd wachtwoord";
@@ -1310,6 +771,8 @@ $a->strings["No name"] = "Geen naam";
 $a->strings["Remove authorization"] = "Verwijder authorisatie";
 $a->strings["No Addon settings configured"] = "Geen Addon instellingen geconfigureerd";
 $a->strings["Addon Settings"] = "Addon instellingen";
+$a->strings["Off"] = "Uit";
+$a->strings["On"] = "Aan";
 $a->strings["Additional Features"] = "Extra functies";
 $a->strings["Diaspora"] = "Diaspora";
 $a->strings["enabled"] = "ingeschakeld";
@@ -1318,6 +781,8 @@ $a->strings["Built-in support for %s connectivity is %s"] = "Ingebouwde onderste
 $a->strings["GNU Social (OStatus)"] = "GNU Social (OStatus)";
 $a->strings["Email access is disabled on this site."] = "E-mailtoegang is op deze website uitgeschakeld.";
 $a->strings["General Social Media Settings"] = "Algemene Sociale Media Instellingen";
+$a->strings["Accept only top level posts by contacts you follow"] = "Enkel posts van het het hoogste niveau accepteren van contacten die je volgt.";
+$a->strings["The system does an auto completion of threads when a comment arrives. This has got the side effect that you can receive posts that had been started by a non-follower but had been commented by someone you follow. This setting deactivates this behaviour. When activated, you strictly only will receive posts from people you really do follow."] = "Het systeem doet auto-complete bij posts wanneer een nieuwe reactie aankomt. Dit heeft het neveneffect dat je posts kan ontvangen die zijn gestart door iemand die je niet volgt maar op werd gereageerd door iemand die je wel volgt. Deze instelling deactiveerd dit gedrag. Als je dit activeert zal je enkel posts ontvangen van mensen die je echt volgt.";
 $a->strings["Disable Content Warning"] = "Deactiveer Content Waarschuwing";
 $a->strings["Users on networks like Mastodon or Pleroma are able to set a content warning field which collapse their post by default. This disables the automatic collapsing and sets the content warning as the post title. Doesn't affect any other content filtering you eventually set up."] = "Gebruikers op netwerken als Mastodon en Pleroma kunnen een content waarschuwing instellen die hun bericht standaard inklapt. Dit deactiveert het automatisch inklappen en toont de content waarschuwing als titel van het bericht. Dit beïnvloedt andere content filters die je mogelijk ingesteld hebt niet.";
 $a->strings["Disable intelligent shortening"] = "Deactiveer intelligent afkorten";
@@ -1343,6 +808,7 @@ $a->strings["Action after import:"] = "Actie na importeren:";
 $a->strings["Mark as seen"] = "Als 'gelezen' markeren";
 $a->strings["Move to folder"] = "Naar map verplaatsen";
 $a->strings["Move to folder:"] = "Verplaatsen naar map:";
+$a->strings["No special theme for mobile devices"] = "Geen speciaal thema voor mobiele apparaten";
 $a->strings["%s - (Unsupported)"] = "%s - (Niet ondersteund)";
 $a->strings["%s - (Experimental)"] = "%s - (Experimenteel)";
 $a->strings["Sunday"] = "Zondag";
@@ -1376,13 +842,21 @@ $a->strings["Unable to find your profile. Please contact your admin."] = "Kan je
 $a->strings["Account Types"] = "Account Types";
 $a->strings["Personal Page Subtypes"] = "Persoonlijke Pagina Subtypes";
 $a->strings["Community Forum Subtypes"] = "Groepsforum Subtypes";
+$a->strings["Personal Page"] = "Persoonlijke pagina";
 $a->strings["Account for a personal profile."] = "Account voor een persoonlijk profiel";
+$a->strings["Organisation Page"] = "Organisatie Pagina";
 $a->strings["Account for an organisation that automatically approves contact requests as \"Followers\"."] = "Account voor een organisatie die automatisch contact aanvragen goedkeurt als \"Volgers\".";
+$a->strings["News Page"] = "Nieuws pagina";
 $a->strings["Account for a news reflector that automatically approves contact requests as \"Followers\"."] = "Account voor een nieuws reflector die automatisch contact aanvragen goedkeurt als \"Volgers\".";
+$a->strings["Community Forum"] = "Groepsforum";
 $a->strings["Account for community discussions."] = "Account voor groepsdiscussies.";
+$a->strings["Normal Account Page"] = "Normale accountpagina";
 $a->strings["Account for a regular personal profile that requires manual approval of \"Friends\" and \"Followers\"."] = "Account voor een normaal persoonlijk profiel dat manuele goedkeuring vereist van \"Vrienden\" en \"Volgers\".";
+$a->strings["Soapbox Page"] = "Zeepkist-pagina";
 $a->strings["Account for a public profile that automatically approves contact requests as \"Followers\"."] = "Account voor een publiek profiel dat automatisch contact aanvragen goedkeurt als \"Volgers\".";
+$a->strings["Public Forum"] = "Publiek Forum";
 $a->strings["Automatically approves all contact requests."] = "Aanvaardt automatisch all contact aanvragen.";
+$a->strings["Automatic Friend Page"] = "Automatisch Vriendschapspagina";
 $a->strings["Account for a popular profile that automatically approves contact requests as \"Friends\"."] = "Account voor een populair profiel dat automatisch contact aanvragen goedkeurt als \"Vrienden\".";
 $a->strings["Private Forum [Experimental]"] = "Privé-forum [experimenteel]";
 $a->strings["Requires manual approval of contact requests."] = "Vereist manuele goedkeuring van contact aanvragen.";
@@ -1417,6 +891,9 @@ $a->strings["Expire photos:"] = "Laat foto's vervallen:";
 $a->strings["Only expire posts by others:"] = "Laat alleen berichten door anderen vervallen:";
 $a->strings["Account Settings"] = "Account Instellingen";
 $a->strings["Password Settings"] = "Wachtwoord Instellingen";
+$a->strings["New Password:"] = "Nieuw Wachtwoord:";
+$a->strings["Allowed characters are a-z, A-Z, 0-9 and special characters except white spaces, accentuated letters and colon (:)."] = "Toegestane tekens zijn a-z, A-Z, 0-9 en speciale tekens behalve spatie, geaccentueerde tekens en dubbele punt.";
+$a->strings["Confirm:"] = "Bevestig:";
 $a->strings["Leave password fields blank unless changing"] = "Laat de wachtwoord-velden leeg, tenzij je het wilt veranderen";
 $a->strings["Current Password:"] = "Huidig wachtwoord:";
 $a->strings["Your current password to confirm the changes"] = "Je huidig wachtwoord om de wijzigingen te bevestigen";
@@ -1460,53 +937,291 @@ $a->strings["Relocate"] = "Verhuis";
 $a->strings["If you have moved this profile from another server, and some of your contacts don't receive your updates, try pushing this button."] = "Als je je profiel van een andere server hebt verhuisd, en er zijn contacten die geen updates van je ontvangen, probeer dan eens deze knop.";
 $a->strings["Resend relocate message to contacts"] = "Stuur verhuis boodschap naar contacten";
 $a->strings["%1\$s is following %2\$s's %3\$s"] = "%1\$s volgt %3\$s van %2\$s";
-$a->strings["Do you really want to delete this suggestion?"] = "Wil je echt dit voorstel verwijderen?";
+$a->strings["Contact suggestion successfully ignored."] = "Contact suggestie succesvol genegeerd";
 $a->strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "Geen voorstellen beschikbaar. Als dit een nieuwe website is, kun je het over 24 uur nog eens proberen.";
+$a->strings["Do you really want to delete this suggestion?"] = "Wil je echt dit voorstel verwijderen?";
 $a->strings["Ignore/Hide"] = "Negeren/Verbergen";
 $a->strings["Friend Suggestions"] = "Vriendschapsvoorstellen";
-$a->strings["Tag(s) removed"] = "Tag(s) verwijderd";
-$a->strings["Remove Item Tag"] = "Verwijder label van item";
-$a->strings["Select a tag to remove: "] = "Selecteer een label om te verwijderen: ";
 $a->strings["Export account"] = "Account exporteren";
 $a->strings["Export your account info and contacts. Use this to make a backup of your account and/or to move it to another server."] = "Je account informatie en contacten exporteren. Gebruik dit om een backup van je account te maken en/of om het te verhuizen naar een andere server.";
 $a->strings["Export all"] = "Alles exporteren";
 $a->strings["Export your accout info, contacts and all your items as json. Could be a very big file, and could take a lot of time. Use this to make a full backup of your account (photos are not exported)"] = "Je account info, contacten en al je items in json formaat exporteren. Dit kan een heel groot bestand worden, en kan lang duren. Gebruik dit om een volledige backup van je account te maken (foto's worden niet geexporteerd)";
-$a->strings["User imports on closed servers can only be done by an administrator."] = "Importen van een gebruiker op een gesloten node kan enkel gedaan worden door een administrator";
-$a->strings["Move account"] = "Account verplaatsen";
-$a->strings["You can import an account from another Friendica server."] = "Je kunt een account van een andere Friendica server importeren.";
-$a->strings["You need to export your account from the old server and upload it here. We will recreate your old account here with all your contacts. We will try also to inform your friends that you moved here."] = "Je moet je account bij de oude server exporteren, en hier uploaden. We zullen je oude account hier opnieuw aanmaken, met al je contacten. We zullen ook proberen om je vrienden in te lichten dat je naar hier verhuisd bent.";
-$a->strings["This feature is experimental. We can't import contacts from the OStatus network (GNU Social/Statusnet) or from Diaspora"] = "Dit feature is experimenteel. We kunnen contacten van het OStatus netwerk (GNU Social/Statusnet) of van Diaspora niet importeren.";
-$a->strings["Account file"] = "Account bestand";
-$a->strings["To export your account, go to \"Settings->Export your personal data\" and select \"Export account\""] = "Om je account te exporteren, ga naar \"Instellingen->Exporteer je persoonlijke data\" en selecteer \"Exporteer account\"";
-$a->strings["You aren't following this contact."] = "Je volgt dit contact niet.";
-$a->strings["Unfollowing is currently not supported by your network."] = "Ontvolgen is momenteel niet gesupporteerd door je netwerk.";
-$a->strings["Contact unfollowed"] = "Contact ontvolgd.";
-$a->strings["Disconnect/Unfollow"] = "Disconnecteer/stop met volgen";
-$a->strings["[Embedded content - reload page to view]"] = "[Ingebedde inhoud - herlaad pagina om het te bekijken]";
-$a->strings["Do you really want to delete this video?"] = "Wil je deze video echt verwijderen?";
-$a->strings["Delete Video"] = "Verwijder video";
 $a->strings["No videos selected"] = "Geen video's geselecteerd";
 $a->strings["View Video"] = "Bekijk Video";
 $a->strings["Recent Videos"] = "Recente video's";
 $a->strings["Upload New Videos"] = "Nieuwe video's uploaden";
-$a->strings["No contacts."] = "Geen contacten.";
-$a->strings["Visit %s's profile [%s]"] = "Bekijk het profiel van %s [%s]";
+$a->strings["default"] = "standaard";
+$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"] = "Variaties";
+$a->strings["Top Banner"] = "Banner Bovenaan";
+$a->strings["Resize image to the width of the screen and show background color below on long pages."] = "Pas het beeld aan aan de breedte van het scherm en toon achtergrondkleur onder lange pagina's";
+$a->strings["Full screen"] = "Volledig scherm";
+$a->strings["Resize image to fill entire screen, clipping either the right or the bottom."] = "Pas het beeld aan om het hele scherm te vullen, met ofwel de rechter- of de onderkant afgeknipt.";
+$a->strings["Single row mosaic"] = "Enkele rij mozaïek";
+$a->strings["Resize image to repeat it on a single row, either vertical or horizontal."] = "Pas het beeld aan zodat het herhaald wordt op een enkele rij, ofwel vertikaal ofwel horizontaal";
+$a->strings["Mosaic"] = "Mozaïek";
+$a->strings["Repeat image to fill the screen."] = "Herhaal beeld om het scherm te vullen.";
+$a->strings["Custom"] = "Aangepast";
+$a->strings["Note"] = "Nota";
+$a->strings["Check image permissions if all users are allowed to see the image"] = "Controleer of alle gebruikers permissie hebben om het beeld te zien ";
+$a->strings["Select color scheme"] = "Selecteer kleurschema";
+$a->strings["Copy or paste schemestring"] = "Kopieer of plak schemastring";
+$a->strings["You can copy this string to share your theme with others. Pasting here applies the schemestring"] = "Je kan deze string kopiëren om uw je kleurenschema met anderen te delen. Een schemastring plakken past deze toe.";
+$a->strings["Navigation bar background color"] = "Navigatie balk achtergrondkleur";
+$a->strings["Navigation bar icon color "] = "Navigatie balk icoon kleur";
+$a->strings["Link color"] = "Link kleur";
+$a->strings["Set the background color"] = "Stel de achtergrondkleur in";
+$a->strings["Content background opacity"] = "Content achtergrond opaciteit";
+$a->strings["Set the background image"] = "Stel het achtergrondbeeld in";
+$a->strings["Background image style"] = "Achtergrond beeld stijl";
+$a->strings["Enable Compose page"] = "Nieuw bericht pagina activeren";
+$a->strings["This replaces the jot modal window for writing new posts with a link to <a href=\"compose\">the new Compose page</a>."] = "";
+$a->strings["Login page background image"] = "Achtergrondafbeelding aanmeldpagina";
+$a->strings["Login page background color"] = "Achtergrondkleur aanmeldpagina";
+$a->strings["Leave background image and color empty for theme defaults"] = "Laat de achtergrondafbeelding en kleur leeg om de standaard van het thema te gebruiken";
+$a->strings["Guest"] = "Gast";
+$a->strings["Visitor"] = "Bezoeker";
+$a->strings["Status"] = "Tijdlijn";
+$a->strings["Your posts and conversations"] = "Jouw berichten en gesprekken";
+$a->strings["Your profile page"] = "Jouw profiel pagina";
+$a->strings["Your photos"] = "Jouw foto's";
+$a->strings["Videos"] = "Video's";
+$a->strings["Your videos"] = "Je video's";
+$a->strings["Your events"] = "Jouw gebeurtenissen";
+$a->strings["Network"] = "Netwerk";
+$a->strings["Conversations from your friends"] = "Gesprekken van je vrienden";
+$a->strings["Events and Calendar"] = "Gebeurtenissen en kalender";
+$a->strings["Private mail"] = "Privéberichten";
+$a->strings["Account settings"] = "Account instellingen";
 $a->strings["Contacts"] = "Contacten";
-$a->strings["Number of daily wall messages for %s exceeded. Message failed."] = "Maximum aantal dagelijkse tijdlijn boodschappen van %s overschreden. Kon boodschap niet plaatsen.";
-$a->strings["Unable to check your home location."] = "Niet in staat om je tijdlijn-locatie vast te stellen";
-$a->strings["No recipient."] = "Geen ontvanger.";
-$a->strings["If you wish for %s to respond, please check that the privacy settings on your site allow private mail from unknown senders."] = "Als je wilt dat %s antwoordt moet je nakijken dat de privacy-instellingen op jouw website privéberichten van onbekende afzenders toelaat.";
-$a->strings["Invalid request."] = "Ongeldige aanvraag.";
-$a->strings["Sorry, maybe your upload is bigger than the PHP configuration allows"] = "Sorry, je op te laden bestand is groter dan deze PHP configuratie toelaat";
-$a->strings["Or - did you try to upload an empty file?"] = "Of - probeerde je een lege file op te laden?";
-$a->strings["File exceeds size limit of %s"] = "Bestand is groter dan de limiet ( %s )";
-$a->strings["File upload failed."] = "Uploaden van bestand mislukt.";
-$a->strings["Wall Photos"] = "Tijdlijn foto's";
-$a->strings["Delete this item?"] = "Dit item verwijderen?";
-$a->strings["show fewer"] = "Minder tonen";
-$a->strings["toggle mobile"] = "mobiel thema omwisselen";
-$a->strings["No system theme config value set."] = "Geen systeem thema configuratie ingesteld.";
-$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."] = "De beveiligingstoken van het formulier was foutief. Dit gebeurde waarschijnlijk omdat het formulier te lang (> 3 uur)  is blijven open staan voor het werd verstuurd.";
+$a->strings["Manage/edit friends and contacts"] = "Beheer/Wijzig vrienden en contacten";
+$a->strings["Alignment"] = "Uitlijning";
+$a->strings["Left"] = "Links";
+$a->strings["Center"] = "Gecentreerd";
+$a->strings["Color scheme"] = "Kleurschema";
+$a->strings["Posts font size"] = "Lettergrootte berichten";
+$a->strings["Textareas font size"] = "Lettergrootte tekstgebieden";
+$a->strings["Comma separated list of helper forums"] = "Kommagescheiden lijst van de helper forums";
+$a->strings["don't show"] = "niet tonen";
+$a->strings["show"] = "tonen";
+$a->strings["Set style"] = "Stijl instellen";
+$a->strings["Community Pages"] = "Forum/groepspagina's";
+$a->strings["Community Profiles"] = "Forum/groepsprofielen";
+$a->strings["Help or @NewHere ?"] = "Help of @NewHere ?";
+$a->strings["Connect Services"] = "Diensten verbinden";
+$a->strings["Find Friends"] = "Zoek vrienden";
+$a->strings["Last users"] = "Laatste gebruikers";
+$a->strings["Find People"] = "Zoek mensen";
+$a->strings["Enter name or interest"] = "Vul naam of interesse in";
+$a->strings["Examples: Robert Morgenstein, Fishing"] = "Voorbeelden: Jan Peeters, Vissen";
+$a->strings["Find"] = "Zoek";
+$a->strings["Similar Interests"] = "Dezelfde interesses";
+$a->strings["Random Profile"] = "Willekeurig Profiel";
+$a->strings["Invite Friends"] = "Vrienden uitnodigen";
+$a->strings["Global Directory"] = "Globale gids";
+$a->strings["Local Directory"] = "Lokale gids";
+$a->strings["Forums"] = "Forums";
+$a->strings["External link to forum"] = "Externe link naar het forum";
+$a->strings["show more"] = "toon meer";
+$a->strings["Quick Start"] = "Snelstart";
+$a->strings["Help"] = "Help";
+$a->strings["Post to Email"] = "Verzenden per e-mail";
+$a->strings["Visible to everybody"] = "Zichtbaar voor iedereen";
+$a->strings["Connectors"] = "";
+$a->strings["Hide your profile details from unknown viewers?"] = "Je profieldetails verbergen voor onbekende bezoekers?";
+$a->strings["Connectors disabled, since \"%s\" is enabled."] = "Connectoren gedeactiveerd, aangezien \"%s\" geactiveerd is.";
+$a->strings["Close"] = "Afsluiten";
+$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."] = "Het databaseconfiguratiebestand \"config/local.config.php\" kon niet worden weggeschreven. Je kunt de bijgevoegde tekst gebruiken om in een configuratiebestand aan te maken in de hoogste map van je webserver. ";
+$a->strings["You may need to import the file \"database.sql\" manually using phpmyadmin or mysql."] = "Het kan nodig zijn om het bestand \"database.sql\" manueel te importeren met phpmyadmin of mysql.";
+$a->strings["Please see the file \"INSTALL.txt\"."] = "Zie het bestand \"INSTALL.txt\".";
+$a->strings["Could not find a command line version of PHP in the web server PATH."] = "Kan geen command-line-versie van PHP vinden in het PATH van de webserver.";
+$a->strings["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>"] = "Als je geen command line versie van PHP geïnstalleerd hebt op je server, dan kan je de achtergrondprocessen niet draaien. Zie <a href='https://github.com/friendica/friendica/blob/master/doc/Install.md#set-up-the-worker'>'Installatie van de worker'</a>";
+$a->strings["PHP executable path"] = "PATH van het PHP commando";
+$a->strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "Vul het volledige pad in naar het php programma. Je kunt dit leeg laten om de installatie verder te zetten.";
+$a->strings["Command line PHP"] = "PHP-opdrachtregel";
+$a->strings["PHP executable is not the php cli binary (could be cgi-fgci version)"] = "PHP uitvoerbaar bestand is niet de php cli binary (zou kunnen de cgi-fgci versie zijn)";
+$a->strings["Found PHP version: "] = "Gevonden PHP versie:";
+$a->strings["PHP cli binary"] = "PHP cli binary";
+$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "De command-line versie van PHP op jouw systeem heeft \"register_argc_argv\" niet geactiveerd.";
+$a->strings["This is required for message delivery to work."] = "Dit is nodig om het verzenden van berichten mogelijk te maken.";
+$a->strings["PHP register_argc_argv"] = "PHP register_argc_argv";
+$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Fout: de \"openssl_pkey_new\" functie op dit systeem kan geen encryptie sleutels genereren";
+$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Zie \"http://www.php.net/manual/en/openssl.installation.php\" wanneer u Friendica onder Windows draait.";
+$a->strings["Generate encryption keys"] = "Genereer encryptie sleutels";
+$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Fout: Apache-module mod-rewrite is vereist, maar niet geïnstalleerd.";
+$a->strings["Apache mod_rewrite module"] = "Apache mod_rewrite module";
+$a->strings["Error: PDO or MySQLi PHP module required but not installed."] = "Fout: PDO of MySQLi PHP module vereist maar niet geïnstalleerd.";
+$a->strings["Error: The MySQL driver for PDO is not installed."] = "Fout: de MySQL driver voor PDO is niet geïnstalleerd.";
+$a->strings["PDO or MySQLi PHP module"] = "PDO of MySQLi PHP module";
+$a->strings["Error, XML PHP module required but not installed."] = "Fout: XML PHP module vereist maar niet geinstalleerd.";
+$a->strings["XML PHP module"] = "XML PHP module";
+$a->strings["libCurl PHP module"] = "libCurl PHP module";
+$a->strings["Error: libCURL PHP module required but not installed."] = "Fout: PHP-module libCURL is vereist, maar niet geïnstalleerd.";
+$a->strings["GD graphics PHP module"] = "GD graphics PHP module";
+$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Fout: PHP-module GD graphics met JPEG support is vereist, maar niet geïnstalleerd.";
+$a->strings["OpenSSL PHP module"] = "OpenSSL PHP module";
+$a->strings["Error: openssl PHP module required but not installed."] = "Fout: PHP-module openssl is vereist, maar niet geïnstalleerd.";
+$a->strings["mb_string PHP module"] = "mb_string PHP module";
+$a->strings["Error: mb_string PHP module required but not installed."] = "Fout: PHP-module mb_string is vereist, maar niet geïnstalleerd.";
+$a->strings["iconv PHP module"] = "iconv PHP module";
+$a->strings["Error: iconv PHP module required but not installed."] = "Fout: iconv PHP module vereist maar niet geïnstalleerd.";
+$a->strings["POSIX PHP module"] = "POSIX PHP module";
+$a->strings["Error: POSIX PHP module required but not installed."] = "Fout: POSIX PHP module vereist maar niet geïnstalleerd.";
+$a->strings["JSON PHP module"] = "";
+$a->strings["Error: JSON PHP module required but not installed."] = "";
+$a->strings["File Information PHP module"] = "";
+$a->strings["Error: File Information PHP module required but not installed."] = "";
+$a->strings["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."] = "Het installatieprogramma moet een bestand \"local.config.php\" in de \"config\" map van je webserver aanmaken, maar kan dit niet doen. ";
+$a->strings["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."] = "Dit is meestal een permissieprobleem, omdat de webserver niet in staat is om in deze map bestanden weg te schrijven - ook al kun je dit zelf wel.";
+$a->strings["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."] = "Op het einde van deze procedure zal ik je een tekst geven om te bewaren in een bestand local.config.php in Friendica \"config\" map. ";
+$a->strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"INSTALL.txt\" for instructions."] = "Je kunt ook deze procedure overslaan, en een manuele installatie uitvoeren. Lees het bestand \"INSTALL.txt\" voor instructies.";
+$a->strings["config/local.config.php is writable"] = "config/local.config.php is schrijfbaar ";
+$a->strings["Friendica uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "Friendica gebruikt het Smarty3 sjabloon systeem om zijn webpagina's weer te geven. Smarty3 compileert sjablonen naar PHP om de weergave te versnellen.";
+$a->strings["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."] = "Om deze gecompileerde sjablonen op te slaan moet de webserver schrijftoegang hebben tot de folder view/smarty3, t.o.v. van de hoogste folder van je Friendica-installatie.";
+$a->strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "Zorg ervoor dat de gebruiker waaronder je webserver runt (bijv. www-data) schrijf-toegang heeft tot deze map.";
+$a->strings["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."] = "Opmerking: voor een goede beveiliging zou je de webserver alleen schrijf-toegang moeten geven voor de map view/smarty3 -- niet voor de template bestanden (.tpl) die in die map zitten.";
+$a->strings["view/smarty3 is writable"] = "view/smarty3 is schrijfbaar";
+$a->strings["Url rewrite in .htaccess is not working. Make sure you copied .htaccess-dist to .htaccess."] = "Url rewrite in .htaccess werkt niet. Heb je .htaccess-dist gekopieerd naar .htaccess?";
+$a->strings["Error message from Curl when fetching"] = "Fout boodschap van Curl bij ophalen";
+$a->strings["Url rewrite is working"] = "Url rewrite werkt correct";
+$a->strings["ImageMagick PHP extension is not installed"] = "ImageMagick PHP extensie is niet geïnstalleerd";
+$a->strings["ImageMagick PHP extension is installed"] = "ImageMagick PHP extensie is geïnstalleerd";
+$a->strings["ImageMagick supports GIF"] = "ImageMagick ondersteunt GIF";
+$a->strings["Database already in use."] = "Database al in gebruik.";
+$a->strings["Could not connect to database."] = "Kon geen toegang krijgen tot de database.";
+$a->strings["Tuesday"] = "Dinsdag";
+$a->strings["Wednesday"] = "Woensdag";
+$a->strings["Thursday"] = "Donderdag";
+$a->strings["Friday"] = "Vrijdag";
+$a->strings["Saturday"] = "Zaterdag";
+$a->strings["January"] = "Januari";
+$a->strings["February"] = "Februari";
+$a->strings["March"] = "Maart";
+$a->strings["April"] = "April";
+$a->strings["May"] = "Mei";
+$a->strings["June"] = "Juni";
+$a->strings["July"] = "Juli";
+$a->strings["August"] = "Augustus";
+$a->strings["September"] = "September";
+$a->strings["October"] = "Oktober";
+$a->strings["November"] = "November";
+$a->strings["December"] = "December";
+$a->strings["Mon"] = "Maa";
+$a->strings["Tue"] = "Din";
+$a->strings["Wed"] = "Woe";
+$a->strings["Thu"] = "Don";
+$a->strings["Fri"] = "Vrij";
+$a->strings["Sat"] = "Zat";
+$a->strings["Sun"] = "Zon";
+$a->strings["Jan"] = "Jan";
+$a->strings["Feb"] = "Feb";
+$a->strings["Mar"] = "Maa";
+$a->strings["Apr"] = "Apr";
+$a->strings["Jun"] = "Jun";
+$a->strings["Jul"] = "Jul";
+$a->strings["Aug"] = "Aug";
+$a->strings["Sep"] = "Sep";
+$a->strings["Oct"] = "Okt";
+$a->strings["Nov"] = "Nov";
+$a->strings["Dec"] = "Dec";
+$a->strings["poke"] = "por";
+$a->strings["poked"] = "porde";
+$a->strings["ping"] = "ping";
+$a->strings["pinged"] = "gepingd";
+$a->strings["prod"] = "porren";
+$a->strings["prodded"] = "gepord";
+$a->strings["slap"] = "slaan";
+$a->strings["slapped"] = "geslagen";
+$a->strings["finger"] = "finger";
+$a->strings["fingered"] = "gerfingerd";
+$a->strings["rebuff"] = "afpoeieren";
+$a->strings["rebuffed"] = "afgepoeierd";
+$a->strings["System"] = "Systeem";
+$a->strings["Home"] = "Tijdlijn";
+$a->strings["Introductions"] = "Verzoeken";
+$a->strings["%s commented on %s's post"] = "%s gaf een reactie op het bericht van %s";
+$a->strings["%s created a new post"] = "%s schreef een nieuw bericht";
+$a->strings["%s liked %s's post"] = "%s vond het bericht van %s leuk";
+$a->strings["%s disliked %s's post"] = "%s vond het bericht van %s niet leuk";
+$a->strings["%s is attending %s's event"] = "%s woont het event van %s bij";
+$a->strings["%s is not attending %s's event"] = "%s woont het event van %s niet bij";
+$a->strings["%s may attend %s's event"] = "%s woont het event van %s misschien bij";
+$a->strings["%s is now friends with %s"] = "%s is nu bevriend met %s";
+$a->strings["Friend Suggestion"] = "Vriendschapsvoorstel";
+$a->strings["Friend/Connect Request"] = "Vriendschapsverzoek";
+$a->strings["New Follower"] = "Nieuwe Volger";
+$a->strings["Welcome %s"] = "";
+$a->strings["Please upload a profile photo."] = "Upload een profielfoto.";
+$a->strings["Welcome back %s"] = "";
+$a->strings["Update %s failed. See error logs."] = "Wijziging %s mislukt. Lees de error logbestanden.";
+$a->strings["\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."] = "\n\t\t\t\tDe Friendica ontwikkelaars hebben recent update %svrijgegeven,\n \t\t\t\tmaar wanneer ik deze probeerde te installeren ging het verschrikkelijk fout.\n \t\t\t\tDit moet snel opgelost worden en ik kan het niet alleen. Contacteer alstublieft\n \t\t\t\teen Friendica ontwikkelaar als je mij zelf niet kan helpen. Mijn database kan ongeldig zijn.";
+$a->strings["The error message is\n[pre]%s[/pre]"] = "De foutboodschap is\n[pre]%s[/pre]";
+$a->strings["[Friendica Notify] Database update"] = "";
+$a->strings["\n\t\t\t\t\tThe friendica database was successfully updated from %s to %s."] = "\n\t\t\t\t\tDe Friendica database is succesvol geupdatet van %s naar %s";
+$a->strings["Error decoding account file"] = "Fout bij decoderen van het account bestand";
+$a->strings["Error! No version data in file! This is not a Friendica account file?"] = "Fout! Geen versie data in het bestand! Is dit wel een Friendica account bestand?";
+$a->strings["User '%s' already exists on this server!"] = "Gebruiker '%s' bestaat al op deze server!";
+$a->strings["User creation error"] = "Fout bij het aanmaken van de gebruiker";
+$a->strings["User profile creation error"] = "Fout bij het aanmaken van het gebruikersprofiel";
+$a->strings["%d contact not imported"] = [
+       0 => "%d contact werd niet geïmporteerd",
+       1 => "%d contacten werden niet geïmporteerd",
+];
+$a->strings["Done. You can now login with your username and password"] = "Gebeurd. Je kunt nu inloggen met je gebruikersnaam en wachtwoord";
+$a->strings["Birthday:"] = "Verjaardag:";
+$a->strings["YYYY-MM-DD or MM-DD"] = "JJJJ-MM-DD of MM-DD";
+$a->strings["never"] = "nooit";
+$a->strings["less than a second ago"] = "minder dan een seconde geleden";
+$a->strings["year"] = "jaar";
+$a->strings["years"] = "jaren";
+$a->strings["months"] = "maanden";
+$a->strings["weeks"] = "weken";
+$a->strings["days"] = "dagen";
+$a->strings["hour"] = "uur";
+$a->strings["hours"] = "uren";
+$a->strings["minute"] = "minuut";
+$a->strings["minutes"] = "minuten";
+$a->strings["second"] = "seconde";
+$a->strings["seconds"] = "seconden";
+$a->strings["in %1\$d %2\$s"] = "in %1\$d%2\$s";
+$a->strings["%1\$d %2\$s ago"] = "%1\$d %2\$s geleden";
+$a->strings["view full size"] = "Volledig formaat";
+$a->strings["Image/photo"] = "Afbeelding/foto";
+$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 schreef:";
+$a->strings["Encrypted content"] = "Versleutelde inhoud";
+$a->strings["Invalid source protocol"] = "Ongeldig bron protocol";
+$a->strings["Invalid link protocol"] = "Ongeldig verbinding protocol";
+$a->strings["Loading more entries..."] = "Meer berichten aan het laden...";
+$a->strings["The end"] = "Het einde";
+$a->strings["Follow"] = "Volg";
+$a->strings["@name, !forum, #tags, content"] = "@naam, !forum, #labels, inhoud";
+$a->strings["Full Text"] = "Volledige tekst";
+$a->strings["Tags"] = "Labels";
+$a->strings["Click to open/close"] = "klik om te openen/sluiten";
+$a->strings["Export"] = "Exporteer";
+$a->strings["Export calendar as ical"] = "Exporteer kalender als ical";
+$a->strings["Export calendar as csv"] = "Exporteer kalender als csv";
+$a->strings["No contacts"] = "Geen contacten";
+$a->strings["%d Contact"] = [
+       0 => "%d contact",
+       1 => "%d contacten",
+];
+$a->strings["View Contacts"] = "Bekijk contacten";
+$a->strings["Trending Tags (last %d hour)"] = [
+       0 => "",
+       1 => "",
+];
+$a->strings["More Trending Tags"] = "";
+$a->strings["newer"] = "nieuwere berichten";
+$a->strings["older"] = "oudere berichten";
+$a->strings["prev"] = "vorige";
+$a->strings["last"] = "laatste";
 $a->strings["Frequently"] = "Frequent";
 $a->strings["Hourly"] = "Ieder uur";
 $a->strings["Twice daily"] = "Twee maal daags";
@@ -1516,6 +1231,7 @@ $a->strings["Monthly"] = "Maandelijks";
 $a->strings["DFRN"] = "DFRN";
 $a->strings["OStatus"] = "OStatus";
 $a->strings["RSS/Atom"] = "RSS/Atom";
+$a->strings["Email"] = "E-mail";
 $a->strings["Zot!"] = "Zot!";
 $a->strings["LinkedIn"] = "LinkedIn";
 $a->strings["XMPP/IM"] = "XMPP/Chat";
@@ -1527,6 +1243,7 @@ $a->strings["Diaspora Connector"] = "Diaspora Connector";
 $a->strings["GNU Social Connector"] = "GNU Social Connector";
 $a->strings["ActivityPub"] = "ActivityPub";
 $a->strings["pnut"] = "pnut";
+$a->strings["No answer"] = "Geen antwoord";
 $a->strings["Male"] = "Mannelijk";
 $a->strings["Female"] = "Vrouwelijk";
 $a->strings["Currently Male"] = "Momenteel mannelijk";
@@ -1555,8 +1272,7 @@ $a->strings["Oodles"] = "Veel";
 $a->strings["Nonsexual"] = "Niet seksueel";
 $a->strings["Single"] = "Alleenstaand";
 $a->strings["Lonely"] = "Eenzaam";
-$a->strings["Available"] = "Beschikbaar";
-$a->strings["Unavailable"] = "Onbeschikbaar";
+$a->strings["In a relation"] = "In een relatie";
 $a->strings["Has crush"] = "Verliefd";
 $a->strings["Infatuated"] = "Smoorverliefd";
 $a->strings["Dating"] = "Aan het daten";
@@ -1591,10 +1307,15 @@ $a->strings["Photo Location"] = "Foto Locatie";
 $a->strings["Photo metadata is normally stripped. This extracts the location (if present) prior to stripping metadata and links it to a map."] = "Foto metadata wordt normaal verwijderd. Dit extraheert de locatie (indien aanwezig) vooraleer de metadata te verwijderen en verbindt die met een kaart.";
 $a->strings["Export Public Calendar"] = "Exporteer Publieke Kalender";
 $a->strings["Ability for visitors to download the public calendar"] = "Mogelijkheid voor bezoekers om de publieke kalender te downloaden";
+$a->strings["Trending Tags"] = "";
+$a->strings["Show a community page widget with a list of the most popular tags in recent public posts."] = "";
 $a->strings["Post Composition Features"] = "Functies voor het opstellen van berichten";
 $a->strings["Auto-mention Forums"] = "Auto-vermelding Forums";
 $a->strings["Add/remove mention when a forum page is selected/deselected in ACL window."] = "Voeg toe/verwijder vermelding wanneer een forum pagina geselecteerd/gedeselecteerd wordt in het ACL venster.";
+$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"] = "Netwerk Zijbalk";
+$a->strings["Archives"] = "Archieven";
 $a->strings["Ability to select posts by date ranges"] = "Mogelijkheid om berichten te selecteren volgens datumbereik";
 $a->strings["Protocol Filter"] = "Proctocol Filter";
 $a->strings["Enable widget to display Network posts only from selected protocols"] = "Sta de widget toe om netwerkberichten te tonen van bepaalde protocollen";
@@ -1613,85 +1334,45 @@ $a->strings["Tag Cloud"] = "Tag Wolk";
 $a->strings["Provide a personal tag cloud on your profile page"] = "Voorzie een persoonlijk tag wolk op je profiel pagina";
 $a->strings["Display Membership Date"] = "Toon Lidmaatschap Datum";
 $a->strings["Display membership date in profile"] = "Toon lidmaatschap datum in profiel";
-$a->strings["Forums"] = "Forums";
-$a->strings["External link to forum"] = "Externe link naar het forum";
 $a->strings["Nothing new here"] = "Niets nieuw hier";
 $a->strings["Clear notifications"] = "Notificaties verwijderen";
-$a->strings["@name, !forum, #tags, content"] = "@naam, !forum, #labels, inhoud";
 $a->strings["Logout"] = "Uitloggen";
 $a->strings["End this session"] = "Deze sessie beëindigen";
-$a->strings["Status"] = "Tijdlijn";
-$a->strings["Your posts and conversations"] = "Jouw berichten en gesprekken";
-$a->strings["Your profile page"] = "Jouw profiel pagina";
-$a->strings["Your photos"] = "Jouw foto's";
-$a->strings["Videos"] = "Video's";
-$a->strings["Your videos"] = "Je video's";
-$a->strings["Your events"] = "Jouw gebeurtenissen";
+$a->strings["Login"] = "Login";
+$a->strings["Sign in"] = "Inloggen";
 $a->strings["Personal notes"] = "Persoonlijke nota's";
 $a->strings["Your personal notes"] = "Je persoonlijke nota's";
-$a->strings["Sign in"] = "Inloggen";
-$a->strings["Home"] = "Tijdlijn";
 $a->strings["Home Page"] = "Jouw tijdlijn";
+$a->strings["Register"] = "Registreer";
 $a->strings["Create an account"] = "Maak een accoount";
 $a->strings["Help and documentation"] = "Hulp en documentatie";
 $a->strings["Apps"] = "Apps";
 $a->strings["Addon applications, utilities, games"] = "Extra toepassingen, hulpmiddelen of spelletjes";
 $a->strings["Search site content"] = "Doorzoek de inhoud van de website";
-$a->strings["Full Text"] = "Volledige tekst";
-$a->strings["Tags"] = "Labels";
 $a->strings["Community"] = "Website";
 $a->strings["Conversations on this and other servers"] = "Gesprekken op deze en andere servers";
-$a->strings["Events and Calendar"] = "Gebeurtenissen en kalender";
 $a->strings["Directory"] = "Gids";
 $a->strings["People directory"] = "Personengids";
+$a->strings["Information"] = "Informatie";
 $a->strings["Information about this friendica instance"] = "informatie over deze friendica server";
+$a->strings["Terms of Service"] = "Gebruiksvoorwaarden";
 $a->strings["Terms of Service of this Friendica instance"] = "Gebruiksvoorwaarden op deze Friendica server";
-$a->strings["Conversations from your friends"] = "Gesprekken van je vrienden";
 $a->strings["Network Reset"] = "Netwerkpagina opnieuw instellen";
 $a->strings["Load Network page with no filters"] = "Laad de netwerkpagina zonder filters";
-$a->strings["Introductions"] = "Verzoeken";
 $a->strings["Friend Requests"] = "Vriendschapsverzoeken";
 $a->strings["See all notifications"] = "Toon alle notificaties";
 $a->strings["Mark all system notifications seen"] = "Alle systeemnotificaties als gelezen markeren";
-$a->strings["Private mail"] = "Privéberichten";
 $a->strings["Inbox"] = "Inbox";
 $a->strings["Outbox"] = "Verzonden berichten";
 $a->strings["Manage"] = "Beheren";
 $a->strings["Manage other pages"] = "Andere pagina's beheren";
-$a->strings["Account settings"] = "Account instellingen";
 $a->strings["Manage/Edit Profiles"] = "Beheer/Wijzig Profielen";
-$a->strings["Manage/edit friends and contacts"] = "Beheer/Wijzig vrienden en contacten";
+$a->strings["Admin"] = "Beheer";
 $a->strings["Site setup and configuration"] = "Website opzetten en configureren";
 $a->strings["Navigation"] = "Navigatie";
 $a->strings["Site map"] = "Sitemap";
 $a->strings["Embedding disabled"] = "Inbedden uitgeschakeld";
 $a->strings["Embedded content"] = "Ingebedde inhoud";
-$a->strings["newer"] = "nieuwere berichten";
-$a->strings["older"] = "oudere berichten";
-$a->strings["first"] = "eerste";
-$a->strings["prev"] = "vorige";
-$a->strings["next"] = "volgende";
-$a->strings["last"] = "laatste";
-$a->strings["view full size"] = "Volledig formaat";
-$a->strings["Image/photo"] = "Afbeelding/foto";
-$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 schreef:";
-$a->strings["Encrypted content"] = "Versleutelde inhoud";
-$a->strings["Invalid source protocol"] = "Ongeldig bron protocol";
-$a->strings["Invalid link protocol"] = "Ongeldig verbinding protocol";
-$a->strings["Loading more entries..."] = "Meer berichten aan het laden...";
-$a->strings["The end"] = "Het einde";
-$a->strings["No contacts"] = "Geen contacten";
-$a->strings["%d Contact"] = [
-       0 => "%d contact",
-       1 => "%d contacten",
-];
-$a->strings["View Contacts"] = "Bekijk contacten";
-$a->strings["Follow"] = "Volg";
-$a->strings["Click to open/close"] = "klik om te openen/sluiten";
-$a->strings["Export"] = "Exporteer";
-$a->strings["Export calendar as ical"] = "Exporteer kalender als ical";
-$a->strings["Export calendar as csv"] = "Exporteer kalender als csv";
 $a->strings["Add New Contact"] = "Nieuw Contact toevoegen";
 $a->strings["Enter address or web location"] = "Voeg een webadres of -locatie in:";
 $a->strings["Example: bob@example.com, http://example.com/barbara"] = "Voorbeeld: jan@voorbeeld.be, http://voorbeeld.nl/barbara";
@@ -1699,13 +1380,10 @@ $a->strings["%d invitation available"] = [
        0 => "%d uitnodiging beschikbaar",
        1 => "%d uitnodigingen beschikbaar",
 ];
-$a->strings["Find People"] = "Zoek mensen";
-$a->strings["Enter name or interest"] = "Vul naam of interesse in";
-$a->strings["Examples: Robert Morgenstein, Fishing"] = "Voorbeelden: Jan Peeters, Vissen";
-$a->strings["Similar Interests"] = "Dezelfde interesses";
-$a->strings["Random Profile"] = "Willekeurig Profiel";
-$a->strings["Invite Friends"] = "Vrienden uitnodigen";
-$a->strings["Local Directory"] = "Lokale gids";
+$a->strings["Following"] = "";
+$a->strings["Mutual friends"] = "";
+$a->strings["Relationships"] = "";
+$a->strings["All Contacts"] = "Alle Contacten";
 $a->strings["Protocols"] = "Protocollen";
 $a->strings["All Protocols"] = "Alle protocollen";
 $a->strings["Saved Folders"] = "Bewaarde Mappen";
@@ -1715,157 +1393,18 @@ $a->strings["%d contact in common"] = [
        0 => "%d gedeeld contact",
        1 => "%d gedeelde contacten",
 ];
-$a->strings["Post to Email"] = "Verzenden per e-mail";
-$a->strings["Hide your profile details from unknown viewers?"] = "Je profieldetails verbergen voor onbekende bezoekers?";
-$a->strings["Connectors disabled, since \"%s\" is enabled."] = "Connectoren gedeactiveerd, aangezien \"%s\" geactiveerd is.";
-$a->strings["Visible to everybody"] = "Zichtbaar voor iedereen";
-$a->strings["show"] = "tonen";
-$a->strings["don't show"] = "niet tonen";
-$a->strings["Close"] = "Afsluiten";
-$a->strings["Welcome "] = "Welkom";
-$a->strings["Please upload a profile photo."] = "Upload een profielfoto.";
-$a->strings["Welcome back "] = "Welkom terug ";
-$a->strings["Could not find any unarchived contact entry for this URL (%s)"] = "Kon geen niet-gearchiveerde contacten vinden voor deze URL (%s)";
-$a->strings["The contact entries have been archived"] = "The contacten zijn gearchiveerd";
-$a->strings["Enter new password: "] = "Geef nieuw paswoord:";
-$a->strings["Password can't be empty"] = "Paswoord mag niet leeg zijn";
-$a->strings["Post update version number has been set to %s."] = "Bericht update versie is ingesteld op %s";
-$a->strings["Check for pending update actions."] = "Controleren op uitgestelde update acties.";
-$a->strings["Done."] = "Gedaan";
-$a->strings["Execute pending post updates."] = "uitgestelde bericht update acties uitvoeren";
-$a->strings["All pending post updates are done."] = "Alle uitgestelde bericht update acties zijn uitgevoerd";
-$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."] = "Het databaseconfiguratiebestand \"config/local.config.php\" kon niet worden weggeschreven. Je kunt de bijgevoegde tekst gebruiken om in een configuratiebestand aan te maken in de hoogste map van je webserver. ";
-$a->strings["You may need to import the file \"database.sql\" manually using phpmyadmin or mysql."] = "Het kan nodig zijn om het bestand \"database.sql\" manueel te importeren met phpmyadmin of mysql.";
-$a->strings["Please see the file \"INSTALL.txt\"."] = "Zie het bestand \"INSTALL.txt\".";
-$a->strings["Could not find a command line version of PHP in the web server PATH."] = "Kan geen command-line-versie van PHP vinden in het PATH van de webserver.";
-$a->strings["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>"] = "Als je geen command line versie van PHP geïnstalleerd hebt op je server, dan kan je de achtergrondprocessen niet draaien. Zie <a href='https://github.com/friendica/friendica/blob/master/doc/Install.md#set-up-the-worker'>'Installatie van de worker'</a>";
-$a->strings["PHP executable path"] = "PATH van het PHP commando";
-$a->strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "Vul het volledige pad in naar het php programma. Je kunt dit leeg laten om de installatie verder te zetten.";
-$a->strings["Command line PHP"] = "PHP-opdrachtregel";
-$a->strings["PHP executable is not the php cli binary (could be cgi-fgci version)"] = "PHP uitvoerbaar bestand is niet de php cli binary (zou kunnen de cgi-fgci versie zijn)";
-$a->strings["Found PHP version: "] = "Gevonden PHP versie:";
-$a->strings["PHP cli binary"] = "PHP cli binary";
-$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "De command-line versie van PHP op jouw systeem heeft \"register_argc_argv\" niet geactiveerd.";
-$a->strings["This is required for message delivery to work."] = "Dit is nodig om het verzenden van berichten mogelijk te maken.";
-$a->strings["PHP register_argc_argv"] = "PHP register_argc_argv";
-$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Fout: de \"openssl_pkey_new\" functie op dit systeem kan geen encryptie sleutels genereren";
-$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Zie \"http://www.php.net/manual/en/openssl.installation.php\" wanneer u Friendica onder Windows draait.";
-$a->strings["Generate encryption keys"] = "Genereer encryptie sleutels";
-$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Fout: Apache-module mod-rewrite is vereist, maar niet geïnstalleerd.";
-$a->strings["Apache mod_rewrite module"] = "Apache mod_rewrite module";
-$a->strings["Error: PDO or MySQLi PHP module required but not installed."] = "Fout: PDO of MySQLi PHP module vereist maar niet geïnstalleerd.";
-$a->strings["Error: The MySQL driver for PDO is not installed."] = "Fout: de MySQL driver voor PDO is niet geïnstalleerd.";
-$a->strings["PDO or MySQLi PHP module"] = "PDO of MySQLi PHP module";
-$a->strings["Error, XML PHP module required but not installed."] = "Fout: XML PHP module vereist maar niet geinstalleerd.";
-$a->strings["XML PHP module"] = "XML PHP module";
-$a->strings["libCurl PHP module"] = "libCurl PHP module";
-$a->strings["Error: libCURL PHP module required but not installed."] = "Fout: PHP-module libCURL is vereist, maar niet geïnstalleerd.";
-$a->strings["GD graphics PHP module"] = "GD graphics PHP module";
-$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Fout: PHP-module GD graphics met JPEG support is vereist, maar niet geïnstalleerd.";
-$a->strings["OpenSSL PHP module"] = "OpenSSL PHP module";
-$a->strings["Error: openssl PHP module required but not installed."] = "Fout: PHP-module openssl is vereist, maar niet geïnstalleerd.";
-$a->strings["mb_string PHP module"] = "mb_string PHP module";
-$a->strings["Error: mb_string PHP module required but not installed."] = "Fout: PHP-module mb_string is vereist, maar niet geïnstalleerd.";
-$a->strings["iconv PHP module"] = "iconv PHP module";
-$a->strings["Error: iconv PHP module required but not installed."] = "Fout: iconv PHP module vereist maar niet geïnstalleerd.";
-$a->strings["POSIX PHP module"] = "POSIX PHP module";
-$a->strings["Error: POSIX PHP module required but not installed."] = "Fout: POSIX PHP module vereist maar niet geïnstalleerd.";
-$a->strings["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."] = "Het installatieprogramma moet een bestand \"local.config.php\" in de \"config\" map van je webserver aanmaken, maar kan dit niet doen. ";
-$a->strings["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."] = "Dit is meestal een permissieprobleem, omdat de webserver niet in staat is om in deze map bestanden weg te schrijven - ook al kun je dit zelf wel.";
-$a->strings["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."] = "Op het einde van deze procedure zal ik je een tekst geven om te bewaren in een bestand local.config.php in Friendica \"config\" map. ";
-$a->strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"INSTALL.txt\" for instructions."] = "Je kunt ook deze procedure overslaan, en een manuele installatie uitvoeren. Lees het bestand \"INSTALL.txt\" voor instructies.";
-$a->strings["config/local.config.php is writable"] = "config/local.config.php is schrijfbaar ";
-$a->strings["Friendica uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "Friendica gebruikt het Smarty3 sjabloon systeem om zijn webpagina's weer te geven. Smarty3 compileert sjablonen naar PHP om de weergave te versnellen.";
-$a->strings["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."] = "Om deze gecompileerde sjablonen op te slaan moet de webserver schrijftoegang hebben tot de folder view/smarty3, t.o.v. van de hoogste folder van je Friendica-installatie.";
-$a->strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "Zorg ervoor dat de gebruiker waaronder je webserver runt (bijv. www-data) schrijf-toegang heeft tot deze map.";
-$a->strings["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."] = "Opmerking: voor een goede beveiliging zou je de webserver alleen schrijf-toegang moeten geven voor de map view/smarty3 -- niet voor de template bestanden (.tpl) die in die map zitten.";
-$a->strings["view/smarty3 is writable"] = "view/smarty3 is schrijfbaar";
-$a->strings["Url rewrite in .htaccess is not working. Make sure you copied .htaccess-dist to .htaccess."] = "Url rewrite in .htaccess werkt niet. Heb je .htaccess-dist gekopieerd naar .htaccess?";
-$a->strings["Error message from Curl when fetching"] = "Fout boodschap van Curl bij ophalen";
-$a->strings["Url rewrite is working"] = "Url rewrite werkt correct";
-$a->strings["ImageMagick PHP extension is not installed"] = "ImageMagick PHP extensie is niet geïnstalleerd";
-$a->strings["ImageMagick PHP extension is installed"] = "ImageMagick PHP extensie is geïnstalleerd";
-$a->strings["ImageMagick supports GIF"] = "ImageMagick ondersteunt GIF";
-$a->strings["Could not connect to database."] = "Kon geen toegang krijgen tot de database.";
-$a->strings["Database already in use."] = "Database al in gebruik.";
-$a->strings["Tuesday"] = "Dinsdag";
-$a->strings["Wednesday"] = "Woensdag";
-$a->strings["Thursday"] = "Donderdag";
-$a->strings["Friday"] = "Vrijdag";
-$a->strings["Saturday"] = "Zaterdag";
-$a->strings["January"] = "Januari";
-$a->strings["February"] = "Februari";
-$a->strings["March"] = "Maart";
-$a->strings["April"] = "April";
-$a->strings["May"] = "Mei";
-$a->strings["June"] = "Juni";
-$a->strings["July"] = "Juli";
-$a->strings["August"] = "Augustus";
-$a->strings["September"] = "September";
-$a->strings["October"] = "Oktober";
-$a->strings["November"] = "November";
-$a->strings["December"] = "December";
-$a->strings["Mon"] = "Maa";
-$a->strings["Tue"] = "Din";
-$a->strings["Wed"] = "Woe";
-$a->strings["Thu"] = "Don";
-$a->strings["Fri"] = "Vrij";
-$a->strings["Sat"] = "Zat";
-$a->strings["Sun"] = "Zon";
-$a->strings["Jan"] = "Jan";
-$a->strings["Feb"] = "Feb";
-$a->strings["Mar"] = "Maa";
-$a->strings["Apr"] = "Apr";
-$a->strings["Jul"] = "Jul";
-$a->strings["Aug"] = "Aug";
-$a->strings["Sep"] = "Sep";
-$a->strings["Oct"] = "Okt";
-$a->strings["Nov"] = "Nov";
-$a->strings["Dec"] = "Dec";
-$a->strings["poke"] = "por";
-$a->strings["poked"] = "porde";
-$a->strings["ping"] = "ping";
-$a->strings["pinged"] = "gepingd";
-$a->strings["prod"] = "porren";
-$a->strings["prodded"] = "gepord";
-$a->strings["slap"] = "slaan";
-$a->strings["slapped"] = "geslagen";
-$a->strings["finger"] = "finger";
-$a->strings["fingered"] = "gerfingerd";
-$a->strings["rebuff"] = "afpoeieren";
-$a->strings["rebuffed"] = "afgepoeierd";
-$a->strings["System"] = "Systeem";
-$a->strings["%s commented on %s's post"] = "%s gaf een reactie op het bericht van %s";
-$a->strings["%s created a new post"] = "%s schreef een nieuw bericht";
-$a->strings["%s liked %s's post"] = "%s vond het bericht van %s leuk";
-$a->strings["%s disliked %s's post"] = "%s vond het bericht van %s niet leuk";
-$a->strings["%s is attending %s's event"] = "%s woont het event van %s bij";
-$a->strings["%s is not attending %s's event"] = "%s woont het event van %s niet bij";
-$a->strings["%s may attend %s's event"] = "%s woont het event van %s misschien bij";
-$a->strings["%s is now friends with %s"] = "%s is nu bevriend met %s";
-$a->strings["Friend Suggestion"] = "Vriendschapsvoorstel";
-$a->strings["Friend/Connect Request"] = "Vriendschapsverzoek";
-$a->strings["New Follower"] = "Nieuwe Volger";
-$a->strings["Update %s failed. See error logs."] = "Wijziging %s mislukt. Lees de error logbestanden.";
-$a->strings["\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."] = "\n\t\t\t\tDe Friendica ontwikkelaars hebben recent update %svrijgegeven,\n \t\t\t\tmaar wanneer ik deze probeerde te installeren ging het verschrikkelijk fout.\n \t\t\t\tDit moet snel opgelost worden en ik kan het niet alleen. Contacteer alstublieft\n \t\t\t\teen Friendica ontwikkelaar als je mij zelf niet kan helpen. Mijn database kan ongeldig zijn.";
-$a->strings["The error message is\n[pre]%s[/pre]"] = "De foutboodschap is\n[pre]%s[/pre]";
-$a->strings["\n\t\t\t\t\tThe friendica database was successfully updated from %s to %s."] = "\n\t\t\t\t\tDe Friendica database is succesvol geupdatet van %s naar %s";
-$a->strings["Error decoding account file"] = "Fout bij decoderen van het account bestand";
-$a->strings["Error! No version data in file! This is not a Friendica account file?"] = "Fout! Geen versie data in het bestand! Is dit wel een Friendica account bestand?";
-$a->strings["User '%s' already exists on this server!"] = "Gebruiker '%s' bestaat al op deze server!";
-$a->strings["User creation error"] = "Fout bij het aanmaken van de gebruiker";
-$a->strings["User profile creation error"] = "Fout bij het aanmaken van het gebruikersprofiel";
-$a->strings["%d contact not imported"] = [
-       0 => "%d contact werd niet geïmporteerd",
-       1 => "%d contacten werden niet geïmporteerd",
-];
-$a->strings["Done. You can now login with your username and password"] = "Gebeurd. Je kunt nu inloggen met je gebruikersnaam en wachtwoord";
 $a->strings["There are no tables on MyISAM."] = "Er zijn geen MyISAM tabellen.";
 $a->strings["\nError %d occurred during database update:\n%s\n"] = "\nFout %d is opgetreden tijdens database update:\n%s\n";
 $a->strings["Errors encountered performing database changes: "] = "Fouten opgetreden tijdens database aanpassingen:";
 $a->strings["%s: Database update"] = "%s: Database update";
 $a->strings["%s: updating %s table."] = "%s: tabel %s aan het updaten.";
-$a->strings["Legacy module file not found: %s"] = "Legacy module bestand niet gevonden: %s";
+$a->strings["Filesystem storage failed to create \"%s\". Check you write permissions."] = "";
+$a->strings["Filesystem storage failed to save data to \"%s\". Check your write permissions"] = "";
+$a->strings["Storage base path"] = "";
+$a->strings["Folder where uploaded files are saved. For maximum security, This should be a path outside web server folder tree"] = "";
+$a->strings["Enter a valid existing folder"] = "";
+$a->strings["Database storage failed to update %s"] = "";
+$a->strings["Database storage failed to insert data"] = "";
 $a->strings["Drop Contact"] = "Verwijder contact";
 $a->strings["Organisation"] = "Organisatie";
 $a->strings["News"] = "Nieuws";
@@ -1882,10 +1421,10 @@ $a->strings["Use mailto: in front of address to force email check."] = "Gebruik
 $a->strings["The profile address specified belongs to a network which has been disabled on this site."] = "Het opgegeven profiel adres behoort tot een netwerk dat gedeactiveerd is op deze site.";
 $a->strings["Limited profile. This person will be unable to receive direct/personal notifications from you."] = "Profiel met restricties. Deze peresoon zal geen directe/persoonlijke notificaties van jou kunnen ontvangen.";
 $a->strings["Unable to retrieve contact information."] = "Het was niet mogelijk informatie over dit contact op te halen.";
+$a->strings["l F d, Y \\@ g:i A"] = "l F d, Y \\@ g:i A";
 $a->strings["Starts:"] = "Begint:";
 $a->strings["Finishes:"] = "Eindigt:";
 $a->strings["all-day"] = "de hele dag";
-$a->strings["Jun"] = "Jun";
 $a->strings["Sept"] = "Sep";
 $a->strings["No events to display"] = "Geen gebeurtenissen te tonen";
 $a->strings["l, F j"] = "l j F";
@@ -1904,88 +1443,534 @@ $a->strings["A deleted group with this name was revived. Existing item permissio
 $a->strings["Default privacy group for new contacts"] = "Standaard privacy groep voor nieuwe contacten";
 $a->strings["Everybody"] = "Iedereen";
 $a->strings["edit"] = "verander";
+$a->strings["Groups"] = "Groepen";
 $a->strings["Edit group"] = "Verander groep";
+$a->strings["Contacts not in any group"] = "Contacten bestaan in geen enkele groep";
 $a->strings["Create a new group"] = "Maak nieuwe groep";
+$a->strings["Group Name: "] = "Groepsnaam:";
 $a->strings["Edit groups"] = "Bewerk groepen";
 $a->strings["activity"] = "activiteit";
 $a->strings["comment"] = [
        0 => "reactie",
        1 => "reacties",
 ];
-$a->strings["post"] = "bericht";
-$a->strings["Content warning: %s"] = "Waarschuwing inhoud: %s";
-$a->strings["bytes"] = "bytes";
-$a->strings["View on separate page"] = "Bekijk op aparte pagina";
-$a->strings["view on separate page"] = "bekijk op aparte pagina";
-$a->strings["[no subject]"] = "[geen onderwerp]";
-$a->strings["Requested account is not available."] = "Gevraagde account is niet beschikbaar.";
-$a->strings["Edit profile"] = "Bewerk profiel";
-$a->strings["Atom feed"] = "Atom feed";
-$a->strings["Manage/edit profiles"] = "Beheer/wijzig profielen";
-$a->strings["XMPP:"] = "XMPP:";
-$a->strings["g A l F d"] = "G l j F";
-$a->strings["F d"] = "d F";
-$a->strings["[today]"] = "[vandaag]";
-$a->strings["Birthday Reminders"] = "Verjaardagsherinneringen";
-$a->strings["Birthdays this week:"] = "Verjaardagen deze week:";
-$a->strings["[No description]"] = "[Geen omschrijving]";
-$a->strings["Event Reminders"] = "Gebeurtenisherinneringen";
-$a->strings["Upcoming events the next 7 days:"] = "Evenementen de komende 7 dagen:";
-$a->strings["Member since:"] = "Lid sinds:";
-$a->strings["j F, Y"] = "F j Y";
-$a->strings["j F"] = "F j";
-$a->strings["Birthday:"] = "Verjaardag:";
-$a->strings["Age:"] = "Leeftijd:";
-$a->strings["for %1\$d %2\$s"] = "voor %1\$d %2\$s";
-$a->strings["Religion:"] = "Religie:";
-$a->strings["Hobbies/Interests:"] = "Hobby:";
-$a->strings["Contact information and Social Networks:"] = "Contactinformatie en sociale netwerken:";
-$a->strings["Musical interests:"] = "Muzikale interesse ";
-$a->strings["Books, literature:"] = "Boeken, literatuur:";
-$a->strings["Television:"] = "Televisie";
-$a->strings["Film/dance/culture/entertainment:"] = "Film/dans/cultuur/ontspanning:";
-$a->strings["Love/Romance:"] = "Liefde/romance:";
-$a->strings["Work/employment:"] = "Werk/beroep:";
-$a->strings["School/education:"] = "School/opleiding:";
-$a->strings["Forums:"] = "Fora:";
-$a->strings["Profile Details"] = "Profieldetails";
-$a->strings["Only You Can See This"] = "Alleen jij kunt dit zien";
-$a->strings["Tips for New Members"] = "Tips voor nieuwe leden";
-$a->strings["OpenWebAuth: %1\$s welcomes %2\$s"] = "OpenWebAuth: %1\$s verwelkomt %2\$s";
-$a->strings["Login failed"] = "Login mislukt";
-$a->strings["Not enough information to authenticate"] = "Niet genoeg informatie om te authentificeren";
-$a->strings["An invitation is required."] = "Een uitnodiging is vereist.";
-$a->strings["Invitation could not be verified."] = "Uitnodiging kon niet geverifieerd worden.";
-$a->strings["Invalid OpenID url"] = "Ongeldige OpenID url";
-$a->strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "Er is een probleem opgetreden bij het inloggen met het opgegeven OpenID. Kijk alsjeblieft de spelling van deze ID na.";
-$a->strings["The error message was:"] = "De foutboodschap was:";
-$a->strings["Please enter the required information."] = "Vul de vereiste informatie in.";
-$a->strings["system.username_min_length (%s) and system.username_max_length (%s) are excluding each other, swapping values."] = "system.username_min_length (%s) en system.username_max_length (%s) sluiten elkaar uit. Waarden worden omgedraaid.";
-$a->strings["Username should be at least %s character."] = [
-       0 => "Gebruikersnaam moet minimaal %s tekens bevatten.",
-       1 => "Gebruikersnaam moet minimaal %s tekens bevatten",
+$a->strings["post"] = "bericht";
+$a->strings["Content warning: %s"] = "Waarschuwing inhoud: %s";
+$a->strings["bytes"] = "bytes";
+$a->strings["View on separate page"] = "Bekijk op aparte pagina";
+$a->strings["view on separate page"] = "bekijk op aparte pagina";
+$a->strings["[no subject]"] = "[geen onderwerp]";
+$a->strings["Edit profile"] = "Bewerk profiel";
+$a->strings["Manage/edit profiles"] = "Beheer/wijzig profielen";
+$a->strings["Status:"] = "Tijdlijn:";
+$a->strings["Homepage:"] = "Website:";
+$a->strings["XMPP:"] = "XMPP:";
+$a->strings["Unfollow"] = "";
+$a->strings["Atom feed"] = "Atom feed";
+$a->strings["g A l F d"] = "G l j F";
+$a->strings["F d"] = "d F";
+$a->strings["[today]"] = "[vandaag]";
+$a->strings["Birthday Reminders"] = "Verjaardagsherinneringen";
+$a->strings["Birthdays this week:"] = "Verjaardagen deze week:";
+$a->strings["[No description]"] = "[Geen omschrijving]";
+$a->strings["Event Reminders"] = "Gebeurtenisherinneringen";
+$a->strings["Upcoming events the next 7 days:"] = "Evenementen de komende 7 dagen:";
+$a->strings["Member since:"] = "Lid sinds:";
+$a->strings["j F, Y"] = "F j Y";
+$a->strings["j F"] = "F j";
+$a->strings["Age:"] = "Leeftijd:";
+$a->strings["for %1\$d %2\$s"] = "voor %1\$d %2\$s";
+$a->strings["Religion:"] = "Religie:";
+$a->strings["Hobbies/Interests:"] = "Hobby:";
+$a->strings["Contact information and Social Networks:"] = "Contactinformatie en sociale netwerken:";
+$a->strings["Musical interests:"] = "Muzikale interesse ";
+$a->strings["Books, literature:"] = "Boeken, literatuur:";
+$a->strings["Television:"] = "Televisie";
+$a->strings["Film/dance/culture/entertainment:"] = "Film/dans/cultuur/ontspanning:";
+$a->strings["Love/Romance:"] = "Liefde/romance:";
+$a->strings["Work/employment:"] = "Werk/beroep:";
+$a->strings["School/education:"] = "School/opleiding:";
+$a->strings["Forums:"] = "Fora:";
+$a->strings["Profile Details"] = "Profieldetails";
+$a->strings["Only You Can See This"] = "Alleen jij kunt dit zien";
+$a->strings["Tips for New Members"] = "Tips voor nieuwe leden";
+$a->strings["OpenWebAuth: %1\$s welcomes %2\$s"] = "OpenWebAuth: %1\$s verwelkomt %2\$s";
+$a->strings["Login failed"] = "Login mislukt";
+$a->strings["Not enough information to authenticate"] = "Niet genoeg informatie om te authentificeren";
+$a->strings["Password can't be empty"] = "Paswoord mag niet leeg zijn";
+$a->strings["Empty passwords are not allowed."] = "";
+$a->strings["The new password has been exposed in a public data dump, please choose another."] = "The nieuwe paswoord is gecompromitteerd in een publieke data dump, kies alsjeblieft een ander.";
+$a->strings["The password can't contain accentuated letters, white spaces or colons (:)"] = "";
+$a->strings["Passwords do not match. Password unchanged."] = "Wachtwoorden komen niet overeen. Wachtwoord niet gewijzigd.";
+$a->strings["An invitation is required."] = "Een uitnodiging is vereist.";
+$a->strings["Invitation could not be verified."] = "Uitnodiging kon niet geverifieerd worden.";
+$a->strings["Invalid OpenID url"] = "Ongeldige OpenID url";
+$a->strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "Er is een probleem opgetreden bij het inloggen met het opgegeven OpenID. Kijk alsjeblieft de spelling van deze ID na.";
+$a->strings["The error message was:"] = "De foutboodschap was:";
+$a->strings["Please enter the required information."] = "Vul de vereiste informatie in.";
+$a->strings["system.username_min_length (%s) and system.username_max_length (%s) are excluding each other, swapping values."] = "system.username_min_length (%s) en system.username_max_length (%s) sluiten elkaar uit. Waarden worden omgedraaid.";
+$a->strings["Username should be at least %s character."] = [
+       0 => "Gebruikersnaam moet minimaal %s tekens bevatten.",
+       1 => "Gebruikersnaam moet minimaal %s tekens bevatten",
+];
+$a->strings["Username should be at most %s character."] = [
+       0 => "Gebruikersnaam mag maximaal %s tekens bevatten.",
+       1 => "Gebruikersnaam mag maximaal %s tekens bevatten.",
+];
+$a->strings["That doesn't appear to be your full (First Last) name."] = "Dat lijkt niet je volledige naam (voor- en achternaam) te zijn.";
+$a->strings["Your email domain is not among those allowed on this site."] = "Je e-maildomein is op deze website niet toegestaan.";
+$a->strings["Not a valid email address."] = "Geen geldig e-mailadres.";
+$a->strings["The nickname was blocked from registration by the nodes admin."] = "De bijnaam werd geblokkeerd voor registratie door de node admin";
+$a->strings["Cannot use that email."] = "Ik kan die e-mail niet gebruiken.";
+$a->strings["Your nickname can only contain a-z, 0-9 and _."] = "Je bijnaam mag alleen a-z, 0-9 of _ bevatten.";
+$a->strings["Nickname is already registered. Please choose another."] = "Bijnaam is al geregistreerd. Kies een andere.";
+$a->strings["SERIOUS ERROR: Generation of security keys failed."] = "ERNSTIGE FOUT: aanmaken van beveiligingssleutels mislukt.";
+$a->strings["An error occurred during registration. Please try again."] = "Er is een fout opgetreden tijdens de registratie. Probeer opnieuw.";
+$a->strings["An error occurred creating your default profile. Please try again."] = "Er is een fout opgetreden bij het aanmaken van je standaard profiel. Probeer opnieuw.";
+$a->strings["An error occurred creating your self contact. Please try again."] = "Er is een fout opgetreden bij het aanmaken van je self contact. Probeer opnieuw.";
+$a->strings["An error occurred creating your default contact group. Please try again."] = "Er is een fout opgetreden bij het aanmaken van je standaard contact groep. Probeer opnieuw.";
+$a->strings["\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"] = "\n\t\t\tHallo %1\$s,\n\t\t\t\tBedankt om je te registreren op %2\$s. Uw account is op dit moment wachten op bevestiging door de administrator.\n\n\t\t\tUw login details zijn:\n\n\t\t\tSite locatie:\t%3\$s\n\t\t\tGebruikersnaam:\t\t%4\$s\n\t\t\tWachtwoord:\t\t%5\$s\n\t\t";
+$a->strings["Registration at %s"] = "Registratie bij %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"] = "\n\t\t\tBeste %1\$s,\n\t\t\t\tBedankt voor je registratie bij %2\$s. Je account is aangemaakt.\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."] = "\n\t\t\tDe login details zijn de volgende:\n\n\t\t\tSite Locatie:\t%3\$s\n\t\t\tLogin Naam:\t\t%1\$s\n\t\t\tPaswoord:\t\t%5\$s\n\n\t\t\tJe kunt je paswoord in de \"Instellingen\" pagina veranderen nadat je bent ingelogd.\n\n\t\t\tNeem een ogenblik de tijd om je andere instellingen na te kijken op die pagina.\n\n\t\t\tJe kunt ook wat basis informatie toevoegen aan je standaard profiel\n\t\t\t(in de \"Profielen\" pagina) zodat anderen je gemakkelijk kunnen vinden.\n\n\t\t\tWe raden aan je volledige naam in te vullen, een profiel foto toe te voegen,\n\t\t\tenkele profiel \"sleutelwoorden\" (zeer handig om nieuwe vrienden te leren kennen) - en\n\t\t\tmisschien in welk land je woont; als je niet meer details wil geven.\n\t\t\tWe respecteren je privacy volledig, en geen van deze velden zijn verplicht.\n\t\t\tAls je nieuw bent en niemand kent, dan kunnen zij je misschien\n\t\t\thelpen om enkele nieuwe en interessante vrienden te leren kennen.\n\n\t\t\tAls je ooit je account wil verwijderen, dan kan je dat via %3\$s/removeme\n\n\t\t\tBedankt en welkom bij %2\$s.";
+$a->strings["Registration details for %s"] = "Registratie details voor %s";
+$a->strings["Sharing notification from Diaspora network"] = "Deelt notificatie van het Diaspora netwerk";
+$a->strings["Attachments:"] = "Bijlagen:";
+$a->strings["%s's timeline"] = "Tijdslijn van %s";
+$a->strings["%s's posts"] = "Berichten van %s";
+$a->strings["%s's comments"] = "reactie van %s";
+$a->strings["%s is now following %s."] = "%s volgt nu %s.";
+$a->strings["following"] = "volgend";
+$a->strings["%s stopped following %s."] = "%s stopte %s te volgen.";
+$a->strings["stopped following"] = "is gestopt met volgen";
+$a->strings["(no subject)"] = "(geen onderwerp)";
+$a->strings["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."] = "Op het moment van de registratie, en om communicatie mogelijk te maken tussen de gebruikersaccount en zijn of haar contacten, moet de gebruiker een weergave naam opgeven, een gebruikersnaam (bijnaam) en een werkend email adres. De namen zullen toegankelijk zijn op de profiel pagina van het account voor elke bezoeker van de pagina, zelfs als andere profiel details niet getoond worden. Het email adres zal enkel gebruikt worden om de gebruiker notificaties te sturen over interacties, maar zal niet zichtbaar getoond worden. Het oplijsten van een account in de gids van de node van de gebruiker of in de globale gids is optioneel en kan beheerd worden in de gebruikersinstellingen, dit is niet nodig voor communicatie.";
+$a->strings["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."] = "Deze data is vereist voor communicatie en wordt doorgegeven aan de nodes van de communicatie partners en wordt daar opgeslagen. Gebruikers kunnen bijkomende privé data opgeven die mag doorgegeven worden aan de accounts van de communicatie partners.";
+$a->strings["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."] = "Een ingelogd gebruiker kan op elk moment zijn of haar account data exporteren via <a href=\"%1\$s/settings/uexport\">account instellingen</a>. Een gebruiker kan ook zijn of haar account verwijderen via <a href=\"%1\$s/removeme\">%1\$s/removeme</a>. De verwijdering van het account is permanent. Ook zal aan andere nodes van communicatie partners gevraagd worden om de data te verwijderen.";
+$a->strings["Privacy Statement"] = "Privacy Verklaring";
+$a->strings["No installed applications."] = "Geen toepassingen geïnstalleerd";
+$a->strings["Applications"] = "Toepassingen";
+$a->strings["Credits"] = "Credits";
+$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 is een gemeenschapsproject dat niet mogelijk zou zijn zonder de hulp van vele mensen.  Hier is een lijst van alle mensen die aan de code of vertalingen van Friendica hebben meegewerkt.  Allen van harte bedankt!";
+$a->strings["Addon not found."] = "";
+$a->strings["Addon %s disabled."] = "Addon %s gedeactiveerd";
+$a->strings["Addon %s enabled."] = "Addon %s geactiveerd";
+$a->strings["Disable"] = "Uitschakelen";
+$a->strings["Enable"] = "Inschakelen";
+$a->strings["Administration"] = "Beheer";
+$a->strings["Toggle"] = "Schakelaar";
+$a->strings["Author: "] = "Auteur:";
+$a->strings["Maintainer: "] = "Onderhoud:";
+$a->strings["Addon %s failed to install."] = "";
+$a->strings["Reload active addons"] = "Herlaad actieve 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"] = "Er zijn op je node momenteel geen addons beschikbaar. Je kan de officiële addon repository vinden op %1\$s en je kan mogelijks nog andere interessante addons vinden in de open addon registry op %2\$s";
+$a->strings["The contact has been blocked from the node"] = "Het contact is geblokkeerd van deze node";
+$a->strings["Could not find any contact entry for this URL (%s)"] = "Kon geen contact vinden op deze URL (%s)";
+$a->strings["%s contact unblocked"] = [
+       0 => "%s contact is niet langer geblokkeerd",
+       1 => "%s contacten zijn niet langer geblokkeerd",
+];
+$a->strings["Remote Contact Blocklist"] = "Remote Contact Blokkeerlijst";
+$a->strings["This page allows you to prevent any message from a remote contact to reach your node."] = "De pagina laat je toe om te vermijden dat boodschappen van een remote contact je node bereiken.";
+$a->strings["Block Remote Contact"] = "Blokkeer Remote Contact";
+$a->strings["select all"] = "Alles selecteren";
+$a->strings["select none"] = "selecteer geen";
+$a->strings["Unblock"] = "Blokkering opheffen";
+$a->strings["No remote contact is blocked from this node."] = "Geen enkel remote contact is geblokkeerd van deze node.";
+$a->strings["Blocked Remote Contacts"] = "Geblokkeerde Remote Contacts";
+$a->strings["Block New Remote Contact"] = "Blokkeer Nieuwe Remote Contacten";
+$a->strings["Photo"] = "Foto";
+$a->strings["Reason"] = "";
+$a->strings["%s total blocked contact"] = [
+       0 => "%s geblokkeerde contacten in totaal",
+       1 => "%s geblokkeerde contacten in totaal",
+];
+$a->strings["URL of the remote contact to block."] = "URL van de remote contact die je wil blokkeren.";
+$a->strings["Block Reason"] = "";
+$a->strings["Server domain pattern added to blocklist."] = "";
+$a->strings["Site blocklist updated."] = "Site blokkeerlijst opgeslagen";
+$a->strings["Blocked server domain pattern"] = "";
+$a->strings["Reason for the block"] = "Reden van de blokkering";
+$a->strings["Delete server domain pattern"] = "";
+$a->strings["Check to delete this entry from the blocklist"] = "Vink aan om dit item van de blokkeerlijst te verwijderen";
+$a->strings["Server Domain Pattern Blocklist"] = "";
+$a->strings["This page can be used to define a blacklist of server domain patterns from the federated network that are not allowed to interact with your node. For each domain pattern you should also provide the reason why you block it."] = "";
+$a->strings["The list of blocked server domain patterns will be made publically available on the <a href=\"/friendica\">/friendica</a> page so that your users and people investigating communication problems can find the reason easily."] = "";
+$a->strings["<p>The server domain pattern syntax is case-insensitive shell wildcard, comprising the following special characters:</p>\n<ul>\n\t<li><code>*</code>: Any number of characters</li>\n\t<li><code>?</code>: Any single character</li>\n\t<li><code>[&lt;char1&gt;&lt;char2&gt;...]</code>: char1 or char2</li>\n</ul>"] = "";
+$a->strings["Add new entry to block list"] = "Voeg nieuw item toe aan de blokkeerlijst";
+$a->strings["Server Domain Pattern"] = "";
+$a->strings["The domain pattern of the new server to add to the block list. Do not include the protocol."] = "";
+$a->strings["Block reason"] = "Reden voor blokkering";
+$a->strings["The reason why you blocked this server domain pattern."] = "";
+$a->strings["Add Entry"] = "Voeg Item toe";
+$a->strings["Save changes to the blocklist"] = "Sla veranderingen in de blokkeerlijst op";
+$a->strings["Current Entries in the Blocklist"] = "Huidige Items in de blokkeerlijst";
+$a->strings["Delete entry from blocklist"] = "Verwijder item uit de blokkeerlijst";
+$a->strings["Delete entry from blocklist?"] = "Item verwijderen uit de blokkeerlijst?";
+$a->strings["Update has been marked successful"] = "Wijziging succesvol gemarkeerd ";
+$a->strings["Database structure update %s was successfully applied."] = "Database structuur update %s werd met succes toegepast.";
+$a->strings["Executing of database structure update %s failed with error: %s"] = "Uitvoering van de database structuur update %s is mislukt met fout: %s";
+$a->strings["Executing %s failed with error: %s"] = "Uitvoering van %s mislukt met fout: %s";
+$a->strings["Update %s was successfully applied."] = "Wijziging %s geslaagd.";
+$a->strings["Update %s did not return a status. Unknown if it succeeded."] = "Wijziging %s gaf geen status terug. We weten niet of de wijziging geslaagd is.";
+$a->strings["There was no additional update function %s that needed to be called."] = "Er was geen bijkomende update functie %s die moest opgeroepen worden.";
+$a->strings["No failed updates."] = "Geen mislukte wijzigingen";
+$a->strings["Check database structure"] = "Controleer de database structuur";
+$a->strings["Failed Updates"] = "Mislukte wijzigingen";
+$a->strings["This does not include updates prior to 1139, which did not return a status."] = "Dit is zonder de wijzigingen voor 1139, welke geen status teruggaven.";
+$a->strings["Mark success (if update was manually applied)"] = "Markeren als succes (als aanpassing manueel doorgevoerd werd)";
+$a->strings["Attempt to execute this update step automatically"] = "Probeer deze stap automatisch uit te voeren";
+$a->strings["Lock feature %s"] = "Fixeer feature %s ";
+$a->strings["Manage Additional Features"] = "Beheer Bijkomende Features";
+$a->strings["unknown"] = "onbekend";
+$a->strings["This page offers you some numbers to the known part of the federated social network your Friendica node is part of. These numbers are not complete but only reflect the part of the network your node is aware of."] = "Deze pagina toont je statistieken van het gekende deel van het gefedereerde sociale netwerk waarvan je Friendica node deel uitmaakt. Deze statistieken zijn niet volledig maar reflecteren het deel van het network dat jouw node kent.";
+$a->strings["The <em>Auto Discovered Contact Directory</em> feature is not enabled, it will improve the data displayed here."] = "Het <em>Automatisch Achterhaalde Contact Gids</em> feature is niet geactiveerd, het zal de hier getoonde informatie verbeteren.";
+$a->strings["Federation Statistics"] = "Federatie Statistieken";
+$a->strings["Currently this node is aware of %d nodes with %d registered users from the following platforms:"] = "Op dit moment kent deze node %d nodes met %d geregistreerde gebruikers op basis van de volgende patformen:";
+$a->strings["Item marked for deletion."] = "Item gemarkeerd om te verwijderen.";
+$a->strings["Delete Item"] = "Verwijder Item";
+$a->strings["Delete this Item"] = "Verwijder dit Item";
+$a->strings["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."] = "Op deze pagina kan je een item van je node verwijderen. Als het item een bericht is op het eerste niveau, dan zal de hele gesprek verwijderd worden.";
+$a->strings["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."] = "Je moet de GUID van het item kennen. Je kan het terugvinden bvb. door te kijken naar de getoonde URL. Het laatste deel van http://example.com/display/123456 is de GUID, hier 123456.";
+$a->strings["GUID"] = "GUID";
+$a->strings["The GUID of the item you want to delete."] = "De GUID van het item dat je wil verwijderen.";
+$a->strings["Item Guid"] = "Item identificatie";
+$a->strings["The logfile '%s' is not writable. No logging possible"] = "";
+$a->strings["Log settings updated."] = "Log instellingen opgeslagen";
+$a->strings["PHP log currently enabled."] = "PHP log momenteel geactiveerd";
+$a->strings["PHP log currently disabled."] = "PHP log momenteel gedeactiveerd";
+$a->strings["Logs"] = "Logs";
+$a->strings["Clear"] = "Wis";
+$a->strings["Enable Debugging"] = "Activeer Debugging";
+$a->strings["Log file"] = "Logbestand";
+$a->strings["Must be writable by web server. Relative to your Friendica top-level directory."] = "De webserver moet hier kunnen schrijven. Relatief t.o.v. de hoogste folder binnen je Friendica-installatie.";
+$a->strings["Log level"] = "Log niveau";
+$a->strings["PHP logging"] = "PHP logging";
+$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."] = "Om logging van PHP fouten en waarschuwingen te activeren, kan je het volgende toevoegen aan het begin van je index.php bestand van je installatie. De naam van het bestand die ingesteld is in de 'error_log' lijn is relatief tegenover de friendica top-level folder en de server moet erin kunnen schrijven. De optie '1' voor 'log_errors' en 'display_errors' activeert deze opties, configureer '0' om ze te deactiveren. ";
+$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."] = "Fout bij het openen van log file <strong>%1\$s</strong> .\\r\\n<br/>Kijk na of bestand %1\$s bestaat en mag gelezen worden.";
+$a->strings["Couldn't open <strong>%1\$s</strong> log file.\\r\\n<br/>Check to see if file %1\$s is readable."] = "Kon log file <strong>%1\$s</strong> niet openen.\\r\\n<br/>Kijk na of bestand %1\$s mag gelezen worden.";
+$a->strings["View Logs"] = "Bekijk Logs";
+$a->strings["Inspect Deferred Worker Queue"] = "Inspecteer wachtrij van uitgestelde workers";
+$a->strings["This page lists the deferred worker jobs. This are jobs that couldn't be executed at the first time."] = "Deze pagine geeft alle uitgestelde workertaken. Dit zijn taken die niet onmiddelijk konden worden uitgevoerd";
+$a->strings["Inspect Worker Queue"] = "Taakwachtrij inspecteren";
+$a->strings["This page lists the currently queued worker jobs. These jobs are handled by the worker cronjob you've set up during install."] = "Deze pagina toont alle taken in de wachtrij. Deze taken worden behandeld door de geplande taak die je hebt ingesteld tijdens installatie.";
+$a->strings["ID"] = "ID";
+$a->strings["Job Parameters"] = "Taak parameters";
+$a->strings["Created"] = "Aangemaakt";
+$a->strings["Priority"] = "Prioriteit";
+$a->strings["Can not parse base url. Must have at least <scheme>://<domain>"] = "Kan de basis url niet verwerken. Moet minstens zijn <scheme>://<domain>";
+$a->strings["Invalid storage backend setting value."] = "";
+$a->strings["Site settings updated."] = "Site instellingen opgeslagen";
+$a->strings["No community page for local users"] = "Geen groepspagina voor lokale gebruikers";
+$a->strings["No community page"] = "Geen groepspagina";
+$a->strings["Public postings from users of this site"] = "Publieke berichten van gebruikers van deze site";
+$a->strings["Public postings from the federated network"] = "Publieke berichten van het gefedereerde netwerk";
+$a->strings["Public postings from local users and the federated network"] = "Publieke berichten van lokale gebruikers en van het gefedereerde netwerk";
+$a->strings["Disabled"] = "Uitgeschakeld";
+$a->strings["Users"] = "Gebruiker";
+$a->strings["Users, Global Contacts"] = "Gebruikers, Globale contacten";
+$a->strings["Users, Global Contacts/fallback"] = "Gebruikers, Globale Contacten/noodoplossing";
+$a->strings["One month"] = "Een maand";
+$a->strings["Three months"] = "Drie maanden";
+$a->strings["Half a year"] = "Een half jaar";
+$a->strings["One year"] = "Een jaar";
+$a->strings["Multi user instance"] = "Server voor meerdere gebruikers";
+$a->strings["Closed"] = "Gesloten";
+$a->strings["Requires approval"] = "Toestemming vereist";
+$a->strings["Open"] = "Open";
+$a->strings["No SSL policy, links will track page SSL state"] = "Geen SSL beleid, links zullen SSL status van pagina volgen";
+$a->strings["Force all links to use SSL"] = "Verplicht alle links om SSL te gebruiken";
+$a->strings["Self-signed certificate, use SSL for local links only (discouraged)"] = "Zelf-ondertekend certificaat, gebruik SSL alleen voor lokale links (afgeraden)";
+$a->strings["Don't check"] = "Geen rekening mee houden";
+$a->strings["check the stable version"] = "Neem de stabiele versie in rekening";
+$a->strings["check the development version"] = "Neem de ontwikkel versie in rekening";
+$a->strings["Database (legacy)"] = "";
+$a->strings["Site"] = "Website";
+$a->strings["Republish users to directory"] = "Opnieuw de gebruikers naar de gids publiceren";
+$a->strings["Registration"] = "Registratie";
+$a->strings["File upload"] = "Uploaden bestand";
+$a->strings["Policies"] = "Beleid";
+$a->strings["Auto Discovered Contact Directory"] = "Automatisch Achterhaalde Contact Gids";
+$a->strings["Performance"] = "Performantie";
+$a->strings["Worker"] = "Worker";
+$a->strings["Message Relay"] = "Boodschap Relais";
+$a->strings["Relocate Instance"] = "Verhuis node";
+$a->strings["Warning! Advanced function. Could make this server unreachable."] = "Waarschuwing! Geavanceerde functie. Dit kan u node onbereikbaar maken";
+$a->strings["Site name"] = "Site naam";
+$a->strings["Sender Email"] = "Verzender Email";
+$a->strings["The email address your server shall use to send notification emails from."] = "Het email adres als afzender van notificatie emails.";
+$a->strings["Banner/Logo"] = "Banner/Logo";
+$a->strings["Shortcut icon"] = "Snelkoppeling icoon";
+$a->strings["Link to an icon that will be used for browsers."] = "Link naar een icoon dat zal gebruikt worden voor browsers.";
+$a->strings["Touch icon"] = "Pictogram voor smartphones";
+$a->strings["Link to an icon that will be used for tablets and mobiles."] = "Link naar een icoon dat zal gebruikt worden voor tablets en mobiele telefoons.";
+$a->strings["Additional Info"] = "Bijkomende Info";
+$a->strings["For public servers: you can add additional information here that will be listed at %s/servers."] = "Voor publieke servers: je kan bijkomende informatie hier toevoegen die zal opgelijst zijn op %s/servers.";
+$a->strings["System language"] = "Systeemtaal";
+$a->strings["System theme"] = "Systeem thema";
+$a->strings["Default system theme - may be over-ridden by user profiles - <a href=\"/admin/themes\" id=\"cnftheme\">Change default theme settings</a>"] = "";
+$a->strings["Mobile system theme"] = "Mobiel systeem thema";
+$a->strings["Theme for mobile devices"] = "Thema voor mobiele apparaten";
+$a->strings["SSL link policy"] = "Beleid SSL-links";
+$a->strings["Determines whether generated links should be forced to use SSL"] = "Bepaald of gegenereerde verwijzingen verplicht SSL moeten gebruiken";
+$a->strings["Force SSL"] = "Dwing SSL af";
+$a->strings["Force all Non-SSL requests to SSL - Attention: on some systems it could lead to endless loops."] = "Forceer alle Niet-SSL aanvragen naar SSL - Pas op: dit kan op sommige systeem resulteren in oneindige lussen.";
+$a->strings["Hide help entry from navigation menu"] = "Verberg de 'help' uit het navigatiemenu";
+$a->strings["Hides the menu entry for the Help pages from the navigation menu. You can still access it calling /help directly."] = "Verbergt het menu-item voor de Help pagina's uit het navigatiemenu. Je kunt ze nog altijd vinden door /help direct in te geven.";
+$a->strings["Single user instance"] = "Server voor één gebruiker";
+$a->strings["Make this instance multi-user or single-user for the named user"] = "Stel deze server in voor meerdere gebruikers, of enkel voor de geselecteerde gebruiker.";
+$a->strings["File storage backend"] = "";
+$a->strings["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 uploaded before the change will still be available at the old backend. Please see <a href=\"/help/Settings#1_2_3_1\">the settings documentation</a> for more information about the choices and the moving procedure."] = "";
+$a->strings["Maximum image size"] = "Maximum afbeeldingsgrootte";
+$a->strings["Maximum size in bytes of uploaded images. Default is 0, which means no limits."] = "Maximum afmeting in bytes van afbeeldingen. Standaard is 0, dus geen beperking.";
+$a->strings["Maximum image length"] = "Maximum afbeeldingslengte";
+$a->strings["Maximum length in pixels of the longest side of uploaded images. Default is -1, which means no limits."] = "Maximum lengte in pixels van de langste kant van afbeeldingen. Standaard is -1, dus geen beperkingen.";
+$a->strings["JPEG image quality"] = "JPEG afbeeldingskwaliteit";
+$a->strings["Uploaded JPEGS will be saved at this quality setting [0-100]. Default is 100, which is full quality."] = "JPEGS zullen met deze kwaliteitsinstelling bewaard worden [0-100]. Standaard is 100, dit is volledige kwaliteit.";
+$a->strings["Register policy"] = "Registratiebeleid";
+$a->strings["Maximum Daily Registrations"] = "Maximum aantal registraties per dag";
+$a->strings["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."] = "Als registratie hierboven is toegelaten, zet dit het maximum aantal registraties van nieuwe gebruikers per dag. Als registratie niet is toegelaten heeft deze instelling geen effect.";
+$a->strings["Register text"] = "Registratietekst";
+$a->strings["Will be displayed prominently on the registration page. You can use BBCode here."] = "Zal prominent op de registratie pagina getoond worden. Je kan hierin BBCode gebruiken.";
+$a->strings["Forbidden Nicknames"] = "Verboden bijnamen";
+$a->strings["Comma separated list of nicknames that are forbidden from registration. Preset is a list of role names according RFC 2142."] = "Kommagescheiden lijst van bijnamen die verboden zijn voor registratie. De lijst uit RFC2142 is op voorhand ingesteld.";
+$a->strings["Accounts abandoned after x days"] = "Verlaten accounts na x dagen";
+$a->strings["Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit."] = "Dit zal geen systeembronnen verspillen aan het nakijken van externe sites voor verlaten accounts. Geef 0 is voor geen tijdslimiet.";
+$a->strings["Allowed friend domains"] = "Toegelaten vriend domeinen";
+$a->strings["Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains"] = "Komma-gescheiden lijst van domeinen die een vriendschapsband met deze website mogen aangaan. Jokers zijn toegelaten. Laat leeg om alle domeinen toe te laten.";
+$a->strings["Allowed email domains"] = "Toegelaten e-mail domeinen";
+$a->strings["Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains"] = "Door komma's gescheiden lijst met e-maildomeinen die op deze website mogen registeren. Wildcards zijn toegestaan.\nLeeg laten om alle domeinen toe te staan.";
+$a->strings["No OEmbed rich content"] = "Geen OEmbed richt content";
+$a->strings["Don't show the rich content (e.g. embedded PDF), except from the domains listed below."] = "Toon geen rich content (bvb. embedded PDF), behalve van domeinen hieronder opgelijst.";
+$a->strings["Allowed OEmbed domains"] = "Sta OEmbed domeinen toe";
+$a->strings["Comma separated list of domains which oembed content is allowed to be displayed. Wildcards are accepted."] = "Met komma's gescheiden lijst van domeinen waarvoor oembed content mag getoond worden. Wildcards zijn toegelaten.";
+$a->strings["Block public"] = "Openbare toegang blokkeren";
+$a->strings["Check to block public access to all otherwise public personal pages on this site unless you are currently logged in."] = "Kruis dit aan om alle openbare persoonlijke pagina's alleen toegankelijk te maken voor ingelogde gebruikers.";
+$a->strings["Force publish"] = "Dwing publiceren af";
+$a->strings["Check to force all profiles on this site to be listed in the site directory."] = "Kruis dit aan om af te dwingen dat alle profielen op deze website in de gids van deze website gepubliceerd worden.";
+$a->strings["Enabling this may violate privacy laws like the GDPR"] = "Dit activeren zou privacy wetten zoals GDPR (AVG) kunnen overtreden";
+$a->strings["Global directory URL"] = "Algemene gids URL";
+$a->strings["URL to the global directory. If this is not set, the global directory is completely unavailable to the application."] = "URL naar de globale gids. Als dit niet geconfigureerd is, dan zal de globale gids volledig onbeschikbaar zijn voor de applicatie.";
+$a->strings["Private posts by default for new users"] = "Privéberichten als standaard voor nieuwe gebruikers";
+$a->strings["Set default post permissions for all new members to the default privacy group rather than public."] = "Stel de standaardrechten van berichten voor nieuwe leden op de standaard privacygroep in, in plaats van openbaar.";
+$a->strings["Don't include post content in email notifications"] = "De inhoud van het bericht niet insluiten bij e-mailnotificaties";
+$a->strings["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."] = "De inhoud van berichten/commentaar/privéberichten/enzovoort  niet insluiten in e-mailnotificaties die door deze website verzonden worden, voor de bescherming van je privacy.";
+$a->strings["Disallow public access to addons listed in the apps menu."] = "Publieke toegang ontzeggen tot addons die opgelijst zijn in het applicatie menu.";
+$a->strings["Checking this box will restrict addons listed in the apps menu to members only."] = "Dit vakje aanvinken zal de lijst van addons in het applicatie menu beperken tot alleen leden.";
+$a->strings["Don't embed private images in posts"] = "Privé beelden in berichten niet inwerken";
+$a->strings["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 photos will have to authenticate and load each image, which may take a while."] = "Vervang lokaal gehoste privé foto's in berichten niet door een ingewerkte kopie van het beeld. Dit betekent dat contacten die berichten krijgen met privé foto's zullen moeten authentificeren en elk beeld apart laden, wat een tijdje kan duren.";
+$a->strings["Explicit Content"] = "Expliciete inhoud";
+$a->strings["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 node information and might be used, e.g. by the global directory, to filter your node from listings of nodes to join. Additionally a note about this will be shown at the user registration page."] = "Vink dit aan om aan te duiden dat deze node veel expliciet materiaal verspreid en niet bedoeld is voor minderjarigen. Deze info zal gepubliceert worden bij de node-info en kan vb. gebruikt worden voor een filter in de globale lijst. Dit word ook getoont naar de gebruiker op de registratie pagina.";
+$a->strings["Allow Users to set remote_self"] = "Sta Gebruikers toe om remote_self te configureren";
+$a->strings["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."] = "Als je dit aanvinkt, dan mag elke gebruiker elke contact als remote_self aanduiden in de 'herstel contact' dialoog. Deze vlag aanzetten voor een contact zorgt ervoor dat elke bericht van dit contact gespiegeld wordt in de gebruiker zijn of haar stroom. ";
+$a->strings["Block multiple registrations"] = "Blokkeer meerdere registraties";
+$a->strings["Disallow users to register additional accounts for use as pages."] = "Laat niet toe dat gebruikers meerdere accounts aanmaken.";
+$a->strings["Disable OpenID"] = "";
+$a->strings["Disable OpenID support for registration and logins."] = "";
+$a->strings["No Fullname check"] = "";
+$a->strings["Allow users to register without a space between the first name and the last name in their full name."] = "";
+$a->strings["Community pages for visitors"] = "Groepspagina voor bezoekers";
+$a->strings["Which community pages should be available for visitors. Local users always see both pages."] = "Welke groepspagina's moeten beschikbaar zijn voor bezoekers. Lokale gebruikers zien altijd beide pagina's.";
+$a->strings["Posts per user on community page"] = "Berichten per gebruiker op de groepspagina";
+$a->strings["The maximum number of posts per user on the community page. (Not valid for \"Global Community\")"] = "";
+$a->strings["Disable OStatus support"] = "";
+$a->strings["Disable built-in OStatus (StatusNet, GNU Social etc.) compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed."] = "";
+$a->strings["OStatus support can only be enabled if threading is enabled."] = "OStatus ondersteuning kan alleen geactiveerd worden als de gespreksstroom geactiveerd is.";
+$a->strings["Diaspora support can't be enabled because Friendica was installed into a sub directory."] = "Diaspora ondersteuning is niet mogelijk omdat Friendica in een sub folder geïnstalleerd is.";
+$a->strings["Enable Diaspora support"] = "Diaspora ondersteuning activeren";
+$a->strings["Provide built-in Diaspora network compatibility."] = "Bied ingebouwde ondersteuning voor het Diaspora netwerk.";
+$a->strings["Only allow Friendica contacts"] = "Laat alleen Friendica contacten toe";
+$a->strings["All contacts must use Friendica protocols. All other built-in communication protocols disabled."] = "Alle contacten moeten een Friendica protocol gebruiken. Alle andere ingebouwde communicatieprotocols worden uitgeschakeld.";
+$a->strings["Verify SSL"] = "Controleer SSL";
+$a->strings["If you wish, you can turn on strict certificate checking. This will mean you cannot connect (at all) to self-signed SSL sites."] = "Als je wilt kun je striktere certificaat controle activeren. Dit betekent dat je (totaal) niet kunt connecteren met sites die zelf-ondertekende SSL certificaten gebruiken.";
+$a->strings["Proxy user"] = "Proxy-gebruiker";
+$a->strings["Proxy URL"] = "Proxy-URL";
+$a->strings["Network timeout"] = "Netwerk timeout";
+$a->strings["Value is in seconds. Set to 0 for unlimited (not recommended)."] = "Waarde is in seconden. Zet op 0 voor onbeperkt (niet aanbevolen).";
+$a->strings["Maximum Load Average"] = "Maximum gemiddelde belasting";
+$a->strings["Maximum system load before delivery and poll processes are deferred - default %d."] = "";
+$a->strings["Maximum Load Average (Frontend)"] = "Maximum Gemiddelde Belasting (Frontend)";
+$a->strings["Maximum system load before the frontend quits service - default 50."] = "Maximum systeem belasting wanneer de frontend ermee ophoudt - standaard waarde 50.";
+$a->strings["Minimal Memory"] = "Minimaal Geheugen";
+$a->strings["Minimal free memory in MB for the worker. Needs access to /proc/meminfo - default 0 (deactivated)."] = "Minimum vrij geheugen in MB voor de worker. Toegang nodig tot /proc/meminfo - standaard waarde 0 (gedeactiveerd).";
+$a->strings["Maximum table size for optimization"] = "Maximum tabel grootte voor optimisatie";
+$a->strings["Maximum table size (in MB) for the automatic optimization. Enter -1 to disable it."] = "Maximum tabel grootte (in MB) voor de automatisch optimisatie. Geef -1 op om dit te deactiveren.";
+$a->strings["Minimum level of fragmentation"] = "Minimum niveau van fragmentatie";
+$a->strings["Minimum fragmenation level to start the automatic optimization - default value is 30%."] = "Minimum fragmentatie niveau om de automatische optimisatie te starten - standaard waarde is 30%.";
+$a->strings["Periodical check of global contacts"] = "Regematige controle van de globale contacten";
+$a->strings["If enabled, the global contacts are checked periodically for missing or outdated data and the vitality of the contacts and servers."] = "Als dit geactiveerd is, dan worden de globale contacten regelmatig gecheckt naar ontbrekende of verlopen data and the vitaliteit van de contacten en servers.";
+$a->strings["Days between requery"] = "Dagen tussen herbevraging";
+$a->strings["Number of days after which a server is requeried for his contacts."] = "Aantal dagen waarna de server opnieuw bevraagd wordt naar zijn contacten.";
+$a->strings["Discover contacts from other servers"] = "Ontdek contacten van andere servers";
+$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["Timeframe for fetching global contacts"] = "Tijdspanne voor het ophalen van globale contacten";
+$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."] = "Wanneer ontdekking is geactiveerd, dan definieert deze waarde de tijdspanne voor de activiteit van globale contacten die opgehaald worden van andere servers.";
+$a->strings["Search the local directory"] = "Doorzoek de lokale gids";
+$a->strings["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."] = "Doorzoek de lokale gids in plaats van de globale gids. Bij lokale doorzoeking wordt elke opzoeking in de globale gids op de achtergrond uitgevoerd. Dit verbetert de zoekresultaten wanneer de zoekopdracht herhaald wordt.";
+$a->strings["Publish server information"] = "Publiceer server informatie";
+$a->strings["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 profiles, number of posts and the activated protocols and connectors. See <a href=\"http://the-federation.info/\">the-federation.info</a> for details."] = "";
+$a->strings["Check upstream version"] = "Controleer upstream versie";
+$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."] = "Activeer het controleren op nieuwe versies van Friendica bij github. Als er een nieuwe versie is, dan word je geïnformeerd in the administratie paneel.";
+$a->strings["Suppress Tags"] = "Onderdruk Tags";
+$a->strings["Suppress showing a list of hashtags at the end of the posting."] = "Onderdruk het tonen van een lijst van hastags op het einde van het bericht.";
+$a->strings["Clean database"] = "Database opruimen";
+$a->strings["Remove old remote items, orphaned database records and old content from some other helper tables."] = "Verwijder oude remote items, database weesrecords en oude content van andere helper tabellen.";
+$a->strings["Lifespan of remote items"] = "Levensduur van 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."] = "Als de database opruiming is geactiveerd, dan definieert dit na hoeveel dagen remote items verwijderd zullen worden. Eigen items, en gemarkeerde of opgeslagen items worden altijd behouden. 0 deactiveert dit gedrag.";
+$a->strings["Lifespan of unclaimed items"] = "Levensduur van niet geclaimde 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."] = "Als de database opruiming geactiveerd is, dan definieert dit na hoeveel dagen ongeclaimde remote items (meestal content van een relais) zal verwijderd worden. Standaard waarde is 90 dagen. Als de waarde 0 is, dan is de waarde gelijk aan de algemene levensduur van remote items.";
+$a->strings["Lifespan of raw conversation data"] = "Levenstijd van ruwe gespreksdata";
+$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."] = "De gespreksdata word gebruikt voor ActivityPub, OStatus en voor debugging doeleinden. Het is veilig om dit na 14 dagen te verwijderen. Standaard staat dit op 90 dagen.";
+$a->strings["Path to item cache"] = "Pad naar cache voor items";
+$a->strings["The item caches buffers generated bbcode and external images."] = "Item caches bufferen gegenereerde bbcodes en externe beelden.";
+$a->strings["Cache duration in seconds"] = "Cache tijdsduur in seconden";
+$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."] = "Hoe lang moeten de cache bestanden bijgehouden worden? Standaard waarde is 86400 seconden (een dag). Zet de waarde op -1 om de item cache te deactiveren.";
+$a->strings["Maximum numbers of comments per post"] = "Maximum aantal reacties per bericht";
+$a->strings["How much comments should be shown for each post? Default value is 100."] = "Hoeveel reacties moeten getoond worden per bericht? Standaard waarde is 100.";
+$a->strings["Temp path"] = "Tijdelijk pad";
+$a->strings["If you have a restricted system where the webserver can't access the system temp path, enter another path here."] = "Als je een systeem met restricties hebt waarbij de webserver geen toegang heeft tot het systeem pad, geef hier dan een ander pad in. ";
+$a->strings["Disable picture proxy"] = "Schakel beeld proxy uit";
+$a->strings["The picture proxy increases performance and privacy. It shouldn't be used on systems with very low bandwidth."] = "De beeld proxy verhoogt de performantie en privacy. Gebruik dit niet op systemen met erg lage bandbreedte.";
+$a->strings["Only search in tags"] = "Zoek alleen in tags";
+$a->strings["On large systems the text search can slow down the system extremely."] = "Het opzoeken van tekst kan grote systemen extreem vertragen.";
+$a->strings["New base url"] = "Nieuwe basis url";
+$a->strings["Change base url for this server. Sends relocate message to all Friendica and Diaspora* contacts of all users."] = "Verander de basis url voor deze server. Stuurt een verhuis boodschap naar all Friendica en Diaspora* contacten.";
+$a->strings["RINO Encryption"] = "RINO encryptie";
+$a->strings["Encryption layer between nodes."] = "Encryptie laag tussen nodes.";
+$a->strings["Enabled"] = "Geactiveerd";
+$a->strings["Maximum number of parallel workers"] = "Maximum aantal parallelle workers";
+$a->strings["On shared hosters set this to %d. On larger systems, values of %d are great. Default value is %d."] = "Op gedeelde hosts zet dit op %d. Op grotere systemen, waarden als %d zijn goed. standaard waarde is %d";
+$a->strings["Don't use \"proc_open\" with the worker"] = "";
+$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."] = "";
+$a->strings["Enable fastlane"] = "Activeer fastlane";
+$a->strings["When enabed, the fastlane mechanism starts an additional worker if processes with higher priority are blocked by processes of lower priority."] = "Als deze parameter geactiveerd is, dan start het fastlane mechanisme een bijkomende worker als processen met hogere prioriteit geblokkeerd worden door processen met een lagere prioriteit.";
+$a->strings["Enable frontend worker"] = "Activeer frontend worker";
+$a->strings["When enabled the Worker process is triggered when backend access is performed (e.g. messages being delivered). 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"] = "Schrijf in op relais";
+$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."] = "Activeert het ontvangen van publieke berichten vanwege de relais. Ze zullen inbegrepen zijn in de zoekresultaten, tags waarop je ingeschreven bent en op de globale groepspagina.";
+$a->strings["Relay server"] = "Relais server";
+$a->strings["Address of the relay server where public posts should be send to. For example https://relay.diasp.org"] = "Adres van de relais server waar publieke berichten naartoe moeten gezonden worden. Bijvoorbeeld https://relay.diasp.org";
+$a->strings["Direct relay transfer"] = "Directe relais transfer";
+$a->strings["Enables the direct transfer to other servers without using the relay servers"] = "Activeert directe relais transfer naar andere servers zonder gebruik van relais servers";
+$a->strings["Relay scope"] = "Scope van de relais";
+$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"] = "alle";
+$a->strings["tags"] = "tags";
+$a->strings["Server tags"] = "Server tags";
+$a->strings["Comma separated list of tags for the \"tags\" subscription."] = "";
+$a->strings["Allow user tags"] = "Sta gebruiker tags toe.";
+$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"] = "Start verhuis";
+$a->strings["Your DB still runs with MyISAM tables. You should change the engine type to InnoDB. As Friendica will use InnoDB only features in the future, you should change this! See <a href=\"%s\">here</a> for a guide that may be helpful converting the table engines. You may also use the command <tt>php bin/console.php dbstructure toinnodb</tt> of your Friendica installation for an automatic conversion.<br />"] = "Je DB opereert nog met MyISAM tabellen. Best is van engine te veranderen naar InnoDB. Aangezien Friendica in de toekomst gebruik zal maken van InnoDB features, zou je dit best aanpassen! Zie <a href=\"%s\">hier</a> voor een gids die je kan helpen om de tabel engines te converteren. Je kan ook het commando<tt>php bin/console.php dbstructure toinnodb</tt> van je Friendica installatie gebruiken voor een automatische conversie.<br />";
+$a->strings["There is a new version of Friendica available for download. Your current version is %1\$s, upstream version is %2\$s"] = "Er is een nieuwe versie van Friendica beschikbaar om te downloaden. Je huidige versie is %1\$s, upstream versie is %2\$s";
+$a->strings["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."] = "Database update is mislukt. Gelieve  \"php bin/console.php dbstructure update\" vanaf de command line uit te voeren en de foutmeldingen die zouden kunnen verschijnen na te kijken.";
+$a->strings["The last update failed. Please run \"php bin/console.php dbstructure update\" from the command line and have a look at the errors that might appear. (Some of the errors are possibly inside the logfile.)"] = "";
+$a->strings["The worker was never executed. Please check your database structure!"] = "De worker werd nooit uitgevoerd. Best je database structuur eens nakijken!";
+$a->strings["The last worker execution was on %s UTC. This is older than one hour. Please check your crontab settings."] = "De laatste worker uitvoering was op %s UTC. Dit is langer dan 1 uur geleden. Best je crontab instellingen nakijken.";
+$a->strings["Friendica's configuration now is stored in config/local.config.php, please copy config/local-sample.config.php and move your config from <code>.htconfig.php</code>. See <a href=\"%s\">the Config help page</a> for help with the transition."] = "Het configuratiebestand bevind zich nu in config/local.config.php. Kopieer het bestand config/local-sample.config.php en verplaats je configuratie uit <code>.htconfig.php</code>. Ga naar de<a href=\"%s\">configuratie help pagina</a> voor hulp bij transitie.";
+$a->strings["Friendica's configuration now is stored in config/local.config.php, please copy config/local-sample.config.php and move your config from <code>config/local.ini.php</code>. See <a href=\"%s\">the Config help page</a> for help with the transition."] = "";
+$a->strings["<a href=\"%s\">%s</a> is not reachable on your system. This is a severe configuration issue that prevents server to server communication. See <a href=\"%s\">the installation page</a> for help."] = "<a href=\"%s\">%s</a> is niet bereikbaar. Dit is een belangrijk communicatieprobleem waardoor server-naar-server communicatie niet mogelijk is. Lees de <a href=\"%s\">the installatie pagina</a> voor hulp.";
+$a->strings["Friendica's system.basepath was updated from '%s' to '%s'. Please remove the system.basepath from your db to avoid differences."] = "";
+$a->strings["Friendica's current system.basepath '%s' is wrong and the config file '%s' isn't used."] = "";
+$a->strings["Friendica's current system.basepath '%s' is not equal to the config file '%s'. Please fix your configuration."] = "";
+$a->strings["Normal Account"] = "Normaal account";
+$a->strings["Automatic Follower Account"] = "Automatische Volger Account";
+$a->strings["Public Forum Account"] = "Publiek Forum account";
+$a->strings["Automatic Friend Account"] = "Automatisch Vriendschapsaccount";
+$a->strings["Blog Account"] = "Blog Account";
+$a->strings["Private Forum Account"] = "Privé Forum Account";
+$a->strings["Message queues"] = "Bericht-wachtrijen";
+$a->strings["Server Settings"] = "Server instellingen.";
+$a->strings["Summary"] = "Samenvatting";
+$a->strings["Registered users"] = "Geregistreerde gebruikers";
+$a->strings["Pending registrations"] = "Registraties die in de wacht staan";
+$a->strings["Version"] = "Versie";
+$a->strings["Active addons"] = "Actieve addons";
+$a->strings["Theme settings updated."] = "Thema-instellingen opgeslagen";
+$a->strings["Theme %s disabled."] = "";
+$a->strings["Theme %s successfully enabled."] = "";
+$a->strings["Theme %s failed to install."] = "";
+$a->strings["Screenshot"] = "Schermafdruk";
+$a->strings["Themes"] = "Thema's";
+$a->strings["Unknown theme."] = "";
+$a->strings["Reload active themes"] = "Herlaad actieve thema's";
+$a->strings["No themes found on the system. They should be placed in %1\$s"] = "Geen thema's gevonden op het systeem. Ze zouden zich moeten bevinden in %1\$s";
+$a->strings["[Experimental]"] = "[Experimenteel]";
+$a->strings["[Unsupported]"] = "[Niet ondersteund]";
+$a->strings["The Terms of Service settings have been updated."] = "";
+$a->strings["Display Terms of Service"] = "Toon Gebruiksvoorwaarden";
+$a->strings["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."] = "Activeer de Gebruiksvoorwaarden pagina. Als deze geactiveerd is, dan zal er een link naar de voorwaarden toegevoegd worden aan het registratie formulier en de algemene informatie pagina.";
+$a->strings["Display Privacy Statement"] = "Toon Privacy Verklaring";
+$a->strings["Show some informations regarding the needed information to operate the node according e.g. to <a href=\"%s\" target=\"_blank\">EU-GDPR</a>."] = "Toon wat inlichtigen over de nodige informatite om de node te beheren in overeenstemming met bvb. de <a href=\"%s\" target=\"_blank\">EU-GDPR</a> (EU-AVG).";
+$a->strings["Privacy Statement Preview"] = "Privacy Verklaring Voorbeeldweergave";
+$a->strings["The Terms of Service"] = "De Gebruiksvoorwaarden";
+$a->strings["Enter the Terms of Service for your node here. You can use BBCode. Headers of sections should be [h2] and below."] = "Geef hier de Gebruiksvoorwaarden van je node op. Je kan BBCode gebruiken. Sectie headers moeten [h2] zijn of lager.";
+$a->strings["\n\t\t\tDear %1\$s,\n\t\t\t\tthe administrator of %2\$s has set up an account for you."] = "\n\t\t\tBeste %1\$s,\n\t\t\t\tde beheerder van %2\$s heeft een account aangemaakt voor jou.";
+$a->strings["\n\t\t\tThe login details are as follows:\n\n\t\t\tSite Location:\t%1\$s\n\t\t\tLogin Name:\t\t%2\$s\n\t\t\tPassword:\t\t%3\$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 %1\$s/removeme\n\n\t\t\tThank you and welcome to %4\$s."] = "\n\t\t\tDe login details zijn de volgende:\n\n\t\t\tSite Locatie:\t%1\$s\n\t\t\tLogin Naam:\t\t%2\$s\n\t\t\tPaswoord:\t\t%3\$s\n\n\t\t\tJe kan je paswoord in je account \"Instellingen\" pagina aanpassen \nnadat je ingelogd bent\n\t\t\tNeem alstublieft een ogenblik om de andere account instellingen op die pagina na te kijken.\n\n\t\t\tMisschien wil je ook wat basis informatie toevoegen aan je standaard profiel\n\t\t\t(op de \"Profielen\" pagina) zodat anderen je gemakkelijk kunnen terugvinden.\n\n\t\t\tWe raden aan je volledige naam in te stellen, een profiel foto toe te voegen,\n\t\t\tenkele \"sleutelwoorden\" toe te voegen (zeer handig om nieuwe vrienden te maken) - en\n\t\t\tmisschien ook in welk land je woont; als je liever niet specifieker \nbent dan dat.\n\n\n\t\t\tWe respecteren ten volle je recht op privacy, en geen van deze items is verplicht.\n\t\t\tAls je nieuw bent hier en niemand kent, dan kunnen zij je mogelijks helpen\n\t\t\tom enkele nieuwe en interessante vrienden te leren kennen.\n\n\t\t\tAls je ooit je account wil verwijderen, dan kan dat via %1\$s/removeme\n\n\t\t\tBedankt en welkom bij %4\$s.";
+$a->strings["%s user blocked"] = [
+       0 => "",
+       1 => "",
+];
+$a->strings["%s user unblocked"] = [
+       0 => "",
+       1 => "",
 ];
-$a->strings["Username should be at most %s character."] = [
-       0 => "Gebruikersnaam mag maximaal %s tekens bevatten.",
-       1 => "Gebruikersnaam mag maximaal %s tekens bevatten.",
+$a->strings["You can't remove yourself"] = "Je kan jezelf niet verwijderen";
+$a->strings["%s user deleted"] = [
+       0 => "%s gebruiker verwijderd",
+       1 => "%s gebruikers verwijderd",
 ];
-$a->strings["That doesn't appear to be your full (First Last) name."] = "Dat lijkt niet je volledige naam (voor- en achternaam) te zijn.";
-$a->strings["Your email domain is not among those allowed on this site."] = "Je e-maildomein is op deze website niet toegestaan.";
-$a->strings["Not a valid email address."] = "Geen geldig e-mailadres.";
-$a->strings["The nickname was blocked from registration by the nodes admin."] = "De bijnaam werd geblokkeerd voor registratie door de node admin";
-$a->strings["Cannot use that email."] = "Ik kan die e-mail niet gebruiken.";
-$a->strings["Your nickname can only contain a-z, 0-9 and _."] = "Je bijnaam mag alleen a-z, 0-9 of _ bevatten.";
-$a->strings["Nickname is already registered. Please choose another."] = "Bijnaam is al geregistreerd. Kies een andere.";
-$a->strings["SERIOUS ERROR: Generation of security keys failed."] = "ERNSTIGE FOUT: aanmaken van beveiligingssleutels mislukt.";
-$a->strings["An error occurred during registration. Please try again."] = "Er is een fout opgetreden tijdens de registratie. Probeer opnieuw.";
-$a->strings["default"] = "standaard";
-$a->strings["An error occurred creating your default profile. Please try again."] = "Er is een fout opgetreden bij het aanmaken van je standaard profiel. Probeer opnieuw.";
-$a->strings["An error occurred creating your self contact. Please try again."] = "Er is een fout opgetreden bij het aanmaken van je self contact. Probeer opnieuw.";
-$a->strings["An error occurred creating your default contact group. Please try again."] = "Er is een fout opgetreden bij het aanmaken van je standaard contact groep. Probeer opnieuw.";
-$a->strings["\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"] = "\n\t\t\tHallo %1\$s,\n\t\t\t\tBedankt om je te registreren op %2\$s. Uw account is op dit moment wachten op bevestiging door de administrator.\n\n\t\t\tUw login details zijn:\n\n\t\t\tSite locatie:\t%3\$s\n\t\t\tGebruikersnaam:\t\t%4\$s\n\t\t\tWachtwoord:\t\t%5\$s\n\t\t";
-$a->strings["Registration at %s"] = "Registratie bij %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"] = "\n\t\t\tBeste %1\$s,\n\t\t\t\tBedankt voor je registratie bij %2\$s. Je account is aangemaakt.\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."] = "\n\t\t\tDe login details zijn de volgende:\n\n\t\t\tSite Locatie:\t%3\$s\n\t\t\tLogin Naam:\t\t%1\$s\n\t\t\tPaswoord:\t\t%5\$s\n\n\t\t\tJe kunt je paswoord in de \"Instellingen\" pagina veranderen nadat je bent ingelogd.\n\n\t\t\tNeem een ogenblik de tijd om je andere instellingen na te kijken op die pagina.\n\n\t\t\tJe kunt ook wat basis informatie toevoegen aan je standaard profiel\n\t\t\t(in de \"Profielen\" pagina) zodat anderen je gemakkelijk kunnen vinden.\n\n\t\t\tWe raden aan je volledige naam in te vullen, een profiel foto toe te voegen,\n\t\t\tenkele profiel \"sleutelwoorden\" (zeer handig om nieuwe vrienden te leren kennen) - en\n\t\t\tmisschien in welk land je woont; als je niet meer details wil geven.\n\t\t\tWe respecteren je privacy volledig, en geen van deze velden zijn verplicht.\n\t\t\tAls je nieuw bent en niemand kent, dan kunnen zij je misschien\n\t\t\thelpen om enkele nieuwe en interessante vrienden te leren kennen.\n\n\t\t\tAls je ooit je account wil verwijderen, dan kan je dat via %3\$s/removeme\n\n\t\t\tBedankt en welkom bij %2\$s.";
+$a->strings["User \"%s\" deleted"] = "";
+$a->strings["User \"%s\" blocked"] = "";
+$a->strings["User \"%s\" unblocked"] = "";
+$a->strings["Private Forum"] = "Privé Forum";
+$a->strings["Relay"] = "";
+$a->strings["Register date"] = "Registratiedatum";
+$a->strings["Last login"] = "Laatste login";
+$a->strings["Last item"] = "Laatste item";
+$a->strings["Type"] = "Type";
+$a->strings["Add User"] = "Gebruiker toevoegen";
+$a->strings["User registrations waiting for confirm"] = "Gebruikersregistraties wachten op een bevestiging";
+$a->strings["User waiting for permanent deletion"] = "Gebruiker wacht op permanente verwijdering";
+$a->strings["Request date"] = "Registratiedatum";
+$a->strings["No registrations."] = "Geen registraties.";
+$a->strings["Note from the user"] = "Nota van de gebruiker";
+$a->strings["Deny"] = "Weiger";
+$a->strings["User blocked"] = "Gebruiker geblokeerd";
+$a->strings["Site admin"] = "Sitebeheerder";
+$a->strings["Account expired"] = "Account verlopen";
+$a->strings["New User"] = "Nieuwe gebruiker";
+$a->strings["Permanent deletion"] = "";
+$a->strings["Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Geselecteerde gebruikers zullen verwijderd worden!\\n\\nAlles wat deze gebruikers gepost hebben op deze website zal permanent verwijderd worden!\\n\\nBen je zeker?";
+$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?"] = "De gebruiker {0} zal verwijderd worden!\\n\\nAlles wat deze gebruiker gepost heeft op deze website zal permanent verwijderd worden!\\n\\nBen je zeker?";
+$a->strings["Name of the new user."] = "Naam van nieuwe gebruiker";
+$a->strings["Nickname"] = "Bijnaam";
+$a->strings["Nickname of the new user."] = "Bijnaam van nieuwe gebruiker";
+$a->strings["Email address of the new user."] = "E-mailadres van nieuwe gebruiker";
+$a->strings["No friends to display."] = "Geen vrienden om te laten zien.";
+$a->strings["Item was not found."] = "Item niet gevonden";
+$a->strings["Submanaged account can't access the administation pages. Please log back in as the master account."] = "";
+$a->strings["Overview"] = "Overzicht";
+$a->strings["Configuration"] = "Configuratie";
+$a->strings["Database"] = "Database";
+$a->strings["DB updates"] = "DB aanpassingen";
+$a->strings["Inspect Deferred Workers"] = "Inspecteer uitgestelde workers";
+$a->strings["Inspect worker Queue"] = "Taakwachtrij inspecteren";
+$a->strings["Tools"] = "Hulpmiddelen";
+$a->strings["Contact Blocklist"] = "Contact Blokkeerlijst";
+$a->strings["Server Blocklist"] = "Server Blokkeerlijst";
+$a->strings["Diagnostics"] = "Diagnostiek";
+$a->strings["PHP Info"] = "PHP Info";
+$a->strings["probe address"] = "probe adres";
+$a->strings["check webfinger"] = "check webfinger";
+$a->strings["Item Source"] = "";
+$a->strings["Babel"] = "";
+$a->strings["Addon Features"] = "Addon Features";
+$a->strings["User registrations waiting for confirmation"] = "Gebruikersregistraties wachten op bevestiging";
+$a->strings["People Search - %s"] = "Mensen Zoeken - %s";
+$a->strings["Forum Search - %s"] = "Forum doorzoeken - %s";
+$a->strings["This page is missing a url parameter."] = "";
+$a->strings["The post was created"] = "Het bericht is aangemaakt";
 $a->strings["%d contact edited."] = [
        0 => "%d contact bewerkt.",
        1 => "%d contacten bewerkt.",
@@ -1993,6 +1978,7 @@ $a->strings["%d contact edited."] = [
 $a->strings["Could not access contact record."] = "Kon geen toegang krijgen tot de contactgegevens";
 $a->strings["Could not locate selected profile."] = "Kon het geselecteerde profiel niet vinden.";
 $a->strings["Contact updated."] = "Contact opgeslagen";
+$a->strings["Contact not found"] = "";
 $a->strings["Contact has been blocked"] = "Contact is geblokkeerd";
 $a->strings["Contact has been unblocked"] = "Contact is gedeblokkeerd";
 $a->strings["Contact has been ignored"] = "Contact wordt genegeerd";
@@ -2024,6 +2010,7 @@ $a->strings["Contact"] = "Contact";
 $a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Kies het profiel dat getoond moet worden wanneer %s je profiel bezoekt. ";
 $a->strings["Their personal note"] = "Hun persoonlijke nota";
 $a->strings["Edit contact notes"] = "Wijzig aantekeningen over dit contact";
+$a->strings["Visit %s's profile [%s]"] = "Bekijk het profiel van %s [%s]";
 $a->strings["Block/Unblock contact"] = "Blokkeer/deblokkeer contact";
 $a->strings["Ignore contact"] = "Negeer contact";
 $a->strings["Repair URL settings"] = "Repareer URL-instellingen";
@@ -2042,11 +2029,7 @@ $a->strings["Send a notification of every new post of this contact"] = "Stuur ee
 $a->strings["Blacklisted keywords"] = "Sleutelwoorden op de zwarte lijst";
 $a->strings["Comma separated list of keywords that should not be converted to hashtags, when \"Fetch information and keywords\" is selected"] = "Door komma's gescheiden lijst van sleutelwoorden die niet in hashtags mogen omgezet worden, wanneer \"Haal informatie en sleutelwoorden op\" is geselecteerd";
 $a->strings["Actions"] = "Acties";
-$a->strings["Suggestions"] = "Voorstellen";
-$a->strings["Suggest potential friends"] = "Stel vrienden voor";
 $a->strings["Show all contacts"] = "Toon alle contacten";
-$a->strings["Unblocked"] = "Niet geblokkeerd";
-$a->strings["Only show unblocked contacts"] = "Toon alleen niet-geblokkeerde contacten";
 $a->strings["Blocked"] = "Geblokkeerd";
 $a->strings["Only show blocked contacts"] = "Toon alleen geblokkeerde contacten";
 $a->strings["Ignored"] = "Genegeerd";
@@ -2073,9 +2056,96 @@ $a->strings["Toggle Blocked status"] = "Schakel geblokkeerde status";
 $a->strings["Toggle Ignored status"] = "Schakel negeerstatus";
 $a->strings["Toggle Archive status"] = "Schakel archiveringsstatus";
 $a->strings["Delete contact"] = "Verwijder contact";
+$a->strings["Source input"] = "Bron input";
+$a->strings["BBCode::toPlaintext"] = "BBCode::toPlaintext";
+$a->strings["BBCode::convert (raw HTML)"] = "BBCode::convert (raw 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"] = "";
+$a->strings["Item Tags"] = "";
+$a->strings["Source input (Diaspora format)"] = "Bron ingave (Diaspora formaat):";
+$a->strings["Markdown::convert (raw HTML)"] = "Markdown::convert (Ruwe HTML)";
+$a->strings["Markdown::convert"] = "Markdown::convert";
+$a->strings["Markdown::toBBCode"] = "Markdown::toBBCode";
+$a->strings["Raw HTML input"] = "Onverwerkte HTML input";
+$a->strings["HTML Input"] = "HTML Input";
+$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 (Ruwe HTML)";
+$a->strings["HTML::toBBCode => BBCode::toPlaintext"] = "";
+$a->strings["HTML::toMarkdown"] = "HTML::toMarkdown";
+$a->strings["HTML::toPlaintext"] = "HTML::toPlaintext";
+$a->strings["HTML::toPlaintext (compact)"] = "";
+$a->strings["Source text"] = "Brontekst";
+$a->strings["BBCode"] = "BBCode";
+$a->strings["Markdown"] = "Markdown";
+$a->strings["HTML"] = "HTML";
+$a->strings["You must be logged in to use this module"] = "Je moet ingelogd zijn om deze module te gebruiken";
+$a->strings["Source URL"] = "Bron URL";
+$a->strings["Time Conversion"] = "Tijdsconversie";
+$a->strings["Friendica provides this service for sharing events with other networks and friends in unknown timezones."] = "Friendica biedt deze dienst aan om gebeurtenissen te delen met andere netwerken en vrienden in onbekende tijdzones.";
+$a->strings["UTC time: %s"] = "UTC tijd: %s";
+$a->strings["Current timezone: %s"] = "Huidige Tijdzone: %s";
+$a->strings["Converted localtime: %s"] = "Omgerekende lokale tijd: %s";
+$a->strings["Please select your timezone:"] = "Selecteer je tijdzone:";
+$a->strings["Only logged in users are permitted to perform a probing."] = "Alleen ingelogde gebruikers hebben toelating om aan probing te doen.";
+$a->strings["Lookup address"] = "";
+$a->strings["No entries (some entries may be hidden)."] = "Geen gegevens (sommige gegevens kunnen verborgen zijn).";
+$a->strings["Find on this site"] = "Op deze website zoeken";
+$a->strings["Results for:"] = "Resultaten voor:";
+$a->strings["Site Directory"] = "Websitegids";
+$a->strings["Filetag %s saved to item"] = "";
+$a->strings["- select -"] = "- Kies -";
+$a->strings["No given contact."] = "";
+$a->strings["Installed addons/apps:"] = "Geïnstalleerde addons/applicaties:";
+$a->strings["No installed addons/apps"] = "Geen geïnstalleerde addons/applicaties";
+$a->strings["Read about the <a href=\"%1\$s/tos\">Terms of Service</a> of this node."] = "Lees de <a href=\"%1\$s/tos\">Gebruiksvoorwaarden</a> van deze node na.";
+$a->strings["On this server the following remote servers are blocked."] = "De volgende remote servers zijn geblokkeerd.";
+$a->strings["This is Friendica, version %s that is running at the web location %s. The database version is %s, the post update version is %s."] = "Dit is Friendica, versie %s en draait op op locatie %s. De databaseversie is %s, en de bericht update versie is %s.";
+$a->strings["Please visit <a href=\"https://friendi.ca\">Friendi.ca</a> to learn more about the Friendica project."] = "Ga naar <a href=\"https://friendi.ca\">Friendi.ca</a> om meer te vernemen over het Friendica project.";
+$a->strings["Bug reports and issues: please visit"] = "Bug rapporten en problemen: bezoek";
+$a->strings["the bugtracker at github"] = "de github bugtracker";
+$a->strings["Suggestions, praise, etc. - please email \"info\" at \"friendi - dot - ca"] = "Suggesties, appreciatie, enz. - aub stuur een email naar \"info\" at \"friendi - dot - ca";
+$a->strings["Group created."] = "Groep aangemaakt.";
+$a->strings["Could not create group."] = "Kon de groep niet aanmaken.";
+$a->strings["Group not found."] = "Groep niet gevonden.";
+$a->strings["Group name changed."] = "Groepsnaam gewijzigd.";
+$a->strings["Unknown group."] = "";
+$a->strings["Contact is unavailable."] = "";
+$a->strings["Contact is deleted."] = "";
+$a->strings["Contact is blocked, unable to add it to a group."] = "";
+$a->strings["Unable to add the contact to the group."] = "";
+$a->strings["Contact successfully added to group."] = "";
+$a->strings["Unable to remove the contact from the group."] = "";
+$a->strings["Contact successfully removed from group."] = "";
+$a->strings["Unknown group command."] = "";
+$a->strings["Bad request."] = "";
+$a->strings["Save Group"] = "Bewaar groep";
+$a->strings["Filter"] = "filter";
+$a->strings["Create a group of contacts/friends."] = "Maak een groep contacten/vrienden aan.";
+$a->strings["Group removed."] = "Groep verwijderd.";
+$a->strings["Unable to remove group."] = "Niet in staat om groep te verwijderen.";
+$a->strings["Delete Group"] = "Verwijder Groep";
+$a->strings["Edit Group Name"] = "Bewerk Groep Naam";
+$a->strings["Members"] = "Leden";
+$a->strings["Remove contact from group"] = "Verwijder contact uit de groep";
+$a->strings["Add contact to group"] = "Voeg contact toe aan de groep";
+$a->strings["Help:"] = "Help:";
+$a->strings["Welcome to %s"] = "Welkom op %s";
 $a->strings["Friendica Communications Server - Setup"] = "Friendica Communicatie Server - Setup";
 $a->strings["System check"] = "Systeemcontrole";
 $a->strings["Check again"] = "Controleer opnieuw";
+$a->strings["Base settings"] = "";
+$a->strings["Host name"] = "Host naam";
+$a->strings["Overwrite this field in case the determinated hostname isn't right, otherweise leave it as is."] = "";
+$a->strings["Base path to installation"] = "Basispad voor installatie";
+$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."] = "Als het systeem het correcte pad naar je installatie niet kan detecteren, geef hier dan het correcte pad in. Deze instelling zou alleen geconfigureerd moeten worden als je een systeem met restricties hebt en symbolische links naar je webroot.";
+$a->strings["Sub path of the URL"] = "";
+$a->strings["Overwrite this field in case the sub path determination isn't right, otherwise leave it as is. Leaving this field blank means the installation is at the base URL without sub path."] = "";
 $a->strings["Database connection"] = "Verbinding met database";
 $a->strings["In order to install Friendica we need to know how to connect to your database."] = "Om Friendica te kunnen installeren moet ik weten hoe ik jouw database kan bereiken.";
 $a->strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Neem contact op met jouw hostingprovider of websitebeheerder, wanneer je vragen hebt over deze instellingen. ";
@@ -2085,10 +2155,10 @@ $a->strings["Database Login Name"] = "Gebruikersnaam database";
 $a->strings["Database Login Password"] = "Wachtwoord database";
 $a->strings["For security reasons the password must not be empty"] = "Om veiligheidsreden mag het paswoord niet leeg zijn";
 $a->strings["Database Name"] = "Naam database";
-$a->strings["Site administrator email address"] = "E-mailadres van de websitebeheerder";
-$a->strings["Your account email address must match this in order to use the web admin panel."] = "Het e-mailadres van je account moet hiermee overeenkomen om het administratiepaneel te kunnen gebruiken.";
 $a->strings["Please select a default timezone for your website"] = "Selecteer een standaard tijdzone voor je website";
 $a->strings["Site settings"] = "Website-instellingen";
+$a->strings["Site administrator email address"] = "E-mailadres van de websitebeheerder";
+$a->strings["Your account email address must match this in order to use the web admin panel."] = "Het e-mailadres van je account moet hiermee overeenkomen om het administratiepaneel te kunnen gebruiken.";
 $a->strings["System Language:"] = "Systeem taal:";
 $a->strings["Set the default language for your Friendica installation interface and to send emails."] = "Stel de standaard taal in voor je Friendica installatie interface en emails.";
 $a->strings["Your Friendica site database has been installed."] = "De database van je Friendica-website is geïnstalleerd.";
@@ -2096,7 +2166,39 @@ $a->strings["Installation finished"] = "Installaitie beëindigd";
 $a->strings["<h1>What next</h1>"] = "<h1>Wat nu</h1>";
 $a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the worker."] = "BELANGRIJK: Je zal [manueel] een geplande taak moeten opzetten voor de worker.";
 $a->strings["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."] = "Go naar je nieuwe Friendica node <a href=\"%s/register\">registratie pagina</a> en registeer als nieuwe gebruiker. Vergeet niet hetzelfde email adres te gebruiken als wat je opgegeven hebt als administrator email. Dit zal je toelaten om het site administratie paneel te openen.";
-$a->strings["Item Guid"] = "Item identificatie";
+$a->strings["Total invitation limit exceeded."] = "Totale uitnodigingslimiet overschreden.";
+$a->strings["%s : Not a valid email address."] = "%s: Geen geldig e-mailadres.";
+$a->strings["Please join us on Friendica"] = "Kom bij ons op Friendica";
+$a->strings["Invitation limit exceeded. Please contact your site administrator."] = "Uitnodigingslimiet overschreden. Neem contact op met de beheerder van je website.";
+$a->strings["%s : Message delivery failed."] = "%s : Aflevering van bericht mislukt.";
+$a->strings["%d message sent."] = [
+       0 => "%d bericht verzonden.",
+       1 => "%d berichten verzonden.",
+];
+$a->strings["You have no more invitations available"] = "Je kunt geen uitnodigingen meer sturen";
+$a->strings["Visit %s for a list of public sites that you can join. Friendica members on other sites can all connect with each other, as well as with members of many other social networks."] = "Bezoek %s voor een lijst van openbare sites waar je je kunt aansluiten. Friendica leden op andere sites kunnen allemaal met elkaar verbonden worden, en ook met leden van verschillende andere sociale netwerken.";
+$a->strings["To accept this invitation, please visit and register at %s or any other public Friendica website."] = "Om deze uitnodiging te accepteren kan je je op %s registreren of op een andere vrij toegankelijke Friendica-website.";
+$a->strings["Friendica sites all inter-connect to create a huge privacy-enhanced social web that is owned and controlled by its members. They can also connect with many traditional social networks. See %s for a list of alternate Friendica sites you can join."] = "Friendica servers zijn allemaal onderling verbonden om een reusachtig sociaal web te maken met verbeterde privacy, dat eigendom is van en gecontroleerd door zijn leden. Ze kunnen ook verbindingen maken met verschillende traditionele sociale netwerken. Bekijk %s voor een lijst van alternatieve Friendica servers waar je aan kunt sluiten.";
+$a->strings["Our apologies. This system is not currently configured to connect with other public sites or invite members."] = "Onze verontschuldigingen. Dit systeem is momenteel niet ingesteld om verbinding te maken met andere openbare plaatsen of leden uit te nodigen.";
+$a->strings["Friendica sites all inter-connect to create a huge privacy-enhanced social web that is owned and controlled by its members. They can also connect with many traditional social networks."] = "Friendica servers zijn allemaal onderling verbonden om een reusachtig sociaal web te maken met verbeterde privacy, dat eigendom is van en gecontroleerd door zijn leden. Ze kunnen ook verbindingen maken met verschillende traditionele sociale netwerken.";
+$a->strings["To accept this invitation, please visit and register at %s."] = "Om deze uitnodiging te accepteren, ga naar en registreer op %s.";
+$a->strings["Send invitations"] = "Verstuur uitnodigingen";
+$a->strings["Enter email addresses, one per line:"] = "Vul e-mailadressen in, één per lijn:";
+$a->strings["You are cordially invited to join me and other close friends on Friendica - and help us to create a better social web."] = "Ik nodig je vriendelijk uit om bij mij en andere vrienden te komen op Friendica - en ons te helpen om een beter sociaal web te bouwen.";
+$a->strings["You will need to supply this invitation code: \$invite_code"] = "Je zult deze uitnodigingscode moeten invullen: \$invite_code";
+$a->strings["Once you have registered, please connect with me via my profile page at:"] = "Eens je geregistreerd bent kun je contact leggen met mij via mijn profielpagina op:";
+$a->strings["For more information about the Friendica project and why we feel it is important, please visit http://friendi.ca"] = "Voor meer informatie over het Friendica project en waarom wij denken dat het belangrijk is kun je http://friendi.ca/ bezoeken";
+$a->strings["Please enter a post body."] = "";
+$a->strings["This feature is only available with the frio theme."] = "";
+$a->strings["Compose new personal note"] = "";
+$a->strings["Compose new post"] = "";
+$a->strings["Clear the location"] = "";
+$a->strings["Location services are unavailable on your device"] = "";
+$a->strings["Location services are disabled. Please check the website's permissions on your device"] = "";
+$a->strings["Public"] = "";
+$a->strings["This post will be sent to all your followers and can be seen in the community pages and by anyone with its link."] = "";
+$a->strings["Limited/Private"] = "";
+$a->strings["This post will be sent only to the people in the first box, to the exception of the people mentioned in the second box. It won't appear anywhere public."] = "";
 $a->strings["Create a New Account"] = "Nieuwe account aanmaken";
 $a->strings["Password: "] = "Wachtwoord:";
 $a->strings["Remember me"] = "Onthou me";
@@ -2107,12 +2209,152 @@ $a->strings["terms of service"] = "servicevoorwaarden";
 $a->strings["Website Privacy Policy"] = "Privacybeleid website";
 $a->strings["privacy policy"] = "privacybeleid";
 $a->strings["Logged out."] = "Uitgelogd.";
-$a->strings["Bad Request."] = "Bad Request";
-$a->strings["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."] = "Op het moment van de registratie, en om communicatie mogelijk te maken tussen de gebruikersaccount en zijn of haar contacten, moet de gebruiker een weergave naam opgeven, een gebruikersnaam (bijnaam) en een werkend email adres. De namen zullen toegankelijk zijn op de profiel pagina van het account voor elke bezoeker van de pagina, zelfs als andere profiel details niet getoond worden. Het email adres zal enkel gebruikt worden om de gebruiker notificaties te sturen over interacties, maar zal niet zichtbaar getoond worden. Het oplijsten van een account in de gids van de node van de gebruiker of in de globale gids is optioneel en kan beheerd worden in de gebruikersinstellingen, dit is niet nodig voor communicatie.";
-$a->strings["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."] = "Deze data is vereist voor communicatie en wordt doorgegeven aan de nodes van de communicatie partners en wordt daar opgeslagen. Gebruikers kunnen bijkomende privé data opgeven die mag doorgegeven worden aan de accounts van de communicatie partners.";
-$a->strings["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."] = "Een ingelogd gebruiker kan op elk moment zijn of haar account data exporteren via <a href=\"%1\$s/settings/uexport\">account instellingen</a>. Een gebruiker kan ook zijn of haar account verwijderen via <a href=\"%1\$s/removeme\">%1\$s/removeme</a>. De verwijdering van het account is permanent. Ook zal aan andere nodes van communicatie partners gevraagd worden om de data te verwijderen.";
-$a->strings["Privacy Statement"] = "Privacy Verklaring";
+$a->strings["System down for maintenance"] = "Systeem onbeschikbaar wegens onderhoud";
+$a->strings["Page not found."] = "Pagina niet gevonden";
+$a->strings["Invalid photo with id %s."] = "";
+$a->strings["User not found."] = "";
+$a->strings["No contacts."] = "Geen contacten.";
+$a->strings["Follower (%s)"] = [
+       0 => "",
+       1 => "",
+];
+$a->strings["Following (%s)"] = [
+       0 => "",
+       1 => "",
+];
+$a->strings["Mutual friend (%s)"] = [
+       0 => "",
+       1 => "",
+];
+$a->strings["Contact (%s)"] = [
+       0 => "",
+       1 => "",
+];
+$a->strings["All contacts"] = "";
+$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."] = "Laat dit veld leeg als je niet vertrouwd bent met OpenID, en vul de rest van de items in.";
+$a->strings["Your OpenID (optional): "] = "Je OpenID (optioneel):";
+$a->strings["Include your profile in member directory?"] = "Je profiel in de ledengids opnemen?";
+$a->strings["Note for the admin"] = "Nota voor de beheerder";
+$a->strings["Leave a message for the admin, why you want to join this node"] = "Laat een boodschap na voor de beheerder, waarom je bij deze node wil komen";
+$a->strings["Membership on this site is by invitation only."] = "Lidmaatschap van deze website is uitsluitend op uitnodiging.";
+$a->strings["Your invitation code: "] = "Je uitnodigingscode:";
+$a->strings["Your Full Name (e.g. Joe Smith, real or real-looking): "] = "Je volledige naam (bvb. Jan Smit, echt of echt lijkend):";
+$a->strings["Your Email Address: (Initial information will be send there, so this has to be an existing address.)"] = "Je Email Adres: (Initiële informatie zal hier naartoe gezonden worden, dus dit moet een bestaand adres zijn.)";
+$a->strings["Leave empty for an auto generated password."] = "Laat leeg voor een automatisch gegenereerd paswoord.";
+$a->strings["Choose a profile nickname. This must begin with a text character. Your profile address on this site will then be \"<strong>nickname@%s</strong>\"."] = "";
+$a->strings["Choose a nickname: "] = "Kies een bijnaam:";
+$a->strings["Import your profile to this friendica instance"] = "Importeer je profiel op deze friendica server";
+$a->strings["Note: This node explicitly contains adult content"] = "Waarschuwing: Deze node heeft inhoud enkel bedoeld voor volwassenen.";
+$a->strings["Registration successful. Please check your email for further instructions."] = "Registratie geslaagd. Kijk je e-mail na voor verdere instructies.";
+$a->strings["Failed to send email message. Here your accout details:<br> login: %s<br> password: %s<br><br>You can change your password after login."] = "Kon email niet verzenden. Hier zijn je account details: <br> login: %s <br> paswoord: %s<br><br> Je kan je paswoord aanpassen nadat je ingelogd bent.";
+$a->strings["Registration successful."] = "Registratie succes.";
+$a->strings["Your registration can not be processed."] = "Je registratie kan niet verwerkt worden.";
+$a->strings["Your registration is pending approval by the site owner."] = "Jouw registratie wacht op goedkeuring van de beheerder.";
+$a->strings["Please enter your password to access this page."] = "";
+$a->strings["App-specific password generation failed: The description is empty."] = "";
+$a->strings["App-specific password generation failed: This description already exists."] = "";
+$a->strings["New app-specific password generated."] = "";
+$a->strings["App-specific passwords successfully revoked."] = "";
+$a->strings["App-specific password successfully revoked."] = "";
+$a->strings["Two-factor app-specific passwords"] = "";
+$a->strings["<p>App-specific passwords are randomly generated passwords used instead your regular password to authenticate your account on third-party applications that don't support two-factor authentication.</p>"] = "";
+$a->strings["Make sure to copy your new app-specific password now. You won’t be able to see it again!"] = "";
+$a->strings["Description"] = "";
+$a->strings["Last Used"] = "";
+$a->strings["Revoke"] = "";
+$a->strings["Revoke All"] = "";
+$a->strings["When you generate a new app-specific password, you must use it right away, it will be shown to you once after you generate it."] = "";
+$a->strings["Generate new app-specific password"] = "";
+$a->strings["Friendiqa on my Fairphone 2..."] = "";
+$a->strings["Generate"] = "";
+$a->strings["Two-factor authentication successfully disabled."] = "";
+$a->strings["<p>Use an application on a mobile device to get two-factor authentication codes when prompted on login.</p>"] = "";
+$a->strings["Authenticator app"] = "";
+$a->strings["Configured"] = "";
+$a->strings["Not Configured"] = "";
+$a->strings["<p>You haven't finished configuring your authenticator app.</p>"] = "";
+$a->strings["<p>Your authenticator app is correctly configured.</p>"] = "";
+$a->strings["Recovery codes"] = "";
+$a->strings["Remaining valid codes"] = "";
+$a->strings["<p>These one-use codes can replace an authenticator app code in case you have lost access to it.</p>"] = "";
+$a->strings["App-specific passwords"] = "";
+$a->strings["Generated app-specific passwords"] = "";
+$a->strings["<p>These randomly generated passwords allow you to authenticate on apps not supporting two-factor authentication.</p>"] = "";
+$a->strings["Current password:"] = "";
+$a->strings["You need to provide your current password to change two-factor authentication settings."] = "";
+$a->strings["Enable two-factor authentication"] = "";
+$a->strings["Disable two-factor authentication"] = "";
+$a->strings["Show recovery codes"] = "";
+$a->strings["Manage app-specific passwords"] = "";
+$a->strings["Finish app configuration"] = "";
+$a->strings["New recovery codes successfully generated."] = "";
+$a->strings["Two-factor recovery codes"] = "";
+$a->strings["<p>Recovery codes can be used to access your account in the event you lose access to your device and cannot receive two-factor authentication codes.</p><p><strong>Put these in a safe spot!</strong> If you lose your device and don’t have the recovery codes you will lose access to your account.</p>"] = "";
+$a->strings["When you generate new recovery codes, you must copy the new codes. Your old codes won’t work anymore."] = "";
+$a->strings["Generate new recovery codes"] = "";
+$a->strings["Next: Verification"] = "";
+$a->strings["Two-factor authentication successfully activated."] = "";
+$a->strings["Invalid code, please retry."] = "";
+$a->strings["<p>Or you can submit the authentication settings manually:</p>\n<dl>\n\t<dt>Issuer</dt>\n\t<dd>%s</dd>\n\t<dt>Account Name</dt>\n\t<dd>%s</dd>\n\t<dt>Secret Key</dt>\n\t<dd>%s</dd>\n\t<dt>Type</dt>\n\t<dd>Time-based</dd>\n\t<dt>Number of digits</dt>\n\t<dd>6</dd>\n\t<dt>Hashing algorithm</dt>\n\t<dd>SHA-1</dd>\n</dl>"] = "";
+$a->strings["Two-factor code verification"] = "";
+$a->strings["<p>Please scan this QR Code with your authenticator app and submit the provided code.</p>"] = "";
+$a->strings["<p>Or you can open the following URL in your mobile devicde:</p><p><a href=\"%s\">%s</a></p>"] = "";
+$a->strings["Please enter a code from your authentication app"] = "";
+$a->strings["Verify code and enable two-factor authentication"] = "";
+$a->strings["Bad Request"] = "Bad Request";
+$a->strings["Unauthorized"] = "";
+$a->strings["Forbidden"] = "";
+$a->strings["Not Found"] = "Niet gevonden";
+$a->strings["Internal Server Error"] = "";
+$a->strings["Service Unavailable"] = "";
+$a->strings["The server cannot or will not process the request due to an apparent client error."] = "";
+$a->strings["Authentication is required and has failed or has not yet been provided."] = "";
+$a->strings["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."] = "";
+$a->strings["The requested resource could not be found but may be available in the future."] = "";
+$a->strings["An unexpected condition was encountered and no more specific message is suitable."] = "";
+$a->strings["The server is currently unavailable (because it is overloaded or down for maintenance). Please try again later."] = "";
+$a->strings["Go back"] = "";
+$a->strings["Remaining recovery codes: %d"] = "";
+$a->strings["Two-factor recovery"] = "";
+$a->strings["<p>You can enter one of your one-time recovery codes in case you lost access to your mobile device.</p>"] = "";
+$a->strings["Don’t have your phone? <a href=\"%s\">Enter a two-factor recovery code</a>"] = "";
+$a->strings["Please enter a recovery code"] = "";
+$a->strings["Submit recovery code and complete login"] = "";
+$a->strings["<p>Open the two-factor authentication app on your device to get an authentication code and verify your identity.</p>"] = "";
+$a->strings["Verify code and complete login"] = "";
+$a->strings["Welcome to Friendica"] = "Welkom bij Friendica";
+$a->strings["New Member Checklist"] = "Checklist voor nieuwe leden";
+$a->strings["We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page. A link to this page will be visible from your home page for two weeks after your initial registration and then will quietly disappear."] = "We willen je een paar tips en verwijzingen aanreiken om je een aangename ervaring te bezorgen. Klik op een item om de relevante pagina's te bezoeken. Een verwijzing naar deze pagina zal twee weken lang na je registratie zichtbaar zijn op je tijdlijn. Daarna zal de verwijzing stilletjes verdwijnen.";
+$a->strings["Getting Started"] = "Aan de slag";
+$a->strings["Friendica Walk-Through"] = "Doorloop Friendica";
+$a->strings["On your <em>Quick Start</em> page - find a brief introduction to your profile and network tabs, make some new connections, and find some groups to join."] = "Op je <em>Snelstart</em> pagina kun je een korte inleiding vinden over je profiel en netwerk tabs, om enkele nieuwe connecties te leggen en groepen te vinden om lid van te worden.";
+$a->strings["Go to Your Settings"] = "Ga naar je instellingen";
+$a->strings["On your <em>Settings</em> page -  change your initial password. Also make a note of your Identity Address. This looks just like an email address - and will be useful in making friends on the free social web."] = "Verander je initieel wachtwoord op je <em>instellingenpagina</em>. Noteer ook het adres van je identiteit. Dit ziet er uit als een e-mailadres - en zal nuttig zijn om vrienden te maken op het vrije sociale web.";
+$a->strings["Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you."] = "Controleer ook de andere instellingen, in het bijzonder de privacy-instellingen. Een niet-gepubliceerd adres is zoals een privé-telefoonnummer. In het algemeen wil je waarschijnlijk je adres publiceren - tenzij al je vrienden en mogelijke vrienden precies weten hoe je te vinden.";
+$a->strings["Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not."] = "Upload een profielfoto, als je dat nog niet gedaan hebt. Studies tonen aan dat mensen met echte foto's van zichzelf tien keer gemakkelijker vrienden maken dan mensen die dat niet doen.";
+$a->strings["Edit Your Profile"] = "Bewerk je profiel";
+$a->strings["Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors."] = "Bewerk je <strong>standaard</strong> profiel zoals je wilt. Controleer de instellingen om je vriendenlijst te verbergen, en om je profiel voor ongekende bezoekers te verbergen.";
+$a->strings["Profile Keywords"] = "Sleutelwoorden voor dit profiel";
+$a->strings["Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships."] = "Stel enkele openbare sleutelwoorden in voor je standaard profiel die je interesses beschrijven. We kunnen dan misschien mensen vinden met gelijkaardige interesses, en vrienden voorstellen.";
+$a->strings["Connecting"] = "Verbinding aan het maken";
+$a->strings["Importing Emails"] = "E-mails importeren";
+$a->strings["Enter your email access information on your Connector Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = "Vul je e-mailtoegangsinformatie in op je pagina met verbindingsinstellingen als je vrienden of mailinglijsten uit je e-mail-inbox wilt importeren, en met hen wilt communiceren";
+$a->strings["Go to Your Contacts Page"] = "Ga naar je contactenpagina";
+$a->strings["Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Add New Contact</em> dialog."] = "Je contactenpagina is jouw poort om vriendschappen te beheren en verbinding te leggen met vrienden op andere netwerken. Je kunt hun adres of URL toevoegen in de <em>Voeg nieuw contact toe</em> dialoog.";
+$a->strings["Go to Your Site's Directory"] = "Ga naar de gids van je website";
+$a->strings["The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested."] = "In de gids vind je andere mensen in dit netwerk of op andere federatieve sites. Zoek naar het woord <em>Connect</em> of <em>Follow</em> op hun profielpagina (meestal aan de linkerkant). Vul je eigen identiteitsadres in wanneer daar om wordt gevraagd.";
+$a->strings["Finding New People"] = "Nieuwe mensen vinden";
+$a->strings["On the side panel of the Contacts page are several tools to find new friends. We can match people by interest, look up people by name or interest, and provide suggestions based on network relationships. On a brand new site, friend suggestions will usually begin to be populated within 24 hours."] = "Op het zijpaneel van de Contacten pagina vind je verschillende tools om nieuwe vrienden te zoeken. We kunnen mensen op interesses matchen, mensen opzoeken op naam of hobby, en suggesties doen gebaseerd op netwerk-relaties. Op een nieuwe webstek beginnen vriendschapssuggesties meestal binnen de 24 uur beschikbaar te worden.";
+$a->strings["Group Your Contacts"] = "Groepeer je contacten";
+$a->strings["Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page."] = "Als je een aantal vrienden gemaakt hebt kun je ze in je eigen gespreksgroepen indelen vanuit de zijbalk van je 'Contacten' pagina, en dan kun je met elke groep apart contact houden op je Netwerk pagina. ";
+$a->strings["Why Aren't My Posts Public?"] = "Waarom zijn mijn berichten niet openbaar?";
+$a->strings["Friendica respects your privacy. By default, your posts will only show up to people you've added as friends. For more information, see the help section from the link above."] = "Friendica respecteert je privacy. Standaard zullen je berichten alleen zichtbaar zijn voor personen die jij als vriend hebt toegevoegd. Lees de help (zie de verwijzing hierboven) voor meer informatie.";
+$a->strings["Getting Help"] = "Hulp krijgen";
+$a->strings["Go to the Help Section"] = "Ga naar de help";
+$a->strings["Our <strong>help</strong> pages may be consulted for detail on other program features and resources."] = "Je kunt onze <strong>help</strong> pagina's raadplegen voor gedetailleerde informatie over andere functies van dit programma.";
 $a->strings["This entry was edited"] = "Deze entry werd bewerkt";
+$a->strings["Private Message"] = "Privébericht";
 $a->strings["Delete locally"] = "Verwijder lokaal";
 $a->strings["Delete globally"] = "Verwijder globaal";
 $a->strings["Remove locally"] = "Verwijder lokaal";
@@ -2136,78 +2378,31 @@ $a->strings["to"] = "aan";
 $a->strings["via"] = "via";
 $a->strings["Wall-to-Wall"] = "wall-to-wall";
 $a->strings["via Wall-To-Wall:"] = "via wall-to-wall";
+$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"] = "";
+$a->strings["Delivery to remote servers is mostly done"] = "";
+$a->strings["Delivery to remote servers is done"] = "";
 $a->strings["%d comment"] = [
        0 => "%d reactie",
        1 => "%d reacties",
 ];
-$a->strings["Sharing notification from Diaspora network"] = "Deelt notificatie van het Diaspora netwerk";
-$a->strings["Attachments:"] = "Bijlagen:";
-$a->strings["%s is now following %s."] = "%s volgt nu %s.";
-$a->strings["following"] = "volgend";
-$a->strings["%s stopped following %s."] = "%s stopte %s te volgen.";
-$a->strings["stopped following"] = "is gestopt met volgen";
-$a->strings["YYYY-MM-DD or MM-DD"] = "JJJJ-MM-DD of MM-DD";
-$a->strings["never"] = "nooit";
-$a->strings["less than a second ago"] = "minder dan een seconde geleden";
-$a->strings["year"] = "jaar";
-$a->strings["years"] = "jaren";
-$a->strings["months"] = "maanden";
-$a->strings["weeks"] = "weken";
-$a->strings["days"] = "dagen";
-$a->strings["hour"] = "uur";
-$a->strings["hours"] = "uren";
-$a->strings["minute"] = "minuut";
-$a->strings["minutes"] = "minuten";
-$a->strings["second"] = "seconde";
-$a->strings["seconds"] = "seconden";
-$a->strings["in %1\$d %2\$s"] = "in %1\$d%2\$s";
-$a->strings["%1\$d %2\$s ago"] = "%1\$d %2\$s geleden";
-$a->strings["(no subject)"] = "(geen onderwerp)";
+$a->strings["Show more"] = "";
+$a->strings["Show fewer"] = "";
+$a->strings["Legacy module file not found: %s"] = "Legacy module bestand niet gevonden: %s";
+$a->strings["Delete this item?"] = "Dit item verwijderen?";
+$a->strings["toggle mobile"] = "mobiel thema omwisselen";
+$a->strings["No system theme config value set."] = "Geen systeem thema configuratie ingesteld.";
+$a->strings["You must be logged in to use addons. "] = "Je moet ingelogd zijn om deze addons te kunnen gebruiken. ";
+$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."] = "De beveiligingstoken van het formulier was foutief. Dit gebeurde waarschijnlijk omdat het formulier te lang (> 3 uur)  is blijven open staan voor het werd verstuurd.";
+$a->strings["Could not find any unarchived contact entry for this URL (%s)"] = "Kon geen niet-gearchiveerde contacten vinden voor deze URL (%s)";
+$a->strings["The contact entries have been archived"] = "The contacten zijn gearchiveerd";
+$a->strings["Enter new password: "] = "Geef nieuw paswoord:";
+$a->strings["Post update version number has been set to %s."] = "Bericht update versie is ingesteld op %s";
+$a->strings["Check for pending update actions."] = "Controleren op uitgestelde update acties.";
+$a->strings["Done."] = "Gedaan";
+$a->strings["Execute pending post updates."] = "uitgestelde bericht update acties uitvoeren";
+$a->strings["All pending post updates are done."] = "Alle uitgestelde bericht update acties zijn uitgevoerd";
 $a->strings["%s: Updating author-id and owner-id in item and thread table. "] = "%s: author-id en owner-id in item en gesprekstabel aan het updaten.";
 $a->strings["%s: Updating post-type."] = "%s: bericht-type bewerken";
-$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"] = "Variaties";
-$a->strings["Custom"] = "Aangepast";
-$a->strings["Note"] = "Nota";
-$a->strings["Check image permissions if all users are allowed to see the image"] = "Controleer of alle gebruikers permissie hebben om het beeld te zien ";
-$a->strings["Select color scheme"] = "Selecteer kleurschema";
-$a->strings["Navigation bar background color"] = "Navigatie balk achtergrondkleur";
-$a->strings["Navigation bar icon color "] = "Navigatie balk icoon kleur";
-$a->strings["Link color"] = "Link kleur";
-$a->strings["Set the background color"] = "Stel de achtergrondkleur in";
-$a->strings["Content background opacity"] = "Content achtergrond opaciteit";
-$a->strings["Set the background image"] = "Stel het achtergrondbeeld in";
-$a->strings["Background image style"] = "Achtergrond beeld stijl";
-$a->strings["Login page background image"] = "Achtergrondafbeelding aanmeldpagina";
-$a->strings["Login page background color"] = "Achtergrondkleur aanmeldpagina";
-$a->strings["Leave background image and color empty for theme defaults"] = "Laat de achtergrondafbeelding en kleur leeg om de standaard van het thema te gebruiken";
-$a->strings["Top Banner"] = "Banner Bovenaan";
-$a->strings["Resize image to the width of the screen and show background color below on long pages."] = "Pas het beeld aan aan de breedte van het scherm en toon achtergrondkleur onder lange pagina's";
-$a->strings["Full screen"] = "Volledig scherm";
-$a->strings["Resize image to fill entire screen, clipping either the right or the bottom."] = "Pas het beeld aan om het hele scherm te vullen, met ofwel de rechter- of de onderkant afgeknipt.";
-$a->strings["Single row mosaic"] = "Enkele rij mozaïek";
-$a->strings["Resize image to repeat it on a single row, either vertical or horizontal."] = "Pas het beeld aan zodat het herhaald wordt op een enkele rij, ofwel vertikaal ofwel horizontaal";
-$a->strings["Mosaic"] = "Mozaïek";
-$a->strings["Repeat image to fill the screen."] = "Herhaal beeld om het scherm te vullen.";
-$a->strings["Guest"] = "Gast";
-$a->strings["Visitor"] = "Bezoeker";
-$a->strings["Alignment"] = "Uitlijning";
-$a->strings["Left"] = "Links";
-$a->strings["Center"] = "Gecentreerd";
-$a->strings["Color scheme"] = "Kleurschema";
-$a->strings["Posts font size"] = "Lettergrootte berichten";
-$a->strings["Textareas font size"] = "Lettergrootte tekstgebieden";
-$a->strings["Comma separated list of helper forums"] = "Kommagescheiden lijst van de helper forums";
-$a->strings["Set style"] = "Stijl instellen";
-$a->strings["Community Pages"] = "Forum/groepspagina's";
-$a->strings["Community Profiles"] = "Forum/groepsprofielen";
-$a->strings["Help or @NewHere ?"] = "Help of @NewHere ?";
-$a->strings["Connect Services"] = "Diensten verbinden";
-$a->strings["Find Friends"] = "Zoek vrienden";
-$a->strings["Last users"] = "Laatste gebruikers";
-$a->strings["Quick Start"] = "Snelstart";
index 3cbe215cd0b3a25824ec05fd2a85ac9265bfaafc..f281161709fd037e335efa7a3036bc1bfb0cbc6b 100644 (file)
@@ -56,8 +56,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-15 08:55-0400\n"
-"PO-Revision-Date: 2019-06-11 16:54+0000\n"
+"POT-Creation-Date: 2019-07-25 22:48-0400\n"
+"PO-Revision-Date: 2019-07-29 15:40+0000\n"
 "Last-Translator: Waldemar Stoczkowski\n"
 "Language-Team: Polish (http://www.transifex.com/Friendica/friendica/language/pl/)\n"
 "MIME-Version: 1.0\n"
@@ -90,90 +90,90 @@ msgstr[3] "Tygodniowy limit wysyłania %d postów. Post został odrzucony."
 msgid "Monthly posting limit of %d post reached. The post was rejected."
 msgstr "Miesięczny limit %d wysyłania postów. Post został odrzucony."
 
-#: include/api.php:4511 mod/photos.php:91 mod/photos.php:193
-#: mod/photos.php:636 mod/photos.php:1082 mod/photos.php:1099
-#: mod/photos.php:1601 mod/profile_photo.php:85 mod/profile_photo.php:94
+#: include/api.php:4511 mod/photos.php:91 mod/photos.php:196
+#: mod/photos.php:640 mod/photos.php:1090 mod/photos.php:1107
+#: mod/photos.php:1610 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:763
-#: src/Model/User.php:771 src/Model/User.php:779
+#: mod/profile_photo.php:305 mod/profile_photo.php:315 src/Model/User.php:796
+#: src/Model/User.php:804 src/Model/User.php:812
 msgid "Profile Photos"
 msgstr "Zdjęcie profilowe"
 
-#: include/conversation.php:160 include/conversation.php:297
-#: src/Model/Item.php:3253
+#: include/conversation.php:161 include/conversation.php:298
+#: src/Model/Item.php:3268
 msgid "event"
 msgstr "wydarzenie"
 
-#: include/conversation.php:163 include/conversation.php:173
-#: include/conversation.php:300 include/conversation.php:309
-#: mod/subthread.php:88 mod/tagger.php:68
+#: include/conversation.php:164 include/conversation.php:174
+#: include/conversation.php:301 include/conversation.php:310
+#: mod/subthread.php:88 mod/tagger.php:69
 msgid "status"
 msgstr "status"
 
-#: include/conversation.php:168 include/conversation.php:305
-#: mod/subthread.php:88 mod/tagger.php:68 src/Model/Item.php:3255
+#: include/conversation.php:169 include/conversation.php:306
+#: mod/subthread.php:88 mod/tagger.php:69 src/Model/Item.php:3270
 msgid "photo"
 msgstr "zdjęcie"
 
-#: include/conversation.php:181
+#: include/conversation.php:182
 #, php-format
 msgid "%1$s likes %2$s's %3$s"
 msgstr "%1$s lubi to %2$s's %3$s"
 
-#: include/conversation.php:183
+#: include/conversation.php:184
 #, php-format
 msgid "%1$s doesn't like %2$s's %3$s"
 msgstr "%1$s nie lubi %2$s's %3$s"
 
-#: include/conversation.php:185
+#: include/conversation.php:186
 #, php-format
 msgid "%1$s attends %2$s's %3$s"
 msgstr "%1$s bierze udział w %2$s's %3$s"
 
-#: include/conversation.php:187
+#: include/conversation.php:188
 #, php-format
 msgid "%1$s doesn't attend %2$s's %3$s"
 msgstr "%1$s nie uczestniczy %2$s 's %3$s"
 
-#: include/conversation.php:189
+#: include/conversation.php:190
 #, php-format
 msgid "%1$s attends maybe %2$s's %3$s"
 msgstr "%1$s może bierze udział %2$s 's %3$s"
 
-#: include/conversation.php:224
+#: include/conversation.php:225
 #, php-format
 msgid "%1$s is now friends with %2$s"
 msgstr "%1$s jest teraz znajomym z %2$s"
 
-#: include/conversation.php:265
+#: include/conversation.php:266
 #, php-format
 msgid "%1$s poked %2$s"
 msgstr "%1$s zaczepił Cię %2$s"
 
-#: include/conversation.php:319 mod/tagger.php:101
+#: include/conversation.php:320 mod/tagger.php:102
 #, php-format
 msgid "%1$s tagged %2$s's %3$s with %4$s"
 msgstr "%1$s zaznaczył %2$s'go %3$s przy użyciu %4$s"
 
-#: include/conversation.php:341
+#: include/conversation.php:342
 msgid "post/item"
 msgstr "stanowisko/pozycja"
 
-#: include/conversation.php:342
+#: include/conversation.php:343
 #, php-format
 msgid "%1$s marked %2$s's %3$s as favorite"
 msgstr "%1$s oznacz %2$s's %3$s jako ulubione"
 
-#: include/conversation.php:568 mod/photos.php:1433 mod/profiles.php:352
+#: include/conversation.php:569 mod/photos.php:1442 mod/profiles.php:352
 msgid "Likes"
 msgstr "Lubię to"
 
-#: include/conversation.php:569 mod/photos.php:1433 mod/profiles.php:355
+#: include/conversation.php:570 mod/photos.php:1442 mod/profiles.php:355
 msgid "Dislikes"
 msgstr "Nie lubię tego"
 
-#: include/conversation.php:570 include/conversation.php:1564
-#: mod/photos.php:1434
+#: include/conversation.php:571 include/conversation.php:1565
+#: mod/photos.php:1443
 msgid "Attending"
 msgid_plural "Attending"
 msgstr[0] "Uczestniczę"
@@ -181,375 +181,374 @@ msgstr[1] "Uczestniczy"
 msgstr[2] "Uczestniczą"
 msgstr[3] "Uczestniczą"
 
-#: include/conversation.php:571 mod/photos.php:1434
+#: include/conversation.php:572 mod/photos.php:1443
 msgid "Not attending"
 msgstr "Nie uczestniczę"
 
-#: include/conversation.php:572 mod/photos.php:1434
+#: include/conversation.php:573 mod/photos.php:1443
 msgid "Might attend"
 msgstr "Może wziąć udział"
 
-#: include/conversation.php:573
+#: include/conversation.php:574
 msgid "Reshares"
 msgstr "Udostępnianie"
 
-#: include/conversation.php:653 mod/photos.php:1490 src/Object/Post.php:208
+#: include/conversation.php:654 mod/photos.php:1499 src/Object/Post.php:209
 msgid "Select"
 msgstr "Wybierz"
 
-#: include/conversation.php:654 mod/photos.php:1491 mod/settings.php:735
+#: include/conversation.php:655 mod/photos.php:1500 mod/settings.php:738
 #: src/Module/Admin/Users.php:288 src/Module/Contact.php:830
-#: src/Module/Contact.php:1105
+#: src/Module/Contact.php:1101
 msgid "Delete"
 msgstr "Usuń"
 
-#: include/conversation.php:679 src/Object/Post.php:382
-#: src/Object/Post.php:383
+#: include/conversation.php:680 src/Object/Post.php:383
+#: src/Object/Post.php:384
 #, php-format
 msgid "View %s's profile @ %s"
 msgstr "Pokaż %s's profil @ %s"
 
-#: include/conversation.php:692 src/Object/Post.php:370
+#: include/conversation.php:693 src/Object/Post.php:371
 msgid "Categories:"
 msgstr "Kategorie:"
 
-#: include/conversation.php:693 src/Object/Post.php:371
+#: include/conversation.php:694 src/Object/Post.php:372
 msgid "Filed under:"
 msgstr "Zapisano w:"
 
-#: include/conversation.php:700 src/Object/Post.php:396
+#: include/conversation.php:701 src/Object/Post.php:397
 #, php-format
 msgid "%s from %s"
 msgstr "%s od %s"
 
-#: include/conversation.php:715
+#: include/conversation.php:716
 msgid "View in context"
 msgstr "Zobacz w kontekście"
 
-#: include/conversation.php:717 include/conversation.php:1230
+#: include/conversation.php:718 include/conversation.php:1231
 #: mod/editpost.php:86 mod/message.php:260 mod/message.php:442
-#: mod/photos.php:1406 mod/wallmessage.php:141 src/Object/Post.php:423
+#: mod/photos.php:1415 mod/wallmessage.php:141 src/Object/Post.php:424
 msgid "Please wait"
 msgstr "Proszę czekać"
 
-#: include/conversation.php:781
+#: include/conversation.php:782
 msgid "remove"
 msgstr "usuń"
 
-#: include/conversation.php:785
+#: include/conversation.php:786
 msgid "Delete Selected Items"
 msgstr "Usuń zaznaczone elementy"
 
-#: include/conversation.php:940 view/theme/frio/theme.php:358
+#: include/conversation.php:941 view/theme/frio/theme.php:355
 msgid "Follow Thread"
 msgstr "Śledź wątek"
 
-#: include/conversation.php:941 src/Model/Contact.php:1111
+#: include/conversation.php:942 src/Model/Contact.php:1200
 msgid "View Status"
 msgstr "Zobacz status"
 
-#: include/conversation.php:942 include/conversation.php:960
-#: mod/dirfind.php:226 mod/match.php:87 mod/suggest.php:87
-#: src/Model/Contact.php:1051 src/Model/Contact.php:1104
-#: src/Model/Contact.php:1112 src/Module/AllFriends.php:74
-#: src/Module/Directory.php:155
+#: include/conversation.php:943 include/conversation.php:961 mod/match.php:87
+#: mod/suggest.php:87 src/Model/Contact.php:1140 src/Model/Contact.php:1193
+#: src/Model/Contact.php:1201 src/Module/AllFriends.php:74
+#: src/Module/BaseSearchModule.php:133 src/Module/Directory.php:150
 msgid "View Profile"
 msgstr "Zobacz profil"
 
-#: include/conversation.php:943 src/Model/Contact.php:1113
+#: include/conversation.php:944 src/Model/Contact.php:1202
 msgid "View Photos"
 msgstr "Zobacz zdjęcia"
 
-#: include/conversation.php:944 src/Model/Contact.php:1105
-#: src/Model/Contact.php:1114
+#: include/conversation.php:945 src/Model/Contact.php:1194
+#: src/Model/Contact.php:1203
 msgid "Network Posts"
 msgstr "Wiadomości sieciowe"
 
-#: include/conversation.php:945 src/Model/Contact.php:1106
-#: src/Model/Contact.php:1115
+#: include/conversation.php:946 src/Model/Contact.php:1195
+#: src/Model/Contact.php:1204
 msgid "View Contact"
 msgstr "Pokaż kontakt"
 
-#: include/conversation.php:946 src/Model/Contact.php:1117
+#: include/conversation.php:947 src/Model/Contact.php:1206
 msgid "Send PM"
 msgstr "Wyślij prywatną wiadomość"
 
-#: include/conversation.php:947 src/Module/Admin/Blocklist/Contact.php:66
-#: src/Module/Admin/Users.php:289 src/Module/Contact.php:624
-#: src/Module/Contact.php:827 src/Module/Contact.php:1080
+#: include/conversation.php:948 src/Module/Admin/Blocklist/Contact.php:67
+#: src/Module/Admin/Users.php:289 src/Module/Contact.php:623
+#: src/Module/Contact.php:827 src/Module/Contact.php:1076
 msgid "Block"
 msgstr "Zablokuj"
 
-#: include/conversation.php:948 mod/notifications.php:60
-#: mod/notifications.php:186 mod/notifications.php:279
-#: src/Module/Contact.php:625 src/Module/Contact.php:828
-#: src/Module/Contact.php:1088
+#: include/conversation.php:949 mod/notifications.php:60
+#: mod/notifications.php:189 mod/notifications.php:282
+#: src/Module/Contact.php:624 src/Module/Contact.php:828
+#: src/Module/Contact.php:1084
 msgid "Ignore"
 msgstr "Ignoruj"
 
-#: include/conversation.php:952 src/Model/Contact.php:1118
+#: include/conversation.php:953 src/Model/Contact.php:1207
 msgid "Poke"
 msgstr "Zaczepka"
 
-#: include/conversation.php:957 mod/dirfind.php:227 mod/follow.php:158
-#: mod/match.php:88 mod/suggest.php:88 src/Content/Widget.php:63
-#: src/Model/Contact.php:1107 src/Module/AllFriends.php:75
-#: src/Module/Contact.php:577 view/theme/vier/theme.php:201
+#: include/conversation.php:958 mod/follow.php:160 mod/match.php:88
+#: mod/suggest.php:88 src/Content/Widget.php:66 src/Model/Contact.php:1196
+#: src/Module/AllFriends.php:75 src/Module/BaseSearchModule.php:134
+#: view/theme/vier/theme.php:201
 msgid "Connect/Follow"
 msgstr "Połącz/Obserwuj"
 
-#: include/conversation.php:1082
+#: include/conversation.php:1083
 #, php-format
 msgid "%s likes this."
 msgstr "%s lubi to."
 
-#: include/conversation.php:1085
+#: include/conversation.php:1086
 #, php-format
 msgid "%s doesn't like this."
 msgstr "%s nie lubi tego."
 
-#: include/conversation.php:1088
+#: include/conversation.php:1089
 #, php-format
 msgid "%s attends."
 msgstr "%s uczestniczy."
 
-#: include/conversation.php:1091
+#: include/conversation.php:1092
 #, php-format
 msgid "%s doesn't attend."
 msgstr "%s nie uczestniczy."
 
-#: include/conversation.php:1094
+#: include/conversation.php:1095
 #, php-format
 msgid "%s attends maybe."
 msgstr "%s może bierze udział."
 
-#: include/conversation.php:1097 include/conversation.php:1140
+#: include/conversation.php:1098 include/conversation.php:1141
 #, php-format
 msgid "%s reshared this."
 msgstr "%sudostępnił to. "
 
-#: include/conversation.php:1105
+#: include/conversation.php:1106
 msgid "and"
 msgstr "i"
 
-#: include/conversation.php:1111
+#: include/conversation.php:1112
 #, php-format
 msgid "and %d other people"
 msgstr "i %d inni ludzie"
 
-#: include/conversation.php:1119
+#: include/conversation.php:1120
 #, php-format
 msgid "<span  %1$s>%2$d people</span> like this"
 msgstr "<span  %1$s>%2$d ludzi </span> lubi to"
 
-#: include/conversation.php:1120
+#: include/conversation.php:1121
 #, php-format
 msgid "%s like this."
 msgstr "%s lubię to."
 
-#: include/conversation.php:1123
+#: include/conversation.php:1124
 #, php-format
 msgid "<span  %1$s>%2$d people</span> don't like this"
 msgstr "<span  %1$s>%2$d ludzi</span> nie lubi tego"
 
-#: include/conversation.php:1124
+#: include/conversation.php:1125
 #, php-format
 msgid "%s don't like this."
 msgstr "%s nie lubię tego."
 
-#: include/conversation.php:1127
+#: include/conversation.php:1128
 #, php-format
 msgid "<span  %1$s>%2$d people</span> attend"
 msgstr "<span  %1$s>%2$dosoby</span> uczestniczą"
 
-#: include/conversation.php:1128
+#: include/conversation.php:1129
 #, php-format
 msgid "%s attend."
 msgstr "%s uczestniczy."
 
-#: include/conversation.php:1131
+#: include/conversation.php:1132
 #, php-format
 msgid "<span  %1$s>%2$d people</span> don't attend"
 msgstr "<span  %1$s>%2$dludzie</span> nie uczestniczą"
 
-#: include/conversation.php:1132
+#: include/conversation.php:1133
 #, php-format
 msgid "%s don't attend."
 msgstr "%s nie uczestniczy."
 
-#: include/conversation.php:1135
+#: include/conversation.php:1136
 #, php-format
 msgid "<span  %1$s>%2$d people</span> attend maybe"
 msgstr "Możliwe, że <span  %1$s>%2$d osoby</span> będą uczestniczyć"
 
-#: include/conversation.php:1136
+#: include/conversation.php:1137
 #, php-format
 msgid "%s attend maybe."
 msgstr "%sbyć może uczestniczyć."
 
-#: include/conversation.php:1139
+#: include/conversation.php:1140
 #, php-format
 msgid "<span  %1$s>%2$d people</span> reshared this"
 msgstr ""
 
-#: include/conversation.php:1169
+#: include/conversation.php:1170
 msgid "Visible to <strong>everybody</strong>"
 msgstr "Widoczne dla <strong>wszystkich</strong>"
 
-#: include/conversation.php:1170 src/Object/Post.php:886
+#: include/conversation.php:1171 src/Object/Post.php:887
 msgid "Please enter a image/video/audio/webpage URL:"
 msgstr "Wprowadź adres URL obrazu/wideo/audio/strony:"
 
-#: include/conversation.php:1171
+#: include/conversation.php:1172
 msgid "Tag term:"
 msgstr "Termin tagu:"
 
-#: include/conversation.php:1172 src/Module/Filer/SaveTag.php:49
+#: include/conversation.php:1173 src/Module/Filer/SaveTag.php:48
 msgid "Save to Folder:"
 msgstr "Zapisz w folderze:"
 
-#: include/conversation.php:1173
+#: include/conversation.php:1174
 msgid "Where are you right now?"
 msgstr "Gdzie teraz jesteś?"
 
-#: include/conversation.php:1174
+#: include/conversation.php:1175
 msgid "Delete item(s)?"
 msgstr "Usunąć pozycję (pozycje)?"
 
-#: include/conversation.php:1206
+#: include/conversation.php:1207
 msgid "New Post"
 msgstr "Nowy Post"
 
-#: include/conversation.php:1209
+#: include/conversation.php:1210
 msgid "Share"
 msgstr "Podziel się"
 
-#: include/conversation.php:1210 mod/editpost.php:72 mod/message.php:258
+#: include/conversation.php:1211 mod/editpost.php:72 mod/message.php:258
 #: mod/message.php:439 mod/wallmessage.php:139
 msgid "Upload photo"
 msgstr "Wyślij zdjęcie"
 
-#: include/conversation.php:1211 mod/editpost.php:73
+#: include/conversation.php:1212 mod/editpost.php:73
 msgid "upload photo"
 msgstr "dodaj zdjęcie"
 
-#: include/conversation.php:1212 mod/editpost.php:74
+#: include/conversation.php:1213 mod/editpost.php:74
 msgid "Attach file"
 msgstr "Załącz plik"
 
-#: include/conversation.php:1213 mod/editpost.php:75
+#: include/conversation.php:1214 mod/editpost.php:75
 msgid "attach file"
 msgstr "załącz plik"
 
-#: include/conversation.php:1214 src/Object/Post.php:878
+#: include/conversation.php:1215 src/Object/Post.php:879
 msgid "Bold"
 msgstr "Pogrubienie"
 
-#: include/conversation.php:1215 src/Object/Post.php:879
+#: include/conversation.php:1216 src/Object/Post.php:880
 msgid "Italic"
 msgstr "Kursywa"
 
-#: include/conversation.php:1216 src/Object/Post.php:880
+#: include/conversation.php:1217 src/Object/Post.php:881
 msgid "Underline"
 msgstr "Podkreślenie"
 
-#: include/conversation.php:1217 src/Object/Post.php:881
+#: include/conversation.php:1218 src/Object/Post.php:882
 msgid "Quote"
 msgstr "Cytat"
 
-#: include/conversation.php:1218 src/Object/Post.php:882
+#: include/conversation.php:1219 src/Object/Post.php:883
 msgid "Code"
 msgstr "Kod"
 
-#: include/conversation.php:1219 src/Object/Post.php:883
+#: include/conversation.php:1220 src/Object/Post.php:884
 msgid "Image"
 msgstr "Obraz"
 
-#: include/conversation.php:1220 src/Object/Post.php:884
+#: include/conversation.php:1221 src/Object/Post.php:885
 msgid "Link"
 msgstr "Link"
 
-#: include/conversation.php:1221 src/Object/Post.php:885
+#: include/conversation.php:1222 src/Object/Post.php:886
 msgid "Link or Media"
 msgstr "Link lub Media"
 
-#: include/conversation.php:1222 mod/editpost.php:82
+#: include/conversation.php:1223 mod/editpost.php:82
 msgid "Set your location"
 msgstr "Ustaw swoją lokalizację"
 
-#: include/conversation.php:1223 mod/editpost.php:83
+#: include/conversation.php:1224 mod/editpost.php:83
 msgid "set location"
 msgstr "wybierz lokalizację"
 
-#: include/conversation.php:1224 mod/editpost.php:84
+#: include/conversation.php:1225 mod/editpost.php:84
 msgid "Clear browser location"
 msgstr "Wyczyść lokalizację przeglądarki"
 
-#: include/conversation.php:1225 mod/editpost.php:85
+#: include/conversation.php:1226 mod/editpost.php:85
 msgid "clear location"
 msgstr "wyczyść lokalizację"
 
-#: include/conversation.php:1227 mod/editpost.php:99
+#: include/conversation.php:1228 mod/editpost.php:99
 msgid "Set title"
 msgstr "Podaj tytuł"
 
-#: include/conversation.php:1229 mod/editpost.php:101
+#: include/conversation.php:1230 mod/editpost.php:101
 msgid "Categories (comma-separated list)"
 msgstr "Kategorie (lista słów oddzielonych przecinkiem)"
 
-#: include/conversation.php:1231 mod/editpost.php:87
+#: include/conversation.php:1232 mod/editpost.php:87
 msgid "Permission settings"
 msgstr "Ustawienia uprawnień"
 
-#: include/conversation.php:1232 mod/editpost.php:116
+#: include/conversation.php:1233 mod/editpost.php:116
 msgid "permissions"
 msgstr "zezwolenia"
 
-#: include/conversation.php:1241 mod/editpost.php:96
+#: include/conversation.php:1242 mod/editpost.php:96
 msgid "Public post"
 msgstr "Publiczny post"
 
-#: include/conversation.php:1245 mod/editpost.php:107 mod/events.php:549
-#: mod/photos.php:1424 mod/photos.php:1463 mod/photos.php:1523
-#: src/Object/Post.php:887
+#: include/conversation.php:1246 mod/editpost.php:107 mod/events.php:550
+#: mod/photos.php:1433 mod/photos.php:1472 mod/photos.php:1532
+#: src/Object/Post.php:888
 msgid "Preview"
 msgstr "Podgląd"
 
-#: include/conversation.php:1249 include/items.php:397
+#: include/conversation.php:1250 include/items.php:397
 #: mod/dfrn_request.php:650 mod/editpost.php:110 mod/fbrowser.php:110
-#: mod/fbrowser.php:139 mod/follow.php:172 mod/message.php:153
-#: mod/photos.php:1076 mod/photos.php:1183 mod/settings.php:675
-#: mod/settings.php:701 mod/suggest.php:76 mod/tagrm.php:20 mod/tagrm.php:115
-#: mod/unfollow.php:132 src/Module/Contact.php:450
+#: mod/fbrowser.php:139 mod/follow.php:174 mod/message.php:153
+#: mod/photos.php:1084 mod/photos.php:1191 mod/settings.php:678
+#: mod/settings.php:704 mod/suggest.php:76 mod/tagrm.php:20 mod/tagrm.php:115
+#: mod/unfollow.php:132 src/Module/Contact.php:464
 msgid "Cancel"
 msgstr "Anuluj"
 
-#: include/conversation.php:1254
+#: include/conversation.php:1255
 msgid "Post to Groups"
 msgstr "Opublikuj w grupach"
 
-#: include/conversation.php:1255
+#: include/conversation.php:1256
 msgid "Post to Contacts"
 msgstr "Wstaw do kontaktów"
 
-#: include/conversation.php:1256
+#: include/conversation.php:1257
 msgid "Private post"
 msgstr "Prywatne posty"
 
-#: include/conversation.php:1261 mod/editpost.php:114
-#: src/Model/Profile.php:366
+#: include/conversation.php:1262 mod/editpost.php:114
+#: src/Model/Profile.php:513 src/Module/Contact.php:339
 msgid "Message"
 msgstr "Wiadomość"
 
-#: include/conversation.php:1262 mod/editpost.php:115
+#: include/conversation.php:1263 mod/editpost.php:115
 msgid "Browser"
 msgstr "Przeglądarka"
 
-#: include/conversation.php:1534
+#: include/conversation.php:1535
 msgid "View all"
 msgstr "Pokaż wszystkie"
 
-#: include/conversation.php:1558
+#: include/conversation.php:1559
 msgid "Like"
 msgid_plural "Likes"
 msgstr[0] "Ostatnie polubienie"
@@ -557,7 +556,7 @@ msgstr[1] "Ostatnie polubienia"
 msgstr[2] "Ostatnich polubienień"
 msgstr[3] "Ostatnie polubienia"
 
-#: include/conversation.php:1561
+#: include/conversation.php:1562
 msgid "Dislike"
 msgid_plural "Dislikes"
 msgstr[0] "Nie lubię"
@@ -565,7 +564,7 @@ msgstr[1] "Nie lubią"
 msgstr[2] "Nie lubią"
 msgstr[3] "Nie lubi"
 
-#: include/conversation.php:1567
+#: include/conversation.php:1568
 msgid "Not Attending"
 msgid_plural "Not Attending"
 msgstr[0] "Nie uczestniczę"
@@ -573,7 +572,7 @@ msgstr[1] "Nie uczestniczy"
 msgstr[2] "Nie uczestniczą"
 msgstr[3] "Nie uczestniczą"
 
-#: include/conversation.php:1570 src/Content/ContactSelector.php:167
+#: include/conversation.php:1571 src/Content/ContactSelector.php:167
 msgid "Undecided"
 msgid_plural "Undecided"
 msgstr[0] "Niezdecydowany"
@@ -896,9 +895,9 @@ msgstr "Imię i nazwisko:\t%s\nLokalizacja witryny:\t%s\nNazwa użytkownika:\t%s
 msgid "Please visit %s to approve or reject the request."
 msgstr "Odwiedź stronę %s, aby zatwierdzić lub odrzucić wniosek."
 
-#: include/items.php:354 mod/notice.php:19
-#: src/Module/Admin/Themes/Details.php:53 src/Module/Admin/Themes/Index.php:41
-#: src/Module/ItemBody.php:27 src/Module/ItemBody.php:40
+#: include/items.php:354 src/Module/Admin/Themes/Details.php:53
+#: src/Module/Admin/Themes/Index.php:41 src/Module/Debug/ItemBody.php:27
+#: src/Module/Debug/ItemBody.php:40
 msgid "Item not found."
 msgstr "Element nie znaleziony."
 
@@ -907,47 +906,39 @@ msgid "Do you really want to delete this item?"
 msgstr "Czy na pewno chcesz usunąć ten element?"
 
 #: include/items.php:394 mod/api.php:109 mod/dfrn_request.php:640
-#: mod/follow.php:161 mod/message.php:150 mod/profiles.php:526
-#: mod/profiles.php:529 mod/profiles.php:551 mod/settings.php:1084
-#: mod/settings.php:1090 mod/settings.php:1097 mod/settings.php:1101
-#: mod/settings.php:1105 mod/settings.php:1109 mod/settings.php:1113
-#: mod/settings.php:1117 mod/settings.php:1137 mod/settings.php:1138
-#: mod/settings.php:1139 mod/settings.php:1140 mod/settings.php:1141
-#: mod/suggest.php:73 src/Module/Contact.php:447 src/Module/Register.php:97
+#: mod/follow.php:163 mod/message.php:150 mod/profiles.php:526
+#: mod/profiles.php:529 mod/profiles.php:551 mod/settings.php:1089
+#: mod/settings.php:1095 mod/settings.php:1102 mod/settings.php:1106
+#: mod/settings.php:1110 mod/settings.php:1114 mod/settings.php:1118
+#: mod/settings.php:1122 mod/settings.php:1142 mod/settings.php:1143
+#: mod/settings.php:1144 mod/settings.php:1145 mod/settings.php:1146
+#: mod/suggest.php:73 src/Module/Contact.php:461 src/Module/Register.php:97
 msgid "Yes"
 msgstr "Tak"
 
 #: include/items.php:444 mod/api.php:34 mod/api.php:39 mod/cal.php:301
 #: mod/common.php:27 mod/crepair.php:90 mod/delegate.php:30
 #: mod/delegate.php:48 mod/delegate.php:59 mod/dfrn_confirm.php:64
-#: mod/dirfind.php:29 mod/editpost.php:21 mod/events.php:207 mod/follow.php:57
-#: mod/follow.php:132 mod/fsuggest.php:77 mod/item.php:169 mod/manage.php:130
-#: mod/message.php:56 mod/message.php:101 mod/network.php:36 mod/notes.php:27
+#: mod/editpost.php:21 mod/events.php:208 mod/follow.php:57 mod/follow.php:134
+#: mod/fsuggest.php:63 mod/item.php:170 mod/manage.php:130 mod/message.php:56
+#: mod/message.php:101 mod/network.php:37 mod/notes.php:27
 #: mod/notifications.php:70 mod/ostatus_subscribe.php:18 mod/photos.php:178
-#: mod/photos.php:958 mod/poke.php:141 mod/profiles.php:182
+#: mod/photos.php:962 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:50 mod/settings.php:163 mod/settings.php:664
+#: mod/settings.php:52 mod/settings.php:165 mod/settings.php:667
 #: mod/suggest.php:39 mod/uimport.php:17 mod/unfollow.php:22
-#: 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/Module/Attach.php:42
-#: src/Module/Contact.php:362 src/Module/FollowConfirm.php:27
-#: src/Module/Group.php:31 src/Module/Group.php:77 src/Module/Invite.php:22
-#: src/Module/Invite.php:110 src/Module/Register.php:192
+#: mod/unfollow.php:77 mod/unfollow.php:109 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/Module/Attach.php:42 src/Module/Contact.php:378
+#: src/Module/FollowConfirm.php:27 src/Module/Group.php:31
+#: src/Module/Group.php:77 src/Module/Invite.php:22 src/Module/Invite.php:110
+#: src/Module/Notifications/Notify.php:19 src/Module/Profile/Contacts.php:50
+#: src/Module/Register.php:192 src/Module/Search/Directory.php:17
 msgid "Permission denied."
 msgstr "Brak uprawnień."
 
-#: include/items.php:515 src/Content/Feature.php:99
-msgid "Archives"
-msgstr "Archiwum"
-
-#: include/items.php:521 src/Content/ForumManager.php:135
-#: src/Content/Widget.php:329 view/theme/vier/theme.php:255
-msgid "show more"
-msgstr "pokaż więcej"
-
 #: mod/api.php:84 mod/api.php:106
 msgid "Authorize application connection"
 msgstr "Autoryzacja połączenia aplikacji"
@@ -956,7 +947,7 @@ msgstr "Autoryzacja połączenia aplikacji"
 msgid "Return to your app and insert this Securty Code:"
 msgstr "Powróć do swojej aplikacji i wpisz ten Kod Bezpieczeństwa:"
 
-#: mod/api.php:94
+#: mod/api.php:94 src/Module/BaseAdminModule.php:56
 msgid "Please login to continue."
 msgstr "Zaloguj się aby kontynuować."
 
@@ -966,67 +957,67 @@ msgid ""
 " and/or create new posts for you?"
 msgstr "Czy chcesz zezwolić tej aplikacji na dostęp do swoich postów i kontaktów i/lub tworzenie nowych postów?"
 
-#: mod/api.php:110 mod/dfrn_request.php:640 mod/follow.php:161
+#: mod/api.php:110 mod/dfrn_request.php:640 mod/follow.php:163
 #: mod/profiles.php:526 mod/profiles.php:530 mod/profiles.php:551
-#: mod/settings.php:1084 mod/settings.php:1090 mod/settings.php:1097
-#: mod/settings.php:1101 mod/settings.php:1105 mod/settings.php:1109
-#: mod/settings.php:1113 mod/settings.php:1117 mod/settings.php:1137
-#: mod/settings.php:1138 mod/settings.php:1139 mod/settings.php:1140
-#: mod/settings.php:1141 src/Module/Register.php:98
+#: mod/settings.php:1089 mod/settings.php:1095 mod/settings.php:1102
+#: mod/settings.php:1106 mod/settings.php:1110 mod/settings.php:1114
+#: mod/settings.php:1118 mod/settings.php:1122 mod/settings.php:1142
+#: mod/settings.php:1143 mod/settings.php:1144 mod/settings.php:1145
+#: mod/settings.php:1146 src/Module/Register.php:98
 msgid "No"
 msgstr "Nie"
 
 #: mod/cal.php:34 mod/cal.php:38 mod/community.php:39 mod/follow.php:20
-#: mod/viewcontacts.php:23 mod/viewcontacts.php:27 src/Module/ItemBody.php:18
+#: src/Module/Debug/ItemBody.php:18
 msgid "Access denied."
 msgstr "Brak dostępu."
 
-#: mod/cal.php:140 mod/display.php:306 src/Module/Profile.php:176
+#: mod/cal.php:140 mod/display.php:301 src/Module/Profile.php:177
 msgid "Access to this profile has been restricted."
 msgstr "Dostęp do tego profilu został ograniczony."
 
-#: mod/cal.php:271 mod/events.php:382 src/Content/Nav.php:159
-#: src/Content/Nav.php:225 src/Model/Profile.php:931 src/Model/Profile.php:942
-#: view/theme/frio/theme.php:266 view/theme/frio/theme.php:270
+#: mod/cal.php:271 mod/events.php:383 src/Content/Nav.php:164
+#: src/Content/Nav.php:228 src/Model/Profile.php:916 src/Model/Profile.php:927
+#: view/theme/frio/theme.php:263 view/theme/frio/theme.php:267
 msgid "Events"
 msgstr "Wydarzenia"
 
-#: mod/cal.php:272 mod/events.php:383
+#: mod/cal.php:272 mod/events.php:384
 msgid "View"
 msgstr "Widok"
 
-#: mod/cal.php:273 mod/events.php:385
+#: mod/cal.php:273 mod/events.php:386
 msgid "Previous"
 msgstr "Poprzedni"
 
-#: mod/cal.php:274 mod/events.php:386 src/Module/Install.php:173
+#: mod/cal.php:274 mod/events.php:387 src/Module/Install.php:175
 msgid "Next"
 msgstr "Następny"
 
-#: mod/cal.php:277 mod/events.php:391 src/Model/Event.php:428
+#: mod/cal.php:277 mod/events.php:392 src/Model/Event.php:428
 msgid "today"
 msgstr "dzisiaj"
 
-#: mod/cal.php:278 mod/events.php:392 src/Model/Event.php:429
+#: mod/cal.php:278 mod/events.php:393 src/Model/Event.php:429
 #: src/Util/Temporal.php:314
 msgid "month"
 msgstr "miesiąc"
 
-#: mod/cal.php:279 mod/events.php:393 src/Model/Event.php:430
+#: mod/cal.php:279 mod/events.php:394 src/Model/Event.php:430
 #: src/Util/Temporal.php:315
 msgid "week"
 msgstr "tydzień"
 
-#: mod/cal.php:280 mod/events.php:394 src/Model/Event.php:431
+#: mod/cal.php:280 mod/events.php:395 src/Model/Event.php:431
 #: src/Util/Temporal.php:316
 msgid "day"
 msgstr "dzień"
 
-#: mod/cal.php:281 mod/events.php:395
+#: mod/cal.php:281 mod/events.php:396
 msgid "list"
 msgstr "lista"
 
-#: mod/cal.php:294 src/Console/NewPassword.php:67 src/Model/User.php:351
+#: mod/cal.php:294 src/Console/NewPassword.php:67 src/Model/User.php:384
 msgid "User not found"
 msgstr "Użytkownik nie znaleziony"
 
@@ -1050,10 +1041,10 @@ msgstr "Brak wspólnych kontaktów."
 msgid "Common Friends"
 msgstr "Wspólni znajomi"
 
-#: mod/community.php:32 mod/dfrn_request.php:597 mod/display.php:204
-#: mod/photos.php:846 mod/probe.php:14 mod/search.php:96 mod/search.php:102
-#: mod/videos.php:118 mod/viewcontacts.php:46 src/Module/Directory.php:43
-#: src/Module/WebFinger.php:19
+#: mod/community.php:32 mod/dfrn_request.php:597 mod/display.php:199
+#: mod/photos.php:850 mod/search.php:87 mod/search.php:93 mod/videos.php:118
+#: src/Module/Debug/Probe.php:20 src/Module/Debug/WebFinger.php:19
+#: src/Module/Directory.php:30
 msgid "Public access denied."
 msgstr "Publiczny dostęp zabroniony."
 
@@ -1081,7 +1072,7 @@ msgstr "Globalna społeczność"
 msgid "Posts from users of the whole federated network"
 msgstr "Wpisy od użytkowników całej sieci stowarzyszonej"
 
-#: mod/community.php:162 mod/search.php:223
+#: mod/community.php:162 mod/search.php:222
 msgid "No results."
 msgstr "Brak wyników."
 
@@ -1099,8 +1090,8 @@ msgstr "Ustawienia kontaktu zaktualizowane."
 msgid "Contact update failed."
 msgstr "Nie udało się zaktualizować kontaktu."
 
-#: mod/crepair.php:102 mod/dfrn_confirm.php:125 mod/fsuggest.php:28
-#: mod/fsuggest.php:89 mod/redir.php:31 mod/redir.php:137
+#: mod/crepair.php:102 mod/dfrn_confirm.php:125 mod/fsuggest.php:32
+#: mod/fsuggest.php:75 mod/redir.php:32 mod/redir.php:140
 #: src/Module/FollowConfirm.php:46 src/Module/Group.php:92
 msgid "Contact not found."
 msgstr "Nie znaleziono kontaktu."
@@ -1137,15 +1128,15 @@ msgstr "Wróć do edytora kontaktów"
 msgid "Refetch contact data"
 msgstr "Odśwież dane kontaktowe"
 
-#: mod/crepair.php:149 mod/events.php:551 mod/fsuggest.php:106
+#: mod/crepair.php:149 mod/events.php:552 mod/fsuggest.php:92
 #: mod/manage.php:183 mod/message.php:261 mod/message.php:441
-#: mod/photos.php:987 mod/photos.php:1093 mod/photos.php:1378
-#: mod/photos.php:1423 mod/photos.php:1462 mod/photos.php:1522
-#: mod/poke.php:184 mod/profiles.php:562 src/Module/Contact.php:597
-#: src/Module/Install.php:211 src/Module/Install.php:251
-#: src/Module/Install.php:287 src/Module/Invite.php:157
-#: src/Module/Localtime.php:45 src/Object/Post.php:877
-#: view/theme/duepuntozero/config.php:72 view/theme/frio/config.php:121
+#: mod/photos.php:991 mod/photos.php:1101 mod/photos.php:1387
+#: mod/photos.php:1432 mod/photos.php:1471 mod/photos.php:1531
+#: mod/poke.php:184 mod/profiles.php:562 src/Module/Contact.php:598
+#: src/Module/Debug/Localtime.php:45 src/Module/Install.php:213
+#: src/Module/Install.php:253 src/Module/Install.php:289
+#: src/Module/Invite.php:157 src/Object/Post.php:878
+#: view/theme/duepuntozero/config.php:72 view/theme/frio/config.php:123
 #: view/theme/quattro/config.php:74 view/theme/vier/config.php:120
 msgid "Submit"
 msgstr "Potwierdź"
@@ -1164,8 +1155,8 @@ msgid ""
 "entries from this contact."
 msgstr "Oznacz ten kontakt jako remote_self, spowoduje to, że friendica odeśle nowe wpisy z tego kontaktu."
 
-#: mod/crepair.php:159 mod/settings.php:676 mod/settings.php:702
-#: src/Module/Admin/Blocklist/Contact.php:72 src/Module/Admin/Users.php:272
+#: mod/crepair.php:159 mod/settings.php:679 mod/settings.php:705
+#: src/Module/Admin/Blocklist/Contact.php:73 src/Module/Admin/Users.php:272
 #: src/Module/Admin/Users.php:283 src/Module/Admin/Users.php:297
 #: src/Module/Admin/Users.php:313
 msgid "Name"
@@ -1234,15 +1225,15 @@ msgid ""
 "settings. Please double check whom you give this access."
 msgstr "Użytkownicy nadrzędni mają pełną kontrolę nad tym kontem, w tym także ustawienia konta. Sprawdź dokładnie, komu przyznasz ten dostęp."
 
-#: mod/delegate.php:175 mod/settings.php:674 mod/settings.php:781
-#: mod/settings.php:869 mod/settings.php:948 mod/settings.php:1173
+#: mod/delegate.php:175 mod/settings.php:677 mod/settings.php:784
+#: mod/settings.php:874 mod/settings.php:953 mod/settings.php:1178
 #: src/Module/Admin/Addons/Index.php:52 src/Module/Admin/Features.php:69
-#: src/Module/Admin/Logs/Settings.php:59 src/Module/Admin/Site.php:570
+#: src/Module/Admin/Logs/Settings.php:65 src/Module/Admin/Site.php:569
 #: src/Module/Admin/Themes/Index.php:95 src/Module/Admin/Tos.php:50
 msgid "Save Settings"
 msgstr "Zapisz ustawienia"
 
-#: mod/delegate.php:176 src/Content/Nav.php:260
+#: mod/delegate.php:176 src/Content/Nav.php:263
 msgid "Delegate Page Management"
 msgstr "Deleguj zarządzanie stronami"
 
@@ -1349,7 +1340,7 @@ msgid "Unable to update your contact profile details on our system"
 msgstr "Nie można zaktualizować danych Twojego profilu kontaktowego w naszym systemie"
 
 #: mod/dfrn_confirm.php:538 mod/dfrn_request.php:560
-#: src/Model/Contact.php:2217
+#: src/Model/Contact.php:2459
 msgid "[Name Withheld]"
 msgstr "[Nazwa zastrzeżona]"
 
@@ -1425,17 +1416,16 @@ msgstr "Wygląda na to, że już jesteście znajomymi z %s."
 msgid "Invalid profile URL."
 msgstr "Nieprawidłowy adres URL profilu."
 
-#: mod/dfrn_request.php:340 src/Model/Contact.php:1878
+#: mod/dfrn_request.php:340 src/Model/Contact.php:2101
 msgid "Disallowed profile URL."
 msgstr "Nie dozwolony adres URL profilu."
 
-#: mod/dfrn_request.php:346 src/Model/Contact.php:1883
-#: src/Module/Admin/Blocklist/Server.php:64
-#: src/Module/Admin/Blocklist/Server.php:83 src/Module/Friendica.php:59
+#: mod/dfrn_request.php:346 src/Model/Contact.php:2106
+#: src/Module/Friendica.php:59
 msgid "Blocked domain"
 msgstr "Zablokowana domena"
 
-#: mod/dfrn_request.php:413 src/Module/Contact.php:237
+#: mod/dfrn_request.php:413 src/Module/Contact.php:143
 msgid "Failed to update contact record."
 msgstr "Aktualizacja rekordu kontaktu nie powiodła się."
 
@@ -1500,16 +1490,16 @@ msgid ""
 "testuser@gnusocial.de"
 msgstr "Przykłady: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@gnusocial.de"
 
-#: mod/dfrn_request.php:639 mod/follow.php:160
+#: mod/dfrn_request.php:639 mod/follow.php:162
 msgid "Please answer the following:"
 msgstr "Proszę odpowiedzieć na następujące pytania:"
 
-#: mod/dfrn_request.php:640 mod/follow.php:161
+#: mod/dfrn_request.php:640 mod/follow.php:163
 #, php-format
 msgid "Does %s know you?"
 msgstr "Czy %s Cię zna?"
 
-#: mod/dfrn_request.php:641 mod/follow.php:162
+#: mod/dfrn_request.php:641 mod/follow.php:164
 msgid "Add a personal note:"
 msgstr "Dodaj osobistą notkę:"
 
@@ -1532,39 +1522,19 @@ msgid ""
 " bar."
 msgstr " - proszę nie używać tego formularza. Zamiast tego, wpisz %s w pasku wyszukiwania Diaspory."
 
-#: mod/dfrn_request.php:647 mod/follow.php:168 mod/unfollow.php:128
+#: mod/dfrn_request.php:647 mod/follow.php:170 mod/unfollow.php:128
 msgid "Your Identity Address:"
 msgstr "Twój adres tożsamości:"
 
-#: mod/dfrn_request.php:649 mod/follow.php:74 mod/unfollow.php:131
+#: mod/dfrn_request.php:649 mod/follow.php:76 mod/unfollow.php:131
 msgid "Submit Request"
 msgstr "Wyślij zgłoszenie"
 
-#: mod/dirfind.php:55
-#, php-format
-msgid "People Search - %s"
-msgstr "Szukaj osób - %s"
-
-#: mod/dirfind.php:66
-#, php-format
-msgid "Forum Search - %s"
-msgstr "Przeszukiwanie forum - %s"
-
-#: mod/dirfind.php:217 mod/match.php:102 mod/suggest.php:106
-#: src/Content/Widget.php:39 src/Model/Profile.php:309
-#: src/Module/AllFriends.php:91
-msgid "Connect"
-msgstr "Połącz"
-
-#: mod/dirfind.php:259 mod/match.php:130
-msgid "No matches"
-msgstr "Brak wyników"
-
-#: mod/display.php:257 mod/display.php:342
+#: mod/display.php:252 mod/display.php:337
 msgid "The requested item doesn't exist or has been deleted."
 msgstr "Żądany element nie istnieje lub został usunięty."
 
-#: mod/display.php:417
+#: mod/display.php:412
 msgid "The feed for this item is unavailable."
 msgstr "Kanał dla tego elementu jest niedostępny."
 
@@ -1576,8 +1546,8 @@ msgstr "Nie znaleziono elementu"
 msgid "Edit post"
 msgstr "Edytuj post"
 
-#: mod/editpost.php:71 mod/notes.php:46 src/Content/Text/HTML.php:894
-#: src/Module/Filer/SaveTag.php:50
+#: mod/editpost.php:71 mod/notes.php:46 src/Content/Text/HTML.php:874
+#: src/Module/Filer/SaveTag.php:49
 msgid "Save"
 msgstr "Zapisz"
 
@@ -1614,96 +1584,96 @@ msgstr "CC: adresy e-mail"
 msgid "Example: bob@example.com, mary@example.com"
 msgstr "Przykład: bob@example.com, mary@example.com"
 
-#: mod/events.php:117 mod/events.php:119
+#: mod/events.php:118 mod/events.php:120
 msgid "Event can not end before it has started."
 msgstr "Wydarzenie nie może się zakończyć przed jego rozpoczęciem."
 
-#: mod/events.php:126 mod/events.php:128
+#: mod/events.php:127 mod/events.php:129
 msgid "Event title and start time are required."
 msgstr "Wymagany tytuł wydarzenia i czas rozpoczęcia."
 
-#: mod/events.php:384
+#: mod/events.php:385
 msgid "Create New Event"
 msgstr "Stwórz nowe wydarzenie"
 
-#: mod/events.php:507
+#: mod/events.php:508
 msgid "Event details"
 msgstr "Szczegóły wydarzenia"
 
-#: mod/events.php:508
+#: mod/events.php:509
 msgid "Starting date and Title are required."
 msgstr "Data rozpoczęcia i tytuł są wymagane."
 
-#: mod/events.php:509 mod/events.php:514
+#: mod/events.php:510 mod/events.php:515
 msgid "Event Starts:"
 msgstr "Rozpoczęcie wydarzenia:"
 
-#: mod/events.php:509 mod/events.php:541 mod/profiles.php:592
+#: mod/events.php:510 mod/events.php:542 mod/profiles.php:592
 msgid "Required"
 msgstr "Wymagany"
 
-#: mod/events.php:522 mod/events.php:547
+#: mod/events.php:523 mod/events.php:548
 msgid "Finish date/time is not known or not relevant"
 msgstr "Data/czas zakończenia nie jest znana lub jest nieistotna"
 
-#: mod/events.php:524 mod/events.php:529
+#: mod/events.php:525 mod/events.php:530
 msgid "Event Finishes:"
 msgstr "Zakończenie wydarzenia:"
 
-#: mod/events.php:535 mod/events.php:548
+#: mod/events.php:536 mod/events.php:549
 msgid "Adjust for viewer timezone"
 msgstr "Dopasuj dla strefy czasowej widza"
 
-#: mod/events.php:537
+#: mod/events.php:538
 msgid "Description:"
 msgstr "Opis:"
 
-#: mod/events.php:539 mod/notifications.php:261 src/Model/Event.php:68
+#: mod/events.php:540 mod/notifications.php:264 src/Model/Event.php:68
 #: src/Model/Event.php:95 src/Model/Event.php:437 src/Model/Event.php:933
-#: src/Model/Profile.php:439 src/Module/Contact.php:646
-#: src/Module/Directory.php:142
+#: src/Model/Profile.php:418 src/Module/Contact.php:645
+#: src/Module/Directory.php:137
 msgid "Location:"
 msgstr "Lokalizacja:"
 
-#: mod/events.php:541 mod/events.php:543
+#: mod/events.php:542 mod/events.php:544
 msgid "Title:"
 msgstr "Tytuł:"
 
-#: mod/events.php:544 mod/events.php:545
+#: mod/events.php:545 mod/events.php:546
 msgid "Share this event"
 msgstr "Udostępnij te wydarzenie"
 
-#: mod/events.php:552 src/Model/Profile.php:871
+#: mod/events.php:553 src/Model/Profile.php:853
 msgid "Basic"
 msgstr "Podstawowy"
 
-#: mod/events.php:553 src/Model/Profile.php:872 src/Module/Admin/Site.php:575
+#: mod/events.php:554 src/Model/Profile.php:854 src/Module/Admin/Site.php:574
 #: src/Module/Contact.php:905
 msgid "Advanced"
 msgstr "Zaawansowany"
 
-#: mod/events.php:554 mod/photos.php:1005 mod/photos.php:1374
+#: mod/events.php:555 mod/photos.php:1009 mod/photos.php:1383
 #: src/Core/ACL.php:314
 msgid "Permissions"
 msgstr "Uprawnienia"
 
-#: mod/events.php:570
+#: mod/events.php:571
 msgid "Failed to remove event"
 msgstr "Nie udało się usunąć wydarzenia"
 
-#: mod/events.php:572
+#: mod/events.php:573
 msgid "Event removed"
 msgstr "Wydarzenie zostało usunięte"
 
-#: mod/fbrowser.php:43 src/Content/Nav.php:157 src/Model/Profile.php:911
-#: view/theme/frio/theme.php:264
+#: mod/fbrowser.php:43 src/Content/Nav.php:162 src/Model/Profile.php:896
+#: view/theme/frio/theme.php:261
 msgid "Photos"
 msgstr "Zdjęcia"
 
-#: mod/fbrowser.php:52 mod/fbrowser.php:76 mod/photos.php:193
-#: mod/photos.php:969 mod/photos.php:1082 mod/photos.php:1099
-#: mod/photos.php:1575 mod/photos.php:1590 src/Model/Photo.php:552
-#: src/Model/Photo.php:561
+#: mod/fbrowser.php:52 mod/fbrowser.php:76 mod/photos.php:196
+#: mod/photos.php:973 mod/photos.php:1090 mod/photos.php:1107
+#: mod/photos.php:1584 mod/photos.php:1599 src/Model/Photo.php:573
+#: src/Model/Photo.php:582
 msgid "Contact Photos"
 msgstr "Zdjęcia kontaktu"
 
@@ -1719,47 +1689,51 @@ msgstr "Pliki"
 msgid "The contact could not be added."
 msgstr "Nie można dodać kontaktu."
 
-#: mod/follow.php:85
+#: mod/follow.php:87
 msgid "You already added this contact."
 msgstr "Już dodałeś ten kontakt."
 
-#: mod/follow.php:97
+#: mod/follow.php:99
 msgid "Diaspora support isn't enabled. Contact can't be added."
 msgstr "Obsługa Diaspory nie jest włączona. Kontakt nie może zostać dodany."
 
-#: mod/follow.php:104
+#: mod/follow.php:106
 msgid "OStatus support is disabled. Contact can't be added."
 msgstr "Obsługa OStatus jest wyłączona. Kontakt nie może zostać dodany."
 
-#: mod/follow.php:111
+#: mod/follow.php:113
 msgid "The network type couldn't be detected. Contact can't be added."
 msgstr "Nie można wykryć typu sieci. Kontakt nie może zostać dodany."
 
-#: mod/follow.php:177 mod/notifications.php:179 mod/notifications.php:271
-#: mod/unfollow.php:137 src/Module/Admin/Blocklist/Contact.php:72
-#: src/Module/Admin/Blocklist/Contact.php:82 src/Module/Contact.php:642
+#: mod/follow.php:179 mod/notifications.php:182 mod/notifications.php:274
+#: mod/unfollow.php:137 src/Module/Admin/Blocklist/Contact.php:83
+#: src/Module/Contact.php:641
 msgid "Profile URL"
 msgstr "Adres URL profilu"
 
-#: mod/follow.php:181 mod/notifications.php:265 src/Model/Profile.php:801
-#: src/Module/Contact.php:652
+#: mod/follow.php:183 mod/notifications.php:268 src/Model/Profile.php:783
+#: src/Module/Contact.php:651
 msgid "Tags:"
 msgstr "Tagi:"
 
-#: mod/follow.php:193 mod/unfollow.php:147 src/Model/Profile.php:898
+#: mod/follow.php:195 mod/unfollow.php:147 src/Model/Profile.php:883
 #: src/Module/Contact.php:867
 msgid "Status Messages and Posts"
 msgstr "Status wiadomości i postów"
 
-#: mod/fsuggest.php:69
+#: mod/fsuggest.php:44
+msgid "Suggested contact not found."
+msgstr "Nie znaleziono sugerowanego kontaktu."
+
+#: mod/fsuggest.php:57
 msgid "Friend suggestion sent."
 msgstr "Wysłana propozycja dodania do znajomych."
 
-#: mod/fsuggest.php:93
+#: mod/fsuggest.php:79
 msgid "Suggest Friends"
 msgstr "Zaproponuj znajomych"
 
-#: mod/fsuggest.php:95
+#: mod/fsuggest.php:81
 #, php-format
 msgid "Suggest a friend for %s"
 msgstr "Zaproponuj znajomych dla %s"
@@ -1768,33 +1742,33 @@ msgstr "Zaproponuj znajomych dla %s"
 msgid "No profile"
 msgstr "Brak profilu"
 
-#: mod/item.php:122
+#: mod/item.php:123
 msgid "Unable to locate original post."
 msgstr "Nie można zlokalizować oryginalnej wiadomości."
 
-#: mod/item.php:322
+#: mod/item.php:323
 msgid "Empty post discarded."
 msgstr "Pusty wpis został odrzucony."
 
-#: mod/item.php:839
+#: mod/item.php:836
 #, php-format
 msgid ""
 "This message was sent to you by %s, a member of the Friendica social "
 "network."
 msgstr "Wiadomość została wysłana do ciebie od %s, członka sieci społecznościowej Friendica."
 
-#: mod/item.php:841
+#: mod/item.php:838
 #, php-format
 msgid "You may visit them online at %s"
 msgstr "Możesz odwiedzić ich online pod adresem %s"
 
-#: mod/item.php:842
+#: mod/item.php:839
 msgid ""
 "Please contact the sender by replying to this post if you do not wish to "
 "receive these messages."
 msgstr "Skontaktuj się z nadawcą odpowiadając na ten post jeśli nie chcesz otrzymywać tych wiadomości."
 
-#: mod/item.php:846
+#: mod/item.php:843
 #, php-format
 msgid "%s posted an update."
 msgstr "%s zaktualizował wpis."
@@ -1873,7 +1847,7 @@ msgid ""
 "your email for further instructions."
 msgstr "Wpisz swój adres email i wyślij, aby zresetować hasło. Później sprawdź swojego emaila w celu uzyskania dalszych instrukcji."
 
-#: mod/lostpass.php:119 src/Module/Login.php:327
+#: mod/lostpass.php:119 src/Module/Login.php:318
 msgid "Nickname or Email: "
 msgstr "Pseudonim lub e-mail: "
 
@@ -1881,7 +1855,7 @@ msgstr "Pseudonim lub e-mail: "
 msgid "Reset"
 msgstr "Zresetuj"
 
-#: mod/lostpass.php:135 src/Module/Login.php:339
+#: mod/lostpass.php:135 src/Module/Login.php:330
 msgid "Password Reset"
 msgstr "Zresetuj hasło"
 
@@ -1955,6 +1929,11 @@ msgstr "Wybierz tożsamość do zarządzania: "
 msgid "No keywords to match. Please add keywords to your default profile."
 msgstr "Brak pasujących słów kluczowych. Dodaj słowa kluczowe do domyślnego profilu."
 
+#: mod/match.php:102 mod/suggest.php:106 src/Content/Widget.php:42
+#: src/Module/AllFriends.php:91 src/Module/BaseSearchModule.php:131
+msgid "Connect"
+msgstr "Połącz"
+
 #: mod/match.php:115 src/Content/Pager.php:198
 msgid "first"
 msgstr "pierwszy"
@@ -1963,11 +1942,15 @@ msgstr "pierwszy"
 msgid "next"
 msgstr "następny"
 
+#: mod/match.php:130 src/Module/BaseSearchModule.php:92
+msgid "No matches"
+msgstr "Brak wyników"
+
 #: mod/match.php:135
 msgid "Profile Match"
 msgstr "Dopasowanie profilu"
 
-#: mod/message.php:33 mod/message.php:116 src/Content/Nav.php:254
+#: mod/message.php:33 mod/message.php:116 src/Content/Nav.php:257
 msgid "New Message"
 msgstr "Nowa wiadomość"
 
@@ -1991,12 +1974,12 @@ msgstr "Błąd zbierania komunikatów."
 msgid "Message sent."
 msgstr "Wysłano."
 
-#: mod/message.php:110 mod/notifications.php:47 mod/notifications.php:187
-#: mod/notifications.php:243
+#: mod/message.php:110 mod/notifications.php:47 mod/notifications.php:190
+#: mod/notifications.php:246
 msgid "Discard"
 msgstr "Odrzuć"
 
-#: mod/message.php:123 src/Content/Nav.php:251 view/theme/frio/theme.php:271
+#: mod/message.php:123 src/Content/Nav.php:254 view/theme/frio/theme.php:268
 msgid "Messages"
 msgstr "Wiadomości"
 
@@ -2091,19 +2074,19 @@ msgstr[1] "%d wiadomości"
 msgstr[2] "%d wiadomości"
 msgstr[3] "%d wiadomości"
 
-#: mod/network.php:184 mod/search.php:38
+#: mod/network.php:183 mod/search.php:35
 msgid "Remove term"
 msgstr "Usuń wpis"
 
-#: mod/network.php:191 mod/search.php:47
+#: mod/network.php:190 mod/search.php:44
 msgid "Saved Searches"
 msgstr "Zapisywanie wyszukiwania"
 
-#: mod/network.php:192 src/Model/Group.php:434
+#: mod/network.php:191 src/Model/Group.php:434
 msgid "add"
 msgstr "dodaj"
 
-#: mod/network.php:572
+#: mod/network.php:571
 #, php-format
 msgid ""
 "Warning: This group contains %s member from a network that doesn't allow non"
@@ -2116,269 +2099,82 @@ msgstr[1] "Ostrzeżenie: Ta grupa zawiera %s członków z sieci, która nie dopu
 msgstr[2] "Ostrzeżenie: Ta grupa zawiera %s członków z sieci, która nie dopuszcza wiadomości niepublicznych."
 msgstr[3] "Ostrzeżenie: Ta grupa zawiera %s członków z sieci, która nie dopuszcza wiadomości niepublicznych."
 
-#: mod/network.php:575
+#: mod/network.php:574
 msgid "Messages in this group won't be send to these receivers."
 msgstr "Wiadomości z tej grupy nie będą wysyłane do tych odbiorców."
 
-#: mod/network.php:642
+#: mod/network.php:641
 msgid "No such group"
 msgstr "Nie ma takiej grupy"
 
-#: mod/network.php:663 src/Module/Group.php:288
+#: mod/network.php:662 src/Module/Group.php:288
 msgid "Group is empty"
 msgstr "Grupa jest pusta"
 
-#: mod/network.php:667
+#: mod/network.php:666
 #, php-format
 msgid "Group: %s"
 msgstr "Grupa: %s"
 
-#: mod/network.php:693
+#: mod/network.php:692
 msgid "Private messages to this person are at risk of public disclosure."
 msgstr "Prywatne wiadomości do tej osoby mogą być widoczne publicznie."
 
-#: mod/network.php:696 src/Module/AllFriends.php:35
+#: mod/network.php:695 src/Module/AllFriends.php:35
 #: src/Module/AllFriends.php:43
 msgid "Invalid contact."
 msgstr "Nieprawidłowy kontakt."
 
-#: mod/network.php:975
+#: mod/network.php:974
 msgid "Commented Order"
 msgstr "Porządek według komentarzy"
 
-#: mod/network.php:978
+#: mod/network.php:977
 msgid "Sort by Comment Date"
 msgstr "Sortuj według daty komentarza"
 
-#: mod/network.php:983
+#: mod/network.php:982
 msgid "Posted Order"
 msgstr "Porządek według wpisów"
 
-#: mod/network.php:986
+#: mod/network.php:985
 msgid "Sort by Post Date"
 msgstr "Sortuj według daty postów"
 
-#: mod/network.php:993 mod/profiles.php:579
+#: mod/network.php:992 mod/profiles.php:579
 #: src/Core/NotificationsManager.php:158
 msgid "Personal"
 msgstr "Osobiste"
 
-#: mod/network.php:996
+#: mod/network.php:995
 msgid "Posts that mention or involve you"
 msgstr "Posty, które wspominają lub angażują Ciebie"
 
-#: mod/network.php:1003
+#: mod/network.php:1002
 msgid "New"
 msgstr "Nowy"
 
-#: mod/network.php:1006
+#: mod/network.php:1005
 msgid "Activity Stream - by date"
 msgstr "Strumień aktywności - według daty"
 
-#: mod/network.php:1014
+#: mod/network.php:1013
 msgid "Shared Links"
 msgstr "Udostępnione łącza"
 
-#: mod/network.php:1017
+#: mod/network.php:1016
 msgid "Interesting Links"
 msgstr "Interesujące linki"
 
-#: mod/network.php:1024
+#: mod/network.php:1023
 msgid "Starred"
 msgstr "Ulubione"
 
-#: mod/network.php:1027
+#: mod/network.php:1026
 msgid "Favourite Posts"
 msgstr "Ulubione posty"
 
-#: mod/newmember.php:12
-msgid "Welcome to Friendica"
-msgstr "Witamy na Friendica"
-
-#: mod/newmember.php:13
-msgid "New Member Checklist"
-msgstr "Lista nowych członków"
-
-#: mod/newmember.php:15
-msgid ""
-"We would like to offer some tips and links to help make your experience "
-"enjoyable. Click any item to visit the relevant page. A link to this page "
-"will be visible from your home page for two weeks after your initial "
-"registration and then will quietly disappear."
-msgstr "Chcielibyśmy zaproponować kilka porad i linków, które pomogą uczynić twoje doświadczenie przyjemnym. Kliknij dowolny element, aby odwiedzić odpowiednią stronę. Link do tej strony będzie widoczny na stronie głównej przez dwa tygodnie od czasu rejestracji, a następnie zniknie."
-
-#: mod/newmember.php:16
-msgid "Getting Started"
-msgstr "Pierwsze kroki"
-
-#: mod/newmember.php:18
-msgid "Friendica Walk-Through"
-msgstr "Friendica Przejdź-Przez"
-
-#: mod/newmember.php:18
-msgid ""
-"On your <em>Quick Start</em> page - find a brief introduction to your "
-"profile and network tabs, make some new connections, and find some groups to"
-" join."
-msgstr "Na stronie <em>Szybki start</em> - znajdź krótkie wprowadzenie do swojego profilu i kart sieciowych, stwórz nowe połączenia i znajdź kilka grup do przyłączenia się."
-
-#: mod/newmember.php:20 mod/settings.php:145 src/Content/Nav.php:262
-#: src/Module/Admin/Addons/Details.php:102
-#: src/Module/Admin/Themes/Details.php:107
-#: src/Module/BaseSettingsModule.php:105 view/theme/frio/theme.php:272
-msgid "Settings"
-msgstr "Ustawienia"
-
-#: mod/newmember.php:22
-msgid "Go to Your Settings"
-msgstr "Idź do swoich ustawień"
-
-#: mod/newmember.php:22
-msgid ""
-"On your <em>Settings</em> page -  change your initial password. Also make a "
-"note of your Identity Address. This looks just like an email address - and "
-"will be useful in making friends on the free social web."
-msgstr "Na stronie Ustawienia - zmień swoje początkowe hasło. Zanotuj także swój adres tożsamości. Wygląda to jak adres e-mail - będzie przydatny w nawiązywaniu znajomości w bezpłatnej sieci społecznościowej."
-
-#: mod/newmember.php:23
-msgid ""
-"Review the other settings, particularly the privacy settings. An unpublished"
-" directory listing is like having an unlisted phone number. In general, you "
-"should probably publish your listing - unless all of your friends and "
-"potential friends know exactly how to find you."
-msgstr "Przejrzyj pozostałe ustawienia, w szczególności ustawienia prywatności. Niepublikowany wykaz katalogów jest podobny do niepublicznego numeru telefonu. Ogólnie rzecz biorąc, powinieneś opublikować swój wpis - chyba, że wszyscy twoi znajomi i potencjalni znajomi dokładnie wiedzą, jak Cię znaleźć."
-
-#: mod/newmember.php:25 mod/profperm.php:117 src/Content/Nav.php:156
-#: src/Model/Profile.php:870 src/Model/Profile.php:903
-#: src/Module/Contact.php:657 src/Module/Contact.php:872
-#: view/theme/frio/theme.php:263
-msgid "Profile"
-msgstr "Profil użytkownika"
-
-#: mod/newmember.php:27 mod/profiles.php:583 mod/profile_photo.php:253
-msgid "Upload Profile Photo"
-msgstr "Wyślij zdjęcie profilowe"
-
-#: mod/newmember.php:27
-msgid ""
-"Upload a profile photo if you have not done so already. Studies have shown "
-"that people with real photos of themselves are ten times more likely to make"
-" friends than people who do not."
-msgstr "Dodaj swoje zdjęcie profilowe jeśli jeszcze tego nie zrobiłeś. Twoje szanse na zwiększenie liczby znajomych rosną dziesięciokrotnie, kiedy na tym zdjęciu jesteś ty."
-
-#: mod/newmember.php:28
-msgid "Edit Your Profile"
-msgstr "Edytuj własny profil"
-
-#: mod/newmember.php:28
-msgid ""
-"Edit your <strong>default</strong> profile to your liking. Review the "
-"settings for hiding your list of friends and hiding the profile from unknown"
-" visitors."
-msgstr "Edytuj swój domyślny profil do swoich potrzeb. Przejrzyj ustawienia ukrywania listy znajomych i ukrywania profilu przed nieznanymi użytkownikami."
-
-#: mod/newmember.php:29
-msgid "Profile Keywords"
-msgstr "Słowa kluczowe profilu"
-
-#: mod/newmember.php:29
-msgid ""
-"Set some public keywords for your default profile which describe your "
-"interests. We may be able to find other people with similar interests and "
-"suggest friendships."
-msgstr "Ustaw kilka publicznych słów kluczowych dla swojego domyślnego profilu, które opisują Twoje zainteresowania. Możemy znaleźć inne osoby o podobnych zainteresowaniach i zaproponować przyjaźnie."
-
-#: mod/newmember.php:31
-msgid "Connecting"
-msgstr "Łączenie"
-
-#: mod/newmember.php:37
-msgid "Importing Emails"
-msgstr "Importowanie e-maili"
-
-#: mod/newmember.php:37
-msgid ""
-"Enter your email access information on your Connector Settings page if you "
-"wish to import and interact with friends or mailing lists from your email "
-"INBOX"
-msgstr "Wprowadź informacje dotyczące dostępu do poczty e-mail na stronie Ustawienia oprogramowania, jeśli chcesz importować i wchodzić w interakcje z przyjaciółmi lub listami adresowymi z poziomu konta e-mail INBOX"
-
-#: mod/newmember.php:40
-msgid "Go to Your Contacts Page"
-msgstr "Idź do strony z Twoimi kontaktami"
-
-#: mod/newmember.php:40
-msgid ""
-"Your Contacts page is your gateway to managing friendships and connecting "
-"with friends on other networks. Typically you enter their address or site "
-"URL in the <em>Add New Contact</em> dialog."
-msgstr "Strona Kontakty jest twoją bramą do zarządzania przyjaciółmi i łączenia się z przyjaciółmi w innych sieciach. Zazwyczaj podaje się adres lub adres URL strony w oknie dialogowym <em>Dodaj nowy kontakt</em>."
-
-#: mod/newmember.php:41
-msgid "Go to Your Site's Directory"
-msgstr "Idż do twojej strony"
-
-#: mod/newmember.php:41
-msgid ""
-"The Directory page lets you find other people in this network or other "
-"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
-"their profile page. Provide your own Identity Address if requested."
-msgstr "Strona Katalog umożliwia znalezienie innych osób w tej sieci lub innych witrynach stowarzyszonych. Poszukaj łącza <em>Połącz</em> lub <em>Śledź</em> na stronie profilu. Jeśli chcesz, podaj swój własny adres tożsamości."
-
-#: mod/newmember.php:42
-msgid "Finding New People"
-msgstr "Znajdowanie nowych osób"
-
-#: mod/newmember.php:42
-msgid ""
-"On the side panel of the Contacts page are several tools to find new "
-"friends. We can match people by interest, look up people by name or "
-"interest, and provide suggestions based on network relationships. On a brand"
-" new site, friend suggestions will usually begin to be populated within 24 "
-"hours."
-msgstr "Na bocznym panelu strony Kontaktów znajduje się kilka narzędzi do znajdowania nowych przyjaciół. Możemy dopasować osoby według zainteresowań, wyszukiwać osoby według nazwisk i zainteresowań oraz dostarczać sugestie oparte na relacjach sieciowych. Na zupełnie nowej stronie sugestie znajomych zwykle zaczynają być wypełniane w ciągu 24 godzin"
-
-#: mod/newmember.php:44 src/Model/Group.php:435 src/Module/Contact.php:756
-msgid "Groups"
-msgstr "Grupy"
-
-#: mod/newmember.php:46
-msgid "Group Your Contacts"
-msgstr "Grupy kontaktów"
-
-#: mod/newmember.php:46
-msgid ""
-"Once you have made some friends, organize them into private conversation "
-"groups from the sidebar of your Contacts page and then you can interact with"
-" each group privately on your Network page."
-msgstr "Gdy zaprzyjaźnisz się z przyjaciółmi, uporządkuj je w prywatne grupy konwersacji na pasku bocznym na stronie Kontakty, a następnie możesz wchodzić w interakcje z każdą grupą prywatnie na stronie Sieć."
-
-#: mod/newmember.php:49
-msgid "Why Aren't My Posts Public?"
-msgstr "Dlaczego moje posty nie są publiczne?"
-
-#: mod/newmember.php:49
-msgid ""
-"Friendica respects your privacy. By default, your posts will only show up to"
-" people you've added as friends. For more information, see the help section "
-"from the link above."
-msgstr "Friendica szanuje Twoją prywatność. Domyślnie Twoje wpisy będą wyświetlane tylko osobom, które dodałeś jako znajomi. Aby uzyskać więcej informacji, zobacz sekcję pomocy na powyższym łączu."
-
-#: mod/newmember.php:53
-msgid "Getting Help"
-msgstr "Otrzymaj pomoc"
-
-#: mod/newmember.php:55
-msgid "Go to the Help Section"
-msgstr "Przejdź do sekcji pomocy"
-
-#: mod/newmember.php:55
-msgid ""
-"Our <strong>help</strong> pages may be consulted for detail on other program"
-" features and resources."
-msgstr "Na naszych stronach <strong>pomocy</strong> można znaleźć szczegółowe informacje na temat innych funkcji programu i zasobów."
-
-#: mod/notes.php:34 src/Model/Profile.php:953
+#: mod/notes.php:34 src/Model/Profile.php:938
 msgid "Personal Notes"
 msgstr "Notatki"
 
@@ -2386,7 +2182,7 @@ msgstr "Notatki"
 msgid "Invalid request identifier."
 msgstr "Nieprawidłowe żądanie identyfikatora."
 
-#: mod/notifications.php:93 src/Content/Nav.php:246
+#: mod/notifications.php:93 src/Content/Nav.php:249
 msgid "Notifications"
 msgstr "Powiadomienia"
 
@@ -2394,7 +2190,7 @@ msgstr "Powiadomienia"
 msgid "Network Notifications"
 msgstr "Powiadomienia sieciowe"
 
-#: mod/notifications.php:112 mod/notify.php:72
+#: mod/notifications.php:112
 msgid "System Notifications"
 msgstr "Powiadomienia systemowe"
 
@@ -2406,118 +2202,114 @@ msgstr "Prywatne powiadomienia"
 msgid "Home Notifications"
 msgstr "Powiadomienia domowe"
 
-#: mod/notifications.php:142
+#: mod/notifications.php:145
 msgid "Show unread"
 msgstr "Pokaż nieprzeczytane"
 
-#: mod/notifications.php:142
+#: mod/notifications.php:145
 msgid "Show all"
 msgstr "Pokaż wszystko"
 
-#: mod/notifications.php:153
+#: mod/notifications.php:156
 msgid "Show Ignored Requests"
 msgstr "Pokaż ignorowane żądania"
 
-#: mod/notifications.php:153
+#: mod/notifications.php:156
 msgid "Hide Ignored Requests"
 msgstr "Ukryj zignorowane prośby"
 
-#: mod/notifications.php:166 mod/notifications.php:251
+#: mod/notifications.php:169 mod/notifications.php:254
 msgid "Notification type:"
 msgstr "Typ powiadomienia:"
 
-#: mod/notifications.php:169
+#: mod/notifications.php:172
 msgid "Suggested by:"
 msgstr "Sugerowany przez:"
 
-#: mod/notifications.php:181 mod/notifications.php:268
-#: src/Module/Contact.php:633
+#: mod/notifications.php:184 mod/notifications.php:271
+#: src/Module/Contact.php:632
 msgid "Hide this contact from others"
 msgstr "Ukryj ten kontakt przed innymi"
 
-#: mod/notifications.php:183 mod/notifications.php:277
+#: mod/notifications.php:186 mod/notifications.php:280
 #: src/Module/Admin/Users.php:286
 msgid "Approve"
 msgstr "Zatwierdź"
 
-#: mod/notifications.php:203
+#: mod/notifications.php:206
 msgid "Claims to be known to you: "
 msgstr "Twierdzi, że go/ją znasz: "
 
-#: mod/notifications.php:204
+#: mod/notifications.php:207
 msgid "yes"
 msgstr "tak"
 
-#: mod/notifications.php:204
+#: mod/notifications.php:207
 msgid "no"
 msgstr "nie"
 
-#: mod/notifications.php:205 mod/notifications.php:209
+#: mod/notifications.php:208 mod/notifications.php:212
 msgid "Shall your connection be bidirectional or not?"
 msgstr "Czy twoje połączenie ma być dwukierunkowe, czy nie?"
 
-#: mod/notifications.php:206 mod/notifications.php:210
+#: mod/notifications.php:209 mod/notifications.php:213
 #, php-format
 msgid ""
 "Accepting %s as a friend allows %s to subscribe to your posts, and you will "
 "also receive updates from them in your news feed."
 msgstr "Przyjmowanie %s jako znajomego pozwala %s zasubskrybować twoje posty, a także otrzymywać od nich aktualizacje w swoim kanale wiadomości."
 
-#: mod/notifications.php:207
+#: mod/notifications.php:210
 #, php-format
 msgid ""
 "Accepting %s as a subscriber allows them to subscribe to your posts, but you"
 " will not receive updates from them in your news feed."
 msgstr "Zaakceptowanie %s jako subskrybenta umożliwia im subskrybowanie Twoich postów, ale nie otrzymasz od nich aktualizacji w swoim kanale wiadomości."
 
-#: mod/notifications.php:211
+#: mod/notifications.php:214
 #, php-format
 msgid ""
 "Accepting %s as a sharer allows them to subscribe to your posts, but you "
 "will not receive updates from them in your news feed."
 msgstr "Akceptowanie %s jako udostępniający pozwala im subskrybować twoje posty, ale nie otrzymasz od nich aktualizacji w swoim kanale wiadomości."
 
-#: mod/notifications.php:222
+#: mod/notifications.php:225
 msgid "Friend"
 msgstr "Znajomy"
 
-#: mod/notifications.php:223
+#: mod/notifications.php:226
 msgid "Sharer"
 msgstr "Udostępniający/a"
 
-#: mod/notifications.php:223
+#: mod/notifications.php:226
 msgid "Subscriber"
 msgstr "Subskrybent"
 
-#: mod/notifications.php:263 src/Model/Profile.php:445
-#: src/Model/Profile.php:813 src/Module/Contact.php:650
-#: src/Module/Directory.php:150
+#: mod/notifications.php:266 src/Model/Profile.php:424
+#: src/Model/Profile.php:795 src/Module/Contact.php:649
+#: src/Module/Directory.php:145
 msgid "About:"
 msgstr "O:"
 
-#: mod/notifications.php:267 src/Model/Profile.php:442
-#: src/Model/Profile.php:752 src/Module/Directory.php:147
+#: mod/notifications.php:270 src/Model/Profile.php:421
+#: src/Model/Profile.php:734 src/Module/Directory.php:142
 msgid "Gender:"
 msgstr "Płeć:"
 
-#: mod/notifications.php:274 src/Model/Profile.php:539
-#: src/Module/Contact.php:90
+#: mod/notifications.php:277 src/Model/Profile.php:521
+#: src/Module/Contact.php:333
 msgid "Network:"
 msgstr "Sieć:"
 
-#: mod/notifications.php:288
+#: mod/notifications.php:291
 msgid "No introductions."
 msgstr "Brak dostępu."
 
-#: mod/notifications.php:322
+#: mod/notifications.php:325
 #, php-format
 msgid "No more %s notifications."
 msgstr "Brak kolejnych %s powiadomień."
 
-#: mod/notify.php:68
-msgid "No more system notifications."
-msgstr "Nie ma więcej powiadomień systemowych."
-
 #: mod/oexchange.php:32
 msgid "Post successful."
 msgstr "Pomyślnie opublikowano."
@@ -2531,7 +2323,7 @@ msgid ""
 "Account not found and OpenID registration is not permitted on this site."
 msgstr "Konto nie zostało znalezione, a rejestracja OpenID nie jest dozwolona na tej stronie."
 
-#: mod/openid.php:117 src/Module/Login.php:93 src/Module/Login.php:144
+#: mod/openid.php:117 src/Module/Login.php:88 src/Module/Login.php:139
 msgid "Login failed."
 msgstr "Logowanie nieudane."
 
@@ -2563,7 +2355,7 @@ msgstr "powodzenie"
 msgid "failed"
 msgstr "nie powiodło się"
 
-#: mod/ostatus_subscribe.php:89 src/Object/Post.php:284
+#: mod/ostatus_subscribe.php:89 src/Object/Post.php:285
 msgid "ignored"
 msgstr "ignorowany(-a)"
 
@@ -2571,19 +2363,19 @@ msgstr "ignorowany(-a)"
 msgid "Keep this window open until done."
 msgstr "Pozostaw to okno otwarte, dopóki nie będzie gotowe."
 
-#: mod/photos.php:113 src/Model/Profile.php:914
+#: mod/photos.php:113 src/Model/Profile.php:899
 msgid "Photo Albums"
 msgstr "Albumy zdjęć"
 
-#: mod/photos.php:114 mod/photos.php:1630
+#: mod/photos.php:114 mod/photos.php:1639
 msgid "Recent Photos"
 msgstr "Ostatnio dodane zdjęcia"
 
-#: mod/photos.php:116 mod/photos.php:1144 mod/photos.php:1632
+#: mod/photos.php:116 mod/photos.php:1152 mod/photos.php:1641
 msgid "Upload New Photos"
 msgstr "Wyślij nowe zdjęcie"
 
-#: mod/photos.php:134 mod/settings.php:58 src/Module/BaseSettingsModule.php:18
+#: mod/photos.php:134 mod/settings.php:60 src/Module/BaseSettingsModule.php:18
 msgid "everybody"
 msgstr "wszyscy"
 
@@ -2591,219 +2383,219 @@ msgstr "wszyscy"
 msgid "Contact information unavailable"
 msgstr "Informacje o kontakcie są niedostępne"
 
-#: mod/photos.php:204
+#: mod/photos.php:207
 msgid "Album not found."
 msgstr "Nie znaleziono albumu."
 
-#: mod/photos.php:262
+#: mod/photos.php:265
 msgid "Album successfully deleted"
 msgstr "Album został pomyślnie usunięty"
 
-#: mod/photos.php:264
+#: mod/photos.php:267
 msgid "Album was empty."
 msgstr "Album był pusty."
 
-#: mod/photos.php:586
+#: mod/photos.php:590
 msgid "a photo"
 msgstr "zdjęcie"
 
-#: mod/photos.php:586
+#: mod/photos.php:590
 #, php-format
 msgid "%1$s was tagged in %2$s by %3$s"
 msgstr "%1$szostał oznaczony tagiem %2$s przez %3$s"
 
-#: mod/photos.php:679 mod/photos.php:682 mod/photos.php:711
+#: mod/photos.php:683 mod/photos.php:686 mod/photos.php:715
 #: mod/profile_photo.php:152 mod/wall_upload.php:198
 #, php-format
 msgid "Image exceeds size limit of %s"
 msgstr "Obraz przekracza limit rozmiaru wynoszący %s"
 
-#: mod/photos.php:685
+#: mod/photos.php:689
 msgid "Image upload didn't complete, please try again"
 msgstr "Przesyłanie zdjęć nie zostało zakończone, spróbuj ponownie"
 
-#: mod/photos.php:688
+#: mod/photos.php:692
 msgid "Image file is missing"
 msgstr "Brak pliku obrazu"
 
-#: mod/photos.php:693
+#: mod/photos.php:697
 msgid ""
 "Server can't accept new file upload at this time, please contact your "
 "administrator"
 msgstr "Serwer nie może teraz przyjąć nowego pliku, skontaktuj się z administratorem"
 
-#: mod/photos.php:719
+#: mod/photos.php:723
 msgid "Image file is empty."
 msgstr "Plik obrazka jest pusty."
 
-#: mod/photos.php:734 mod/profile_photo.php:161 mod/wall_upload.php:212
+#: mod/photos.php:738 mod/profile_photo.php:161 mod/wall_upload.php:212
 msgid "Unable to process image."
 msgstr "Przetwarzanie obrazu nie powiodło się."
 
-#: mod/photos.php:763 mod/profile_photo.php:310 mod/wall_upload.php:251
+#: mod/photos.php:767 mod/profile_photo.php:310 mod/wall_upload.php:251
 msgid "Image upload failed."
 msgstr "Przesyłanie obrazu nie powiodło się."
 
-#: mod/photos.php:851
+#: mod/photos.php:855
 msgid "No photos selected"
 msgstr "Nie zaznaczono zdjęć"
 
-#: mod/photos.php:943 mod/videos.php:210
+#: mod/photos.php:947 mod/videos.php:210
 msgid "Access to this item is restricted."
 msgstr "Dostęp do tego obiektu jest ograniczony."
 
-#: mod/photos.php:997
+#: mod/photos.php:1001
 msgid "Upload Photos"
 msgstr "Prześlij zdjęcia"
 
-#: mod/photos.php:1001 mod/photos.php:1089
+#: mod/photos.php:1005 mod/photos.php:1097
 msgid "New album name: "
 msgstr "Nazwa nowego albumu: "
 
-#: mod/photos.php:1002
+#: mod/photos.php:1006
 msgid "or select existing album:"
 msgstr "lub wybierz istniejący album:"
 
-#: mod/photos.php:1003
+#: mod/photos.php:1007
 msgid "Do not show a status post for this upload"
 msgstr "Nie pokazuj statusu postów dla tego wysłania"
 
-#: mod/photos.php:1019 mod/photos.php:1382 mod/settings.php:1208
+#: mod/photos.php:1023 mod/photos.php:1391 mod/settings.php:1213
 msgid "Show to Groups"
 msgstr "Pokaż Grupy"
 
-#: mod/photos.php:1020 mod/photos.php:1383 mod/settings.php:1209
+#: mod/photos.php:1024 mod/photos.php:1392 mod/settings.php:1214
 msgid "Show to Contacts"
 msgstr "Pokaż kontakty"
 
-#: mod/photos.php:1071
+#: mod/photos.php:1079
 msgid "Do you really want to delete this photo album and all its photos?"
 msgstr "Czy na pewno chcesz usunąć ten album i wszystkie zdjęcia z tego albumu?"
 
-#: mod/photos.php:1073 mod/photos.php:1094
+#: mod/photos.php:1081 mod/photos.php:1102
 msgid "Delete Album"
 msgstr "Usuń album"
 
-#: mod/photos.php:1100
+#: mod/photos.php:1108
 msgid "Edit Album"
 msgstr "Edytuj album"
 
-#: mod/photos.php:1101
+#: mod/photos.php:1109
 msgid "Drop Album"
 msgstr "Upuść Album"
 
-#: mod/photos.php:1106
+#: mod/photos.php:1114
 msgid "Show Newest First"
 msgstr "Pokaż najpierw najnowsze"
 
-#: mod/photos.php:1108
+#: mod/photos.php:1116
 msgid "Show Oldest First"
 msgstr "Pokaż najpierw najstarsze"
 
-#: mod/photos.php:1129 mod/photos.php:1615
+#: mod/photos.php:1137 mod/photos.php:1624
 msgid "View Photo"
 msgstr "Zobacz zdjęcie"
 
-#: mod/photos.php:1166
+#: mod/photos.php:1174
 msgid "Permission denied. Access to this item may be restricted."
 msgstr "Odmowa dostępu. Dostęp do tych danych może być ograniczony."
 
-#: mod/photos.php:1168
+#: mod/photos.php:1176
 msgid "Photo not available"
 msgstr "Zdjęcie niedostępne"
 
-#: mod/photos.php:1178
+#: mod/photos.php:1186
 msgid "Do you really want to delete this photo?"
 msgstr "Czy na pewno chcesz usunąć to zdjęcie ?"
 
-#: mod/photos.php:1180 mod/photos.php:1379
+#: mod/photos.php:1188 mod/photos.php:1388
 msgid "Delete Photo"
 msgstr "Usuń zdjęcie"
 
-#: mod/photos.php:1271
+#: mod/photos.php:1279
 msgid "View photo"
 msgstr "Zobacz zdjęcie"
 
-#: mod/photos.php:1273
+#: mod/photos.php:1281
 msgid "Edit photo"
 msgstr "Edytuj zdjęcie"
 
-#: mod/photos.php:1274
+#: mod/photos.php:1282
 msgid "Delete photo"
 msgstr "Usuń zdjęcie"
 
-#: mod/photos.php:1275
+#: mod/photos.php:1283
 msgid "Use as profile photo"
 msgstr "Ustaw jako zdjęcie profilowe"
 
-#: mod/photos.php:1282
+#: mod/photos.php:1290
 msgid "Private Photo"
 msgstr "Prywatne zdjęcie"
 
-#: mod/photos.php:1288
+#: mod/photos.php:1296
 msgid "View Full Size"
 msgstr "Zobacz w pełnym rozmiarze"
 
-#: mod/photos.php:1347
+#: mod/photos.php:1356
 msgid "Tags: "
 msgstr "Tagi: "
 
-#: mod/photos.php:1350
+#: mod/photos.php:1359
 msgid "[Select tags to remove]"
 msgstr "[Wybierz tagi do usunięcia]"
 
-#: mod/photos.php:1365
+#: mod/photos.php:1374
 msgid "New album name"
 msgstr "Nazwa nowego albumu"
 
-#: mod/photos.php:1366
+#: mod/photos.php:1375
 msgid "Caption"
 msgstr "Zawartość"
 
-#: mod/photos.php:1367
+#: mod/photos.php:1376
 msgid "Add a Tag"
 msgstr "Dodaj tag"
 
-#: mod/photos.php:1367
+#: mod/photos.php:1376
 msgid ""
 "Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
 msgstr "Przykładowo: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
 
-#: mod/photos.php:1368
+#: mod/photos.php:1377
 msgid "Do not rotate"
 msgstr "Nie obracaj"
 
-#: mod/photos.php:1369
+#: mod/photos.php:1378
 msgid "Rotate CW (right)"
 msgstr "Obróć CW (w prawo)"
 
-#: mod/photos.php:1370
+#: mod/photos.php:1379
 msgid "Rotate CCW (left)"
 msgstr "Obróć CCW (w lewo)"
 
-#: mod/photos.php:1404 src/Object/Post.php:312
+#: mod/photos.php:1413 src/Object/Post.php:313
 msgid "I like this (toggle)"
 msgstr "Lubię to (zmień)"
 
-#: mod/photos.php:1405 src/Object/Post.php:313
+#: mod/photos.php:1414 src/Object/Post.php:314
 msgid "I don't like this (toggle)"
 msgstr "Nie lubię tego (zmień)"
 
-#: mod/photos.php:1420 mod/photos.php:1459 mod/photos.php:1519
-#: src/Module/Contact.php:1021 src/Object/Post.php:874
+#: mod/photos.php:1429 mod/photos.php:1468 mod/photos.php:1528
+#: src/Module/Contact.php:1017 src/Object/Post.php:875
 msgid "This is you"
 msgstr "To jesteś ty"
 
-#: mod/photos.php:1422 mod/photos.php:1461 mod/photos.php:1521
-#: src/Object/Post.php:419 src/Object/Post.php:876
+#: mod/photos.php:1431 mod/photos.php:1470 mod/photos.php:1530
+#: src/Object/Post.php:420 src/Object/Post.php:877
 msgid "Comment"
 msgstr "Komentarz"
 
-#: mod/photos.php:1550
+#: mod/photos.php:1559
 msgid "Map"
 msgstr "Mapa"
 
-#: mod/photos.php:1621 mod/videos.php:287
+#: mod/photos.php:1630 mod/videos.php:287
 msgid "View Album"
 msgstr "Zobacz album"
 
@@ -2835,10 +2627,6 @@ msgstr "Wybierz, co chcesz zrobić"
 msgid "Make this post private"
 msgstr "Ustaw ten post jako prywatny"
 
-#: mod/probe.php:13 src/Module/WebFinger.php:18
-msgid "Only logged in users are permitted to perform a probing."
-msgstr "Tylko zalogowani użytkownicy mogą wykonywać sondowanie."
-
 #: mod/profiles.php:62
 msgid "Profile deleted."
 msgstr "Konto usunięte."
@@ -2899,7 +2687,7 @@ msgstr "Strona Główna"
 msgid "Interests"
 msgstr "Zainteresowania"
 
-#: mod/profiles.php:382 src/Module/Admin/Blocklist/Contact.php:72
+#: mod/profiles.php:382
 msgid "Address"
 msgstr "Adres"
 
@@ -2943,7 +2731,7 @@ msgstr "Wyświetl ten profil"
 msgid "View all profiles"
 msgstr "Wyświetl wszystkie profile"
 
-#: mod/profiles.php:567 mod/profiles.php:662 src/Model/Profile.php:415
+#: mod/profiles.php:567 mod/profiles.php:662 src/Model/Profile.php:394
 msgid "Edit visibility"
 msgstr "Edytuj widoczność"
 
@@ -2987,6 +2775,10 @@ msgstr "Relacje"
 msgid "Miscellaneous"
 msgstr "Różny"
 
+#: mod/profiles.php:583 mod/profile_photo.php:253 src/Module/Welcome.php:39
+msgid "Upload Profile Photo"
+msgstr "Wyślij zdjęcie profilowe"
+
 #: mod/profiles.php:584
 msgid "Your Gender:"
 msgstr "Płeć:"
@@ -2995,7 +2787,7 @@ msgstr "Płeć:"
 msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
 msgstr "<span class=\"heart\">&hearts;</span> Stan cywilny:"
 
-#: mod/profiles.php:586 src/Model/Profile.php:789
+#: mod/profiles.php:586 src/Model/Profile.php:771
 msgid "Sexual Preference:"
 msgstr "Preferencje seksualne:"
 
@@ -3075,11 +2867,11 @@ msgstr "Adres XMPP będzie propagowany do Twoich kontaktów, aby mogli Cię śle
 msgid "Homepage URL:"
 msgstr "Adres URL strony domowej:"
 
-#: mod/profiles.php:613 src/Model/Profile.php:797
+#: mod/profiles.php:613 src/Model/Profile.php:779
 msgid "Hometown:"
 msgstr "Miasto rodzinne:"
 
-#: mod/profiles.php:614 src/Model/Profile.php:805
+#: mod/profiles.php:614 src/Model/Profile.php:787
 msgid "Political Views:"
 msgstr "Poglądy polityczne:"
 
@@ -3103,11 +2895,11 @@ msgstr "Prywatne słowa kluczowe:"
 msgid "(Used for searching profiles, never shown to others)"
 msgstr "(Używany do wyszukiwania profili, niepokazywany innym)"
 
-#: mod/profiles.php:618 src/Model/Profile.php:821
+#: mod/profiles.php:618 src/Model/Profile.php:803
 msgid "Likes:"
 msgstr "Lubię to:"
 
-#: mod/profiles.php:619 src/Model/Profile.php:825
+#: mod/profiles.php:619 src/Model/Profile.php:807
 msgid "Dislikes:"
 msgstr "Nie lubię tego:"
 
@@ -3147,11 +2939,11 @@ msgstr "Szkoła/edukacja"
 msgid "Contact information and Social Networks"
 msgstr "Dane kontaktowe i Sieci społecznościowe"
 
-#: mod/profiles.php:659 src/Model/Profile.php:411
+#: mod/profiles.php:659 src/Model/Profile.php:390
 msgid "Profile Image"
 msgstr "Zdjęcie profilowe"
 
-#: mod/profiles.php:661 src/Model/Profile.php:414
+#: mod/profiles.php:661 src/Model/Profile.php:393
 msgid "visible to everybody"
 msgstr "widoczne dla wszystkich"
 
@@ -3159,11 +2951,11 @@ msgstr "widoczne dla wszystkich"
 msgid "Edit/Manage Profiles"
 msgstr "Edycja/Zarządzanie profilami"
 
-#: mod/profiles.php:669 src/Model/Profile.php:401 src/Model/Profile.php:423
+#: mod/profiles.php:669 src/Model/Profile.php:380 src/Model/Profile.php:401
 msgid "Change profile photo"
 msgstr "Zmień zdjęcie profilowe"
 
-#: mod/profiles.php:670 src/Model/Profile.php:402
+#: mod/profiles.php:670 src/Model/Profile.php:381
 msgid "Create New Profile"
 msgstr "Utwórz nowy profil"
 
@@ -3235,6 +3027,13 @@ msgstr "Nieprawidłowa nazwa użytkownika."
 msgid "Profile Visibility Editor"
 msgstr "Ustawienia widoczności profilu"
 
+#: mod/profperm.php:117 src/Content/Nav.php:161 src/Model/Profile.php:852
+#: src/Model/Profile.php:888 src/Module/Contact.php:656
+#: src/Module/Contact.php:872 src/Module/Welcome.php:38
+#: view/theme/frio/theme.php:260
+msgid "Profile"
+msgstr "Profil użytkownika"
+
 #: mod/profperm.php:119 src/Module/Group.php:321
 msgid "Click on a contact to add or remove."
 msgstr "Kliknij na kontakt w celu dodania lub usunięcia."
@@ -3293,257 +3092,286 @@ msgstr "Wprowadź hasło w celu weryfikacji:"
 msgid "Resubscribing to OStatus contacts"
 msgstr "Ponowne subskrybowanie kontaktów OStatus"
 
-#: mod/repair_ostatus.php:37
+#: mod/repair_ostatus.php:37 src/Module/TwoFactor/Verify.php:64
 msgid "Error"
-msgstr "Błąd"
+msgid_plural "Errors"
+msgstr[0] "Błąd"
+msgstr[1] "Błędów"
+msgstr[2] "Błędy"
+msgstr[3] "Błędów"
 
-#: mod/search.php:101
+#: mod/search.php:92
 msgid "Only logged in users are permitted to perform a search."
 msgstr "Tylko zalogowani użytkownicy mogą wyszukiwać."
 
-#: mod/search.php:123
+#: mod/search.php:114
 msgid "Only one search per minute is permitted for not logged in users."
 msgstr "Dla niezalogowanych użytkowników dozwolone jest tylko jedno wyszukiwanie na minutę."
 
-#: mod/search.php:143 src/Content/Nav.php:197 src/Content/Text/HTML.php:900
+#: mod/search.php:134 src/Content/Nav.php:200 src/Content/Text/HTML.php:880
 msgid "Search"
 msgstr "Szukaj"
 
-#: mod/search.php:229
+#: mod/search.php:228
 #, php-format
 msgid "Items tagged with: %s"
 msgstr "Przedmioty oznaczone tagiem: %s"
 
-#: mod/search.php:231 src/Module/Contact.php:819
+#: mod/search.php:230 src/Module/Contact.php:819
 #, php-format
 msgid "Results for: %s"
 msgstr "Wyniki dla: %s"
 
-#: mod/settings.php:63 src/Module/BaseSettingsModule.php:24
+#: mod/settings.php:65 src/Module/BaseSettingsModule.php:24
 msgid "Account"
 msgstr "Konto"
 
-#: mod/settings.php:71 src/Module/BaseSettingsModule.php:31
-#: src/Module/Settings/TwoFactor/Index.php:83
-#: src/Module/TwoFactor/Verify.php:60
+#: mod/settings.php:73 src/Module/BaseSettingsModule.php:31
+#: src/Module/Settings/TwoFactor/Index.php:89
+#: src/Module/TwoFactor/Verify.php:62
 msgid "Two-factor authentication"
 msgstr "Uwierzytelnianie dwuskładnikowe"
 
-#: mod/settings.php:78 src/Content/Nav.php:265 src/Model/Profile.php:394
+#: mod/settings.php:80 src/Content/Nav.php:268 src/Model/Profile.php:373
 #: src/Module/BaseSettingsModule.php:38
 msgid "Profiles"
 msgstr "Profile"
 
-#: mod/settings.php:86 src/Module/BaseAdminModule.php:84
+#: mod/settings.php:88 src/Module/BaseAdminModule.php:84
 #: src/Module/BaseSettingsModule.php:46
 msgid "Additional features"
 msgstr "Dodatkowe funkcje"
 
-#: mod/settings.php:94 src/Module/BaseSettingsModule.php:54
+#: mod/settings.php:96 src/Module/BaseSettingsModule.php:54
 msgid "Display"
 msgstr "Wygląd"
 
-#: mod/settings.php:101 mod/settings.php:839
+#: mod/settings.php:103 mod/settings.php:843
 #: src/Module/BaseSettingsModule.php:61
 msgid "Social Networks"
 msgstr "Portale społecznościowe"
 
-#: mod/settings.php:108 src/Module/Admin/Addons/Details.php:100
+#: mod/settings.php:110 src/Module/Admin/Addons/Details.php:100
 #: src/Module/Admin/Addons/Index.php:51 src/Module/BaseAdminModule.php:82
 #: src/Module/BaseSettingsModule.php:68
 msgid "Addons"
 msgstr "Dodatki"
 
-#: mod/settings.php:115 src/Content/Nav.php:260
+#: mod/settings.php:117 src/Content/Nav.php:263
 #: src/Module/BaseSettingsModule.php:75
 msgid "Delegations"
 msgstr "Delegowanie"
 
-#: mod/settings.php:122 src/Module/BaseSettingsModule.php:82
+#: mod/settings.php:124 src/Module/BaseSettingsModule.php:82
 msgid "Connected apps"
 msgstr "Powiązane aplikacje"
 
-#: mod/settings.php:129 mod/uexport.php:52
+#: mod/settings.php:131 mod/uexport.php:59
 #: src/Module/BaseSettingsModule.php:89
 msgid "Export personal data"
 msgstr "Eksportuj dane osobiste"
 
-#: mod/settings.php:136 src/Module/BaseSettingsModule.php:96
+#: mod/settings.php:138 src/Module/BaseSettingsModule.php:96
 msgid "Remove account"
 msgstr "Usuń konto"
 
-#: mod/settings.php:188
+#: mod/settings.php:147 src/Content/Nav.php:265
+#: src/Module/Admin/Addons/Details.php:102
+#: src/Module/Admin/Themes/Details.php:107
+#: src/Module/BaseSettingsModule.php:105 src/Module/Welcome.php:33
+#: view/theme/frio/theme.php:269
+msgid "Settings"
+msgstr "Ustawienia"
+
+#: mod/settings.php:190
 msgid "Missing some important data!"
 msgstr "Brakuje ważnych danych!"
 
-#: mod/settings.php:190 mod/settings.php:700 src/Module/Contact.php:826
+#: mod/settings.php:192 mod/settings.php:703 src/Module/Contact.php:826
 msgid "Update"
 msgstr "Zaktualizuj"
 
-#: mod/settings.php:299
+#: mod/settings.php:302
 msgid "Failed to connect with email account using the settings provided."
 msgstr "Połączenie z kontem email używając wybranych ustawień nie powiodło się."
 
-#: mod/settings.php:304
+#: mod/settings.php:307
 msgid "Email settings updated."
 msgstr "Zaktualizowano ustawienia email."
 
-#: mod/settings.php:320
+#: mod/settings.php:323
 msgid "Features updated"
 msgstr "Funkcje zaktualizowane"
 
-#: mod/settings.php:393
+#: mod/settings.php:384
+msgid "The theme you chose isn't available."
+msgstr "Wybrany motyw jest niedostępny."
+
+#: mod/settings.php:396
 msgid "Relocate message has been send to your contacts"
 msgstr "Przeniesienie wiadomości zostało wysłane do Twoich kontaktów"
 
-#: mod/settings.php:405
+#: mod/settings.php:408
 msgid "Passwords do not match."
 msgstr "Hasła nie pasują do siebie."
 
-#: mod/settings.php:413 src/Console/NewPassword.php:80
+#: mod/settings.php:416 src/Console/NewPassword.php:80
 msgid "Password update failed. Please try again."
 msgstr "Aktualizacja hasła nie powiodła się. Proszę spróbować ponownie."
 
-#: mod/settings.php:416 src/Console/NewPassword.php:83
+#: mod/settings.php:419 src/Console/NewPassword.php:83
 msgid "Password changed."
 msgstr "Hasło zostało zmienione."
 
-#: mod/settings.php:419
+#: mod/settings.php:422
 msgid "Password unchanged."
 msgstr "Hasło niezmienione."
 
-#: mod/settings.php:500
+#: mod/settings.php:503
 msgid " Please use a shorter name."
 msgstr " Proszę użyć krótszej nazwy."
 
-#: mod/settings.php:503
+#: mod/settings.php:506
 msgid " Name too short."
 msgstr " Nazwa jest zbyt krótka."
 
-#: mod/settings.php:510 src/Module/Settings/TwoFactor/Index.php:66
+#: mod/settings.php:513 src/Module/Settings/TwoFactor/Index.php:72
 msgid "Wrong Password"
 msgstr "Złe hasło"
 
-#: mod/settings.php:515
+#: mod/settings.php:518
 msgid "Invalid email."
 msgstr "Niepoprawny e-mail."
 
-#: mod/settings.php:521
+#: mod/settings.php:524
 msgid "Cannot change to that email."
 msgstr "Nie można zmienić tego e-maila."
 
-#: mod/settings.php:571
+#: mod/settings.php:574
 msgid "Private forum has no privacy permissions. Using default privacy group."
 msgstr "Prywatne forum nie ma uprawnień do prywatności. Użyj domyślnej grupy prywatnej."
 
-#: mod/settings.php:574
+#: mod/settings.php:577
 msgid "Private forum has no privacy permissions and no default privacy group."
 msgstr "Prywatne forum nie ma uprawnień do prywatności ani domyślnej grupy prywatności."
 
-#: mod/settings.php:614
+#: mod/settings.php:617
 msgid "Settings updated."
 msgstr "Zaktualizowano ustawienia."
 
-#: mod/settings.php:673 mod/settings.php:699 mod/settings.php:733
+#: mod/settings.php:676 mod/settings.php:702 mod/settings.php:736
 msgid "Add application"
 msgstr "Dodaj aplikację"
 
-#: mod/settings.php:677 mod/settings.php:703
+#: mod/settings.php:680 mod/settings.php:706
 msgid "Consumer Key"
 msgstr "Klucz klienta"
 
-#: mod/settings.php:678 mod/settings.php:704
+#: mod/settings.php:681 mod/settings.php:707
 msgid "Consumer Secret"
 msgstr "Tajny klucz klienta"
 
-#: mod/settings.php:679 mod/settings.php:705
+#: mod/settings.php:682 mod/settings.php:708
 msgid "Redirect"
 msgstr "Przekierowanie"
 
-#: mod/settings.php:680 mod/settings.php:706
+#: mod/settings.php:683 mod/settings.php:709
 msgid "Icon url"
 msgstr "Adres Url ikony"
 
-#: mod/settings.php:691
+#: mod/settings.php:694
 msgid "You can't edit this application."
 msgstr "Nie możesz edytować tej aplikacji."
 
-#: mod/settings.php:732
+#: mod/settings.php:735
 msgid "Connected Apps"
 msgstr "Powiązane aplikacje"
 
-#: mod/settings.php:734 src/Object/Post.php:167 src/Object/Post.php:169
+#: mod/settings.php:737 src/Object/Post.php:168 src/Object/Post.php:170
 msgid "Edit"
 msgstr "Edytuj"
 
-#: mod/settings.php:736
+#: mod/settings.php:739
 msgid "Client key starts with"
 msgstr "Klucz klienta zaczyna się od"
 
-#: mod/settings.php:737
+#: mod/settings.php:740
 msgid "No name"
 msgstr "Bez nazwy"
 
-#: mod/settings.php:738
+#: mod/settings.php:741
 msgid "Remove authorization"
 msgstr "Odwołaj upoważnienie"
 
-#: mod/settings.php:749
+#: mod/settings.php:752
 msgid "No Addon settings configured"
 msgstr "Brak skonfigurowanych ustawień dodatków"
 
-#: mod/settings.php:758
+#: mod/settings.php:761
 msgid "Addon Settings"
 msgstr "Ustawienia Dodatków"
 
-#: mod/settings.php:772 src/Module/Admin/Features.php:58
+#: mod/settings.php:775 src/Module/Admin/Features.php:58
 #: src/Module/Admin/Features.php:59
 msgid "Off"
 msgstr "Wyłącz"
 
-#: mod/settings.php:772 src/Module/Admin/Features.php:58
+#: mod/settings.php:775 src/Module/Admin/Features.php:58
 #: src/Module/Admin/Features.php:59
 msgid "On"
 msgstr "Włącz"
 
-#: mod/settings.php:779
+#: mod/settings.php:782
 msgid "Additional Features"
 msgstr "Dodatkowe funkcje"
 
-#: mod/settings.php:802 src/Content/ContactSelector.php:87
+#: mod/settings.php:806 src/Content/ContactSelector.php:87
 msgid "Diaspora"
 msgstr "Diaspora"
 
-#: mod/settings.php:802 mod/settings.php:803
+#: mod/settings.php:806 mod/settings.php:807
 msgid "enabled"
 msgstr "włączone"
 
-#: mod/settings.php:802 mod/settings.php:803
+#: mod/settings.php:806 mod/settings.php:807
 msgid "disabled"
 msgstr "wyłączone"
 
-#: mod/settings.php:802 mod/settings.php:803
+#: mod/settings.php:806 mod/settings.php:807
 #, php-format
 msgid "Built-in support for %s connectivity is %s"
 msgstr "Wbudowane wsparcie dla połączenia z %s jest %s"
 
-#: mod/settings.php:803
+#: mod/settings.php:807
 msgid "GNU Social (OStatus)"
 msgstr "GNU Soocial (OStatus)"
 
-#: mod/settings.php:834
+#: mod/settings.php:838
 msgid "Email access is disabled on this site."
 msgstr "Dostęp do e-maila jest wyłączony na tej stronie."
 
-#: mod/settings.php:844
+#: mod/settings.php:848
 msgid "General Social Media Settings"
 msgstr "Ogólne ustawienia mediów społecznościowych"
 
-#: mod/settings.php:845
+#: mod/settings.php:849
+msgid "Accept only top level posts by contacts you follow"
+msgstr "Akceptuj tylko posty najwyższego poziomu według kontaktów, które obserwujesz"
+
+#: mod/settings.php:849
+msgid ""
+"The system does an auto completion of threads when a comment arrives. This "
+"has got the side effect that can you receive posts that had been started by "
+"a non-follower but had been commented by someone you follow. This setting "
+"deactivates this behaviour. When activated, you strictly only will receive "
+"posts from people you really do follow."
+msgstr "System wykonuje automatyczne uzupełnianie wątków, gdy nadejdzie komentarz. Ma to efekt uboczny, że możesz otrzymywać posty, które zostały uruchomione przez osoby, które nie obserwują, ale zostały skomentowane przez kogoś, kogo śledzisz. To ustawienie dezaktywuje to zachowanie. Po aktywacji będziesz otrzymywać wyłącznie posty od osób, które naprawdę śledzisz."
+
+#: mod/settings.php:850
 msgid "Disable Content Warning"
 msgstr "Wyłącz ostrzeżenie o treści"
 
-#: mod/settings.php:845
+#: mod/settings.php:850
 msgid ""
 "Users on networks like Mastodon or Pleroma are able to set a content warning"
 " field which collapse their post by default. This disables the automatic "
@@ -3551,352 +3379,352 @@ msgid ""
 "any other content filtering you eventually set up."
 msgstr "Użytkownicy w sieciach takich jak Mastodon lub Pleroma mogą ustawić pole ostrzeżenia o treści, które domyślnie zwijać będzie swój wpis. Powoduje wyłączenie automatycznego zwijania i ustawia ostrzeżenie o treści jako tytuł postu. Nie ma wpływu na żadne inne filtrowanie treści, które ostatecznie utworzyłeś."
 
-#: mod/settings.php:846
+#: mod/settings.php:851
 msgid "Disable intelligent shortening"
 msgstr "Wyłącz inteligentne skracanie"
 
-#: mod/settings.php:846
+#: mod/settings.php:851
 msgid ""
 "Normally the system tries to find the best link to add to shortened posts. "
 "If this option is enabled then every shortened post will always point to the"
 " original friendica post."
 msgstr "Zwykle system próbuje znaleźć najlepszy link do dodania do skróconych postów. Jeśli ta opcja jest włączona, każdy skrócony wpis zawsze wskazuje oryginalny post znajomej osoby."
 
-#: mod/settings.php:847
+#: mod/settings.php:852
 msgid "Automatically follow any GNU Social (OStatus) followers/mentioners"
 msgstr "Automatycznie podążaj za wszystkimi obserwatorami/rzecznikami GNU Społeczności (OStatus)"
 
-#: mod/settings.php:847
+#: mod/settings.php:852
 msgid ""
 "If you receive a message from an unknown OStatus user, this option decides "
 "what to do. If it is checked, a new contact will be created for every "
 "unknown user."
 msgstr "Jeśli otrzymasz wiadomość od nieznanego użytkownika OStatus, ta opcja decyduje, co zrobić. Jeśli zostanie zaznaczone, dla każdego nieznanego użytkownika zostanie utworzony nowy kontakt."
 
-#: mod/settings.php:848
+#: mod/settings.php:853
 msgid "Default group for OStatus contacts"
 msgstr "Domyślna grupa dla kontaktów OStatus"
 
-#: mod/settings.php:849
+#: mod/settings.php:854
 msgid "Your legacy GNU Social account"
 msgstr "Twoje starsze konto społecznościowe GNU"
 
-#: mod/settings.php:849
+#: mod/settings.php:854
 msgid ""
 "If you enter your old GNU Social/Statusnet account name here (in the format "
 "user@domain.tld), your contacts will be added automatically. The field will "
 "be emptied when done."
 msgstr "Jeśli podasz swoją starą nazwę konta GNU Social/Statusnet tutaj (w formacie user@domain.tld), twoje kontakty zostaną dodane automatycznie. Pole zostanie opróżnione po zakończeniu."
 
-#: mod/settings.php:852
+#: mod/settings.php:857
 msgid "Repair OStatus subscriptions"
 msgstr "Napraw subskrypcje OStatus"
 
-#: mod/settings.php:856
+#: mod/settings.php:861
 msgid "Email/Mailbox Setup"
 msgstr "Ustawienia  emaila/skrzynki mailowej"
 
-#: mod/settings.php:857
+#: mod/settings.php:862
 msgid ""
 "If you wish to communicate with email contacts using this service "
 "(optional), please specify how to connect to your mailbox."
 msgstr "Jeśli chcesz komunikować się z kontaktami e-mail za pomocą tej usługi (opcjonalnie), określ sposób łączenia się ze skrzynką pocztową."
 
-#: mod/settings.php:858
+#: mod/settings.php:863
 msgid "Last successful email check:"
 msgstr "Ostatni sprawdzony e-mail:"
 
-#: mod/settings.php:860
+#: mod/settings.php:865
 msgid "IMAP server name:"
 msgstr "Nazwa serwera IMAP:"
 
-#: mod/settings.php:861
+#: mod/settings.php:866
 msgid "IMAP port:"
 msgstr "Port IMAP:"
 
-#: mod/settings.php:862
+#: mod/settings.php:867
 msgid "Security:"
 msgstr "Ochrona:"
 
-#: mod/settings.php:862 mod/settings.php:867
+#: mod/settings.php:867 mod/settings.php:872
 msgid "None"
 msgstr "Brak"
 
-#: mod/settings.php:863
+#: mod/settings.php:868
 msgid "Email login name:"
 msgstr "Nazwa logowania e-mail:"
 
-#: mod/settings.php:864
+#: mod/settings.php:869
 msgid "Email password:"
 msgstr "E-mail hasło:"
 
-#: mod/settings.php:865
+#: mod/settings.php:870
 msgid "Reply-to address:"
 msgstr "Adres zwrotny:"
 
-#: mod/settings.php:866
+#: mod/settings.php:871
 msgid "Send public posts to all email contacts:"
 msgstr "Wyślij publiczny wpis do wszystkich kontaktów e-mail:"
 
-#: mod/settings.php:867
+#: mod/settings.php:872
 msgid "Action after import:"
 msgstr "Akcja po zaimportowaniu:"
 
-#: mod/settings.php:867 src/Content/Nav.php:248
+#: mod/settings.php:872 src/Content/Nav.php:251
 msgid "Mark as seen"
 msgstr "Oznacz jako przeczytane"
 
-#: mod/settings.php:867
+#: mod/settings.php:872
 msgid "Move to folder"
 msgstr "Przenieś do folderu"
 
-#: mod/settings.php:868
+#: mod/settings.php:873
 msgid "Move to folder:"
 msgstr "Przenieś do folderu:"
 
-#: mod/settings.php:892 src/Module/Admin/Site.php:435
+#: mod/settings.php:897 src/Module/Admin/Site.php:434
 msgid "No special theme for mobile devices"
 msgstr "Brak specialnego motywu dla urządzeń mobilnych"
 
-#: mod/settings.php:900
+#: mod/settings.php:905
 #, php-format
 msgid "%s - (Unsupported)"
 msgstr "%s - (Nieobsługiwane)"
 
-#: mod/settings.php:902 src/Module/Admin/Site.php:452
+#: mod/settings.php:907 src/Module/Admin/Site.php:451
 #, php-format
 msgid "%s - (Experimental)"
 msgstr "%s- (Eksperymentalne)"
 
-#: mod/settings.php:930 src/Core/L10n.php:371 src/Model/Event.php:395
+#: mod/settings.php:935 src/Core/L10n/L10n.php:372 src/Model/Event.php:395
 msgid "Sunday"
 msgstr "Niedziela"
 
-#: mod/settings.php:930 src/Core/L10n.php:371 src/Model/Event.php:396
+#: mod/settings.php:935 src/Core/L10n/L10n.php:372 src/Model/Event.php:396
 msgid "Monday"
 msgstr "Poniedziałek"
 
-#: mod/settings.php:946
+#: mod/settings.php:951
 msgid "Display Settings"
 msgstr "Ustawienia wyglądu"
 
-#: mod/settings.php:952
+#: mod/settings.php:957
 msgid "Display Theme:"
 msgstr "Wyświetl motyw:"
 
-#: mod/settings.php:953
+#: mod/settings.php:958
 msgid "Mobile Theme:"
 msgstr "Motyw dla urządzeń mobilnych:"
 
-#: mod/settings.php:954
+#: mod/settings.php:959
 msgid "Suppress warning of insecure networks"
 msgstr "Ukryj ostrzeżenie przed niebezpiecznymi sieciami"
 
-#: mod/settings.php:954
+#: mod/settings.php:959
 msgid ""
 "Should the system suppress the warning that the current group contains "
 "members of networks that can't receive non public postings."
 msgstr "System powinien pominąć ostrzeżenie, że bieżąca grupa zawiera członków sieci, którzy nie mogą otrzymywać komentarzy niepublicznych"
 
-#: mod/settings.php:955
+#: mod/settings.php:960
 msgid "Update browser every xx seconds"
 msgstr "Odświeżaj stronę co xx sekund"
 
-#: mod/settings.php:955
+#: mod/settings.php:960
 msgid "Minimum of 10 seconds. Enter -1 to disable it."
 msgstr "Minimum 10 sekund. Wprowadź -1, aby go wyłączyć."
 
-#: mod/settings.php:956
+#: mod/settings.php:961
 msgid "Number of items to display per page:"
 msgstr "Liczba elementów do wyświetlenia na stronie:"
 
-#: mod/settings.php:956 mod/settings.php:957
+#: mod/settings.php:961 mod/settings.php:962
 msgid "Maximum of 100 items"
 msgstr "Maksymalnie 100 elementów"
 
-#: mod/settings.php:957
+#: mod/settings.php:962
 msgid "Number of items to display per page when viewed from mobile device:"
 msgstr "Liczba elementów do wyświetlenia na stronie podczas przeglądania z urządzenia mobilnego:"
 
-#: mod/settings.php:958
+#: mod/settings.php:963
 msgid "Don't show emoticons"
 msgstr "Nie pokazuj emotikonek"
 
-#: mod/settings.php:959
+#: mod/settings.php:964
 msgid "Calendar"
 msgstr "Kalendarz"
 
-#: mod/settings.php:960
+#: mod/settings.php:965
 msgid "Beginning of week:"
 msgstr "Początek tygodnia:"
 
-#: mod/settings.php:961
+#: mod/settings.php:966
 msgid "Don't show notices"
 msgstr "Nie pokazuj powiadomień"
 
-#: mod/settings.php:962
+#: mod/settings.php:967
 msgid "Infinite scroll"
 msgstr "Nieskończone przewijanie"
 
-#: mod/settings.php:963
+#: mod/settings.php:968
 msgid "Automatic updates only at the top of the network page"
 msgstr "Automatyczne aktualizacje tylko w górnej części strony sieci"
 
-#: mod/settings.php:963
+#: mod/settings.php:968
 msgid ""
 "When disabled, the network page is updated all the time, which could be "
 "confusing while reading."
 msgstr "Po wyłączeniu strona sieciowa jest cały czas aktualizowana, co może być mylące podczas czytania."
 
-#: mod/settings.php:964
+#: mod/settings.php:969
 msgid "Bandwidth Saver Mode"
 msgstr "Tryb oszczędzania przepustowości"
 
-#: mod/settings.php:964
+#: mod/settings.php:969
 msgid ""
 "When enabled, embedded content is not displayed on automatic updates, they "
 "only show on page reload."
 msgstr "Po włączeniu wbudowana zawartość nie jest wyświetlana w automatycznych aktualizacjach, wyświetlają się tylko przy przeładowaniu strony."
 
-#: mod/settings.php:965
+#: mod/settings.php:970
 msgid "Smart Threading"
 msgstr "Inteligentne wątki"
 
-#: mod/settings.php:965
+#: mod/settings.php:970
 msgid ""
 "When enabled, suppress extraneous thread indentation while keeping it where "
 "it matters. Only works if threading is available and enabled."
 msgstr "Włączenie tej opcji powoduje pomijanie wcięcia wątków zewnętrznych, zachowując je w dowolnym miejscu. Działa tylko wtedy, gdy wątki są dostępne i włączone."
 
-#: mod/settings.php:967
+#: mod/settings.php:972
 msgid "General Theme Settings"
 msgstr "Ogólne ustawienia motywu"
 
-#: mod/settings.php:968
+#: mod/settings.php:973
 msgid "Custom Theme Settings"
 msgstr "Niestandardowe ustawienia motywów"
 
-#: mod/settings.php:969
+#: mod/settings.php:974
 msgid "Content Settings"
 msgstr "Ustawienia zawartości"
 
-#: mod/settings.php:970 view/theme/duepuntozero/config.php:73
-#: view/theme/frio/config.php:122 view/theme/quattro/config.php:75
+#: mod/settings.php:975 view/theme/duepuntozero/config.php:73
+#: view/theme/frio/config.php:124 view/theme/quattro/config.php:75
 #: view/theme/vier/config.php:121
 msgid "Theme settings"
 msgstr "Ustawienia motywu"
 
-#: mod/settings.php:984
+#: mod/settings.php:989
 msgid "Unable to find your profile. Please contact your admin."
 msgstr "Nie można znaleźć Twojego profilu. Skontaktuj się z administratorem."
 
-#: mod/settings.php:1023
+#: mod/settings.php:1028
 msgid "Account Types"
 msgstr "Rodzaje kont"
 
-#: mod/settings.php:1024
+#: mod/settings.php:1029
 msgid "Personal Page Subtypes"
 msgstr "Podtypy osobistych stron"
 
-#: mod/settings.php:1025
+#: mod/settings.php:1030
 msgid "Community Forum Subtypes"
 msgstr "Podtypy społeczności forum"
 
-#: mod/settings.php:1032 src/Module/Admin/Users.php:229
+#: mod/settings.php:1037 src/Module/Admin/Users.php:229
 msgid "Personal Page"
 msgstr "Strona osobista"
 
-#: mod/settings.php:1033
+#: mod/settings.php:1038
 msgid "Account for a personal profile."
 msgstr "Konto dla profilu osobistego."
 
-#: mod/settings.php:1036 src/Module/Admin/Users.php:230
+#: mod/settings.php:1041 src/Module/Admin/Users.php:230
 msgid "Organisation Page"
 msgstr "Strona Organizacji"
 
-#: mod/settings.php:1037
+#: mod/settings.php:1042
 msgid ""
 "Account for an organisation that automatically approves contact requests as "
 "\"Followers\"."
 msgstr "Konto dla organizacji, która automatycznie zatwierdza prośby o kontakt jako \"Obserwatorzy\"."
 
-#: mod/settings.php:1040 src/Module/Admin/Users.php:231
+#: mod/settings.php:1045 src/Module/Admin/Users.php:231
 msgid "News Page"
 msgstr "Strona Wiadomości"
 
-#: mod/settings.php:1041
+#: mod/settings.php:1046
 msgid ""
 "Account for a news reflector that automatically approves contact requests as"
 " \"Followers\"."
 msgstr "Konto dla reflektora wiadomości, który automatycznie zatwierdza prośby o kontakt jako \"Obserwatorzy\"."
 
-#: mod/settings.php:1044 src/Module/Admin/Users.php:232
+#: mod/settings.php:1049 src/Module/Admin/Users.php:232
 msgid "Community Forum"
 msgstr "Forum społecznościowe"
 
-#: mod/settings.php:1045
+#: mod/settings.php:1050
 msgid "Account for community discussions."
 msgstr "Konto do dyskusji w społeczności."
 
-#: mod/settings.php:1048 src/Module/Admin/Users.php:222
+#: mod/settings.php:1053 src/Module/Admin/Users.php:222
 msgid "Normal Account Page"
 msgstr "Normalna strona konta"
 
-#: mod/settings.php:1049
+#: mod/settings.php:1054
 msgid ""
 "Account for a regular personal profile that requires manual approval of "
 "\"Friends\" and \"Followers\"."
 msgstr "Konto dla zwykłego profilu osobistego, który wymaga ręcznej zgody \"Przyjaciół\" i \"Obserwatorów\"."
 
-#: mod/settings.php:1052 src/Module/Admin/Users.php:223
+#: mod/settings.php:1057 src/Module/Admin/Users.php:223
 msgid "Soapbox Page"
 msgstr "Strona Soapbox"
 
-#: mod/settings.php:1053
+#: mod/settings.php:1058
 msgid ""
 "Account for a public profile that automatically approves contact requests as"
 " \"Followers\"."
 msgstr "Konto dla profilu publicznego, który automatycznie zatwierdza prośby o kontakt jako \"Obserwatorzy\"."
 
-#: mod/settings.php:1056 src/Module/Admin/Users.php:224
+#: mod/settings.php:1061 src/Module/Admin/Users.php:224
 msgid "Public Forum"
 msgstr "Forum publiczne"
 
-#: mod/settings.php:1057
+#: mod/settings.php:1062
 msgid "Automatically approves all contact requests."
 msgstr "Automatycznie zatwierdza wszystkie prośby o kontakt."
 
-#: mod/settings.php:1060 src/Module/Admin/Users.php:225
+#: mod/settings.php:1065 src/Module/Admin/Users.php:225
 msgid "Automatic Friend Page"
 msgstr "Automatyczna strona znajomego"
 
-#: mod/settings.php:1061
+#: mod/settings.php:1066
 msgid ""
 "Account for a popular profile that automatically approves contact requests "
 "as \"Friends\"."
 msgstr "Konto popularnego profilu, które automatycznie zatwierdza prośby o kontakt jako \"Przyjaciele\"."
 
-#: mod/settings.php:1064
+#: mod/settings.php:1069
 msgid "Private Forum [Experimental]"
 msgstr "Prywatne Forum [Eksperymentalne]"
 
-#: mod/settings.php:1065
+#: mod/settings.php:1070
 msgid "Requires manual approval of contact requests."
 msgstr "Wymaga ręcznego zatwierdzania żądań kontaktów."
 
-#: mod/settings.php:1076
+#: mod/settings.php:1081
 msgid "OpenID:"
 msgstr "OpenID:"
 
-#: mod/settings.php:1076
+#: mod/settings.php:1081
 msgid "(Optional) Allow this OpenID to login to this account."
 msgstr "(Opcjonalnie) Pozwól zalogować się na to konto przy pomocy OpenID."
 
-#: mod/settings.php:1084
+#: mod/settings.php:1089
 msgid "Publish your default profile in your local site directory?"
 msgstr "Opublikować Twój domyślny profil w Twoim lokalnym katalogu stron?"
 
-#: mod/settings.php:1084
+#: mod/settings.php:1089
 #, php-format
 msgid ""
 "Your profile will be published in this node's <a href=\"%s\">local "
@@ -3904,314 +3732,314 @@ msgid ""
 " system settings."
 msgstr "Twój profil zostanie opublikowany w lokalnym katalogu tego <a href=\"%s\">węzła</a>. Dane Twojego profilu mogą być publicznie widoczne w zależności od ustawień systemu."
 
-#: mod/settings.php:1090
+#: mod/settings.php:1095
 msgid "Publish your default profile in the global social directory?"
 msgstr "Opublikować Twój domyślny profil w globalnym, społecznościowym katalogu?"
 
-#: mod/settings.php:1090
+#: mod/settings.php:1095
 #, php-format
 msgid ""
 "Your profile will be published in the global friendica directories (e.g. <a "
 "href=\"%s\">%s</a>). Your profile will be visible in public."
 msgstr "Twój profil zostanie opublikowany w globalnych katalogach friendica (np.<a href=\"%s\">%s</a>). Twój profil będzie widoczny publicznie."
 
-#: mod/settings.php:1097
+#: mod/settings.php:1102
 msgid "Hide your contact/friend list from viewers of your default profile?"
 msgstr "Ukryć listę znajomych przed odwiedzającymi Twój profil?"
 
-#: mod/settings.php:1097
+#: mod/settings.php:1102
 msgid ""
 "Your contact list won't be shown in your default profile page. You can "
 "decide to show your contact list separately for each additional profile you "
 "create"
 msgstr "Twoja lista kontaktów nie będzie wyświetlana na domyślnej stronie profilu. Możesz zdecydować o wyświetleniu listy kontaktów osobno dla każdego tworzonego dodatkowego profilu."
 
-#: mod/settings.php:1101
+#: mod/settings.php:1106
 msgid "Hide your profile details from anonymous viewers?"
 msgstr "Ukryć dane Twojego profilu przed anonimowymi widzami?"
 
-#: mod/settings.php:1101
+#: mod/settings.php:1106
 msgid ""
 "Anonymous visitors will only see your profile picture, your display name and"
 " the nickname you are using on your profile page. Your public posts and "
 "replies will still be accessible by other means."
 msgstr "Anonimowi użytkownicy zobaczą tylko Twoje zdjęcie profilowe, swoją wyświetlaną nazwę i pseudonim, którego używasz na stronie profilu. Twoje publiczne posty i odpowiedzi będą nadal dostępne w inny sposób."
 
-#: mod/settings.php:1105
+#: mod/settings.php:1110
 msgid "Allow friends to post to your profile page?"
 msgstr "Zezwalać znajomym na publikowanie postów na stronie Twojego profilu?"
 
-#: mod/settings.php:1105
+#: mod/settings.php:1110
 msgid ""
 "Your contacts may write posts on your profile wall. These posts will be "
 "distributed to your contacts"
 msgstr "Twoi znajomi mogą pisać posty na stronie Twojego profilu. Posty zostaną przesłane do Twoich kontaktów."
 
-#: mod/settings.php:1109
+#: mod/settings.php:1114
 msgid "Allow friends to tag your posts?"
 msgstr "Zezwolić na oznaczanie Twoich postów przez znajomych?"
 
-#: mod/settings.php:1109
+#: mod/settings.php:1114
 msgid "Your contacts can add additional tags to your posts."
 msgstr "Twoje kontakty mogą dodawać do tagów dodatkowe posty."
 
-#: mod/settings.php:1113
+#: mod/settings.php:1118
 msgid "Allow us to suggest you as a potential friend to new members?"
 msgstr "Zezwolić na zaproponowanie Cię jako potencjalnego przyjaciela dla nowych członków?"
 
-#: mod/settings.php:1113
+#: mod/settings.php:1118
 msgid ""
 "If you like, Friendica may suggest new members to add you as a contact."
 msgstr "Jeśli chcesz, Friendica może zaproponować nowym członkom dodanie Cię jako kontakt."
 
-#: mod/settings.php:1117
+#: mod/settings.php:1122
 msgid "Permit unknown people to send you private mail?"
 msgstr "Zezwolić nieznanym osobom na wysyłanie prywatnych wiadomości?"
 
-#: mod/settings.php:1117
+#: mod/settings.php:1122
 msgid ""
 "Friendica network users may send you private messages even if they are not "
 "in your contact list."
 msgstr "Użytkownicy sieci w serwisie Friendica mogą wysyłać prywatne wiadomości, nawet jeśli nie znajdują się one na liście kontaktów."
 
-#: mod/settings.php:1121
+#: mod/settings.php:1126
 msgid "Profile is <strong>not published</strong>."
 msgstr "Profil <strong>nie jest opublikowany</strong>."
 
-#: mod/settings.php:1127
+#: mod/settings.php:1132
 #, php-format
 msgid "Your Identity Address is <strong>'%s'</strong> or '%s'."
 msgstr "Twój adres tożsamości to <strong>'%s'</strong> lub '%s'."
 
-#: mod/settings.php:1134
+#: mod/settings.php:1139
 msgid "Automatically expire posts after this many days:"
 msgstr "Posty wygasną automatycznie po następującej liczbie dni:"
 
-#: mod/settings.php:1134
+#: mod/settings.php:1139
 msgid "If empty, posts will not expire. Expired posts will be deleted"
 msgstr "Pole puste, wiadomość nie wygaśnie. Niezapisane wpisy zostaną usunięte."
 
-#: mod/settings.php:1135
+#: mod/settings.php:1140
 msgid "Advanced expiration settings"
 msgstr "Zaawansowane ustawienia wygaszania"
 
-#: mod/settings.php:1136
+#: mod/settings.php:1141
 msgid "Advanced Expiration"
 msgstr "Zaawansowane wygaszanie"
 
-#: mod/settings.php:1137
+#: mod/settings.php:1142
 msgid "Expire posts:"
 msgstr "Wygasające posty:"
 
-#: mod/settings.php:1138
+#: mod/settings.php:1143
 msgid "Expire personal notes:"
 msgstr "Wygaszanie osobistych notatek:"
 
-#: mod/settings.php:1139
+#: mod/settings.php:1144
 msgid "Expire starred posts:"
 msgstr "Wygaszaj posty oznaczone gwiazdką:"
 
-#: mod/settings.php:1140
+#: mod/settings.php:1145
 msgid "Expire photos:"
 msgstr "Wygasanie zdjęć:"
 
-#: mod/settings.php:1141
+#: mod/settings.php:1146
 msgid "Only expire posts by others:"
 msgstr "Wygaszaj tylko te posty, które zostały napisane przez inne osoby:"
 
-#: mod/settings.php:1171
+#: mod/settings.php:1176
 msgid "Account Settings"
 msgstr "Ustawienia konta"
 
-#: mod/settings.php:1179
+#: mod/settings.php:1184
 msgid "Password Settings"
 msgstr "Ustawienia hasła"
 
-#: mod/settings.php:1180 src/Module/Register.php:130
+#: mod/settings.php:1185 src/Module/Register.php:130
 msgid "New Password:"
 msgstr "Nowe hasło:"
 
-#: mod/settings.php:1180
+#: mod/settings.php:1185
 msgid ""
 "Allowed characters are a-z, A-Z, 0-9 and special characters except white "
 "spaces, accentuated letters and colon (:)."
 msgstr "Dozwolone znaki to a-z, A-Z, 0-9 i znaki specjalne, z wyjątkiem białych znaków, podkreślonych liter i dwukropka (:)."
 
-#: mod/settings.php:1181 src/Module/Register.php:131
+#: mod/settings.php:1186 src/Module/Register.php:131
 msgid "Confirm:"
 msgstr "Potwierdź:"
 
-#: mod/settings.php:1181
+#: mod/settings.php:1186
 msgid "Leave password fields blank unless changing"
 msgstr "Pozostaw pole hasła puste, jeżeli nie chcesz go zmienić."
 
-#: mod/settings.php:1182
+#: mod/settings.php:1187
 msgid "Current Password:"
 msgstr "Aktualne hasło:"
 
-#: mod/settings.php:1182 mod/settings.php:1183
+#: mod/settings.php:1187 mod/settings.php:1188
 msgid "Your current password to confirm the changes"
 msgstr "Wpisz aktualne hasło, aby potwierdzić zmiany"
 
-#: mod/settings.php:1183
+#: mod/settings.php:1188
 msgid "Password:"
 msgstr "Hasło:"
 
-#: mod/settings.php:1187
+#: mod/settings.php:1192
 msgid "Basic Settings"
 msgstr "Ustawienia podstawowe"
 
-#: mod/settings.php:1188 src/Model/Profile.php:745
+#: mod/settings.php:1193 src/Model/Profile.php:727
 msgid "Full Name:"
 msgstr "Imię i nazwisko:"
 
-#: mod/settings.php:1189
+#: mod/settings.php:1194
 msgid "Email Address:"
 msgstr "Adres email:"
 
-#: mod/settings.php:1190
+#: mod/settings.php:1195
 msgid "Your Timezone:"
 msgstr "Twoja strefa czasowa:"
 
-#: mod/settings.php:1191
+#: mod/settings.php:1196
 msgid "Your Language:"
 msgstr "Twój język:"
 
-#: mod/settings.php:1191
+#: mod/settings.php:1196
 msgid ""
 "Set the language we use to show you friendica interface and to send you "
 "emails"
 msgstr "Wybierz język, ktory bedzie używany do wyświetlania użytkownika friendica i wysłania Ci e-maili"
 
-#: mod/settings.php:1192
+#: mod/settings.php:1197
 msgid "Default Post Location:"
 msgstr "Domyślna lokalizacja wiadomości:"
 
-#: mod/settings.php:1193
+#: mod/settings.php:1198
 msgid "Use Browser Location:"
 msgstr "Używaj lokalizacji przeglądarki:"
 
-#: mod/settings.php:1196
+#: mod/settings.php:1201
 msgid "Security and Privacy Settings"
 msgstr "Ustawienia bezpieczeństwa i prywatności"
 
-#: mod/settings.php:1198
+#: mod/settings.php:1203
 msgid "Maximum Friend Requests/Day:"
 msgstr "Maksymalna dzienna liczba zaproszeń do grona przyjaciół:"
 
-#: mod/settings.php:1198 mod/settings.php:1227
+#: mod/settings.php:1203 mod/settings.php:1232
 msgid "(to prevent spam abuse)"
 msgstr "(aby zapobiec spamowaniu)"
 
-#: mod/settings.php:1199
+#: mod/settings.php:1204
 msgid "Default Post Permissions"
 msgstr "Domyślne prawa dostępu wiadomości"
 
-#: mod/settings.php:1200
+#: mod/settings.php:1205
 msgid "(click to open/close)"
 msgstr "(kliknij by otworzyć/zamknąć)"
 
-#: mod/settings.php:1210
+#: mod/settings.php:1215
 msgid "Default Private Post"
 msgstr "Domyślny Prywatny Wpis"
 
-#: mod/settings.php:1211
+#: mod/settings.php:1216
 msgid "Default Public Post"
 msgstr "Domyślny Publiczny Post"
 
-#: mod/settings.php:1215
+#: mod/settings.php:1220
 msgid "Default Permissions for New Posts"
 msgstr "Uprawnienia domyślne dla nowych postów"
 
-#: mod/settings.php:1227
+#: mod/settings.php:1232
 msgid "Maximum private messages per day from unknown people:"
 msgstr "Maksymalna liczba prywatnych wiadomości dziennie od nieznanych osób:"
 
-#: mod/settings.php:1230
+#: mod/settings.php:1235
 msgid "Notification Settings"
 msgstr "Ustawienia powiadomień"
 
-#: mod/settings.php:1231
+#: mod/settings.php:1236
 msgid "Send a notification email when:"
 msgstr "Wysyłaj powiadmonienia na email, kiedy:"
 
-#: mod/settings.php:1232
+#: mod/settings.php:1237
 msgid "You receive an introduction"
 msgstr "Otrzymałeś zaproszenie"
 
-#: mod/settings.php:1233
+#: mod/settings.php:1238
 msgid "Your introductions are confirmed"
 msgstr "Twoje zaproszenie jest potwierdzone"
 
-#: mod/settings.php:1234
+#: mod/settings.php:1239
 msgid "Someone writes on your profile wall"
 msgstr "Ktoś pisze na twoim profilu"
 
-#: mod/settings.php:1235
+#: mod/settings.php:1240
 msgid "Someone writes a followup comment"
 msgstr "Ktoś pisze komentarz nawiązujący."
 
-#: mod/settings.php:1236
+#: mod/settings.php:1241
 msgid "You receive a private message"
 msgstr "Otrzymałeś prywatną wiadomość"
 
-#: mod/settings.php:1237
+#: mod/settings.php:1242
 msgid "You receive a friend suggestion"
 msgstr "Otrzymałeś propozycję od znajomych"
 
-#: mod/settings.php:1238
+#: mod/settings.php:1243
 msgid "You are tagged in a post"
 msgstr "Jesteś oznaczony tagiem w poście"
 
-#: mod/settings.php:1239
+#: mod/settings.php:1244
 msgid "You are poked/prodded/etc. in a post"
 msgstr "Jesteś zaczepiony/zaczepiona/itp. w poście"
 
-#: mod/settings.php:1241
+#: mod/settings.php:1246
 msgid "Activate desktop notifications"
 msgstr "Aktywuj powiadomienia na pulpicie"
 
-#: mod/settings.php:1241
+#: mod/settings.php:1246
 msgid "Show desktop popup on new notifications"
 msgstr "Pokazuj wyskakujące okienko gdy otrzymasz powiadomienie"
 
-#: mod/settings.php:1243
+#: mod/settings.php:1248
 msgid "Text-only notification emails"
 msgstr "E-maile z powiadomieniami tekstowymi"
 
-#: mod/settings.php:1245
+#: mod/settings.php:1250
 msgid "Send text only notification emails, without the html part"
 msgstr "Wysyłaj tylko e-maile z powiadomieniami tekstowymi, bez części html"
 
-#: mod/settings.php:1247
+#: mod/settings.php:1252
 msgid "Show detailled notifications"
 msgstr "Pokazuj szczegółowe powiadomienia"
 
-#: mod/settings.php:1249
+#: mod/settings.php:1254
 msgid ""
 "Per default, notifications are condensed to a single notification per item. "
 "When enabled every notification is displayed."
 msgstr "Domyślne powiadomienia są skondensowane z jednym powiadomieniem dla każdego przedmiotu. Po włączeniu wyświetlane jest każde powiadomienie."
 
-#: mod/settings.php:1251
+#: mod/settings.php:1256
 msgid "Advanced Account/Page Type Settings"
 msgstr "Zaawansowane ustawienia konta/rodzaju strony"
 
-#: mod/settings.php:1252
+#: mod/settings.php:1257
 msgid "Change the behaviour of this account for special situations"
 msgstr "Zmień zachowanie tego konta w sytuacjach specjalnych"
 
-#: mod/settings.php:1255
+#: mod/settings.php:1260
 msgid "Relocate"
 msgstr "Przeniesienie"
 
-#: mod/settings.php:1256
+#: mod/settings.php:1261
 msgid ""
 "If you have moved this profile from another server, and some of your "
 "contacts don't receive your updates, try pushing this button."
 msgstr "Jeśli ten profil został przeniesiony z innego serwera, a niektóre z Twoich kontaktów nie otrzymają aktualizacji, spróbuj nacisnąć ten przycisk."
 
-#: mod/settings.php:1257
+#: mod/settings.php:1262
 msgid "Resend relocate message to contacts"
 msgstr "Wyślij ponownie przenieść wiadomości do kontaktów"
 
@@ -4238,7 +4066,7 @@ msgstr "Czy na pewno chcesz usunąć te sugestie ?"
 msgid "Ignore/Hide"
 msgstr "Ignoruj/Ukryj"
 
-#: mod/suggest.php:119 src/Content/Widget.php:66 view/theme/vier/theme.php:204
+#: mod/suggest.php:119 src/Content/Widget.php:69 view/theme/vier/theme.php:204
 msgid "Friend Suggestions"
 msgstr "Osoby, które możesz znać"
 
@@ -4254,21 +4082,21 @@ msgstr "Usuń pozycję Tag"
 msgid "Select a tag to remove: "
 msgstr "Wybierz tag do usunięcia: "
 
-#: mod/uexport.php:45
+#: mod/uexport.php:52
 msgid "Export account"
 msgstr "Eksportuj konto"
 
-#: mod/uexport.php:45
+#: mod/uexport.php:52
 msgid ""
 "Export your account info and contacts. Use this to make a backup of your "
 "account and/or to move it to another server."
 msgstr "Eksportuj informacje o swoim koncie i kontaktach. Użyj tego do utworzenia kopii zapasowej konta i/lub przeniesienia go na inny serwer."
 
-#: mod/uexport.php:46
+#: mod/uexport.php:53
 msgid "Export all"
 msgstr "Eksportuj wszystko"
 
-#: mod/uexport.php:46
+#: mod/uexport.php:53
 msgid ""
 "Export your accout info, contacts and all your items as json. Could be a "
 "very big file, and could take a lot of time. Use this to make a full backup "
@@ -4332,7 +4160,7 @@ msgstr "Brak obserwowania nie jest obecnie obsługiwany przez twoją sieć."
 msgid "Contact unfollowed"
 msgstr "Skontaktuj się z obserwowanym"
 
-#: mod/unfollow.php:118 src/Module/Contact.php:573
+#: mod/unfollow.php:118
 msgid "Disconnect/Unfollow"
 msgstr "Rozłącz/Nie obserwuj"
 
@@ -4346,7 +4174,7 @@ msgstr "[Dodatkowa zawartość - odśwież stronę by zobaczyć]"
 msgid "No videos selected"
 msgstr "Nie zaznaczono filmów"
 
-#: mod/videos.php:280 src/Model/Item.php:3421
+#: mod/videos.php:280 src/Model/Item.php:3436
 msgid "View Video"
 msgstr "Zobacz film"
 
@@ -4358,23 +4186,6 @@ msgstr "Ostatnio dodane filmy"
 msgid "Upload New Videos"
 msgstr "Wstaw nowe filmy"
 
-#: mod/viewcontacts.php:78
-msgid "No contacts."
-msgstr "Brak kontaktów."
-
-#: mod/viewcontacts.php:94 src/Module/Contact.php:606
-#: src/Module/Contact.php:1027
-#, php-format
-msgid "Visit %s's profile [%s]"
-msgstr "Obejrzyj %s's profil [%s]"
-
-#: mod/viewcontacts.php:114 src/Content/Nav.php:202 src/Content/Nav.php:268
-#: src/Content/Text/HTML.php:911 src/Model/Profile.php:974
-#: src/Model/Profile.php:977 src/Module/Contact.php:814
-#: src/Module/Contact.php:884 view/theme/frio/theme.php:273
-msgid "Contacts"
-msgstr "Kontakty"
-
 #: mod/wallmessage.php:52 mod/wallmessage.php:115
 #, php-format
 msgid "Number of daily wall messages for %s exceeded. Message failed."
@@ -4422,19 +4233,19 @@ msgstr "Przesyłanie pliku nie powiodło się."
 msgid "Wall Photos"
 msgstr "Tablica zdjęć"
 
-#: src/App.php:505
+#: src/App.php:532
 msgid "Delete this item?"
 msgstr "Usunąć ten element?"
 
-#: src/App.php:547
+#: src/App.php:574
 msgid "toggle mobile"
 msgstr "przełącz na mobilny"
 
-#: src/App.php:863
+#: src/App.php:890
 msgid "No system theme config value set."
 msgstr "Nie ustawiono wartości konfiguracyjnej zestawu tematycznego."
 
-#: src/App.php:1163
+#: src/App.php:1178
 msgid "You must be logged in to use addons. "
 msgstr "Musisz być zalogowany(-a), aby korzystać z dodatków. "
 
@@ -4453,14 +4264,14 @@ msgstr "Nie można znaleźć żadnego wpisu kontaktu zarchiwizowanego dla tego a
 msgid "The contact entries have been archived"
 msgstr "Wpisy kontaktów zostały zarchiwizowane"
 
-#: src/Console/GlobalCommunityBlock.php:65
-#: src/Module/Admin/Blocklist/Contact.php:29
+#: src/Console/GlobalCommunityBlock.php:66
+#: src/Module/Admin/Blocklist/Contact.php:30
 #, php-format
 msgid "Could not find any contact entry for this URL (%s)"
 msgstr "Nie można znaleźć żadnego kontaktu dla tego adresu URL (%s)"
 
-#: src/Console/GlobalCommunityBlock.php:68
-#: src/Module/Admin/Blocklist/Contact.php:27
+#: src/Console/GlobalCommunityBlock.php:71
+#: src/Module/Admin/Blocklist/Contact.php:28
 msgid "The contact has been blocked from the node"
 msgstr "Kontakt został zablokowany w węźle"
 
@@ -4693,118 +4504,114 @@ msgid "Lonely"
 msgstr "Samotny(-a)"
 
 #: src/Content/ContactSelector.php:234
-msgid "Available"
-msgstr "Dostępny(-a)"
+msgid "In a relation"
+msgstr "W relacji"
 
 #: src/Content/ContactSelector.php:235
-msgid "Unavailable"
-msgstr "Niedostępny(-a)"
-
-#: src/Content/ContactSelector.php:236
 msgid "Has crush"
 msgstr "Ma sympatię"
 
-#: src/Content/ContactSelector.php:237
+#: src/Content/ContactSelector.php:236
 msgid "Infatuated"
 msgstr "Zakochany(-a)"
 
-#: src/Content/ContactSelector.php:238
+#: src/Content/ContactSelector.php:237
 msgid "Dating"
 msgstr "Randki"
 
-#: src/Content/ContactSelector.php:239
+#: src/Content/ContactSelector.php:238
 msgid "Unfaithful"
 msgstr "Niewierny(-a)"
 
-#: src/Content/ContactSelector.php:240
+#: src/Content/ContactSelector.php:239
 msgid "Sex Addict"
 msgstr "Uzależniony(-a) od seksu"
 
-#: src/Content/ContactSelector.php:241 src/Model/User.php:729
+#: src/Content/ContactSelector.php:240 src/Model/User.php:762
 msgid "Friends"
 msgstr "Przyjaciele"
 
-#: src/Content/ContactSelector.php:242
+#: src/Content/ContactSelector.php:241
 msgid "Friends/Benefits"
 msgstr "Przyjaciele/Korzyści"
 
-#: src/Content/ContactSelector.php:243
+#: src/Content/ContactSelector.php:242
 msgid "Casual"
 msgstr "Przypadkowy"
 
-#: src/Content/ContactSelector.php:244
+#: src/Content/ContactSelector.php:243
 msgid "Engaged"
 msgstr "Zaręczony(-a)"
 
-#: src/Content/ContactSelector.php:245
+#: src/Content/ContactSelector.php:244
 msgid "Married"
 msgstr "W związku małżeńskim"
 
-#: src/Content/ContactSelector.php:246
+#: src/Content/ContactSelector.php:245
 msgid "Imaginarily married"
 msgstr "Fikcyjnie w związku małżeńskim"
 
-#: src/Content/ContactSelector.php:247
+#: src/Content/ContactSelector.php:246
 msgid "Partners"
 msgstr "Partnerzy"
 
-#: src/Content/ContactSelector.php:248
+#: src/Content/ContactSelector.php:247
 msgid "Cohabiting"
 msgstr "Konkubinat"
 
-#: src/Content/ContactSelector.php:249
+#: src/Content/ContactSelector.php:248
 msgid "Common law"
 msgstr "Prawo zwyczajowe"
 
-#: src/Content/ContactSelector.php:250
+#: src/Content/ContactSelector.php:249
 msgid "Happy"
 msgstr "Szczęśliwy(-a)"
 
-#: src/Content/ContactSelector.php:251
+#: src/Content/ContactSelector.php:250
 msgid "Not looking"
 msgstr "Nie szukam"
 
-#: src/Content/ContactSelector.php:252
+#: src/Content/ContactSelector.php:251
 msgid "Swinger"
 msgstr "Swinger"
 
-#: src/Content/ContactSelector.php:253
+#: src/Content/ContactSelector.php:252
 msgid "Betrayed"
 msgstr "Zdradzony(-a)"
 
-#: src/Content/ContactSelector.php:254
+#: src/Content/ContactSelector.php:253
 msgid "Separated"
 msgstr "W separacji"
 
-#: src/Content/ContactSelector.php:255
+#: src/Content/ContactSelector.php:254
 msgid "Unstable"
 msgstr "Niestabilny"
 
-#: src/Content/ContactSelector.php:256
+#: src/Content/ContactSelector.php:255
 msgid "Divorced"
 msgstr "Rozwiedziony(-a)"
 
-#: src/Content/ContactSelector.php:257
+#: src/Content/ContactSelector.php:256
 msgid "Imaginarily divorced"
 msgstr "Fikcyjnie rozwiedziony(-a)"
 
-#: src/Content/ContactSelector.php:258
+#: src/Content/ContactSelector.php:257
 msgid "Widowed"
 msgstr "Wdowiec"
 
-#: src/Content/ContactSelector.php:259
+#: src/Content/ContactSelector.php:258
 msgid "Uncertain"
 msgstr "Nieokreślony(-a)"
 
-#: src/Content/ContactSelector.php:260
+#: src/Content/ContactSelector.php:259
 msgid "It's complicated"
 msgstr "To skomplikowane"
 
-#: src/Content/ContactSelector.php:261
+#: src/Content/ContactSelector.php:260
 msgid "Don't care"
 msgstr "Nie przejmuj się"
 
-#: src/Content/ContactSelector.php:262
+#: src/Content/ContactSelector.php:261
 msgid "Ask me"
 msgstr "Zapytaj mnie"
 
@@ -4865,6 +4672,10 @@ msgstr "Dodaj wyraźne wzmianki do pola komentarza, aby ręcznie kontrolować, k
 msgid "Network Sidebar"
 msgstr "Sieć Pasek Boczny"
 
+#: src/Content/Feature.php:99 src/Content/Widget.php:501
+msgid "Archives"
+msgstr "Archiwum"
+
 #: src/Content/Feature.php:99
 msgid "Ability to select posts by date ranges"
 msgstr "Wybierz wpisy według zakresów dat"
@@ -4937,8 +4748,8 @@ msgstr "Wyświetl datę członkostwa"
 msgid "Display membership date in profile"
 msgstr "Wyświetla datę członkostwa w profilu"
 
-#: src/Content/ForumManager.php:130 src/Content/Nav.php:206
-#: src/Content/Text/HTML.php:914 view/theme/vier/theme.php:250
+#: src/Content/ForumManager.php:130 src/Content/Nav.php:209
+#: src/Content/Text/HTML.php:894 view/theme/vier/theme.php:250
 msgid "Forums"
 msgstr "Fora"
 
@@ -4946,251 +4757,263 @@ msgstr "Fora"
 msgid "External link to forum"
 msgstr "Zewnętrzny link do forum"
 
-#: src/Content/Nav.php:73
+#: src/Content/ForumManager.php:135 src/Content/Widget.php:407
+#: src/Content/Widget.php:507 view/theme/vier/theme.php:255
+msgid "show more"
+msgstr "pokaż więcej"
+
+#: src/Content/Nav.php:74
 msgid "Nothing new here"
 msgstr "Brak nowych zdarzeń"
 
-#: src/Content/Nav.php:77
+#: src/Content/Nav.php:78
 msgid "Clear notifications"
 msgstr "Wyczyść powiadomienia"
 
-#: src/Content/Nav.php:78 src/Content/Text/HTML.php:903
+#: src/Content/Nav.php:79 src/Content/Text/HTML.php:883
 msgid "@name, !forum, #tags, content"
 msgstr "@imię, !forum, #tagi, treść"
 
-#: src/Content/Nav.php:152 src/Module/Login.php:324
-#: view/theme/frio/theme.php:259
+#: src/Content/Nav.php:153 src/Module/Login.php:315
 msgid "Logout"
 msgstr "Wyloguj"
 
-#: src/Content/Nav.php:152 view/theme/frio/theme.php:259
+#: src/Content/Nav.php:153
 msgid "End this session"
 msgstr "Zakończ sesję"
 
-#: src/Content/Nav.php:155 src/Model/Profile.php:895
-#: src/Module/Contact.php:655 src/Module/Contact.php:856
-#: src/Module/Settings/TwoFactor/Index.php:85 view/theme/frio/theme.php:262
+#: src/Content/Nav.php:155 src/Module/Bookmarklet.php:25
+#: src/Module/Login.php:316
+msgid "Login"
+msgstr "Zaloguj się"
+
+#: src/Content/Nav.php:155
+msgid "Sign in"
+msgstr "Zaloguj się"
+
+#: src/Content/Nav.php:160 src/Model/Profile.php:880
+#: src/Module/Contact.php:654 src/Module/Contact.php:856
+#: src/Module/Settings/TwoFactor/Index.php:91 view/theme/frio/theme.php:259
 msgid "Status"
 msgstr "Status"
 
-#: src/Content/Nav.php:155 src/Content/Nav.php:241
-#: view/theme/frio/theme.php:262
+#: src/Content/Nav.php:160 src/Content/Nav.php:244
+#: view/theme/frio/theme.php:259
 msgid "Your posts and conversations"
 msgstr "Twoje posty i rozmowy"
 
-#: src/Content/Nav.php:156 view/theme/frio/theme.php:263
+#: src/Content/Nav.php:161 view/theme/frio/theme.php:260
 msgid "Your profile page"
 msgstr "Twoja strona profilowa"
 
-#: src/Content/Nav.php:157 view/theme/frio/theme.php:264
+#: src/Content/Nav.php:162 view/theme/frio/theme.php:261
 msgid "Your photos"
 msgstr "Twoje zdjęcia"
 
-#: src/Content/Nav.php:158 src/Model/Profile.php:919 src/Model/Profile.php:922
-#: view/theme/frio/theme.php:265
+#: src/Content/Nav.php:163 src/Model/Profile.php:904 src/Model/Profile.php:907
+#: view/theme/frio/theme.php:262
 msgid "Videos"
 msgstr "Filmy"
 
-#: src/Content/Nav.php:158 view/theme/frio/theme.php:265
+#: src/Content/Nav.php:163 view/theme/frio/theme.php:262
 msgid "Your videos"
 msgstr "Twoje filmy"
 
-#: src/Content/Nav.php:159 view/theme/frio/theme.php:266
+#: src/Content/Nav.php:164 view/theme/frio/theme.php:263
 msgid "Your events"
 msgstr "Twoje wydarzenia"
 
-#: src/Content/Nav.php:160
+#: src/Content/Nav.php:165
 msgid "Personal notes"
 msgstr "Notatki"
 
-#: src/Content/Nav.php:160
+#: src/Content/Nav.php:165
 msgid "Your personal notes"
 msgstr "Twoje prywatne notatki"
 
-#: src/Content/Nav.php:169 src/Module/Bookmarklet.php:25
-#: src/Module/Login.php:325
-msgid "Login"
-msgstr "Zaloguj się"
-
-#: src/Content/Nav.php:169
-msgid "Sign in"
-msgstr "Zaloguj się"
-
-#: src/Content/Nav.php:179 src/Content/Nav.php:241
+#: src/Content/Nav.php:182 src/Content/Nav.php:244
 #: src/Core/NotificationsManager.php:165
 msgid "Home"
 msgstr "Strona domowa"
 
-#: src/Content/Nav.php:179
+#: src/Content/Nav.php:182
 msgid "Home Page"
 msgstr "Strona startowa"
 
-#: src/Content/Nav.php:183 src/Module/Login.php:296
+#: src/Content/Nav.php:186 src/Module/Login.php:287
 #: src/Module/Register.php:136
 msgid "Register"
 msgstr "Zarejestruj"
 
-#: src/Content/Nav.php:183
+#: src/Content/Nav.php:186
 msgid "Create an account"
 msgstr "Załóż konto"
 
-#: src/Content/Nav.php:189 src/Module/Help.php:50
-#: src/Module/Settings/TwoFactor/Index.php:84
+#: src/Content/Nav.php:192 src/Module/Help.php:50
+#: src/Module/Settings/TwoFactor/AppSpecific.php:99
+#: src/Module/Settings/TwoFactor/Index.php:90
 #: src/Module/Settings/TwoFactor/Recovery.php:77
 #: src/Module/Settings/TwoFactor/Verify.php:117 view/theme/vier/theme.php:294
 msgid "Help"
 msgstr "Pomoc"
 
-#: src/Content/Nav.php:189
+#: src/Content/Nav.php:192
 msgid "Help and documentation"
 msgstr "Pomoc i dokumentacja"
 
-#: src/Content/Nav.php:193
+#: src/Content/Nav.php:196
 msgid "Apps"
 msgstr "Aplikacje"
 
-#: src/Content/Nav.php:193
+#: src/Content/Nav.php:196
 msgid "Addon applications, utilities, games"
 msgstr "Wtyczki, aplikacje, narzędzia, gry"
 
-#: src/Content/Nav.php:197
+#: src/Content/Nav.php:200
 msgid "Search site content"
 msgstr "Przeszukaj zawartość strony"
 
-#: src/Content/Nav.php:200 src/Content/Text/HTML.php:909
+#: src/Content/Nav.php:203 src/Content/Text/HTML.php:889
 msgid "Full Text"
 msgstr "Pełny tekst"
 
-#: src/Content/Nav.php:201 src/Content/Text/HTML.php:910
+#: src/Content/Nav.php:204 src/Content/Text/HTML.php:890
 #: src/Content/Widget/TagCloud.php:54
 msgid "Tags"
 msgstr "Tagi"
 
-#: src/Content/Nav.php:221
+#: src/Content/Nav.php:205 src/Content/Nav.php:271
+#: src/Content/Text/HTML.php:891 src/Model/Profile.php:959
+#: src/Model/Profile.php:962 src/Module/Contact.php:800
+#: src/Module/Contact.php:884 view/theme/frio/theme.php:270
+msgid "Contacts"
+msgstr "Kontakty"
+
+#: src/Content/Nav.php:224
 msgid "Community"
 msgstr "Społeczność"
 
-#: src/Content/Nav.php:221
+#: src/Content/Nav.php:224
 msgid "Conversations on this and other servers"
 msgstr "Rozmowy na tym i innych serwerach"
 
-#: src/Content/Nav.php:225 src/Model/Profile.php:934 src/Model/Profile.php:945
-#: view/theme/frio/theme.php:270
+#: src/Content/Nav.php:228 src/Model/Profile.php:919 src/Model/Profile.php:930
+#: view/theme/frio/theme.php:267
 msgid "Events and Calendar"
 msgstr "Wydarzenia i kalendarz"
 
-#: src/Content/Nav.php:228
+#: src/Content/Nav.php:231
 msgid "Directory"
 msgstr "Katalog"
 
-#: src/Content/Nav.php:228
+#: src/Content/Nav.php:231
 msgid "People directory"
 msgstr "Katalog osób"
 
-#: src/Content/Nav.php:230 src/Module/BaseAdminModule.php:75
+#: src/Content/Nav.php:233 src/Module/BaseAdminModule.php:75
 msgid "Information"
 msgstr "Informacje"
 
-#: src/Content/Nav.php:230
+#: src/Content/Nav.php:233
 msgid "Information about this friendica instance"
 msgstr "Informacje o tej instancji friendica"
 
-#: src/Content/Nav.php:233 src/Module/Admin/Tos.php:43
+#: src/Content/Nav.php:236 src/Module/Admin/Tos.php:43
 #: src/Module/BaseAdminModule.php:85 src/Module/Register.php:144
 #: src/Module/Tos.php:73
 msgid "Terms of Service"
 msgstr "Warunki usługi"
 
-#: src/Content/Nav.php:233
+#: src/Content/Nav.php:236
 msgid "Terms of Service of this Friendica instance"
 msgstr "Warunki świadczenia usług tej instancji Friendica"
 
-#: src/Content/Nav.php:238 src/Core/NotificationsManager.php:151
-#: view/theme/frio/theme.php:269
+#: src/Content/Nav.php:241 src/Core/NotificationsManager.php:151
+#: view/theme/frio/theme.php:266
 msgid "Network"
 msgstr "Sieć"
 
-#: src/Content/Nav.php:238 view/theme/frio/theme.php:269
+#: src/Content/Nav.php:241 view/theme/frio/theme.php:266
 msgid "Conversations from your friends"
 msgstr "Rozmowy Twoich przyjaciół"
 
-#: src/Content/Nav.php:239
+#: src/Content/Nav.php:242
 msgid "Network Reset"
 msgstr "Resetowanie sieci"
 
-#: src/Content/Nav.php:239
+#: src/Content/Nav.php:242
 msgid "Load Network page with no filters"
 msgstr "Załaduj stronę sieci bez filtrów"
 
-#: src/Content/Nav.php:245 src/Core/NotificationsManager.php:172
+#: src/Content/Nav.php:248 src/Core/NotificationsManager.php:172
 msgid "Introductions"
 msgstr "Zapoznanie"
 
-#: src/Content/Nav.php:245
+#: src/Content/Nav.php:248
 msgid "Friend Requests"
 msgstr "Prośba o przyjęcie do grona znajomych"
 
-#: src/Content/Nav.php:247
+#: src/Content/Nav.php:250
 msgid "See all notifications"
 msgstr "Zobacz wszystkie powiadomienia"
 
-#: src/Content/Nav.php:248
+#: src/Content/Nav.php:251
 msgid "Mark all system notifications seen"
 msgstr "Oznacz wszystkie powiadomienia systemu jako przeczytane"
 
-#: src/Content/Nav.php:251 view/theme/frio/theme.php:271
+#: src/Content/Nav.php:254 view/theme/frio/theme.php:268
 msgid "Private mail"
 msgstr "Prywatne maile"
 
-#: src/Content/Nav.php:252
+#: src/Content/Nav.php:255
 msgid "Inbox"
 msgstr "Odebrane"
 
-#: src/Content/Nav.php:253
+#: src/Content/Nav.php:256
 msgid "Outbox"
 msgstr "Wysłane"
 
-#: src/Content/Nav.php:257
+#: src/Content/Nav.php:260
 msgid "Manage"
 msgstr "Zarządzaj"
 
-#: src/Content/Nav.php:257
+#: src/Content/Nav.php:260
 msgid "Manage other pages"
 msgstr "Zarządzaj innymi stronami"
 
-#: src/Content/Nav.php:262 view/theme/frio/theme.php:272
+#: src/Content/Nav.php:265 view/theme/frio/theme.php:269
 msgid "Account settings"
 msgstr "Ustawienia konta"
 
-#: src/Content/Nav.php:265
+#: src/Content/Nav.php:268
 msgid "Manage/Edit Profiles"
 msgstr "Zarządzaj/Edytuj profile"
 
-#: src/Content/Nav.php:268 view/theme/frio/theme.php:273
+#: src/Content/Nav.php:271 view/theme/frio/theme.php:270
 msgid "Manage/edit friends and contacts"
 msgstr "Zarządzaj listą przyjaciół i kontaktami"
 
-#: src/Content/Nav.php:273 src/Module/BaseAdminModule.php:114
+#: src/Content/Nav.php:276 src/Module/BaseAdminModule.php:114
 msgid "Admin"
 msgstr "Administator"
 
-#: src/Content/Nav.php:273
+#: src/Content/Nav.php:276
 msgid "Site setup and configuration"
 msgstr "Konfiguracja i ustawienia instancji"
 
-#: src/Content/Nav.php:276
+#: src/Content/Nav.php:279
 msgid "Navigation"
 msgstr "Nawigacja"
 
-#: src/Content/Nav.php:276
+#: src/Content/Nav.php:279
 msgid "Site map"
 msgstr "Mapa strony"
 
-#: src/Content/OEmbed.php:255
+#: src/Content/OEmbed.php:254
 msgid "Embedding disabled"
 msgstr "Osadzanie wyłączone"
 
-#: src/Content/OEmbed.php:378
+#: src/Content/OEmbed.php:377
 msgid "Embedded content"
 msgstr "Osadzona zawartość"
 
@@ -5210,50 +5033,51 @@ msgstr "poprzedni"
 msgid "last"
 msgstr "ostatni"
 
-#: src/Content/Text/BBCode.php:430
+#: src/Content/Text/BBCode.php:432
 msgid "view full size"
 msgstr "zobacz pełny rozmiar"
 
-#: src/Content/Text/BBCode.php:864 src/Content/Text/BBCode.php:1591
-#: src/Content/Text/BBCode.php:1592
+#: src/Content/Text/BBCode.php:866 src/Content/Text/BBCode.php:1499
+#: src/Content/Text/BBCode.php:1500
 msgid "Image/photo"
 msgstr "Obrazek/zdjęcie"
 
-#: src/Content/Text/BBCode.php:972
+#: src/Content/Text/BBCode.php:984
 #, 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/Content/Text/BBCode.php:1518 src/Content/Text/BBCode.php:1540
+#: src/Content/Text/BBCode.php:1426 src/Content/Text/BBCode.php:1448
 msgid "$1 wrote:"
 msgstr "$1 napisał:"
 
-#: src/Content/Text/BBCode.php:1602 src/Content/Text/BBCode.php:1603
+#: src/Content/Text/BBCode.php:1502 src/Content/Text/BBCode.php:1503
 msgid "Encrypted content"
 msgstr "Szyfrowana treść"
 
-#: src/Content/Text/BBCode.php:1710
+#: src/Content/Text/BBCode.php:1724
 msgid "Invalid source protocol"
 msgstr "Nieprawidłowy protokół źródłowy"
 
-#: src/Content/Text/BBCode.php:1721
+#: src/Content/Text/BBCode.php:1735
 msgid "Invalid link protocol"
 msgstr "Niepoprawny link protokołu"
 
-#: src/Content/Text/HTML.php:800
+#: src/Content/Text/HTML.php:780
 msgid "Loading more entries..."
 msgstr "Ładuję więcej wpisów..."
 
-#: src/Content/Text/HTML.php:801
+#: src/Content/Text/HTML.php:781
 msgid "The end"
 msgstr "Koniec"
 
-#: src/Content/Text/HTML.php:894
+#: src/Content/Text/HTML.php:874 src/Model/Profile.php:507
+#: src/Module/Contact.php:335
 msgid "Follow"
 msgstr "Śledź"
 
-#: src/Content/Text/HTML.php:951 src/Model/Item.php:3471
-#: src/Model/Item.php:3482
+#: src/Content/Text/HTML.php:931 src/Model/Item.php:3486
+#: src/Model/Item.php:3497
 msgid "Click to open/close"
 msgstr "Kliknij aby otworzyć/zamknąć"
 
@@ -5286,19 +5110,19 @@ msgstr[3] "%d Kontakty"
 msgid "View Contacts"
 msgstr "Widok kontaktów"
 
-#: src/Content/Widget.php:35
+#: src/Content/Widget.php:38
 msgid "Add New Contact"
 msgstr "Dodaj nowy kontakt"
 
-#: src/Content/Widget.php:36
+#: src/Content/Widget.php:39
 msgid "Enter address or web location"
 msgstr "Wpisz adres lub lokalizację sieciową"
 
-#: src/Content/Widget.php:37
+#: src/Content/Widget.php:40
 msgid "Example: bob@example.com, http://example.com/barbara"
 msgstr "Przykład: bob@przykład.com, http://przykład.com/barbara"
 
-#: src/Content/Widget.php:55
+#: src/Content/Widget.php:58
 #, php-format
 msgid "%d invitation available"
 msgid_plural "%d invitations available"
@@ -5307,65 +5131,89 @@ msgstr[1] "%d zaproszeń dostępnych"
 msgstr[2] "%d zaproszenia dostępne"
 msgstr[3] "%d zaproszenia dostępne"
 
-#: src/Content/Widget.php:61 view/theme/vier/theme.php:199
+#: src/Content/Widget.php:64 view/theme/vier/theme.php:199
 msgid "Find People"
 msgstr "Znajdź ludzi"
 
-#: src/Content/Widget.php:62 view/theme/vier/theme.php:200
+#: src/Content/Widget.php:65 view/theme/vier/theme.php:200
 msgid "Enter name or interest"
 msgstr "Wpisz nazwę lub zainteresowanie"
 
-#: src/Content/Widget.php:64 view/theme/vier/theme.php:202
+#: src/Content/Widget.php:67 view/theme/vier/theme.php:202
 msgid "Examples: Robert Morgenstein, Fishing"
 msgstr "Przykład: Jan Kowalski, Wędkarstwo"
 
-#: src/Content/Widget.php:65 src/Module/Contact.php:820
-#: src/Module/Directory.php:91 view/theme/vier/theme.php:203
+#: src/Content/Widget.php:68 src/Module/Contact.php:820
+#: src/Module/Directory.php:86 view/theme/vier/theme.php:203
 msgid "Find"
 msgstr "Znajdź"
 
-#: src/Content/Widget.php:67 view/theme/vier/theme.php:205
+#: src/Content/Widget.php:70 view/theme/vier/theme.php:205
 msgid "Similar Interests"
 msgstr "Podobne zainteresowania"
 
-#: src/Content/Widget.php:68 view/theme/vier/theme.php:206
+#: src/Content/Widget.php:71 view/theme/vier/theme.php:206
 msgid "Random Profile"
 msgstr "Domyślny profil"
 
-#: src/Content/Widget.php:69 view/theme/vier/theme.php:207
+#: src/Content/Widget.php:72 view/theme/vier/theme.php:207
 msgid "Invite Friends"
 msgstr "Zaproś znajomych"
 
-#: src/Content/Widget.php:70 src/Module/Directory.php:83
+#: src/Content/Widget.php:73 src/Module/Directory.php:78
 #: view/theme/vier/theme.php:208
 msgid "Global Directory"
 msgstr "Katalog globalny"
 
-#: src/Content/Widget.php:72 view/theme/vier/theme.php:210
+#: src/Content/Widget.php:75 view/theme/vier/theme.php:210
 msgid "Local Directory"
 msgstr "Katalog lokalny"
 
-#: src/Content/Widget.php:158
+#: src/Content/Widget.php:192 src/Module/Contact.php:797
+#: src/Module/Profile/Contacts.php:126
+msgid "Followers"
+msgstr ""
+
+#: src/Content/Widget.php:193 src/Module/Contact.php:798
+#: src/Module/Profile/Contacts.php:127
+msgid "Following"
+msgstr ""
+
+#: src/Content/Widget.php:194 src/Module/Contact.php:799
+#: src/Module/Profile/Contacts.php:128
+msgid "Mutual friends"
+msgstr "Wspólni znajomi"
+
+#: src/Content/Widget.php:199
+msgid "Relationships"
+msgstr "Relacje"
+
+#: src/Content/Widget.php:201 src/Module/Contact.php:694
+#: src/Module/Group.php:287
+msgid "All Contacts"
+msgstr "Wszystkie kontakty"
+
+#: src/Content/Widget.php:244
 msgid "Protocols"
 msgstr "Protokoły"
 
-#: src/Content/Widget.php:161
+#: src/Content/Widget.php:246
 msgid "All Protocols"
 msgstr "Wszystkie protokoły"
 
-#: src/Content/Widget.php:198
+#: src/Content/Widget.php:279
 msgid "Saved Folders"
 msgstr "Zapisz w folderach"
 
-#: src/Content/Widget.php:201 src/Content/Widget.php:243
+#: src/Content/Widget.php:281 src/Content/Widget.php:320
 msgid "Everything"
 msgstr "Wszystko"
 
-#: src/Content/Widget.php:240
+#: src/Content/Widget.php:318
 msgid "Categories"
 msgstr "Kategorie"
 
-#: src/Content/Widget.php:324
+#: src/Content/Widget.php:402
 #, php-format
 msgid "%d contact in common"
 msgid_plural "%d contacts in common"
@@ -5420,8 +5268,8 @@ msgid ""
 "or mysql."
 msgstr "Może być konieczne zaimportowanie pliku \"database.sql\" ręcznie, używając phpmyadmin lub mysql."
 
-#: src/Core/Installer.php:184 src/Module/Install.php:172
-#: src/Module/Install.php:328
+#: src/Core/Installer.php:184 src/Module/Install.php:174
+#: src/Module/Install.php:330
 msgid "Please see the file \"INSTALL.txt\"."
 msgstr "Proszę przejrzeć plik \"INSTALL.txt\"."
 
@@ -5667,200 +5515,205 @@ msgstr "Rozszerzenie PHP ImageMagick nie jest zainstalowane"
 msgid "ImageMagick PHP extension is installed"
 msgstr "Rozszerzenie PHP ImageMagick jest zainstalowane"
 
-#: src/Core/Installer.php:584 tests/src/Core/InstallerTest.php:347
-#: tests/src/Core/InstallerTest.php:373
+#: src/Core/Installer.php:584 tests/src/Core/InstallerTest.php:361
+#: tests/src/Core/InstallerTest.php:389
 msgid "ImageMagick supports GIF"
 msgstr "ImageMagick obsługuje GIF"
 
-#: src/Core/Installer.php:609
-msgid "Could not connect to database."
-msgstr "Nie można połączyć się z bazą danych."
-
-#: src/Core/Installer.php:616
+#: src/Core/Installer.php:607
 msgid "Database already in use."
 msgstr "Baza danych jest już w użyciu."
 
-#: src/Core/L10n.php:371 src/Model/Event.php:397
+#: src/Core/Installer.php:612
+msgid "Could not connect to database."
+msgstr "Nie można połączyć się z bazą danych."
+
+#: src/Core/L10n/L10n.php:372 src/Model/Event.php:397
 msgid "Tuesday"
 msgstr "Wtorek"
 
-#: src/Core/L10n.php:371 src/Model/Event.php:398
+#: src/Core/L10n/L10n.php:372 src/Model/Event.php:398
 msgid "Wednesday"
 msgstr "Środa"
 
-#: src/Core/L10n.php:371 src/Model/Event.php:399
+#: src/Core/L10n/L10n.php:372 src/Model/Event.php:399
 msgid "Thursday"
 msgstr "Czwartek"
 
-#: src/Core/L10n.php:371 src/Model/Event.php:400
+#: src/Core/L10n/L10n.php:372 src/Model/Event.php:400
 msgid "Friday"
 msgstr "Piątek"
 
-#: src/Core/L10n.php:371 src/Model/Event.php:401
+#: src/Core/L10n/L10n.php:372 src/Model/Event.php:401
 msgid "Saturday"
 msgstr "Sobota"
 
-#: src/Core/L10n.php:375 src/Model/Event.php:416
+#: src/Core/L10n/L10n.php:376 src/Model/Event.php:416
 msgid "January"
 msgstr "Styczeń"
 
-#: src/Core/L10n.php:375 src/Model/Event.php:417
+#: src/Core/L10n/L10n.php:376 src/Model/Event.php:417
 msgid "February"
 msgstr "Luty"
 
-#: src/Core/L10n.php:375 src/Model/Event.php:418
+#: src/Core/L10n/L10n.php:376 src/Model/Event.php:418
 msgid "March"
 msgstr "Marzec"
 
-#: src/Core/L10n.php:375 src/Model/Event.php:419
+#: src/Core/L10n/L10n.php:376 src/Model/Event.php:419
 msgid "April"
 msgstr "Kwiecień"
 
-#: src/Core/L10n.php:375 src/Core/L10n.php:394 src/Model/Event.php:407
+#: src/Core/L10n/L10n.php:376 src/Core/L10n/L10n.php:396
+#: src/Model/Event.php:407
 msgid "May"
 msgstr "Maj"
 
-#: src/Core/L10n.php:375 src/Model/Event.php:420
+#: src/Core/L10n/L10n.php:376 src/Model/Event.php:420
 msgid "June"
 msgstr "Czerwiec"
 
-#: src/Core/L10n.php:375 src/Model/Event.php:421
+#: src/Core/L10n/L10n.php:376 src/Model/Event.php:421
 msgid "July"
 msgstr "Lipiec"
 
-#: src/Core/L10n.php:375 src/Model/Event.php:422
+#: src/Core/L10n/L10n.php:376 src/Model/Event.php:422
 msgid "August"
 msgstr "Sierpień"
 
-#: src/Core/L10n.php:375 src/Model/Event.php:423
+#: src/Core/L10n/L10n.php:376 src/Model/Event.php:423
 msgid "September"
 msgstr "Wrzesień"
 
-#: src/Core/L10n.php:375 src/Model/Event.php:424
+#: src/Core/L10n/L10n.php:376 src/Model/Event.php:424
 msgid "October"
 msgstr "Październik"
 
-#: src/Core/L10n.php:375 src/Model/Event.php:425
+#: src/Core/L10n/L10n.php:376 src/Model/Event.php:425
 msgid "November"
 msgstr "Listopad"
 
-#: src/Core/L10n.php:375 src/Model/Event.php:426
+#: src/Core/L10n/L10n.php:376 src/Model/Event.php:426
 msgid "December"
 msgstr "Grudzień"
 
-#: src/Core/L10n.php:390 src/Model/Event.php:388
+#: src/Core/L10n/L10n.php:392 src/Model/Event.php:388
 msgid "Mon"
 msgstr "Pon"
 
-#: src/Core/L10n.php:390 src/Model/Event.php:389
+#: src/Core/L10n/L10n.php:392 src/Model/Event.php:389
 msgid "Tue"
 msgstr "Wt"
 
-#: src/Core/L10n.php:390 src/Model/Event.php:390
+#: src/Core/L10n/L10n.php:392 src/Model/Event.php:390
 msgid "Wed"
 msgstr "Śr"
 
-#: src/Core/L10n.php:390 src/Model/Event.php:391
+#: src/Core/L10n/L10n.php:392 src/Model/Event.php:391
 msgid "Thu"
 msgstr "Czw"
 
-#: src/Core/L10n.php:390 src/Model/Event.php:392
+#: src/Core/L10n/L10n.php:392 src/Model/Event.php:392
 msgid "Fri"
 msgstr "Pt"
 
-#: src/Core/L10n.php:390 src/Model/Event.php:393
+#: src/Core/L10n/L10n.php:392 src/Model/Event.php:393
 msgid "Sat"
 msgstr "Sob"
 
-#: src/Core/L10n.php:390 src/Model/Event.php:387
+#: src/Core/L10n/L10n.php:392 src/Model/Event.php:387
 msgid "Sun"
 msgstr "Niedz"
 
-#: src/Core/L10n.php:394 src/Model/Event.php:403
+#: src/Core/L10n/L10n.php:396 src/Model/Event.php:403
 msgid "Jan"
 msgstr "Sty"
 
-#: src/Core/L10n.php:394 src/Model/Event.php:404
+#: src/Core/L10n/L10n.php:396 src/Model/Event.php:404
 msgid "Feb"
 msgstr "Lut"
 
-#: src/Core/L10n.php:394 src/Model/Event.php:405
+#: src/Core/L10n/L10n.php:396 src/Model/Event.php:405
 msgid "Mar"
 msgstr "Mar"
 
-#: src/Core/L10n.php:394 src/Model/Event.php:406
+#: src/Core/L10n/L10n.php:396 src/Model/Event.php:406
 msgid "Apr"
 msgstr "Kwi"
 
-#: src/Core/L10n.php:394 src/Model/Event.php:409
+#: src/Core/L10n/L10n.php:396 src/Model/Event.php:408
+msgid "Jun"
+msgstr "Cze"
+
+#: src/Core/L10n/L10n.php:396 src/Model/Event.php:409
 msgid "Jul"
 msgstr "Lip"
 
-#: src/Core/L10n.php:394 src/Model/Event.php:410
+#: src/Core/L10n/L10n.php:396 src/Model/Event.php:410
 msgid "Aug"
 msgstr "Sie"
 
-#: src/Core/L10n.php:394
+#: src/Core/L10n/L10n.php:396
 msgid "Sep"
 msgstr "Wrz"
 
-#: src/Core/L10n.php:394 src/Model/Event.php:412
+#: src/Core/L10n/L10n.php:396 src/Model/Event.php:412
 msgid "Oct"
 msgstr "Paź"
 
-#: src/Core/L10n.php:394 src/Model/Event.php:413
+#: src/Core/L10n/L10n.php:396 src/Model/Event.php:413
 msgid "Nov"
 msgstr "Lis"
 
-#: src/Core/L10n.php:394 src/Model/Event.php:414
+#: src/Core/L10n/L10n.php:396 src/Model/Event.php:414
 msgid "Dec"
 msgstr "Gru"
 
-#: src/Core/L10n.php:413
+#: src/Core/L10n/L10n.php:415
 msgid "poke"
 msgstr "zaczep"
 
-#: src/Core/L10n.php:413
+#: src/Core/L10n/L10n.php:415
 msgid "poked"
 msgstr "zaczepił Cię"
 
-#: src/Core/L10n.php:414
+#: src/Core/L10n/L10n.php:416
 msgid "ping"
 msgstr "ping"
 
-#: src/Core/L10n.php:414
+#: src/Core/L10n/L10n.php:416
 msgid "pinged"
 msgstr "napięcia"
 
-#: src/Core/L10n.php:415
+#: src/Core/L10n/L10n.php:417
 msgid "prod"
 msgstr "zaczep"
 
-#: src/Core/L10n.php:415
+#: src/Core/L10n/L10n.php:417
 msgid "prodded"
 msgstr "zaczepiać"
 
-#: src/Core/L10n.php:416
+#: src/Core/L10n/L10n.php:418
 msgid "slap"
 msgstr "klask"
 
-#: src/Core/L10n.php:416
+#: src/Core/L10n/L10n.php:418
 msgid "slapped"
 msgstr "spoliczkowany"
 
-#: src/Core/L10n.php:417
+#: src/Core/L10n/L10n.php:419
 msgid "finger"
 msgstr "wskaż"
 
-#: src/Core/L10n.php:417
+#: src/Core/L10n/L10n.php:419
 msgid "fingered"
 msgstr "dotknięty"
 
-#: src/Core/L10n.php:418
+#: src/Core/L10n/L10n.php:420
 msgid "rebuff"
 msgstr "odrzuć"
 
-#: src/Core/L10n.php:418
+#: src/Core/L10n/L10n.php:420
 msgid "rebuffed"
 msgstr "odrzucony"
 
@@ -5920,16 +5773,16 @@ msgstr "Prośba o dodanie do przyjaciół/powiązanych"
 msgid "New Follower"
 msgstr "Nowy obserwujący"
 
-#: src/Core/Session.php:194
+#: src/Core/Session.php:188
 #, php-format
 msgid "Welcome %s"
 msgstr "Witaj %s"
 
-#: src/Core/Session.php:195
+#: src/Core/Session.php:189
 msgid "Please upload a profile photo."
 msgstr "Proszę dodać zdjęcie profilowe."
 
-#: src/Core/Session.php:198
+#: src/Core/Session.php:192
 #, php-format
 msgid "Welcome back %s"
 msgstr "Witaj ponownie %s"
@@ -5967,28 +5820,28 @@ msgid ""
 "\t\t\t\t\tThe friendica database was successfully updated from %s to %s."
 msgstr "\n\t\t\t\t\tBaza danych Friendica została pomyślnie zaktualizowana z %s do %s."
 
-#: src/Core/UserImport.php:99
+#: src/Core/UserImport.php:107
 msgid "Error decoding account file"
 msgstr "Błąd podczas odczytu pliku konta"
 
-#: src/Core/UserImport.php:105
+#: src/Core/UserImport.php:113
 msgid "Error! No version data in file! This is not a Friendica account file?"
 msgstr "Błąd! Brak danych wersji w pliku! To nie jest plik konta Friendica?"
 
-#: src/Core/UserImport.php:113
+#: src/Core/UserImport.php:121
 #, php-format
 msgid "User '%s' already exists on this server!"
 msgstr "Użytkownik '%s' już istnieje na tym serwerze!"
 
-#: src/Core/UserImport.php:149
+#: src/Core/UserImport.php:157
 msgid "User creation error"
 msgstr "Błąd tworzenia użytkownika"
 
-#: src/Core/UserImport.php:167
+#: src/Core/UserImport.php:175
 msgid "User profile creation error"
 msgstr "Błąd tworzenia profilu użytkownika"
 
-#: src/Core/UserImport.php:211
+#: src/Core/UserImport.php:219
 #, php-format
 msgid "%d contact not imported"
 msgid_plural "%d contacts not imported"
@@ -5997,7 +5850,7 @@ msgstr[1] "Nie zaimportowano %d kontaktów"
 msgstr[2] "Nie zaimportowano %d kontaktów"
 msgstr[3] "%d kontakty nie zostały zaimportowane "
 
-#: src/Core/UserImport.php:276
+#: src/Core/UserImport.php:284
 msgid "Done. You can now login with your username and password"
 msgstr "Gotowe. Możesz teraz zalogować się z użyciem nazwy użytkownika i hasła"
 
@@ -6032,80 +5885,81 @@ msgstr "%s: aktualizowanie %s tabeli."
 msgid "Legacy module file not found: %s"
 msgstr "Nie znaleziono pliku modułu: %s"
 
-#: src/Model/Contact.php:1116
+#: src/Model/Contact.php:1205
 msgid "Drop Contact"
 msgstr "Zakończ znajomość"
 
-#: src/Model/Contact.php:1651
+#: src/Model/Contact.php:1707
 msgid "Organisation"
 msgstr "Organizacja"
 
-#: src/Model/Contact.php:1655
+#: src/Model/Contact.php:1711
 msgid "News"
 msgstr "Aktualności"
 
-#: src/Model/Contact.php:1659
+#: src/Model/Contact.php:1715
 msgid "Forum"
 msgstr "Forum"
 
-#: src/Model/Contact.php:1888
+#: src/Model/Contact.php:2111
 msgid "Connect URL missing."
 msgstr "Brak adresu URL połączenia."
 
-#: src/Model/Contact.php:1897
+#: src/Model/Contact.php:2120
 msgid ""
 "The contact could not be added. Please check the relevant network "
 "credentials in your Settings -> Social Networks page."
 msgstr "Nie można dodać kontaktu. Sprawdź odpowiednie poświadczenia sieciowe na stronie Ustawienia -> Sieci społecznościowe."
 
-#: src/Model/Contact.php:1938
+#: src/Model/Contact.php:2161
 msgid ""
 "This site is not configured to allow communications with other networks."
 msgstr "Ta strona nie jest skonfigurowana do pozwalania na komunikację z innymi sieciami"
 
-#: src/Model/Contact.php:1939 src/Model/Contact.php:1952
+#: src/Model/Contact.php:2162 src/Model/Contact.php:2175
 msgid "No compatible communication protocols or feeds were discovered."
 msgstr "Nie znaleziono żadnych kompatybilnych protokołów komunikacyjnych ani źródeł."
 
-#: src/Model/Contact.php:1950
+#: src/Model/Contact.php:2173
 msgid "The profile address specified does not provide adequate information."
 msgstr "Dany adres profilu nie dostarcza odpowiednich informacji."
 
-#: src/Model/Contact.php:1955
+#: src/Model/Contact.php:2178
 msgid "An author or name was not found."
 msgstr "Autor lub nazwa nie zostało znalezione."
 
-#: src/Model/Contact.php:1958
+#: src/Model/Contact.php:2181
 msgid "No browser URL could be matched to this address."
 msgstr "Przeglądarka WWW nie może odnaleźć podanego adresu"
 
-#: src/Model/Contact.php:1961
+#: src/Model/Contact.php:2184
 msgid ""
 "Unable to match @-style Identity Address with a known protocol or email "
 "contact."
 msgstr "Nie można dopasować @-stylu Adres identyfikacyjny ze znanym protokołem lub kontaktem e-mail."
 
-#: src/Model/Contact.php:1962
+#: src/Model/Contact.php:2185
 msgid "Use mailto: in front of address to force email check."
 msgstr "Użyj mailto: przed adresem, aby wymusić sprawdzanie poczty e-mail."
 
-#: src/Model/Contact.php:1968
+#: src/Model/Contact.php:2191
 msgid ""
 "The profile address specified belongs to a network which has been disabled "
 "on this site."
 msgstr "Określony adres profilu należy do sieci, która została wyłączona na tej stronie."
 
-#: src/Model/Contact.php:1973
+#: src/Model/Contact.php:2196
 msgid ""
 "Limited profile. This person will be unable to receive direct/personal "
 "notifications from you."
 msgstr "Profil ograniczony. Ta osoba będzie niezdolna do odbierania osobistych powiadomień od ciebie."
 
-#: src/Model/Contact.php:2027
+#: src/Model/Contact.php:2251
 msgid "Unable to retrieve contact information."
 msgstr "Nie można otrzymać informacji kontaktowych"
 
-#: src/Model/Event.php:34 src/Model/Event.php:847 src/Module/Localtime.php:17
+#: src/Model/Event.php:34 src/Model/Event.php:847
+#: src/Module/Debug/Localtime.php:17
 msgid "l F d, Y \\@ g:i A"
 msgstr "l F d, Y \\@ g:i A"
 
@@ -6123,10 +5977,6 @@ msgstr "Zakończenie:"
 msgid "all-day"
 msgstr "cały dzień"
 
-#: src/Model/Event.php:408
-msgid "Jun"
-msgstr "Cze"
-
 #: src/Model/Event.php:411
 msgid "Sept"
 msgstr "Wrz"
@@ -6151,7 +6001,7 @@ msgstr "Zduplikowane zdarzenie"
 msgid "Delete event"
 msgstr "Usuń wydarzenie"
 
-#: src/Model/Event.php:626 src/Model/Item.php:3522 src/Model/Item.php:3529
+#: src/Model/Event.php:626 src/Model/Item.php:3537 src/Model/Item.php:3544
 msgid "link to source"
 msgstr "link do źródła"
 
@@ -6181,7 +6031,7 @@ msgstr "%s urodzin"
 msgid "Happy Birthday %s"
 msgstr "Urodziny %s"
 
-#: src/Model/FileTag.php:256
+#: src/Model/FileTag.php:265
 msgid "Item filed"
 msgstr "Element złożony"
 
@@ -6204,6 +6054,11 @@ msgstr "Wszyscy"
 msgid "edit"
 msgstr "edytuj"
 
+#: src/Model/Group.php:435 src/Module/Contact.php:734
+#: src/Module/Welcome.php:57
+msgid "Groups"
+msgstr "Grupy"
+
 #: src/Model/Group.php:439
 msgid "Edit group"
 msgstr "Edytuj grupy"
@@ -6225,11 +6080,11 @@ msgstr "Nazwa grupy: "
 msgid "Edit groups"
 msgstr "Edytuj grupy"
 
-#: src/Model/Item.php:3257
+#: src/Model/Item.php:3272
 msgid "activity"
 msgstr "aktywność"
 
-#: src/Model/Item.php:3259 src/Object/Post.php:472
+#: src/Model/Item.php:3274 src/Object/Post.php:473
 msgid "comment"
 msgid_plural "comments"
 msgstr[0] "komentarz"
@@ -6237,172 +6092,176 @@ msgstr[1] "komentarze"
 msgstr[2] "komentarze"
 msgstr[3] "komentarz"
 
-#: src/Model/Item.php:3262
+#: src/Model/Item.php:3277
 msgid "post"
 msgstr "post"
 
-#: src/Model/Item.php:3361
+#: src/Model/Item.php:3376
 #, php-format
 msgid "Content warning: %s"
 msgstr "Ostrzeżenie o treści: %s"
 
-#: src/Model/Item.php:3438
+#: src/Model/Item.php:3453
 msgid "bytes"
 msgstr "bajty"
 
-#: src/Model/Item.php:3516
+#: src/Model/Item.php:3531
 msgid "View on separate page"
 msgstr "Zobacz na oddzielnej stronie"
 
-#: src/Model/Item.php:3517
+#: src/Model/Item.php:3532
 msgid "view on separate page"
 msgstr "zobacz na oddzielnej stronie"
 
-#: src/Model/Mail.php:109 src/Model/Mail.php:244
+#: src/Model/Mail.php:112 src/Model/Mail.php:247
 msgid "[no subject]"
 msgstr "[bez tematu]"
 
-#: src/Model/Profile.php:177 src/Model/Profile.php:421
-#: src/Model/Profile.php:866
+#: src/Model/Profile.php:183 src/Model/Profile.php:399
+#: src/Model/Profile.php:848
 msgid "Edit profile"
 msgstr "Edytuj profil"
 
-#: src/Model/Profile.php:355
-msgid "Atom feed"
-msgstr "Kanał Atom"
-
-#: src/Model/Profile.php:394
+#: src/Model/Profile.php:373
 msgid "Manage/edit profiles"
 msgstr "Zarządzaj profilami"
 
-#: src/Model/Profile.php:443 src/Model/Profile.php:776
-#: src/Module/Directory.php:148
+#: src/Model/Profile.php:422 src/Model/Profile.php:758
+#: src/Module/Directory.php:143
 msgid "Status:"
 msgstr "Status:"
 
-#: src/Model/Profile.php:444 src/Model/Profile.php:793
-#: src/Module/Directory.php:149
+#: src/Model/Profile.php:423 src/Model/Profile.php:775
+#: src/Module/Directory.php:144
 msgid "Homepage:"
 msgstr "Strona główna:"
 
-#: src/Model/Profile.php:446 src/Module/Contact.php:648
+#: src/Model/Profile.php:425 src/Module/Contact.php:647
 msgid "XMPP:"
 msgstr "XMPP:"
 
-#: src/Model/Profile.php:569 src/Model/Profile.php:666
+#: src/Model/Profile.php:509 src/Module/Contact.php:337
+msgid "Unfollow"
+msgstr ""
+
+#: src/Model/Profile.php:511
+msgid "Atom feed"
+msgstr "Kanał Atom"
+
+#: src/Model/Profile.php:551 src/Model/Profile.php:648
 msgid "g A l F d"
 msgstr "g A I F d"
 
-#: src/Model/Profile.php:570
+#: src/Model/Profile.php:552
 msgid "F d"
 msgstr "F d"
 
-#: src/Model/Profile.php:632 src/Model/Profile.php:717
+#: src/Model/Profile.php:614 src/Model/Profile.php:699
 msgid "[today]"
 msgstr "[dziś]"
 
-#: src/Model/Profile.php:642
+#: src/Model/Profile.php:624
 msgid "Birthday Reminders"
 msgstr "Przypomnienia o urodzinach"
 
-#: src/Model/Profile.php:643
+#: src/Model/Profile.php:625
 msgid "Birthdays this week:"
 msgstr "Urodziny w tym tygodniu:"
 
-#: src/Model/Profile.php:704
+#: src/Model/Profile.php:686
 msgid "[No description]"
 msgstr "[Brak opisu]"
 
-#: src/Model/Profile.php:730
+#: src/Model/Profile.php:712
 msgid "Event Reminders"
 msgstr "Przypominacze wydarzeń"
 
-#: src/Model/Profile.php:731
+#: src/Model/Profile.php:713
 msgid "Upcoming events the next 7 days:"
 msgstr "Nadchodzące wydarzenia w ciągu następnych 7 dni:"
 
-#: src/Model/Profile.php:748
+#: src/Model/Profile.php:730
 msgid "Member since:"
 msgstr "Członek od:"
 
-#: src/Model/Profile.php:756
+#: src/Model/Profile.php:738
 msgid "j F, Y"
 msgstr "d M, R"
 
-#: src/Model/Profile.php:757
+#: src/Model/Profile.php:739
 msgid "j F"
 msgstr "d M"
 
-#: src/Model/Profile.php:765 src/Util/Temporal.php:147
+#: src/Model/Profile.php:747 src/Util/Temporal.php:147
 msgid "Birthday:"
 msgstr "Urodziny:"
 
-#: src/Model/Profile.php:772
+#: src/Model/Profile.php:754
 msgid "Age:"
 msgstr "Wiek:"
 
-#: src/Model/Profile.php:785
+#: src/Model/Profile.php:767
 #, php-format
 msgid "for %1$d %2$s"
 msgstr "od %1$d %2$s"
 
-#: src/Model/Profile.php:809
+#: src/Model/Profile.php:791
 msgid "Religion:"
 msgstr "Religia:"
 
-#: src/Model/Profile.php:817
+#: src/Model/Profile.php:799
 msgid "Hobbies/Interests:"
 msgstr "Hobby/Zainteresowania:"
 
-#: src/Model/Profile.php:829
+#: src/Model/Profile.php:811
 msgid "Contact information and Social Networks:"
 msgstr "Informacje kontaktowe i sieci społecznościowe:"
 
-#: src/Model/Profile.php:833
+#: src/Model/Profile.php:815
 msgid "Musical interests:"
 msgstr "Zainteresowania muzyczne:"
 
-#: src/Model/Profile.php:837
+#: src/Model/Profile.php:819
 msgid "Books, literature:"
 msgstr "Książki, literatura:"
 
-#: src/Model/Profile.php:841
+#: src/Model/Profile.php:823
 msgid "Television:"
 msgstr "Telewizja:"
 
-#: src/Model/Profile.php:845
+#: src/Model/Profile.php:827
 msgid "Film/dance/culture/entertainment:"
 msgstr "Film/taniec/kultura/rozrywka:"
 
-#: src/Model/Profile.php:849
+#: src/Model/Profile.php:831
 msgid "Love/Romance:"
 msgstr "Miłość/Romans:"
 
-#: src/Model/Profile.php:853
+#: src/Model/Profile.php:835
 msgid "Work/employment:"
 msgstr "Praca/zatrudnienie:"
 
-#: src/Model/Profile.php:857
+#: src/Model/Profile.php:839
 msgid "School/education:"
 msgstr "Szkoła/edukacja:"
 
-#: src/Model/Profile.php:862
+#: src/Model/Profile.php:844
 msgid "Forums:"
 msgstr "Fora:"
 
-#: src/Model/Profile.php:906 src/Module/Contact.php:875
+#: src/Model/Profile.php:891 src/Module/Contact.php:875
 msgid "Profile Details"
 msgstr "Szczegóły profilu"
 
-#: src/Model/Profile.php:956
+#: src/Model/Profile.php:941
 msgid "Only You Can See This"
 msgstr "Tylko ty możesz to zobaczyć"
 
-#: src/Model/Profile.php:964 src/Model/Profile.php:967
+#: src/Model/Profile.php:949 src/Model/Profile.php:952
 msgid "Tips for New Members"
 msgstr "Wskazówki dla nowych użytkowników"
 
-#: src/Model/Profile.php:1167
+#: src/Model/Profile.php:1149
 #, php-format
 msgid "OpenWebAuth: %1$s welcomes %2$s"
 msgstr "OpenWebAuth: %1$s wita %2$s"
@@ -6430,7 +6289,7 @@ msgstr "Nie udało się zapisać danych w pamięci systemu plików \"%s\". Spraw
 
 #: src/Model/Storage/Filesystem.php:126
 msgid "Storage base path"
-msgstr ""
+msgstr "Ścieżka bazy pamięci masowej"
 
 #: src/Model/Storage/Filesystem.php:128
 msgid ""
@@ -6442,71 +6301,71 @@ msgstr "Folder, w którym zapisywane są przesłane pliki. Dla maksymalnego bezp
 msgid "Enter a valid existing folder"
 msgstr "Wprowadź poprawny istniejący folder"
 
-#: src/Model/User.php:298
+#: src/Model/User.php:331
 msgid "Login failed"
 msgstr "Logowanie nieudane"
 
-#: src/Model/User.php:329
+#: src/Model/User.php:362
 msgid "Not enough information to authenticate"
 msgstr "Za mało informacji do uwierzytelnienia"
 
-#: src/Model/User.php:407
+#: src/Model/User.php:440
 msgid "Password can't be empty"
 msgstr "Hasło nie może być puste"
 
-#: src/Model/User.php:426
+#: src/Model/User.php:459
 msgid "Empty passwords are not allowed."
 msgstr "Puste hasła są niedozwolone."
 
-#: src/Model/User.php:430
+#: src/Model/User.php:463
 msgid ""
 "The new password has been exposed in a public data dump, please choose "
 "another."
 msgstr "Nowe hasło zostało ujawnione w publicznym zrzucie danych, wybierz inne."
 
-#: src/Model/User.php:436
+#: src/Model/User.php:469
 msgid ""
 "The password can't contain accentuated letters, white spaces or colons (:)"
 msgstr "Hasło nie może zawierać podkreślonych liter, białych spacji ani dwukropków (:)"
 
-#: src/Model/User.php:536
+#: src/Model/User.php:569
 msgid "Passwords do not match. Password unchanged."
 msgstr "Hasła nie pasują do siebie. Hasło niezmienione."
 
-#: src/Model/User.php:543
+#: src/Model/User.php:576
 msgid "An invitation is required."
 msgstr "Wymagane zaproszenie."
 
-#: src/Model/User.php:547
+#: src/Model/User.php:580
 msgid "Invitation could not be verified."
 msgstr "Zaproszenie niezweryfikowane."
 
-#: src/Model/User.php:554
+#: src/Model/User.php:587
 msgid "Invalid OpenID url"
 msgstr "Nieprawidłowy adres url OpenID"
 
-#: src/Model/User.php:567 src/Module/Login.php:107
+#: src/Model/User.php:600 src/Module/Login.php:102
 msgid ""
 "We encountered a problem while logging in with the OpenID you provided. "
 "Please check the correct spelling of the ID."
 msgstr "Napotkaliśmy problem podczas logowania z podanym przez nas identyfikatorem OpenID. Sprawdź poprawną pisownię identyfikatora."
 
-#: src/Model/User.php:567 src/Module/Login.php:107
+#: src/Model/User.php:600 src/Module/Login.php:102
 msgid "The error message was:"
 msgstr "Komunikat o błędzie:"
 
-#: src/Model/User.php:573
+#: src/Model/User.php:606
 msgid "Please enter the required information."
 msgstr "Wprowadź wymagane informacje."
 
-#: src/Model/User.php:587
+#: src/Model/User.php:620
 #, 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) i system.username_max_length (%s) wykluczają się nawzajem, zamieniając wartości."
 
-#: src/Model/User.php:594
+#: src/Model/User.php:627
 #, php-format
 msgid "Username should be at least %s character."
 msgid_plural "Username should be at least %s characters."
@@ -6515,7 +6374,7 @@ msgstr[1] "Nazwa użytkownika powinna wynosić co najmniej %s znaków."
 msgstr[2] "Nazwa użytkownika powinna wynosić co najmniej %s znaków."
 msgstr[3] "Nazwa użytkownika powinna wynosić co najmniej %s znaków."
 
-#: src/Model/User.php:598
+#: src/Model/User.php:631
 #, php-format
 msgid "Username should be at most %s character."
 msgid_plural "Username should be at most %s characters."
@@ -6524,60 +6383,60 @@ msgstr[1] "Nazwa użytkownika nie może mieć więcej niż %s znaków."
 msgstr[2] "Nazwa użytkownika nie może mieć więcej niż %s znaków."
 msgstr[3] "Nazwa użytkownika nie może mieć więcej niż %s znaków."
 
-#: src/Model/User.php:606
+#: src/Model/User.php:639
 msgid "That doesn't appear to be your full (First Last) name."
 msgstr "Wydaje mi się, że to nie jest twoje pełne imię (pierwsze imię) i nazwisko."
 
-#: src/Model/User.php:611
+#: src/Model/User.php:644
 msgid "Your email domain is not among those allowed on this site."
 msgstr "Twoja domena internetowa nie jest obsługiwana na tej stronie."
 
-#: src/Model/User.php:615
+#: src/Model/User.php:648
 msgid "Not a valid email address."
 msgstr "Niepoprawny adres e mail.."
 
-#: src/Model/User.php:618
+#: src/Model/User.php:651
 msgid "The nickname was blocked from registration by the nodes admin."
 msgstr "Pseudonim został zablokowany przed rejestracją przez administratora węzłów."
 
-#: src/Model/User.php:622 src/Model/User.php:630
+#: src/Model/User.php:655 src/Model/User.php:663
 msgid "Cannot use that email."
 msgstr "Nie można użyć tego e-maila."
 
-#: src/Model/User.php:637
+#: src/Model/User.php:670
 msgid "Your nickname can only contain a-z, 0-9 and _."
 msgstr "Twój pseudonim może zawierać tylko a-z, 0-9 i _."
 
-#: src/Model/User.php:644 src/Model/User.php:701
+#: src/Model/User.php:677 src/Model/User.php:734
 msgid "Nickname is already registered. Please choose another."
 msgstr "Ten login jest zajęty. Wybierz inny."
 
-#: src/Model/User.php:654
+#: src/Model/User.php:687
 msgid "SERIOUS ERROR: Generation of security keys failed."
 msgstr "POWAŻNY BŁĄD: niepowodzenie podczas tworzenia kluczy zabezpieczeń."
 
-#: src/Model/User.php:688 src/Model/User.php:692
+#: src/Model/User.php:721 src/Model/User.php:725
 msgid "An error occurred during registration. Please try again."
 msgstr "Wystąpił bład podczas rejestracji, Spróbuj ponownie."
 
-#: src/Model/User.php:712 view/theme/duepuntozero/config.php:55
+#: src/Model/User.php:745 view/theme/duepuntozero/config.php:55
 msgid "default"
 msgstr "standardowe"
 
-#: src/Model/User.php:717
+#: src/Model/User.php:750
 msgid "An error occurred creating your default profile. Please try again."
 msgstr "Wystąpił błąd podczas tworzenia profilu. Spróbuj ponownie."
 
-#: src/Model/User.php:724
+#: src/Model/User.php:757
 msgid "An error occurred creating your self contact. Please try again."
 msgstr "Wystąpił błąd podczas tworzenia własnego kontaktu. Proszę spróbuj ponownie."
 
-#: src/Model/User.php:733
+#: src/Model/User.php:766
 msgid ""
 "An error occurred creating your default contact group. Please try again."
 msgstr "Wystąpił błąd podczas tworzenia domyślnej grupy kontaktów. Proszę spróbuj ponownie."
 
-#: src/Model/User.php:809
+#: src/Model/User.php:842
 #, php-format
 msgid ""
 "\n"
@@ -6592,12 +6451,12 @@ msgid ""
 "\t\t"
 msgstr "\n\t\t\tSzanowny Użytkowniku %1$s,\n\t\t\t\tDziękujemy za rejestrację na stronie %2$s. Twoje konto czeka na zatwierdzenie przez administratora.\n\n\t\t\tTwoje dane do logowania są następujące:\n\n\t\t\tLokalizacja witryny:\t%3$s\n\t\t\tNazwa użytkownika:\t\t%4$s\n\t\t\tHasło:\t\t%5$s\n\t\t"
 
-#: src/Model/User.php:826
+#: src/Model/User.php:859
 #, php-format
 msgid "Registration at %s"
 msgstr "Rejestracja w %s"
 
-#: src/Model/User.php:845
+#: src/Model/User.php:878
 #, php-format
 msgid ""
 "\n"
@@ -6606,7 +6465,7 @@ msgid ""
 "\t\t"
 msgstr "\n\t\t\tSzanowny(-a) %1$s,\n\t\t\t\tDziękujemy za rejestrację na stronie %2$s. Twoje konto zostało utworzone."
 
-#: src/Model/User.php:851
+#: src/Model/User.php:884
 #, php-format
 msgid ""
 "\n"
@@ -6638,7 +6497,7 @@ msgid ""
 "\t\t\tThank you and welcome to %2$s."
 msgstr "\n\t\t\tDane logowania są następuje:\n\t\t\tLokalizacja witryny:\t%3$s\n\t\t\tNazwa użytkownika:\t\t%1$s\n\t\t\tHasło:\t\t%5$s\n\n\t\t\tPo zalogowaniu możesz zmienić hasło do swojego konta na stronie \"Ustawienia\".\n \t\t\tProszę poświęć chwilę, aby przejrzeć inne ustawienia konta na tej stronie.\n\n\t\t\tMożesz również dodać podstawowe informacje do swojego domyślnego profilu\n\t\t\t(na stronie \"Profil użytkownika\"), aby inne osoby mogły łatwo Cię znaleźć.\n\n\t\t\tZalecamy ustawienie imienia i nazwiska, dodanie zdjęcia profilowego,\n\t\t\tdodanie niektórych \"słów kluczowych\" profilu (bardzo przydatne w nawiązywaniu nowych znajomości) \n\t\t\ti być może gdzie mieszkasz; jeśli nie chcesz podać więcej szczegów.\n\n\t\t\tW pełni szanujemy Twoje prawo do prywatności i żaden z tych elementów nie jest konieczny.\n\t\t\tJeśli jesteś nowy i nie znasz tutaj nikogo, oni mogą ci pomóc\n\t\t\tmożesz zdobyć nowych interesujących przyjaciół.\n\n\t\t\tJeśli kiedykolwiek zechcesz usunąć swoje konto, możesz to zrobić na stronie %3$s/removeme\n\n\t\t\tDziękujemy i Zapraszamy do %2$s."
 
-#: src/Model/User.php:886 src/Module/Admin/Users.php:88
+#: src/Model/User.php:919 src/Module/Admin/Users.php:88
 #, php-format
 msgid "Registration details for %s"
 msgstr "Szczegóły rejestracji dla %s"
@@ -6668,12 +6527,12 @@ msgid "Enable"
 msgstr "Zezwól"
 
 #: src/Module/Admin/Addons/Details.php:99 src/Module/Admin/Addons/Index.php:50
-#: src/Module/Admin/Blocklist/Contact.php:60
+#: src/Module/Admin/Blocklist/Contact.php:61
 #: src/Module/Admin/Blocklist/Server.php:73
-#: src/Module/Admin/Federation.php:185 src/Module/Admin/Item/Delete.php:46
-#: src/Module/Admin/Logs/Settings.php:57 src/Module/Admin/Logs/View.php:46
-#: src/Module/Admin/Queue.php:56 src/Module/Admin/Site.php:568
-#: src/Module/Admin/Summary.php:160 src/Module/Admin/Themes/Details.php:104
+#: src/Module/Admin/Federation.php:187 src/Module/Admin/Item/Delete.php:46
+#: src/Module/Admin/Logs/Settings.php:63 src/Module/Admin/Logs/View.php:46
+#: src/Module/Admin/Queue.php:56 src/Module/Admin/Site.php:567
+#: src/Module/Admin/Summary.php:175 src/Module/Admin/Themes/Details.php:104
 #: src/Module/Admin/Themes/Index.php:93 src/Module/Admin/Tos.php:42
 #: src/Module/Admin/Users.php:277
 msgid "Administration"
@@ -6711,7 +6570,7 @@ msgid ""
 " the open addon registry at %2$s"
 msgstr "W twoim węźle nie ma obecnie żadnych dodatków. Możesz znaleźć oficjalne repozytorium dodatków na %1$s i możesz znaleźć inne interesujące dodatki w otwartym rejestrze dodatków na %2$s"
 
-#: src/Module/Admin/Blocklist/Contact.php:37
+#: src/Module/Admin/Blocklist/Contact.php:38
 #, php-format
 msgid "%s contact unblocked"
 msgid_plural "%s contacts unblocked"
@@ -6720,51 +6579,55 @@ msgstr[1] "%s kontakty odblokowane"
 msgstr[2] "%s kontaktów odblokowanych"
 msgstr[3] "%s kontaktów odblokowanych"
 
-#: src/Module/Admin/Blocklist/Contact.php:61
+#: src/Module/Admin/Blocklist/Contact.php:62
 msgid "Remote Contact Blocklist"
 msgstr "Lista zablokowanych kontaktów zdalnych"
 
-#: src/Module/Admin/Blocklist/Contact.php:62
+#: src/Module/Admin/Blocklist/Contact.php:63
 msgid ""
 "This page allows you to prevent any message from a remote contact to reach "
 "your node."
 msgstr "Ta strona pozwala zapobiec wysyłaniu do węzła wiadomości od kontaktu zdalnego."
 
-#: src/Module/Admin/Blocklist/Contact.php:63
+#: src/Module/Admin/Blocklist/Contact.php:64
 msgid "Block Remote Contact"
 msgstr "Zablokuj kontakt zdalny"
 
-#: src/Module/Admin/Blocklist/Contact.php:64 src/Module/Admin/Users.php:280
+#: src/Module/Admin/Blocklist/Contact.php:65 src/Module/Admin/Users.php:280
 msgid "select all"
 msgstr "zaznacz wszystko"
 
-#: src/Module/Admin/Blocklist/Contact.php:65
+#: src/Module/Admin/Blocklist/Contact.php:66
 msgid "select none"
 msgstr "wybierz brak"
 
-#: src/Module/Admin/Blocklist/Contact.php:67 src/Module/Admin/Users.php:291
-#: src/Module/Contact.php:624 src/Module/Contact.php:827
-#: src/Module/Contact.php:1080
+#: src/Module/Admin/Blocklist/Contact.php:68 src/Module/Admin/Users.php:291
+#: src/Module/Contact.php:623 src/Module/Contact.php:827
+#: src/Module/Contact.php:1076
 msgid "Unblock"
 msgstr "Odblokuj"
 
-#: src/Module/Admin/Blocklist/Contact.php:68
+#: src/Module/Admin/Blocklist/Contact.php:69
 msgid "No remote contact is blocked from this node."
 msgstr "Z tego węzła nie jest blokowany kontakt zdalny."
 
-#: src/Module/Admin/Blocklist/Contact.php:70
+#: src/Module/Admin/Blocklist/Contact.php:71
 msgid "Blocked Remote Contacts"
 msgstr "Zablokowane kontakty zdalne"
 
-#: src/Module/Admin/Blocklist/Contact.php:71
+#: src/Module/Admin/Blocklist/Contact.php:72
 msgid "Block New Remote Contact"
 msgstr "Zablokuj nowy kontakt zdalny"
 
-#: src/Module/Admin/Blocklist/Contact.php:72
+#: src/Module/Admin/Blocklist/Contact.php:73
 msgid "Photo"
 msgstr "Zdjęcie"
 
-#: src/Module/Admin/Blocklist/Contact.php:80
+#: src/Module/Admin/Blocklist/Contact.php:73
+msgid "Reason"
+msgstr ""
+
+#: src/Module/Admin/Blocklist/Contact.php:81
 #, php-format
 msgid "%s total blocked contact"
 msgid_plural "%s total blocked contacts"
@@ -6773,94 +6636,107 @@ msgstr[1] "łącznie %s zablokowane kontakty"
 msgstr[2] "łącznie %s zablokowanych kontaktów"
 msgstr[3] "%s całkowicie zablokowane kontakty"
 
-#: src/Module/Admin/Blocklist/Contact.php:82
+#: src/Module/Admin/Blocklist/Contact.php:83
 msgid "URL of the remote contact to block."
 msgstr "Adres URL kontaktu zdalnego do zablokowania."
 
+#: src/Module/Admin/Blocklist/Contact.php:84
+msgid "Block Reason"
+msgstr ""
+
 #: src/Module/Admin/Blocklist/Server.php:31
-msgid "Server added to blocklist."
-msgstr "Serwer dodany do listy zablokowanych."
+msgid "Server domain pattern added to blocklist."
+msgstr ""
 
 #: src/Module/Admin/Blocklist/Server.php:47
 msgid "Site blocklist updated."
 msgstr "Zaktualizowano listę bloków witryny."
 
 #: src/Module/Admin/Blocklist/Server.php:64
-msgid "The blocked domain"
-msgstr "Zablokowana domena"
+#: src/Module/Admin/Blocklist/Server.php:89
+msgid "Blocked server domain pattern"
+msgstr ""
 
 #: src/Module/Admin/Blocklist/Server.php:65
-#: src/Module/Admin/Blocklist/Server.php:84 src/Module/Friendica.php:60
+#: src/Module/Admin/Blocklist/Server.php:90 src/Module/Friendica.php:60
 msgid "Reason for the block"
 msgstr "Powód blokowania"
 
-#: src/Module/Admin/Blocklist/Server.php:65
-#: src/Module/Admin/Blocklist/Server.php:79
-msgid "The reason why you blocked this domain."
-msgstr "Powód zablokowania tej domeny."
-
 #: src/Module/Admin/Blocklist/Server.php:66
-msgid "Delete domain"
-msgstr "Usuń domenę"
+msgid "Delete server domain pattern"
+msgstr ""
 
 #: src/Module/Admin/Blocklist/Server.php:66
 msgid "Check to delete this entry from the blocklist"
 msgstr "Zaznacz, aby usunąć ten wpis z listy bloków"
 
-#: src/Module/Admin/Blocklist/Server.php:74 src/Module/BaseAdminModule.php:94
-msgid "Server Blocklist"
-msgstr "Lista zablokowanych serwerów"
+#: src/Module/Admin/Blocklist/Server.php:74
+msgid "Server Domain Pattern Blocklist"
+msgstr ""
 
 #: src/Module/Admin/Blocklist/Server.php:75
 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 "
-"domains you should also give a reason why you have blocked the remote "
-"server."
-msgstr "Na tej stronie można zdefiniować czarną listę serwerów ze stowarzyszonej sieci, które nie mogą współdziałać z danym węzłem. Dla wszystkich wprowadzonych domen powinieneś podać powód, dla którego zablokowałeś serwer zdalny."
+"This page can be used to define a blacklist of server domain patterns from "
+"the federated network that are not allowed to interact with your node. For "
+"each domain pattern you should also provide the reason why you block it."
+msgstr "Ta strona może zostać użyta do zdefiniowania czarnej listy wzorców domen serwera z sieci stowarzyszonej, które nie mogą współdziałać z twoim węzłem. Dla każdego wzorca domeny należy również podać powód zablokowania go."
 
 #: src/Module/Admin/Blocklist/Server.php:76
 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 "Lista zablokowanych serwerów zostanie publicznie udostępniona na stronie /friendica, dzięki czemu użytkownicy i osoby badające problemy z komunikacją mogą łatwo znaleźć przyczynę."
+"The list of blocked server domain patterns will be made publically available"
+" on the <a href=\"/friendica\">/friendica</a> page so that your users and "
+"people investigating communication problems can find the reason easily."
+msgstr ""
 
 #: src/Module/Admin/Blocklist/Server.php:77
+msgid ""
+"<p>The server domain pattern syntax is case-insensitive shell wildcard, comprising the following special characters:</p>\n"
+"<ul>\n"
+"\t<li><code>*</code>: Any number of characters</li>\n"
+"\t<li><code>?</code>: Any single character</li>\n"
+"\t<li><code>[&lt;char1&gt;&lt;char2&gt;...]</code>: char1 or char2</li>\n"
+"</ul>"
+msgstr ""
+
+#: src/Module/Admin/Blocklist/Server.php:83
 msgid "Add new entry to block list"
 msgstr "Dodaj nowy wpis do listy bloków"
 
-#: src/Module/Admin/Blocklist/Server.php:78
-msgid "Server Domain"
-msgstr "Domena serwera"
+#: src/Module/Admin/Blocklist/Server.php:84
+msgid "Server Domain Pattern"
+msgstr ""
 
-#: src/Module/Admin/Blocklist/Server.php:78
+#: src/Module/Admin/Blocklist/Server.php:84
 msgid ""
-"The domain of the new server to add to the block list. Do not include the "
-"protocol."
-msgstr "Domena nowego serwera do dodania do listy bloków. Nie dołączaj protokołu."
+"The domain pattern of the new server to add to the block list. Do not "
+"include the protocol."
+msgstr ""
 
-#: src/Module/Admin/Blocklist/Server.php:79
+#: src/Module/Admin/Blocklist/Server.php:85
 msgid "Block reason"
 msgstr "Powód zablokowania"
 
-#: src/Module/Admin/Blocklist/Server.php:80
+#: src/Module/Admin/Blocklist/Server.php:85
+msgid "The reason why you blocked this server domain pattern."
+msgstr "Powód zablokowania wzorca domeny serwera."
+
+#: src/Module/Admin/Blocklist/Server.php:86
 msgid "Add Entry"
 msgstr "Dodaj wpis"
 
-#: src/Module/Admin/Blocklist/Server.php:81
+#: src/Module/Admin/Blocklist/Server.php:87
 msgid "Save changes to the blocklist"
 msgstr "Zapisz zmiany w liście zablokowanych"
 
-#: src/Module/Admin/Blocklist/Server.php:82
+#: src/Module/Admin/Blocklist/Server.php:88
 msgid "Current Entries in the Blocklist"
 msgstr "Aktualne wpisy na liście zablokowanych"
 
-#: src/Module/Admin/Blocklist/Server.php:85
+#: src/Module/Admin/Blocklist/Server.php:91
 msgid "Delete entry from blocklist"
 msgstr "Usuń wpis z listy zablokowanych"
 
-#: src/Module/Admin/Blocklist/Server.php:88
+#: src/Module/Admin/Blocklist/Server.php:94
 msgid "Delete entry from blocklist?"
 msgstr "Usunąć wpis z listy zablokowanych?"
 
@@ -6936,24 +6812,24 @@ msgstr "Zarządzanie dodatkowymi funkcjami"
 msgid "unknown"
 msgstr "nieznany"
 
-#: src/Module/Admin/Federation.php:179
+#: src/Module/Admin/Federation.php:181
 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 "Ta strona zawiera kilka numerów do znanej części federacyjnej sieci społecznościowej, do której należy Twój węzeł Friendica. Liczby te nie są kompletne, ale odzwierciedlają tylko część sieci, o której wie twój węzeł."
 
-#: src/Module/Admin/Federation.php:180
+#: src/Module/Admin/Federation.php:182
 msgid ""
 "The <em>Auto Discovered Contact Directory</em> feature is not enabled, it "
 "will improve the data displayed here."
 msgstr "Funkcja <em>Katalog kontaktów automatycznie odkrytych</em> nie jest włączona, poprawi ona wyświetlane tutaj dane."
 
-#: src/Module/Admin/Federation.php:186 src/Module/BaseAdminModule.php:77
+#: src/Module/Admin/Federation.php:188 src/Module/BaseAdminModule.php:77
 msgid "Federation Statistics"
 msgstr "Statystyki Organizacji"
 
-#: src/Module/Admin/Federation.php:192
+#: src/Module/Admin/Federation.php:194
 #, php-format
 msgid ""
 "Currently this node is aware of %d nodes with %d registered users from the "
@@ -6993,54 +6869,60 @@ msgstr "GUID"
 msgid "The GUID of the item you want to delete."
 msgstr "Identyfikator elementu GUID, który chcesz usunąć."
 
-#: src/Module/Admin/Item/Source.php:46 src/Module/Itemsource.php:46
+#: src/Module/Admin/Item/Source.php:46
 msgid "Item Guid"
 msgstr "Element Guid"
 
-#: src/Module/Admin/Logs/Settings.php:30
+#: src/Module/Admin/Logs/Settings.php:27 src/Module/Admin/Summary.php:83
+#: src/Module/Admin/Summary.php:90
+#, php-format
+msgid "The logfile '%s' is not writable. No logging possible"
+msgstr "Plik dziennika '%s' nie jest zapisywalny. Brak możliwości logowania"
+
+#: src/Module/Admin/Logs/Settings.php:36
 msgid "Log settings updated."
 msgstr "Zaktualizowano ustawienia logów."
 
-#: src/Module/Admin/Logs/Settings.php:49
+#: src/Module/Admin/Logs/Settings.php:55
 msgid "PHP log currently enabled."
 msgstr "Dziennik PHP jest obecnie włączony."
 
-#: src/Module/Admin/Logs/Settings.php:51
+#: src/Module/Admin/Logs/Settings.php:57
 msgid "PHP log currently disabled."
 msgstr "Dziennik PHP jest obecnie wyłączony."
 
-#: src/Module/Admin/Logs/Settings.php:58 src/Module/BaseAdminModule.php:97
+#: src/Module/Admin/Logs/Settings.php:64 src/Module/BaseAdminModule.php:97
 #: src/Module/BaseAdminModule.php:98
 msgid "Logs"
 msgstr "Logi"
 
-#: src/Module/Admin/Logs/Settings.php:60
+#: src/Module/Admin/Logs/Settings.php:66
 msgid "Clear"
 msgstr "Wyczyść"
 
-#: src/Module/Admin/Logs/Settings.php:64
+#: src/Module/Admin/Logs/Settings.php:70
 msgid "Enable Debugging"
 msgstr "Włącz debugowanie"
 
-#: src/Module/Admin/Logs/Settings.php:65
+#: src/Module/Admin/Logs/Settings.php:71
 msgid "Log file"
 msgstr "Plik logów"
 
-#: src/Module/Admin/Logs/Settings.php:65
+#: src/Module/Admin/Logs/Settings.php:71
 msgid ""
 "Must be writable by web server. Relative to your Friendica top-level "
 "directory."
 msgstr "Musi być zapisywalny przez serwer sieciowy. W stosunku do katalogu najwyższego poziomu Friendica."
 
-#: src/Module/Admin/Logs/Settings.php:66
+#: src/Module/Admin/Logs/Settings.php:72
 msgid "Log level"
 msgstr "Poziom logów"
 
-#: src/Module/Admin/Logs/Settings.php:68
+#: src/Module/Admin/Logs/Settings.php:74
 msgid "PHP logging"
 msgstr "Logowanie w PHP"
 
-#: src/Module/Admin/Logs/Settings.php:69
+#: src/Module/Admin/Logs/Settings.php:75
 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 "
@@ -7103,7 +6985,7 @@ msgstr "Utwórz"
 msgid "Priority"
 msgstr "Priorytet"
 
-#: src/Module/Admin/Site.php:49
+#: src/Module/Admin/Site.php:50
 msgid "Can not parse base url. Must have at least <scheme>://<domain>"
 msgstr "Nie można zanalizować podstawowego adresu URL. Musi mieć co najmniej <scheme>: //<domain>"
 
@@ -7111,260 +6993,260 @@ msgstr "Nie można zanalizować podstawowego adresu URL. Musi mieć co najmniej
 msgid "Invalid storage backend setting value."
 msgstr ""
 
-#: src/Module/Admin/Site.php:412
+#: src/Module/Admin/Site.php:411
 msgid "Site settings updated."
 msgstr "Zaktualizowano ustawienia strony."
 
-#: src/Module/Admin/Site.php:464
+#: src/Module/Admin/Site.php:463
 msgid "No community page for local users"
 msgstr "Brak strony społeczności dla użytkowników lokalnych"
 
-#: src/Module/Admin/Site.php:465
+#: src/Module/Admin/Site.php:464
 msgid "No community page"
 msgstr "Brak strony społeczności"
 
-#: src/Module/Admin/Site.php:466
+#: src/Module/Admin/Site.php:465
 msgid "Public postings from users of this site"
 msgstr "Publikacje publiczne od użytkowników tej strony"
 
-#: src/Module/Admin/Site.php:467
+#: src/Module/Admin/Site.php:466
 msgid "Public postings from the federated network"
 msgstr "Publikacje wpisy ze sfederowanej sieci"
 
-#: src/Module/Admin/Site.php:468
+#: src/Module/Admin/Site.php:467
 msgid "Public postings from local users and the federated network"
 msgstr "Publikacje publiczne od użytkowników lokalnych i sieci federacyjnej"
 
-#: src/Module/Admin/Site.php:472 src/Module/Admin/Site.php:668
-#: src/Module/Admin/Site.php:678 src/Module/Contact.php:549
-#: src/Module/Settings/TwoFactor/Index.php:91
+#: src/Module/Admin/Site.php:471 src/Module/Admin/Site.php:666
+#: src/Module/Admin/Site.php:676 src/Module/Contact.php:563
+#: src/Module/Settings/TwoFactor/Index.php:97
 msgid "Disabled"
 msgstr "Wyłączony"
 
-#: src/Module/Admin/Site.php:473 src/Module/Admin/Users.php:278
+#: src/Module/Admin/Site.php:472 src/Module/Admin/Users.php:278
 #: src/Module/Admin/Users.php:295 src/Module/BaseAdminModule.php:81
 msgid "Users"
 msgstr "Użytkownicy"
 
-#: src/Module/Admin/Site.php:474
+#: src/Module/Admin/Site.php:473
 msgid "Users, Global Contacts"
 msgstr "Użytkownicy, kontakty globalne"
 
-#: src/Module/Admin/Site.php:475
+#: src/Module/Admin/Site.php:474
 msgid "Users, Global Contacts/fallback"
 msgstr "Użytkownicy, kontakty globalne/awaryjne"
 
-#: src/Module/Admin/Site.php:479
+#: src/Module/Admin/Site.php:478
 msgid "One month"
 msgstr "Miesiąc"
 
-#: src/Module/Admin/Site.php:480
+#: src/Module/Admin/Site.php:479
 msgid "Three months"
 msgstr "Trzy miesiące"
 
-#: src/Module/Admin/Site.php:481
+#: src/Module/Admin/Site.php:480
 msgid "Half a year"
 msgstr "Pół roku"
 
-#: src/Module/Admin/Site.php:482
+#: src/Module/Admin/Site.php:481
 msgid "One year"
 msgstr "Rok"
 
-#: src/Module/Admin/Site.php:488
+#: src/Module/Admin/Site.php:487
 msgid "Multi user instance"
 msgstr "Tryb wielu użytkowników"
 
-#: src/Module/Admin/Site.php:510
+#: src/Module/Admin/Site.php:509
 msgid "Closed"
 msgstr "Zamknięte"
 
-#: src/Module/Admin/Site.php:511
+#: src/Module/Admin/Site.php:510
 msgid "Requires approval"
 msgstr "Wymaga zatwierdzenia"
 
-#: src/Module/Admin/Site.php:512
+#: src/Module/Admin/Site.php:511
 msgid "Open"
 msgstr "Otwarta"
 
-#: src/Module/Admin/Site.php:516 src/Module/Install.php:181
+#: src/Module/Admin/Site.php:515 src/Module/Install.php:183
 msgid "No SSL policy, links will track page SSL state"
 msgstr "Brak SSL, linki będą śledzić stan SSL"
 
-#: src/Module/Admin/Site.php:517 src/Module/Install.php:182
+#: src/Module/Admin/Site.php:516 src/Module/Install.php:184
 msgid "Force all links to use SSL"
 msgstr "Wymuś używanie SSL na wszystkich odnośnikach"
 
-#: src/Module/Admin/Site.php:518 src/Module/Install.php:183
+#: src/Module/Admin/Site.php:517 src/Module/Install.php:185
 msgid "Self-signed certificate, use SSL for local links only (discouraged)"
 msgstr "Wewnętrzne Certyfikaty, użyj SSL tylko dla linków lokalnych . "
 
-#: src/Module/Admin/Site.php:522
+#: src/Module/Admin/Site.php:521
 msgid "Don't check"
 msgstr "Nie sprawdzaj"
 
-#: src/Module/Admin/Site.php:523
+#: src/Module/Admin/Site.php:522
 msgid "check the stable version"
 msgstr "sprawdź wersję stabilną"
 
-#: src/Module/Admin/Site.php:524
+#: src/Module/Admin/Site.php:523
 msgid "check the development version"
 msgstr "sprawdź wersję rozwojową"
 
-#: src/Module/Admin/Site.php:544
+#: src/Module/Admin/Site.php:543
 msgid "Database (legacy)"
-msgstr ""
+msgstr "Baza danych (legacy)"
 
-#: src/Module/Admin/Site.php:569 src/Module/BaseAdminModule.php:80
+#: src/Module/Admin/Site.php:568 src/Module/BaseAdminModule.php:80
 msgid "Site"
 msgstr "Strona"
 
-#: src/Module/Admin/Site.php:571
+#: src/Module/Admin/Site.php:570
 msgid "Republish users to directory"
 msgstr "Ponownie opublikuj użytkowników w katalogu"
 
-#: src/Module/Admin/Site.php:572 src/Module/Register.php:121
+#: src/Module/Admin/Site.php:571 src/Module/Register.php:121
 msgid "Registration"
 msgstr "Rejestracja"
 
-#: src/Module/Admin/Site.php:573
+#: src/Module/Admin/Site.php:572
 msgid "File upload"
 msgstr "Przesyłanie plików"
 
-#: src/Module/Admin/Site.php:574
+#: src/Module/Admin/Site.php:573
 msgid "Policies"
 msgstr "Zasady"
 
-#: src/Module/Admin/Site.php:576
+#: src/Module/Admin/Site.php:575
 msgid "Auto Discovered Contact Directory"
 msgstr "Katalog kontaktów automatycznie odkrytych"
 
-#: src/Module/Admin/Site.php:577
+#: src/Module/Admin/Site.php:576
 msgid "Performance"
 msgstr "Ustawienia"
 
-#: src/Module/Admin/Site.php:578
+#: src/Module/Admin/Site.php:577
 msgid "Worker"
 msgstr "Pracownik"
 
-#: src/Module/Admin/Site.php:579
+#: src/Module/Admin/Site.php:578
 msgid "Message Relay"
 msgstr "Przekazywanie wiadomości"
 
-#: src/Module/Admin/Site.php:580
+#: src/Module/Admin/Site.php:579
 msgid "Relocate Instance"
 msgstr "Zmień lokalizację"
 
-#: src/Module/Admin/Site.php:581
+#: src/Module/Admin/Site.php:580
 msgid "Warning! Advanced function. Could make this server unreachable."
 msgstr "Ostrzeżenie! Zaawansowana funkcja. Może spowodować, że serwer będzie nieosiągalny."
 
-#: src/Module/Admin/Site.php:585
+#: src/Module/Admin/Site.php:584
 msgid "Site name"
 msgstr "Nazwa strony"
 
-#: src/Module/Admin/Site.php:586
+#: src/Module/Admin/Site.php:585
 msgid "Sender Email"
 msgstr "E-mail nadawcy"
 
-#: src/Module/Admin/Site.php:586
+#: src/Module/Admin/Site.php:585
 msgid ""
 "The email address your server shall use to send notification emails from."
 msgstr "Adres e-mail używany przez Twój serwer do wysyłania e-maili z powiadomieniami."
 
-#: src/Module/Admin/Site.php:587
+#: src/Module/Admin/Site.php:586
 msgid "Banner/Logo"
 msgstr "Logo"
 
-#: src/Module/Admin/Site.php:588
+#: src/Module/Admin/Site.php:587
 msgid "Shortcut icon"
 msgstr "Ikona skrótu"
 
-#: src/Module/Admin/Site.php:588
+#: src/Module/Admin/Site.php:587
 msgid "Link to an icon that will be used for browsers."
 msgstr "Link do ikony, która będzie używana w przeglądarkach."
 
-#: src/Module/Admin/Site.php:589
+#: src/Module/Admin/Site.php:588
 msgid "Touch icon"
 msgstr "Dołącz ikonę"
 
-#: src/Module/Admin/Site.php:589
+#: src/Module/Admin/Site.php:588
 msgid "Link to an icon that will be used for tablets and mobiles."
 msgstr "Link do ikony, która będzie używana w tabletach i telefonach komórkowych."
 
-#: src/Module/Admin/Site.php:590
+#: src/Module/Admin/Site.php:589
 msgid "Additional Info"
 msgstr "Dodatkowe informacje"
 
-#: src/Module/Admin/Site.php:590
+#: src/Module/Admin/Site.php:589
 #, php-format
 msgid ""
 "For public servers: you can add additional information here that will be "
 "listed at %s/servers."
 msgstr "W przypadku serwerów publicznych: możesz tu dodać dodatkowe informacje, które będą wymienione na %s/servers."
 
-#: src/Module/Admin/Site.php:591
+#: src/Module/Admin/Site.php:590
 msgid "System language"
 msgstr "Język systemu"
 
-#: src/Module/Admin/Site.php:592
+#: src/Module/Admin/Site.php:591
 msgid "System theme"
 msgstr "Motyw systemowy"
 
-#: src/Module/Admin/Site.php:592
+#: src/Module/Admin/Site.php:591
 msgid ""
 "Default system theme - may be over-ridden by user profiles - <a "
 "href=\"/admin/themes\" id=\"cnftheme\">Change default theme settings</a>"
-msgstr ""
+msgstr "Domyślny motyw systemu - może być nadpisywany przez profile użytkowników - <a href=\"/admin/themes\" id=\"cnftheme\">Zmień domyślne ustawienia motywu</a>"
 
-#: src/Module/Admin/Site.php:593
+#: src/Module/Admin/Site.php:592
 msgid "Mobile system theme"
 msgstr "Motyw systemu mobilnego"
 
-#: src/Module/Admin/Site.php:593
+#: src/Module/Admin/Site.php:592
 msgid "Theme for mobile devices"
 msgstr "Motyw na urządzenia mobilne"
 
-#: src/Module/Admin/Site.php:594 src/Module/Install.php:191
+#: src/Module/Admin/Site.php:593 src/Module/Install.php:193
 msgid "SSL link policy"
 msgstr "Polityka odnośników SSL"
 
-#: src/Module/Admin/Site.php:594 src/Module/Install.php:193
+#: src/Module/Admin/Site.php:593 src/Module/Install.php:195
 msgid "Determines whether generated links should be forced to use SSL"
 msgstr "Określa, czy generowane odnośniki będą obowiązkowo używały SSL"
 
-#: src/Module/Admin/Site.php:595
+#: src/Module/Admin/Site.php:594
 msgid "Force SSL"
 msgstr "Wymuś SSL"
 
-#: src/Module/Admin/Site.php:595
+#: src/Module/Admin/Site.php:594
 msgid ""
 "Force all Non-SSL requests to SSL - Attention: on some systems it could lead"
 " to endless loops."
 msgstr "Wymuszaj wszystkie żądania SSL bez SSL - Uwaga: w niektórych systemach może to prowadzić do niekończących się pętli."
 
-#: src/Module/Admin/Site.php:596
+#: src/Module/Admin/Site.php:595
 msgid "Hide help entry from navigation menu"
 msgstr "Ukryj pomoc w menu nawigacyjnym"
 
-#: src/Module/Admin/Site.php:596
+#: src/Module/Admin/Site.php:595
 msgid ""
 "Hides the menu entry for the Help pages from the navigation menu. You can "
 "still access it calling /help directly."
 msgstr "Chowa pozycje menu dla stron pomocy ze strony nawigacyjnej. Możesz nadal ją wywołać poprzez komendę /help."
 
-#: src/Module/Admin/Site.php:597
+#: src/Module/Admin/Site.php:596
 msgid "Single user instance"
 msgstr "Tryb pojedynczego użytkownika"
 
-#: src/Module/Admin/Site.php:597
+#: src/Module/Admin/Site.php:596
 msgid "Make this instance multi-user or single-user for the named user"
 msgstr "Ustawia tryb dla wielu użytkowników lub pojedynczego użytkownika dla nazwanego użytkownika"
 
-#: src/Module/Admin/Site.php:599
+#: src/Module/Admin/Site.php:598
 msgid "File storage backend"
 msgstr "Backend przechowywania plików"
 
-#: src/Module/Admin/Site.php:599
+#: src/Module/Admin/Site.php:598
 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 "
@@ -7373,190 +7255,190 @@ msgid ""
 " for more information about the choices and the moving procedure."
 msgstr ""
 
-#: src/Module/Admin/Site.php:601
+#: src/Module/Admin/Site.php:600
 msgid "Maximum image size"
 msgstr "Maksymalny rozmiar zdjęcia"
 
-#: src/Module/Admin/Site.php:601
+#: src/Module/Admin/Site.php:600
 msgid ""
 "Maximum size in bytes of uploaded images. Default is 0, which means no "
 "limits."
 msgstr "Maksymalny rozmiar w bitach dla wczytywanego obrazu . Domyślnie jest to  0 , co oznacza bez limitu ."
 
-#: src/Module/Admin/Site.php:602
+#: src/Module/Admin/Site.php:601
 msgid "Maximum image length"
 msgstr "Maksymalna długość obrazu"
 
-#: src/Module/Admin/Site.php:602
+#: src/Module/Admin/Site.php:601
 msgid ""
 "Maximum length in pixels of the longest side of uploaded images. Default is "
 "-1, which means no limits."
 msgstr "Maksymalna długość w pikselach dłuższego boku przesyłanego obrazu. Wartością domyślną jest -1, co oznacza brak ograniczeń."
 
-#: src/Module/Admin/Site.php:603
+#: src/Module/Admin/Site.php:602
 msgid "JPEG image quality"
 msgstr "Jakość obrazu JPEG"
 
-#: src/Module/Admin/Site.php:603
+#: src/Module/Admin/Site.php:602
 msgid ""
 "Uploaded JPEGS will be saved at this quality setting [0-100]. Default is "
 "100, which is full quality."
 msgstr "Przesłane pliki JPEG zostaną zapisane w tym ustawieniu jakości [0-100]. Domyślna wartość to 100, która jest pełną jakością."
 
-#: src/Module/Admin/Site.php:605
+#: src/Module/Admin/Site.php:604
 msgid "Register policy"
 msgstr "Zasady rejestracji"
 
-#: src/Module/Admin/Site.php:606
+#: src/Module/Admin/Site.php:605
 msgid "Maximum Daily Registrations"
 msgstr "Maksymalna dzienna rejestracja"
 
-#: src/Module/Admin/Site.php:606
+#: src/Module/Admin/Site.php:605
 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 "Jeśli rejestracja powyżej jest dozwolona, to określa maksymalną liczbę nowych rejestracji użytkowników do zaakceptowania na dzień. Jeśli rejestracja jest ustawiona na \"Zamknięta\", to ustawienie to nie ma wpływu."
 
-#: src/Module/Admin/Site.php:607
+#: src/Module/Admin/Site.php:606
 msgid "Register text"
 msgstr "Zarejestruj tekst"
 
-#: src/Module/Admin/Site.php:607
+#: src/Module/Admin/Site.php:606
 msgid ""
 "Will be displayed prominently on the registration page. You can use BBCode "
 "here."
 msgstr "Będą wyświetlane w widocznym miejscu na stronie rejestracji. Możesz użyć BBCode tutaj."
 
-#: src/Module/Admin/Site.php:608
+#: src/Module/Admin/Site.php:607
 msgid "Forbidden Nicknames"
 msgstr "Zakazane pseudonimy"
 
-#: src/Module/Admin/Site.php:608
+#: src/Module/Admin/Site.php:607
 msgid ""
 "Comma separated list of nicknames that are forbidden from registration. "
 "Preset is a list of role names according RFC 2142."
 msgstr "Lista oddzielonych przecinkami pseudonimów, których nie wolno rejestrować. Preset to lista nazw ról zgodnie z RFC 2142."
 
-#: src/Module/Admin/Site.php:609
+#: src/Module/Admin/Site.php:608
 msgid "Accounts abandoned after x days"
 msgstr "Konta porzucone po x dni"
 
-#: src/Module/Admin/Site.php:609
+#: src/Module/Admin/Site.php:608
 msgid ""
 "Will not waste system resources polling external sites for abandonded "
 "accounts. Enter 0 for no time limit."
 msgstr "Nie będzie marnować zasobów systemu wypytując zewnętrzne strony o opuszczone konta. Ustaw 0 dla braku limitu czasu ."
 
-#: src/Module/Admin/Site.php:610
+#: src/Module/Admin/Site.php:609
 msgid "Allowed friend domains"
 msgstr "Dozwolone domeny przyjaciół"
 
-#: src/Module/Admin/Site.php:610
+#: src/Module/Admin/Site.php:609
 msgid ""
 "Comma separated list of domains which are allowed to establish friendships "
 "with this site. Wildcards are accepted. Empty to allow any domains"
 msgstr "Rozdzielana przecinkami lista domen, które mogą nawiązywać przyjaźnie z tą witryną. Symbole wieloznaczne są akceptowane. Pozostaw puste by zezwolić każdej domenie na zaprzyjaźnienie."
 
-#: src/Module/Admin/Site.php:611
+#: src/Module/Admin/Site.php:610
 msgid "Allowed email domains"
 msgstr "Dozwolone domeny e-mailowe"
 
-#: src/Module/Admin/Site.php:611
+#: src/Module/Admin/Site.php:610
 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 "Rozdzielana przecinkami lista domen dozwolonych w adresach e-mail do rejestracji na tej stronie. Symbole wieloznaczne są akceptowane. Opróżnij, aby zezwolić na dowolne domeny"
 
-#: src/Module/Admin/Site.php:612
+#: src/Module/Admin/Site.php:611
 msgid "No OEmbed rich content"
 msgstr "Brak treści multimedialnych ze znaczkiem HTML"
 
-#: src/Module/Admin/Site.php:612
+#: src/Module/Admin/Site.php:611
 msgid ""
 "Don't show the rich content (e.g. embedded PDF), except from the domains "
 "listed below."
 msgstr "Nie wyświetlaj zasobów treści (np. osadzonego pliku PDF), z wyjątkiem domen wymienionych poniżej."
 
-#: src/Module/Admin/Site.php:613
+#: src/Module/Admin/Site.php:612
 msgid "Allowed OEmbed domains"
 msgstr "Dozwolone domeny OEmbed"
 
-#: src/Module/Admin/Site.php:613
+#: src/Module/Admin/Site.php:612
 msgid ""
 "Comma separated list of domains which oembed content is allowed to be "
 "displayed. Wildcards are accepted."
 msgstr "Rozdzielana przecinkami lista domen, w których wyświetlana jest treść, może być wyświetlana. Symbole wieloznaczne są akceptowane."
 
-#: src/Module/Admin/Site.php:614
+#: src/Module/Admin/Site.php:613
 msgid "Block public"
 msgstr "Blokuj publicznie"
 
-#: src/Module/Admin/Site.php:614
+#: src/Module/Admin/Site.php:613
 msgid ""
 "Check to block public access to all otherwise public personal pages on this "
 "site unless you are currently logged in."
 msgstr "Zaznacz, aby zablokować publiczny dostęp do wszystkich publicznych stron prywatnych w tej witrynie, chyba że jesteś zalogowany."
 
-#: src/Module/Admin/Site.php:615
+#: src/Module/Admin/Site.php:614
 msgid "Force publish"
 msgstr "Wymuś publikację"
 
-#: src/Module/Admin/Site.php:615
+#: src/Module/Admin/Site.php:614
 msgid ""
 "Check to force all profiles on this site to be listed in the site directory."
 msgstr "Zaznacz, aby wymusić umieszczenie wszystkich profili w tej witrynie w katalogu witryny."
 
-#: src/Module/Admin/Site.php:615
+#: src/Module/Admin/Site.php:614
 msgid "Enabling this may violate privacy laws like the GDPR"
 msgstr "Włączenie tego może naruszyć prawa ochrony prywatności, takie jak GDPR"
 
-#: src/Module/Admin/Site.php:616
+#: src/Module/Admin/Site.php:615
 msgid "Global directory URL"
 msgstr "Globalny adres URL katalogu"
 
-#: src/Module/Admin/Site.php:616
+#: src/Module/Admin/Site.php:615
 msgid ""
 "URL to the global directory. If this is not set, the global directory is "
 "completely unavailable to the application."
 msgstr "Adres URL do katalogu globalnego. Jeśli nie zostanie to ustawione, katalog globalny jest całkowicie niedostępny dla aplikacji."
 
-#: src/Module/Admin/Site.php:617
+#: src/Module/Admin/Site.php:616
 msgid "Private posts by default for new users"
 msgstr "Prywatne posty domyślnie dla nowych użytkowników"
 
-#: src/Module/Admin/Site.php:617
+#: src/Module/Admin/Site.php:616
 msgid ""
 "Set default post permissions for all new members to the default privacy "
 "group rather than public."
 msgstr "Ustaw domyślne uprawnienia do publikowania dla wszystkich nowych członków na domyślną grupę prywatności, a nie publiczną."
 
-#: src/Module/Admin/Site.php:618
+#: src/Module/Admin/Site.php:617
 msgid "Don't include post content in email notifications"
 msgstr "Nie wklejaj zawartości postu do powiadomienia o poczcie"
 
-#: src/Module/Admin/Site.php:618
+#: src/Module/Admin/Site.php:617
 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 "W celu ochrony prywatności, nie włączaj zawartości postu/komentarza/wiadomości prywatnej/etc. do powiadomień w wiadomościach mailowych wysyłanych z tej strony."
 
-#: src/Module/Admin/Site.php:619
+#: src/Module/Admin/Site.php:618
 msgid "Disallow public access to addons listed in the apps menu."
 msgstr "Nie zezwalaj na publiczny dostęp do dodatkowych wtyczek wyszczególnionych w menu aplikacji."
 
-#: src/Module/Admin/Site.php:619
+#: src/Module/Admin/Site.php:618
 msgid ""
 "Checking this box will restrict addons listed in the apps menu to members "
 "only."
 msgstr "Zaznaczenie tego pola spowoduje ograniczenie dodatków wymienionych w menu aplikacji tylko dla członków."
 
-#: src/Module/Admin/Site.php:620
+#: src/Module/Admin/Site.php:619
 msgid "Don't embed private images in posts"
 msgstr "Nie umieszczaj prywatnych zdjęć w postach"
 
-#: src/Module/Admin/Site.php:620
+#: src/Module/Admin/Site.php:619
 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 "
@@ -7564,11 +7446,11 @@ msgid ""
 "while."
 msgstr "Nie zastępuj lokalnie hostowanych zdjęć prywatnych we wpisach za pomocą osadzonej kopii obrazu. Oznacza to, że osoby, które otrzymują posty zawierające prywatne zdjęcia, będą musiały uwierzytelnić i wczytać każdy obraz, co może trochę potrwać."
 
-#: src/Module/Admin/Site.php:621
+#: src/Module/Admin/Site.php:620
 msgid "Explicit Content"
 msgstr "Treści dla dorosłych"
 
-#: src/Module/Admin/Site.php:621
+#: src/Module/Admin/Site.php:620
 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 "
@@ -7577,211 +7459,200 @@ msgid ""
 "will be shown at the user registration page."
 msgstr "Ustaw to, aby ogłosić, że Twój węzeł jest używany głównie do jawnej treści, która może nie być odpowiednia dla nieletnich. Informacje te zostaną opublikowane w informacjach o węźle i mogą zostać wykorzystane, np. w katalogu globalnym, aby filtrować węzeł z list węzłów do przyłączenia. Dodatkowo notatka o tym zostanie pokazana na stronie rejestracji użytkownika."
 
-#: src/Module/Admin/Site.php:622
+#: src/Module/Admin/Site.php:621
 msgid "Allow Users to set remote_self"
 msgstr "Zezwól użytkownikom na ustawienie remote_self"
 
-#: src/Module/Admin/Site.php:622
+#: src/Module/Admin/Site.php:621
 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 "Po sprawdzeniu tego każdy użytkownik może zaznaczyć każdy kontakt jako zdalny w oknie dialogowym kontaktu naprawczego. Ustawienie tej flagi na kontakcie powoduje dublowanie każdego wpisu tego kontaktu w strumieniu użytkowników."
 
-#: src/Module/Admin/Site.php:623
+#: src/Module/Admin/Site.php:622
 msgid "Block multiple registrations"
 msgstr "Zablokuj wielokrotną rejestrację"
 
-#: src/Module/Admin/Site.php:623
+#: src/Module/Admin/Site.php:622
 msgid "Disallow users to register additional accounts for use as pages."
 msgstr "Nie pozwalaj użytkownikom na zakładanie dodatkowych kont do używania jako strony. "
 
-#: src/Module/Admin/Site.php:624
+#: src/Module/Admin/Site.php:623
 msgid "Disable OpenID"
 msgstr "Wyłącz OpenID"
 
-#: src/Module/Admin/Site.php:624
+#: src/Module/Admin/Site.php:623
 msgid "Disable OpenID support for registration and logins."
 msgstr "Wyłącz obsługę OpenID dla rejestracji i logowania."
 
-#: src/Module/Admin/Site.php:625
+#: src/Module/Admin/Site.php:624
 msgid "No Fullname check"
 msgstr "Bez sprawdzania pełnej nazwy"
 
-#: src/Module/Admin/Site.php:625
+#: src/Module/Admin/Site.php:624
 msgid ""
 "Allow users to register without a space between the first name and the last "
 "name in their full name."
 msgstr "Zezwól użytkownikom na rejestrację bez spacji między imieniem i nazwiskiem w ich pełnym imieniu."
 
-#: src/Module/Admin/Site.php:626
+#: src/Module/Admin/Site.php:625
 msgid "Community pages for visitors"
 msgstr "Strony społecznościowe dla odwiedzających"
 
-#: src/Module/Admin/Site.php:626
+#: src/Module/Admin/Site.php:625
 msgid ""
 "Which community pages should be available for visitors. Local users always "
 "see both pages."
 msgstr "Które strony społeczności powinny być dostępne dla odwiedzających. Lokalni użytkownicy zawsze widzą obie strony."
 
-#: src/Module/Admin/Site.php:627
+#: src/Module/Admin/Site.php:626
 msgid "Posts per user on community page"
 msgstr "Lista postów użytkownika na stronie społeczności"
 
-#: src/Module/Admin/Site.php:627
+#: src/Module/Admin/Site.php:626
 msgid ""
 "The maximum number of posts per user on the community page. (Not valid for "
 "\"Global Community\")"
 msgstr "Maksymalna liczba postów na użytkownika na stronie społeczności. (Nie dotyczy „Globalnej społeczności”)"
 
-#: src/Module/Admin/Site.php:628
+#: src/Module/Admin/Site.php:627
 msgid "Disable OStatus support"
 msgstr "Wyłącz obsługę OStatus"
 
-#: src/Module/Admin/Site.php:628
+#: src/Module/Admin/Site.php:627
 msgid ""
 "Disable built-in OStatus (StatusNet, GNU Social etc.) compatibility. All "
 "communications in OStatus are public, so privacy warnings will be "
 "occasionally displayed."
 msgstr "Wyłącz wbudowaną kompatybilność z OStatus (StatusNet, GNU Social itd.). Wszystkie rozmowy w OStatus są publiczne, więc czasem będą pojawiać się ostrzeżenia o prywatności."
 
-#: src/Module/Admin/Site.php:629
-msgid "Only import OStatus/ActivityPub threads from our contacts"
-msgstr "Importuj wątki OStatus/ActivityPub tylko z naszych kontaktów"
-
-#: src/Module/Admin/Site.php:629
-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 "Normalnie importujemy każdą zawartość z naszych kontaktów OStatus i ActivityPub. W tej opcji przechowujemy tylko wątki uruchomione przez kontakt znany w naszym systemie."
-
-#: src/Module/Admin/Site.php:630
+#: src/Module/Admin/Site.php:628
 msgid "OStatus support can only be enabled if threading is enabled."
 msgstr "Obsługa OStatus może być włączona tylko wtedy, gdy włączone jest wątkowanie."
 
-#: src/Module/Admin/Site.php:632
+#: src/Module/Admin/Site.php:630
 msgid ""
 "Diaspora support can't be enabled because Friendica was installed into a sub"
 " directory."
 msgstr "Obsługa Diaspory nie może być włączona, ponieważ Friendica została zainstalowana w podkatalogu."
 
-#: src/Module/Admin/Site.php:633
+#: src/Module/Admin/Site.php:631
 msgid "Enable Diaspora support"
 msgstr "Włączyć obsługę Diaspory"
 
-#: src/Module/Admin/Site.php:633
+#: src/Module/Admin/Site.php:631
 msgid "Provide built-in Diaspora network compatibility."
 msgstr "Zapewnij wbudowaną kompatybilność z siecią Diaspora."
 
-#: src/Module/Admin/Site.php:634
+#: src/Module/Admin/Site.php:632
 msgid "Only allow Friendica contacts"
 msgstr "Dopuść tylko kontakty Friendrica"
 
-#: src/Module/Admin/Site.php:634
+#: src/Module/Admin/Site.php:632
 msgid ""
 "All contacts must use Friendica protocols. All other built-in communication "
 "protocols disabled."
 msgstr "Wszyscy znajomi muszą używać protokołów Friendica. Wszystkie inne wbudowane protokoły komunikacyjne są wyłączone."
 
-#: src/Module/Admin/Site.php:635
+#: src/Module/Admin/Site.php:633
 msgid "Verify SSL"
 msgstr "Weryfikacja SSL"
 
-#: src/Module/Admin/Site.php:635
+#: src/Module/Admin/Site.php:633
 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 "Jeśli chcesz, możesz włączyć ścisłe sprawdzanie certyfikatu. Oznacza to, że nie możesz połączyć się (w ogóle) z własnoręcznie podpisanymi stronami SSL."
 
-#: src/Module/Admin/Site.php:636
+#: src/Module/Admin/Site.php:634
 msgid "Proxy user"
 msgstr "Użytkownik proxy"
 
-#: src/Module/Admin/Site.php:637
+#: src/Module/Admin/Site.php:635
 msgid "Proxy URL"
 msgstr "URL Proxy"
 
-#: src/Module/Admin/Site.php:638
+#: src/Module/Admin/Site.php:636
 msgid "Network timeout"
 msgstr "Network timeout"
 
-#: src/Module/Admin/Site.php:638
+#: src/Module/Admin/Site.php:636
 msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
 msgstr "Wartość jest w sekundach. Ustaw na 0 dla nieograniczonej (niezalecane)."
 
-#: src/Module/Admin/Site.php:639
+#: src/Module/Admin/Site.php:637
 msgid "Maximum Load Average"
 msgstr "Maksymalne obciążenie średnie"
 
-#: src/Module/Admin/Site.php:639
+#: src/Module/Admin/Site.php:637
 #, php-format
 msgid ""
 "Maximum system load before delivery and poll processes are deferred - "
 "default %d."
-msgstr ""
+msgstr "Maksymalne obciążenie systemu przed dostarczeniem i procesami odpytywania jest odroczone - domyślnie %d."
 
-#: src/Module/Admin/Site.php:640
+#: src/Module/Admin/Site.php:638
 msgid "Maximum Load Average (Frontend)"
 msgstr "Maksymalne obciążenie średnie (Frontend)"
 
-#: src/Module/Admin/Site.php:640
+#: src/Module/Admin/Site.php:638
 msgid "Maximum system load before the frontend quits service - default 50."
 msgstr "Maksymalne obciążenie systemu, zanim frontend zakończy pracę - domyślnie 50."
 
-#: src/Module/Admin/Site.php:641
+#: src/Module/Admin/Site.php:639
 msgid "Minimal Memory"
 msgstr "Minimalna pamięć"
 
-#: src/Module/Admin/Site.php:641
+#: src/Module/Admin/Site.php:639
 msgid ""
 "Minimal free memory in MB for the worker. Needs access to /proc/meminfo - "
 "default 0 (deactivated)."
 msgstr "Minimalna wolna pamięć w MB dla pracownika. Potrzebuje dostępu do /proc/ meminfo - domyślnie 0 (wyłączone)."
 
-#: src/Module/Admin/Site.php:642
+#: src/Module/Admin/Site.php:640
 msgid "Maximum table size for optimization"
 msgstr "Maksymalny rozmiar stołu do optymalizacji"
 
-#: src/Module/Admin/Site.php:642
+#: src/Module/Admin/Site.php:640
 msgid ""
 "Maximum table size (in MB) for the automatic optimization. Enter -1 to "
 "disable it."
 msgstr "Maksymalny rozmiar tablicy (w MB) do automatycznej optymalizacji. Wprowadź -1, aby go wyłączyć."
 
-#: src/Module/Admin/Site.php:643
+#: src/Module/Admin/Site.php:641
 msgid "Minimum level of fragmentation"
 msgstr "Minimalny poziom fragmentacji"
 
-#: src/Module/Admin/Site.php:643
+#: src/Module/Admin/Site.php:641
 msgid ""
 "Minimum fragmenation level to start the automatic optimization - default "
 "value is 30%."
 msgstr "Minimalny poziom fragmentacji, aby rozpocząć automatyczną optymalizację - domyślna wartość to 30%."
 
-#: src/Module/Admin/Site.php:645
+#: src/Module/Admin/Site.php:643
 msgid "Periodical check of global contacts"
 msgstr "Okresowa kontrola kontaktów globalnych"
 
-#: src/Module/Admin/Site.php:645
+#: src/Module/Admin/Site.php:643
 msgid ""
 "If enabled, the global contacts are checked periodically for missing or "
 "outdated data and the vitality of the contacts and servers."
 msgstr "Jeśli jest włączona, kontakty globalne są okresowo sprawdzane pod kątem brakujących lub nieaktualnych danych oraz żywotności kontaktów i serwerów."
 
-#: src/Module/Admin/Site.php:646
+#: src/Module/Admin/Site.php:644
 msgid "Days between requery"
 msgstr "Dni między żądaniem"
 
-#: src/Module/Admin/Site.php:646
+#: src/Module/Admin/Site.php:644
 msgid "Number of days after which a server is requeried for his contacts."
 msgstr "Liczba dni, po upływie których serwer jest żądany dla swoich kontaktów."
 
-#: src/Module/Admin/Site.php:647
+#: src/Module/Admin/Site.php:645
 msgid "Discover contacts from other servers"
 msgstr "Odkryj kontakty z innych serwerów"
 
-#: src/Module/Admin/Site.php:647
+#: src/Module/Admin/Site.php:645
 msgid ""
 "Periodically query other servers for contacts. You can choose between "
 "\"Users\": the users on the remote system, \"Global Contacts\": active "
@@ -7789,85 +7660,85 @@ msgid ""
 "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\"."
-msgstr ""
+msgstr "Okresowo sprawdzaj kontakty z innymi serwerami. Możesz wybrać „Użytkownicy”: użytkownicy systemu zdalnego, „Kontakty globalne”: aktywne kontakty znane w systemie. Rozwiązanie awaryjne jest przeznaczone dla serwerów Redmatrix i starszych serwerów friendica, gdzie globalne kontakty nie były dostępne. Powrót awaryjny zwiększa obciążenie serwera, więc zalecane ustawienie to „Użytkownicy, kontakty globalne”."
 
-#: src/Module/Admin/Site.php:648
+#: src/Module/Admin/Site.php:646
 msgid "Timeframe for fetching global contacts"
 msgstr "Czas pobierania globalnych kontaktów"
 
-#: src/Module/Admin/Site.php:648
+#: src/Module/Admin/Site.php:646
 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 "Po aktywowaniu wykrywania ta wartość określa czas działania globalnych kontaktów pobieranych z innych serwerów."
 
-#: src/Module/Admin/Site.php:649
+#: src/Module/Admin/Site.php:647
 msgid "Search the local directory"
 msgstr "Wyszukaj w lokalnym katalogu"
 
-#: src/Module/Admin/Site.php:649
+#: src/Module/Admin/Site.php:647
 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 "Wyszukaj lokalny katalog zamiast katalogu globalnego. Podczas wyszukiwania lokalnie każde wyszukiwanie zostanie wykonane w katalogu globalnym w tle. Poprawia to wyniki wyszukiwania, gdy wyszukiwanie jest powtarzane."
 
-#: src/Module/Admin/Site.php:651
+#: src/Module/Admin/Site.php:649
 msgid "Publish server information"
 msgstr "Publikuj informacje o serwerze"
 
-#: src/Module/Admin/Site.php:651
+#: src/Module/Admin/Site.php:649
 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 "
 "profiles, number of posts and the activated protocols and connectors. See <a"
 " href=\"http://the-federation.info/\">the-federation.info</a> for details."
-msgstr ""
+msgstr "Jeśli ta opcja jest włączona, ogólne dane dotyczące serwera i użytkowania zostaną opublikowane. Dane zawierają nazwę i wersję serwera, liczbę użytkowników z profilami publicznymi, liczbę postów i aktywowane protokoły i złącza. Szczegółowe informacje można znaleźć na <a href=\"http://the-federation.info/\">the-federation.info</a>."
 
-#: src/Module/Admin/Site.php:653
+#: src/Module/Admin/Site.php:651
 msgid "Check upstream version"
 msgstr "Sprawdź wersję powyżej"
 
-#: src/Module/Admin/Site.php:653
+#: src/Module/Admin/Site.php:651
 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żliwia sprawdzenie nowych wersji Friendica na github. Jeśli pojawi się nowa wersja, zostaniesz o tym poinformowany w panelu administracyjnym."
 
-#: src/Module/Admin/Site.php:654
+#: src/Module/Admin/Site.php:652
 msgid "Suppress Tags"
 msgstr "Ukryj tagi"
 
-#: src/Module/Admin/Site.php:654
+#: src/Module/Admin/Site.php:652
 msgid "Suppress showing a list of hashtags at the end of the posting."
 msgstr "Pomiń wyświetlenie listy hashtagów na końcu postu."
 
-#: src/Module/Admin/Site.php:655
+#: src/Module/Admin/Site.php:653
 msgid "Clean database"
 msgstr "Wyczyść bazę danych"
 
-#: src/Module/Admin/Site.php:655
+#: src/Module/Admin/Site.php:653
 msgid ""
 "Remove old remote items, orphaned database records and old content from some"
 " other helper tables."
 msgstr "Usuń stare zdalne pozycje, osierocone rekordy bazy danych i starą zawartość z innych tabel pomocników."
 
-#: src/Module/Admin/Site.php:656
+#: src/Module/Admin/Site.php:654
 msgid "Lifespan of remote items"
 msgstr "Żywotność odległych przedmiotów"
 
-#: src/Module/Admin/Site.php:656
+#: src/Module/Admin/Site.php:654
 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 "Po włączeniu czyszczenia bazy danych określa dni, po których zdalne elementy zostaną usunięte. Własne przedmioty oraz oznaczone lub wypełnione pozycje są zawsze przechowywane. 0 wyłącza to zachowanie."
 
-#: src/Module/Admin/Site.php:657
+#: src/Module/Admin/Site.php:655
 msgid "Lifespan of unclaimed items"
 msgstr "Żywotność nieodebranych przedmiotów"
 
-#: src/Module/Admin/Site.php:657
+#: src/Module/Admin/Site.php:655
 msgid ""
 "When the database cleanup is enabled, this defines the days after which "
 "unclaimed remote items (mostly content from the relay) will be deleted. "
@@ -7875,130 +7746,130 @@ msgid ""
 "items if set to 0."
 msgstr "Po włączeniu czyszczenia bazy danych określa się dni, po których usunięte zostaną nieodebrane zdalne elementy (głównie zawartość z przekaźnika). Wartość domyślna to 90 dni. Wartość domyślna dla ogólnej długości życia zdalnych pozycji, jeśli jest ustawiona na 0."
 
-#: src/Module/Admin/Site.php:658
+#: src/Module/Admin/Site.php:656
 msgid "Lifespan of raw conversation data"
 msgstr "Trwałość nieprzetworzonych danych konwersacji"
 
-#: src/Module/Admin/Site.php:658
+#: src/Module/Admin/Site.php:656
 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 "Dane konwersacji są używane do ActivityPub i OStatus, a także do celów debugowania. Powinno być bezpieczne usunięcie go po 14 dniach, domyślnie jest to 90 dni."
 
-#: src/Module/Admin/Site.php:659
+#: src/Module/Admin/Site.php:657
 msgid "Path to item cache"
 msgstr "Ścieżka do pamięci podręcznej"
 
-#: src/Module/Admin/Site.php:659
+#: src/Module/Admin/Site.php:657
 msgid "The item caches buffers generated bbcode and external images."
 msgstr "Pozycja buforuje bufory generowane bbcode i obrazy zewnętrzne."
 
-#: src/Module/Admin/Site.php:660
+#: src/Module/Admin/Site.php:658
 msgid "Cache duration in seconds"
 msgstr "Czas trwania w sekundach"
 
-#: src/Module/Admin/Site.php:660
+#: src/Module/Admin/Site.php:658
 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 długo powinny być przechowywane pliki pamięci podręcznej? Wartość domyślna to 86400 sekund (jeden dzień). Aby wyłączyć pamięć podręczną elementów, ustaw wartość na -1."
 
-#: src/Module/Admin/Site.php:661
+#: src/Module/Admin/Site.php:659
 msgid "Maximum numbers of comments per post"
 msgstr "Maksymalna liczba komentarzy na post"
 
-#: src/Module/Admin/Site.php:661
+#: src/Module/Admin/Site.php:659
 msgid "How much comments should be shown for each post? Default value is 100."
 msgstr "Ile komentarzy powinno być pokazywanych dla każdego posta? Domyślna wartość to 100."
 
-#: src/Module/Admin/Site.php:662
+#: src/Module/Admin/Site.php:660
 msgid "Temp path"
 msgstr "Ścieżka do Temp"
 
-#: src/Module/Admin/Site.php:662
+#: src/Module/Admin/Site.php:660
 msgid ""
 "If you have a restricted system where the webserver can't access the system "
 "temp path, enter another path here."
 msgstr "Jeśli masz zastrzeżony system, w którym serwer internetowy nie może uzyskać dostępu do ścieżki temp systemu, wprowadź tutaj inną ścieżkę."
 
-#: src/Module/Admin/Site.php:663
+#: src/Module/Admin/Site.php:661
 msgid "Disable picture proxy"
 msgstr "Wyłącz obraz proxy"
 
-#: src/Module/Admin/Site.php:663
+#: src/Module/Admin/Site.php:661
 msgid ""
 "The picture proxy increases performance and privacy. It shouldn't be used on"
 " systems with very low bandwidth."
 msgstr "Serwer proxy zwiększa wydajność i prywatność. Nie powinno być używane w systemach o bardzo niskiej przepustowości."
 
-#: src/Module/Admin/Site.php:664
+#: src/Module/Admin/Site.php:662
 msgid "Only search in tags"
 msgstr "Szukaj tylko w tagach"
 
-#: src/Module/Admin/Site.php:664
+#: src/Module/Admin/Site.php:662
 msgid "On large systems the text search can slow down the system extremely."
 msgstr "W dużych systemach wyszukiwanie tekstu może wyjątkowo spowolnić system."
 
-#: src/Module/Admin/Site.php:666
+#: src/Module/Admin/Site.php:664
 msgid "New base url"
 msgstr "Nowy bazowy adres url"
 
-#: src/Module/Admin/Site.php:666
+#: src/Module/Admin/Site.php:664
 msgid ""
 "Change base url for this server. Sends relocate message to all Friendica and"
 " Diaspora* contacts of all users."
 msgstr "Zmień bazowy adres URL dla tego serwera. Wysyła wiadomość o przeniesieniu do wszystkich kontaktów Friendica i Diaspora* wszystkich użytkowników."
 
-#: src/Module/Admin/Site.php:668
+#: src/Module/Admin/Site.php:666
 msgid "RINO Encryption"
 msgstr "Szyfrowanie RINO"
 
-#: src/Module/Admin/Site.php:668
+#: src/Module/Admin/Site.php:666
 msgid "Encryption layer between nodes."
 msgstr "Warstwa szyfrowania między węzłami."
 
-#: src/Module/Admin/Site.php:668
+#: src/Module/Admin/Site.php:666
 msgid "Enabled"
 msgstr "Włącz"
 
-#: src/Module/Admin/Site.php:670
+#: src/Module/Admin/Site.php:668
 msgid "Maximum number of parallel workers"
 msgstr "Maksymalna liczba równoległych pracowników"
 
-#: src/Module/Admin/Site.php:670
+#: src/Module/Admin/Site.php:668
 #, php-format
 msgid ""
 "On shared hosters set this to %d. On larger systems, values of %d are great."
 " Default value is %d."
 msgstr "Na udostępnionych usługach hostingowych ustaw tę opcję %d. W większych systemach wartości %dsą świetne . Wartość domyślna to %d."
 
-#: src/Module/Admin/Site.php:671
+#: src/Module/Admin/Site.php:669
 msgid "Don't use \"proc_open\" with the worker"
 msgstr ""
 
-#: src/Module/Admin/Site.php:671
+#: src/Module/Admin/Site.php:669
 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 "Włącz to, jeśli twój system nie zezwala na użycie „proc_open”. Może się tak zdarzyć na współdzielonych hostach. Jeśli to jest włączone, powinieneś zwiększyć częstotliwość wywołań roboczych w crontabie."
 
-#: src/Module/Admin/Site.php:672
+#: src/Module/Admin/Site.php:670
 msgid "Enable fastlane"
 msgstr "Włącz Fastlane"
 
-#: src/Module/Admin/Site.php:672
+#: src/Module/Admin/Site.php:670
 msgid ""
 "When enabed, the fastlane mechanism starts an additional worker if processes"
 " with higher priority are blocked by processes of lower priority."
 msgstr "Po włączeniu system Fastlane uruchamia dodatkowego pracownika, jeśli procesy o wyższym priorytecie są blokowane przez procesy o niższym priorytecie."
 
-#: src/Module/Admin/Site.php:673
+#: src/Module/Admin/Site.php:671
 msgid "Enable frontend worker"
 msgstr "Włącz pracownika frontend"
 
-#: src/Module/Admin/Site.php:673
+#: src/Module/Admin/Site.php:671
 #, php-format
 msgid ""
 "When enabled the Worker process is triggered when backend access is "
@@ -8008,73 +7879,73 @@ msgid ""
 "server."
 msgstr ""
 
-#: src/Module/Admin/Site.php:675
+#: src/Module/Admin/Site.php:673
 msgid "Subscribe to relay"
 msgstr "Subskrybuj przekaźnik"
 
-#: src/Module/Admin/Site.php:675
+#: src/Module/Admin/Site.php:673
 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żliwia odbieranie publicznych wiadomości z przekaźnika. Zostaną uwzględnione w tagach wyszukiwania, subskrybowanych i na stronie społeczności globalnej."
 
-#: src/Module/Admin/Site.php:676
+#: src/Module/Admin/Site.php:674
 msgid "Relay server"
 msgstr "Serwer przekazujący"
 
-#: src/Module/Admin/Site.php:676
+#: src/Module/Admin/Site.php:674
 msgid ""
 "Address of the relay server where public posts should be send to. For "
 "example https://relay.diasp.org"
 msgstr "Adres serwera przekazującego, do którego należy wysyłać publiczne posty. Na przykład https://relay.diasp.org"
 
-#: src/Module/Admin/Site.php:677
+#: src/Module/Admin/Site.php:675
 msgid "Direct relay transfer"
 msgstr "Bezpośredni transfer przekaźników"
 
-#: src/Module/Admin/Site.php:677
+#: src/Module/Admin/Site.php:675
 msgid ""
 "Enables the direct transfer to other servers without using the relay servers"
 msgstr "Umożliwia bezpośredni transfer do innych serwerów bez korzystania z serwerów przekazujących"
 
-#: src/Module/Admin/Site.php:678
+#: src/Module/Admin/Site.php:676
 msgid "Relay scope"
 msgstr "Zakres przekaźnika"
 
-#: src/Module/Admin/Site.php:678
+#: src/Module/Admin/Site.php:676
 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 "Mogą to być „wszystkie” lub „tagi”. „wszystkie” oznacza, że ​​każdy publiczny post powinien zostać odebrany. „Tagi” oznaczają, że powinny być odbierane tylko posty z wybranymi tagami."
 
-#: src/Module/Admin/Site.php:678
+#: src/Module/Admin/Site.php:676
 msgid "all"
 msgstr "wszystko"
 
-#: src/Module/Admin/Site.php:678
+#: src/Module/Admin/Site.php:676
 msgid "tags"
 msgstr "tagi"
 
-#: src/Module/Admin/Site.php:679
+#: src/Module/Admin/Site.php:677
 msgid "Server tags"
 msgstr "Serwer tagów"
 
-#: src/Module/Admin/Site.php:679
+#: src/Module/Admin/Site.php:677
 msgid "Comma separated list of tags for the \"tags\" subscription."
 msgstr "Rozdzielana przecinkami lista tagów dla subskrypcji „tagi”."
 
-#: src/Module/Admin/Site.php:680
+#: src/Module/Admin/Site.php:678
 msgid "Allow user tags"
 msgstr "Pozwól na tagi użytkowników"
 
-#: src/Module/Admin/Site.php:680
+#: src/Module/Admin/Site.php:678
 msgid ""
 "If enabled, the tags from the saved searches will used for the \"tags\" "
 "subscription in addition to the \"relay_server_tags\"."
-msgstr ""
+msgstr "Jeśli ta opcja jest włączona, tagi z zapisanych wyszukiwań będą używane jako subskrypcja „tagów” jako uzupełnienie do \"relay_server_tags\"."
 
-#: src/Module/Admin/Site.php:683
+#: src/Module/Admin/Site.php:681
 msgid "Start Relocation"
 msgstr "Rozpocznij przenoszenie"
 
@@ -8108,7 +7979,7 @@ msgid ""
 "The last update failed. Please run \"php bin/console.php dbstructure "
 "update\" from the command line and have a look at the errors that might "
 "appear. (Some of the errors are possibly inside the logfile.)"
-msgstr ""
+msgstr "Ostatnia aktualizacja nie powiodła się. Uruchom polecenie \"php bin/console.php dbstructure update\" z wiersza poleceń i spójrz na błędy, które mogą się pojawić. (Niektóre błędy są prawdopodobnie w pliku dziennika)."
 
 #: src/Module/Admin/Summary.php:56
 msgid "The worker was never executed. Please check your database structure!"
@@ -8128,7 +7999,7 @@ msgid ""
 "copy config/local-sample.config.php and move your config from "
 "<code>.htconfig.php</code>. See <a href=\"%s\">the Config help page</a> for "
 "help with the transition."
-msgstr ""
+msgstr "Konfiguracja Friendiki jest teraz przechowywana w config/local.config.php, skopiuj config/local-sample.config.php i przenieś swoją konfigurację z <code>.htconfig.php</code>. Zobacz <a href=\"%s\">stronę pomocy Config</a>, aby uzyskać pomoc dotyczącą przejścia."
 
 #: src/Module/Admin/Summary.php:67
 #, php-format
@@ -8137,7 +8008,7 @@ msgid ""
 "copy config/local-sample.config.php and move your config from "
 "<code>config/local.ini.php</code>. See <a href=\"%s\">the Config help "
 "page</a> for help with the transition."
-msgstr ""
+msgstr "Konfiguracja Friendiki jest teraz przechowywana w config/local.config.php, skopiuj config/local-sample.config.php i przenieś konfigurację z <code>config/local.ini.php</code>. Zobacz <a href=\"%s\">stronę pomocy Config</a>, aby uzyskać pomoc dotyczącą przejścia."
 
 #: src/Module/Admin/Summary.php:73
 #, php-format
@@ -8147,76 +8018,76 @@ msgid ""
 "href=\"%s\">the installation page</a> for help."
 msgstr "<a href=\"%s\">%s</a> nie jest osiągalny w twoim systemie. Jest to poważny problem z konfiguracją, który uniemożliwia komunikację między serwerami. Zobacz pomoc na <a href=\"%s\">stronie instalacji</a>."
 
-#: src/Module/Admin/Summary.php:89
+#: src/Module/Admin/Summary.php:106
 #, php-format
 msgid ""
 "Friendica's system.basepath was updated from '%s' to '%s'. Please remove the"
 " system.basepath from your db to avoid differences."
-msgstr ""
+msgstr "System.basepath Friendiki został zaktualizowany z '%s' do '%s'. Usuń system.basepath z bazy danych, aby uniknąć różnic."
 
-#: src/Module/Admin/Summary.php:97
+#: src/Module/Admin/Summary.php:114
 #, php-format
 msgid ""
 "Friendica's current system.basepath '%s' is wrong and the config file '%s' "
 "isn't used."
-msgstr ""
+msgstr "Obecny system.basepath Friendiki '%s' jest nieprawidłowy i plik konfiguracyjny '%s' nie jest używany."
 
-#: src/Module/Admin/Summary.php:105
+#: src/Module/Admin/Summary.php:122
 #, php-format
 msgid ""
 "Friendica's current system.basepath '%s' is not equal to the config file "
 "'%s'. Please fix your configuration."
-msgstr ""
+msgstr "Obecny system.basepath Friendiki '%s' nie jest równy plikowi konfiguracyjnemu '%s'. Napraw konfigurację."
 
-#: src/Module/Admin/Summary.php:112
+#: src/Module/Admin/Summary.php:129
 msgid "Normal Account"
 msgstr "Konto normalne"
 
-#: src/Module/Admin/Summary.php:113
+#: src/Module/Admin/Summary.php:130
 msgid "Automatic Follower Account"
 msgstr "Automatyczne konto obserwatora"
 
-#: src/Module/Admin/Summary.php:114
+#: src/Module/Admin/Summary.php:131
 msgid "Public Forum Account"
 msgstr "Publiczne konto na forum"
 
-#: src/Module/Admin/Summary.php:115
+#: src/Module/Admin/Summary.php:132
 msgid "Automatic Friend Account"
 msgstr "Automatyczny przyjaciel konta"
 
-#: src/Module/Admin/Summary.php:116
+#: src/Module/Admin/Summary.php:133
 msgid "Blog Account"
 msgstr "Konto Bloga"
 
-#: src/Module/Admin/Summary.php:117
+#: src/Module/Admin/Summary.php:134
 msgid "Private Forum Account"
 msgstr "Prywatne konto na forum"
 
-#: src/Module/Admin/Summary.php:141
+#: src/Module/Admin/Summary.php:156
 msgid "Message queues"
 msgstr "Wiadomości"
 
-#: src/Module/Admin/Summary.php:147
+#: src/Module/Admin/Summary.php:162
 msgid "Server Settings"
 msgstr "Ustawienia serwera"
 
-#: src/Module/Admin/Summary.php:161
+#: src/Module/Admin/Summary.php:176
 msgid "Summary"
 msgstr "Podsumowanie"
 
-#: src/Module/Admin/Summary.php:163
+#: src/Module/Admin/Summary.php:178
 msgid "Registered users"
 msgstr "Zarejestrowani użytkownicy"
 
-#: src/Module/Admin/Summary.php:165
+#: src/Module/Admin/Summary.php:180
 msgid "Pending registrations"
 msgstr "Oczekujące rejestracje"
 
-#: src/Module/Admin/Summary.php:166
+#: src/Module/Admin/Summary.php:181
 msgid "Version"
 msgstr "Wersja"
 
-#: src/Module/Admin/Summary.php:170
+#: src/Module/Admin/Summary.php:185
 msgid "Active addons"
 msgstr "Aktywne dodatki"
 
@@ -8510,109 +8381,11 @@ msgstr "Aplikacje"
 msgid "Item was not found."
 msgstr "Element nie znaleziony."
 
-#: src/Module/Babel.php:31
-msgid "Source input"
-msgstr "Źródło wejściowe"
-
-#: src/Module/Babel.php:37
-msgid "BBCode::toPlaintext"
-msgstr "BBCode::na prosty tekst"
-
-#: src/Module/Babel.php:43
-msgid "BBCode::convert (raw HTML)"
-msgstr "BBCode:: konwersjia (raw HTML)"
-
-#: src/Module/Babel.php:48
-msgid "BBCode::convert"
-msgstr "BBCode::przekształć"
-
-#: src/Module/Babel.php:54
-msgid "BBCode::convert => HTML::toBBCode"
-msgstr "BBCode::przekształć => HTML::toBBCode"
-
-#: src/Module/Babel.php:60
-msgid "BBCode::toMarkdown"
-msgstr "BBCode::toMarkdown"
-
-#: src/Module/Babel.php:66
-msgid "BBCode::toMarkdown => Markdown::convert"
-msgstr "BBCode::toMarkdown => Markdown::przekształć"
-
-#: src/Module/Babel.php:72
-msgid "BBCode::toMarkdown => Markdown::toBBCode"
-msgstr "BBCode::toMarkdown => Markdown::toBBCode"
-
-#: src/Module/Babel.php:78
-msgid "BBCode::toMarkdown =>  Markdown::convert => HTML::toBBCode"
-msgstr "BBCode::toMarkdown => Markdown::przekształć => HTML::toBBCode"
-
-#: src/Module/Babel.php:89
-msgid "Item Body"
-msgstr ""
-
-#: src/Module/Babel.php:93
-msgid "Item Tags"
-msgstr ""
-
-#: src/Module/Babel.php:100
-msgid "Source input (Diaspora format)"
-msgstr "Źródło wejściowe (format Diaspora)"
-
-#: src/Module/Babel.php:106
-msgid "Markdown::convert (raw HTML)"
-msgstr "Markdown::convert (raw HTML)"
-
-#: src/Module/Babel.php:111
-msgid "Markdown::convert"
-msgstr "Markdown::convert"
-
-#: src/Module/Babel.php:117
-msgid "Markdown::toBBCode"
-msgstr "Markdown::toBBCode"
-
-#: src/Module/Babel.php:124
-msgid "Raw HTML input"
-msgstr "Surowe wejście HTML"
-
-#: src/Module/Babel.php:129
-msgid "HTML Input"
-msgstr "Wejście HTML"
-
-#: src/Module/Babel.php:135
-msgid "HTML::toBBCode"
-msgstr "HTML::toBBCode"
-
-#: src/Module/Babel.php:141
-msgid "HTML::toBBCode => BBCode::convert"
-msgstr "HTML::toBBCode => BBCode::convert"
-
-#: src/Module/Babel.php:146
-msgid "HTML::toBBCode => BBCode::convert (raw HTML)"
-msgstr "HTML::toBBCode => BBCode::convert (raw HTML)"
-
-#: src/Module/Babel.php:152
-msgid "HTML::toMarkdown"
-msgstr "HTML::toMarkdown"
-
-#: src/Module/Babel.php:158
-msgid "HTML::toPlaintext"
-msgstr "HTML::toPlaintext"
-
-#: src/Module/Babel.php:166
-msgid "Source text"
-msgstr "Tekst źródłowy"
-
-#: src/Module/Babel.php:167
-msgid "BBCode"
-msgstr "BBCode"
-
-#: src/Module/Babel.php:168
-msgid "Markdown"
-msgstr "Markdown"
-
-#: src/Module/Babel.php:169
-msgid "HTML"
-msgstr "HTML"
+#: src/Module/BaseAdminModule.php:62
+msgid ""
+"Submanaged account can't access the administation pages. Please log back in "
+"as the master account."
+msgstr "Konto podrzędne nie może uzyskać dostępu do stron administracyjnych. Zaloguj się ponownie jako konto główne."
 
 #: src/Module/BaseAdminModule.php:76
 msgid "Overview"
@@ -8646,6 +8419,10 @@ msgstr "Narzędzia"
 msgid "Contact Blocklist"
 msgstr "Lista zablokowanych kontaktów"
 
+#: src/Module/BaseAdminModule.php:94
+msgid "Server Blocklist"
+msgstr "Lista zablokowanych serwerów"
+
 #: src/Module/BaseAdminModule.php:101
 msgid "Diagnostics"
 msgstr "Diagnostyka"
@@ -8678,6 +8455,16 @@ msgstr "Funkcje dodatkowe"
 msgid "User registrations waiting for confirmation"
 msgstr "Rejestracje użytkowników czekające na potwierdzenie"
 
+#: src/Module/BaseSearchModule.php:52
+#, php-format
+msgid "People Search - %s"
+msgstr "Szukaj osób - %s"
+
+#: src/Module/BaseSearchModule.php:62
+#, php-format
+msgid "Forum Search - %s"
+msgstr "Przeszukiwanie forum - %s"
+
 #: src/Module/Bookmarklet.php:35
 msgid "This page is missing a url parameter."
 msgstr "Na tej stronie brakuje parametru url."
@@ -8686,7 +8473,7 @@ msgstr "Na tej stronie brakuje parametru url."
 msgid "The post was created"
 msgstr "Post został utworzony"
 
-#: src/Module/Contact.php:166
+#: src/Module/Contact.php:72
 #, php-format
 msgid "%d contact edited."
 msgid_plural "%d contacts edited."
@@ -8695,285 +8482,275 @@ msgstr[1] "Zedytowano %d kontakty."
 msgstr[2] "Zedytowano %d kontaktów."
 msgstr[3] "%dedytuj kontakty."
 
-#: src/Module/Contact.php:193 src/Module/Contact.php:377
+#: src/Module/Contact.php:99
 msgid "Could not access contact record."
 msgstr "Nie można uzyskać dostępu do rejestru kontaktów."
 
-#: src/Module/Contact.php:203
+#: src/Module/Contact.php:109
 msgid "Could not locate selected profile."
 msgstr "Nie można znaleźć wybranego profilu."
 
-#: src/Module/Contact.php:235
+#: src/Module/Contact.php:141
 msgid "Contact updated."
 msgstr "Zaktualizowano kontakt."
 
-#: src/Module/Contact.php:398
+#: src/Module/Contact.php:393
+msgid "Contact not found"
+msgstr "Nie znaleziono kontaktu"
+
+#: src/Module/Contact.php:412
 msgid "Contact has been blocked"
 msgstr "Kontakt został zablokowany"
 
-#: src/Module/Contact.php:398
+#: src/Module/Contact.php:412
 msgid "Contact has been unblocked"
 msgstr "Kontakt został odblokowany"
 
-#: src/Module/Contact.php:408
+#: src/Module/Contact.php:422
 msgid "Contact has been ignored"
 msgstr "Kontakt jest ignorowany"
 
-#: src/Module/Contact.php:408
+#: src/Module/Contact.php:422
 msgid "Contact has been unignored"
 msgstr "Kontakt nie jest ignorowany"
 
-#: src/Module/Contact.php:418
+#: src/Module/Contact.php:432
 msgid "Contact has been archived"
 msgstr "Kontakt został zarchiwizowany"
 
-#: src/Module/Contact.php:418
+#: src/Module/Contact.php:432
 msgid "Contact has been unarchived"
 msgstr "Kontakt został przywrócony"
 
-#: src/Module/Contact.php:442
+#: src/Module/Contact.php:456
 msgid "Drop contact"
 msgstr "Usuń kontakt"
 
-#: src/Module/Contact.php:445 src/Module/Contact.php:823
+#: src/Module/Contact.php:459 src/Module/Contact.php:823
 msgid "Do you really want to delete this contact?"
 msgstr "Czy na pewno chcesz usunąć ten kontakt?"
 
-#: src/Module/Contact.php:459
+#: src/Module/Contact.php:473
 msgid "Contact has been removed."
 msgstr "Kontakt został usunięty."
 
-#: src/Module/Contact.php:489
+#: src/Module/Contact.php:503
 #, php-format
 msgid "You are mutual friends with %s"
 msgstr "Jesteś już znajomym z %s"
 
-#: src/Module/Contact.php:494
+#: src/Module/Contact.php:508
 #, php-format
 msgid "You are sharing with %s"
 msgstr "Współdzielisz z %s"
 
-#: src/Module/Contact.php:499
+#: src/Module/Contact.php:513
 #, php-format
 msgid "%s is sharing with you"
 msgstr "%s współdzieli z tobą"
 
-#: src/Module/Contact.php:523
+#: src/Module/Contact.php:537
 msgid "Private communications are not available for this contact."
 msgstr "Nie można nawiązać prywatnej rozmowy z tym kontaktem."
 
-#: src/Module/Contact.php:525
+#: src/Module/Contact.php:539
 msgid "Never"
 msgstr "Nigdy"
 
-#: src/Module/Contact.php:528
+#: src/Module/Contact.php:542
 msgid "(Update was successful)"
 msgstr "(Aktualizacja przebiegła pomyślnie)"
 
-#: src/Module/Contact.php:528
+#: src/Module/Contact.php:542
 msgid "(Update was not successful)"
 msgstr "(Aktualizacja nie powiodła się)"
 
-#: src/Module/Contact.php:530 src/Module/Contact.php:1061
+#: src/Module/Contact.php:544 src/Module/Contact.php:1057
 msgid "Suggest friends"
 msgstr "Osoby, które możesz znać"
 
-#: src/Module/Contact.php:534
+#: src/Module/Contact.php:548
 #, php-format
 msgid "Network type: %s"
 msgstr "Typ sieci: %s"
 
-#: src/Module/Contact.php:539
+#: src/Module/Contact.php:553
 msgid "Communications lost with this contact!"
 msgstr "Utracono komunikację z tym kontaktem!"
 
-#: src/Module/Contact.php:545
+#: src/Module/Contact.php:559
 msgid "Fetch further information for feeds"
 msgstr "Pobierz dalsze informacje dla kanałów"
 
-#: src/Module/Contact.php:547
+#: src/Module/Contact.php:561
 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 "Pobieranie informacji, takich jak zdjęcia podglądu, tytuł i zwiastun z elementu kanału. Możesz to aktywować, jeśli plik danych nie zawiera dużo tekstu. Słowa kluczowe są pobierane z nagłówka meta w elemencie kanału i są publikowane jako znaczniki haszowania."
 
-#: src/Module/Contact.php:550
+#: src/Module/Contact.php:564
 msgid "Fetch information"
 msgstr "Pobierz informacje"
 
-#: src/Module/Contact.php:551
+#: src/Module/Contact.php:565
 msgid "Fetch keywords"
 msgstr "Pobierz słowa kluczowe"
 
-#: src/Module/Contact.php:552
+#: src/Module/Contact.php:566
 msgid "Fetch information and keywords"
 msgstr "Pobierz informacje i słowa kluczowe"
 
-#: src/Module/Contact.php:584
+#: src/Module/Contact.php:585
 msgid "Profile Visibility"
 msgstr "Widoczność profilu"
 
-#: src/Module/Contact.php:585
+#: src/Module/Contact.php:586
 msgid "Contact Information / Notes"
 msgstr "Informacje kontaktowe/Notatki"
 
-#: src/Module/Contact.php:586
+#: src/Module/Contact.php:587
 msgid "Contact Settings"
 msgstr "Ustawienia kontaktów"
 
-#: src/Module/Contact.php:595
+#: src/Module/Contact.php:596
 msgid "Contact"
 msgstr "Kontakt"
 
-#: src/Module/Contact.php:599
+#: src/Module/Contact.php:600
 #, php-format
 msgid ""
 "Please choose the profile you would like to display to %s when viewing your "
 "profile securely."
 msgstr "Wybierz profil, który chcesz bezpiecznie wyświetlić %s"
 
-#: src/Module/Contact.php:601
+#: src/Module/Contact.php:602
 msgid "Their personal note"
 msgstr "Ich osobista uwaga"
 
-#: src/Module/Contact.php:603
+#: src/Module/Contact.php:604
 msgid "Edit contact notes"
 msgstr "Edytuj notatki kontaktu"
 
-#: src/Module/Contact.php:607
+#: src/Module/Contact.php:607 src/Module/Contact.php:1023
+#: src/Module/Profile/Contacts.php:93
+#, php-format
+msgid "Visit %s's profile [%s]"
+msgstr "Obejrzyj %s's profil [%s]"
+
+#: src/Module/Contact.php:608
 msgid "Block/Unblock contact"
 msgstr "Zablokuj/odblokuj kontakt"
 
-#: src/Module/Contact.php:608
+#: src/Module/Contact.php:609
 msgid "Ignore contact"
 msgstr "Ignoruj kontakt"
 
-#: src/Module/Contact.php:609
+#: src/Module/Contact.php:610
 msgid "Repair URL settings"
 msgstr "Napraw ustawienia adresów URL"
 
-#: src/Module/Contact.php:610
+#: src/Module/Contact.php:611
 msgid "View conversations"
 msgstr "Wyświetl rozmowy"
 
-#: src/Module/Contact.php:615
+#: src/Module/Contact.php:616
 msgid "Last update:"
 msgstr "Ostatnia aktualizacja:"
 
-#: src/Module/Contact.php:617
+#: src/Module/Contact.php:618
 msgid "Update public posts"
 msgstr "Zaktualizuj publiczne posty"
 
-#: src/Module/Contact.php:619 src/Module/Contact.php:1071
+#: src/Module/Contact.php:620 src/Module/Contact.php:1067
 msgid "Update now"
 msgstr "Aktualizuj teraz"
 
-#: src/Module/Contact.php:625 src/Module/Contact.php:828
-#: src/Module/Contact.php:1088
+#: src/Module/Contact.php:624 src/Module/Contact.php:828
+#: src/Module/Contact.php:1084
 msgid "Unignore"
 msgstr "Odblokuj"
 
-#: src/Module/Contact.php:629
+#: src/Module/Contact.php:628
 msgid "Currently blocked"
 msgstr "Obecnie zablokowany"
 
-#: src/Module/Contact.php:630
+#: src/Module/Contact.php:629
 msgid "Currently ignored"
 msgstr "Obecnie zignorowany"
 
-#: src/Module/Contact.php:631
+#: src/Module/Contact.php:630
 msgid "Currently archived"
 msgstr "Obecnie zarchiwizowany"
 
-#: src/Module/Contact.php:632
+#: src/Module/Contact.php:631
 msgid "Awaiting connection acknowledge"
 msgstr "Oczekiwanie na potwierdzenie połączenia"
 
-#: src/Module/Contact.php:633
+#: src/Module/Contact.php:632
 msgid ""
 "Replies/likes to your public posts <strong>may</strong> still be visible"
 msgstr "Odpowiedzi/kliknięcia \"lubię to\" do twoich publicznych postów nadal <strong>mogą</strong> być widoczne"
 
-#: src/Module/Contact.php:634
+#: src/Module/Contact.php:633
 msgid "Notification for new posts"
 msgstr "Powiadomienie o nowych postach"
 
-#: src/Module/Contact.php:634
+#: src/Module/Contact.php:633
 msgid "Send a notification of every new post of this contact"
 msgstr "Wyślij powiadomienie o każdym nowym poście tego kontaktu"
 
-#: src/Module/Contact.php:636
+#: src/Module/Contact.php:635
 msgid "Blacklisted keywords"
 msgstr "Słowa kluczowe na czarnej liście"
 
-#: src/Module/Contact.php:636
+#: src/Module/Contact.php:635
 msgid ""
 "Comma separated list of keywords that should not be converted to hashtags, "
 "when \"Fetch information and keywords\" is selected"
 msgstr "Rozdzielana przecinkami lista słów kluczowych, które nie powinny zostać przekonwertowane na hashtagi, gdy wybrana jest opcja 'Pobierz informacje i słowa kluczowe'"
 
-#: src/Module/Contact.php:653 src/Module/Settings/TwoFactor/Index.php:100
+#: src/Module/Contact.php:652 src/Module/Settings/TwoFactor/Index.php:111
 msgid "Actions"
 msgstr "Akcja"
 
-#: src/Module/Contact.php:700
-msgid "Suggestions"
-msgstr "Sugestie"
-
-#: src/Module/Contact.php:703
-msgid "Suggest potential friends"
-msgstr "Sugerowani znajomi"
-
-#: src/Module/Contact.php:708 src/Module/Group.php:287
-msgid "All Contacts"
-msgstr "Wszystkie kontakty"
-
-#: src/Module/Contact.php:711
+#: src/Module/Contact.php:697
 msgid "Show all contacts"
 msgstr "Pokaż wszystkie kontakty"
 
-#: src/Module/Contact.php:716
-msgid "Unblocked"
-msgstr "Odblokowane"
-
-#: src/Module/Contact.php:719
-msgid "Only show unblocked contacts"
-msgstr "Pokaż tylko odblokowane kontakty"
-
-#: src/Module/Contact.php:724
+#: src/Module/Contact.php:702 src/Module/Contact.php:804
 msgid "Blocked"
 msgstr "Zablokowane"
 
-#: src/Module/Contact.php:727
+#: src/Module/Contact.php:705
 msgid "Only show blocked contacts"
 msgstr "Pokaż tylko zablokowane kontakty"
 
-#: src/Module/Contact.php:732
+#: src/Module/Contact.php:710 src/Module/Contact.php:806
 msgid "Ignored"
 msgstr "Ignorowane"
 
-#: src/Module/Contact.php:735
+#: src/Module/Contact.php:713
 msgid "Only show ignored contacts"
 msgstr "Pokaż tylko ignorowane kontakty"
 
-#: src/Module/Contact.php:740
+#: src/Module/Contact.php:718 src/Module/Contact.php:807
 msgid "Archived"
 msgstr "Zarchiwizowane"
 
-#: src/Module/Contact.php:743
+#: src/Module/Contact.php:721
 msgid "Only show archived contacts"
 msgstr "Pokaż tylko zarchiwizowane kontakty"
 
-#: src/Module/Contact.php:748
+#: src/Module/Contact.php:726 src/Module/Contact.php:805
 msgid "Hidden"
 msgstr "Ukryte"
 
-#: src/Module/Contact.php:751
+#: src/Module/Contact.php:729
 msgid "Only show hidden contacts"
 msgstr "Pokaż tylko ukryte kontakty"
 
-#: src/Module/Contact.php:759
+#: src/Module/Contact.php:737
 msgid "Organize your contact groups"
 msgstr "Uporządkuj swoje grupy kontaktów"
 
@@ -8981,11 +8758,11 @@ msgstr "Uporządkuj swoje grupy kontaktów"
 msgid "Search your contacts"
 msgstr "Wyszukaj w kontaktach"
 
-#: src/Module/Contact.php:829 src/Module/Contact.php:1097
+#: src/Module/Contact.php:829 src/Module/Contact.php:1093
 msgid "Archive"
 msgstr "Archiwum"
 
-#: src/Module/Contact.php:829 src/Module/Contact.php:1097
+#: src/Module/Contact.php:829 src/Module/Contact.php:1093
 msgid "Unarchive"
 msgstr "Przywróć z archiwum"
 
@@ -9013,35 +8790,35 @@ msgstr "Zobacz wszystkich popularnych znajomych"
 msgid "Advanced Contact Settings"
 msgstr "Zaawansowane ustawienia kontaktów"
 
-#: src/Module/Contact.php:994
+#: src/Module/Contact.php:990
 msgid "Mutual Friendship"
 msgstr "Wzajemna przyjaźń"
 
-#: src/Module/Contact.php:999
+#: src/Module/Contact.php:995
 msgid "is a fan of yours"
 msgstr "jest twoim fanem"
 
-#: src/Module/Contact.php:1004
+#: src/Module/Contact.php:1000
 msgid "you are a fan of"
 msgstr "jesteś fanem"
 
-#: src/Module/Contact.php:1028
+#: src/Module/Contact.php:1024
 msgid "Edit contact"
 msgstr "Edytuj kontakt"
 
-#: src/Module/Contact.php:1082
+#: src/Module/Contact.php:1078
 msgid "Toggle Blocked status"
 msgstr "Przełącz status na Zablokowany"
 
-#: src/Module/Contact.php:1090
+#: src/Module/Contact.php:1086
 msgid "Toggle Ignored status"
 msgstr "Przełącz status na Ignorowany"
 
-#: src/Module/Contact.php:1099
+#: src/Module/Contact.php:1095
 msgid "Toggle Archive status"
 msgstr "Przełącz  status na Archiwalny"
 
-#: src/Module/Contact.php:1107
+#: src/Module/Contact.php:1103
 msgid "Delete contact"
 msgstr "Usuń kontakt"
 
@@ -9056,37 +8833,178 @@ msgid ""
 "code or the translation of Friendica. Thank you all!"
 msgstr "Friendica to projekt społecznościowy, który nie byłby możliwy bez pomocy wielu osób. Oto lista osób, które przyczyniły się do tworzenia kodu lub tłumaczenia Friendica. Dziękuję wam wszystkim!"
 
-#: src/Module/Directory.php:66
-msgid "No entries (some entries may be hidden)."
-msgstr "Brak odwiedzin (niektóre odwiedziny mogą być ukryte)."
+#: src/Module/Debug/Babel.php:32
+msgid "Source input"
+msgstr "Źródło wejściowe"
 
-#: src/Module/Directory.php:85
-msgid "Find on this site"
-msgstr "Znajdź na tej stronie"
+#: src/Module/Debug/Babel.php:38
+msgid "BBCode::toPlaintext"
+msgstr "BBCode::na prosty tekst"
 
-#: src/Module/Directory.php:87
-msgid "Results for:"
-msgstr "Wyniki dla:"
+#: src/Module/Debug/Babel.php:44
+msgid "BBCode::convert (raw HTML)"
+msgstr "BBCode:: konwersjia (raw HTML)"
 
-#: src/Module/Directory.php:89
-msgid "Site Directory"
-msgstr "Katalog Witryny"
+#: src/Module/Debug/Babel.php:49
+msgid "BBCode::convert"
+msgstr "BBCode::przekształć"
 
-#: src/Module/Feedtest.php:20 src/Module/Filer/SaveTag.php:20
-msgid "You must be logged in to use this module"
-msgstr "Musisz być zalogowany, aby korzystać z tego modułu"
+#: src/Module/Debug/Babel.php:55
+msgid "BBCode::convert => HTML::toBBCode"
+msgstr "BBCode::przekształć => HTML::toBBCode"
 
-#: src/Module/Feedtest.php:49
-msgid "Source URL"
-msgstr "Źródłowy adres URL"
+#: src/Module/Debug/Babel.php:61
+msgid "BBCode::toMarkdown"
+msgstr "BBCode::toMarkdown"
 
-#: src/Module/Filer/SaveTag.php:39
-#, php-format
-msgid "Filetag %s saved to item"
-msgstr ""
+#: src/Module/Debug/Babel.php:67
+msgid "BBCode::toMarkdown => Markdown::convert"
+msgstr "BBCode::toMarkdown => Markdown::przekształć"
 
-#: src/Module/Filer/SaveTag.php:49
-msgid "- select -"
+#: src/Module/Debug/Babel.php:73
+msgid "BBCode::toMarkdown => Markdown::toBBCode"
+msgstr "BBCode::toMarkdown => Markdown::toBBCode"
+
+#: src/Module/Debug/Babel.php:79
+msgid "BBCode::toMarkdown =>  Markdown::convert => HTML::toBBCode"
+msgstr "BBCode::toMarkdown => Markdown::przekształć => HTML::toBBCode"
+
+#: src/Module/Debug/Babel.php:90
+msgid "Item Body"
+msgstr ""
+
+#: src/Module/Debug/Babel.php:94
+msgid "Item Tags"
+msgstr ""
+
+#: src/Module/Debug/Babel.php:101
+msgid "Source input (Diaspora format)"
+msgstr "Źródło wejściowe (format Diaspora)"
+
+#: src/Module/Debug/Babel.php:107
+msgid "Markdown::convert (raw HTML)"
+msgstr "Markdown::convert (raw HTML)"
+
+#: src/Module/Debug/Babel.php:112
+msgid "Markdown::convert"
+msgstr "Markdown::convert"
+
+#: src/Module/Debug/Babel.php:118
+msgid "Markdown::toBBCode"
+msgstr "Markdown::toBBCode"
+
+#: src/Module/Debug/Babel.php:125
+msgid "Raw HTML input"
+msgstr "Surowe wejście HTML"
+
+#: src/Module/Debug/Babel.php:130
+msgid "HTML Input"
+msgstr "Wejście HTML"
+
+#: src/Module/Debug/Babel.php:136
+msgid "HTML::toBBCode"
+msgstr "HTML::toBBCode"
+
+#: src/Module/Debug/Babel.php:142
+msgid "HTML::toBBCode => BBCode::convert"
+msgstr "HTML::toBBCode => BBCode::convert"
+
+#: src/Module/Debug/Babel.php:147
+msgid "HTML::toBBCode => BBCode::convert (raw HTML)"
+msgstr "HTML::toBBCode => BBCode::convert (raw HTML)"
+
+#: src/Module/Debug/Babel.php:153
+msgid "HTML::toMarkdown"
+msgstr "HTML::toMarkdown"
+
+#: src/Module/Debug/Babel.php:159 src/Module/Debug/Babel.php:165
+msgid "HTML::toPlaintext"
+msgstr "HTML::toPlaintext"
+
+#: src/Module/Debug/Babel.php:173
+msgid "Source text"
+msgstr "Tekst źródłowy"
+
+#: src/Module/Debug/Babel.php:174
+msgid "BBCode"
+msgstr "BBCode"
+
+#: src/Module/Debug/Babel.php:175
+msgid "Markdown"
+msgstr "Markdown"
+
+#: src/Module/Debug/Babel.php:176
+msgid "HTML"
+msgstr "HTML"
+
+#: src/Module/Debug/Feed.php:20 src/Module/Filer/SaveTag.php:20
+msgid "You must be logged in to use this module"
+msgstr "Musisz być zalogowany, aby korzystać z tego modułu"
+
+#: src/Module/Debug/Feed.php:49
+msgid "Source URL"
+msgstr "Źródłowy adres URL"
+
+#: src/Module/Debug/Localtime.php:30
+msgid "Time Conversion"
+msgstr "Zmiana czasu"
+
+#: src/Module/Debug/Localtime.php:31
+msgid ""
+"Friendica provides this service for sharing events with other networks and "
+"friends in unknown timezones."
+msgstr "Friendica udostępnia tę usługę do udostępniania wydarzeń innym sieciom i znajomym w nieznanych strefach czasowych."
+
+#: src/Module/Debug/Localtime.php:32
+#, php-format
+msgid "UTC time: %s"
+msgstr "Czas UTC %s"
+
+#: src/Module/Debug/Localtime.php:35
+#, php-format
+msgid "Current timezone: %s"
+msgstr "Obecna strefa czasowa: %s"
+
+#: src/Module/Debug/Localtime.php:39
+#, php-format
+msgid "Converted localtime: %s"
+msgstr "Zmień strefę czasową: %s"
+
+#: src/Module/Debug/Localtime.php:43
+msgid "Please select your timezone:"
+msgstr "Wybierz swoją strefę czasową:"
+
+#: src/Module/Debug/Probe.php:19 src/Module/Debug/WebFinger.php:18
+msgid "Only logged in users are permitted to perform a probing."
+msgstr "Tylko zalogowani użytkownicy mogą wykonywać sondowanie."
+
+#: src/Module/Debug/Probe.php:35
+msgid "Lookup address"
+msgstr "Wyszukaj adres"
+
+#: src/Module/Directory.php:61
+msgid "No entries (some entries may be hidden)."
+msgstr "Brak odwiedzin (niektóre odwiedziny mogą być ukryte)."
+
+#: src/Module/Directory.php:80
+msgid "Find on this site"
+msgstr "Znajdź na tej stronie"
+
+#: src/Module/Directory.php:82
+msgid "Results for:"
+msgstr "Wyniki dla:"
+
+#: src/Module/Directory.php:84
+msgid "Site Directory"
+msgstr "Katalog Witryny"
+
+#: src/Module/Filer/SaveTag.php:39
+#, php-format
+msgid "Filetag %s saved to item"
+msgstr ""
+
+#: src/Module/Filer/SaveTag.php:48
+msgid "- select -"
 msgstr "- wybierz -"
 
 #: src/Module/FollowConfirm.php:37
@@ -9173,23 +9091,23 @@ msgstr "Nie można dodać kontaktu do grupy."
 
 #: src/Module/Group.php:112
 msgid "Contact successfully added to group."
-msgstr ""
+msgstr "Kontakt został pomyślnie dodany do grupy."
 
 #: src/Module/Group.php:116
 msgid "Unable to remove the contact from the group."
-msgstr ""
+msgstr "Nie można usunąć kontaktu z grupy."
 
 #: src/Module/Group.php:118
 msgid "Contact successfully removed from group."
-msgstr ""
+msgstr "Kontakt został pomyślnie usunięty z grupy."
 
 #: src/Module/Group.php:121
 msgid "Unknown group command."
-msgstr ""
+msgstr "Nieznane polecenie grupy."
 
 #: src/Module/Group.php:124
 msgid "Bad request."
-msgstr ""
+msgstr "Błędne żądanie."
 
 #: src/Module/Group.php:163
 msgid "Save Group"
@@ -9240,143 +9158,143 @@ msgstr "Pomoc:"
 msgid "Welcome to %s"
 msgstr "Witamy w %s"
 
-#: src/Module/Install.php:158
+#: src/Module/Install.php:160
 msgid "Friendica Communications Server - Setup"
 msgstr "Friendica Communications Server - Instalator"
 
-#: src/Module/Install.php:169
+#: src/Module/Install.php:171
 msgid "System check"
 msgstr "Sprawdzanie systemu"
 
-#: src/Module/Install.php:174
+#: src/Module/Install.php:176
 msgid "Check again"
 msgstr "Sprawdź ponownie"
 
-#: src/Module/Install.php:189
+#: src/Module/Install.php:191
 msgid "Base settings"
-msgstr ""
+msgstr "Ustawienia bazy"
 
-#: src/Module/Install.php:196
+#: src/Module/Install.php:198
 msgid "Host name"
 msgstr "Nazwa hosta"
 
-#: src/Module/Install.php:198
+#: src/Module/Install.php:200
 msgid ""
 "Overwrite this field in case the determinated hostname isn't right, "
 "otherweise leave it as is."
-msgstr ""
+msgstr "Nadpisz to pole w przypadku, gdy określona nazwa hosta nie jest prawidłowa, a pozostałe pozostaw to bez zmian."
 
-#: src/Module/Install.php:201
+#: src/Module/Install.php:203
 msgid "Base path to installation"
 msgstr "Podstawowa ścieżka do instalacji"
 
-#: src/Module/Install.php:203
+#: src/Module/Install.php:205
 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 "Jeśli system nie może wykryć poprawnej ścieżki do instalacji, wprowadź tutaj poprawną ścieżkę. To ustawienie powinno być ustawione tylko wtedy, gdy używasz ograniczonego systemu i dowiązań symbolicznych do twojego webroota."
 
-#: src/Module/Install.php:206
+#: src/Module/Install.php:208
 msgid "Sub path of the URL"
 msgstr ""
 
-#: src/Module/Install.php:208
+#: src/Module/Install.php:210
 msgid ""
 "Overwrite this field in case the sub path determination isn't right, "
 "otherwise leave it as is. Leaving this field blank means the installation is"
 " at the base URL without sub path."
-msgstr ""
+msgstr "Nadpisz to pole w przypadku, gdy określenie ścieżki podrzędnej nie jest prawidłowe, w przeciwnym razie pozostaw je bez zmian. Pozostawienie tego pola pustego oznacza, że ​​instalacja odbywa się pod podstawowym adresem URL bez podścieżki."
 
-#: src/Module/Install.php:219
+#: src/Module/Install.php:221
 msgid "Database connection"
 msgstr "Połączenie z bazą danych"
 
-#: src/Module/Install.php:220
+#: src/Module/Install.php:222
 msgid ""
 "In order to install Friendica we need to know how to connect to your "
 "database."
 msgstr "W celu zainstalowania Friendica musimy wiedzieć jak połączyć się z twoją bazą danych."
 
-#: src/Module/Install.php:221
+#: src/Module/Install.php:223
 msgid ""
 "Please contact your hosting provider or site administrator if you have "
 "questions about these settings."
 msgstr "Proszę skontaktuj się ze swoim dostawcą usług hostingowych bądź administratorem strony jeśli masz pytania co do tych ustawień ."
 
-#: src/Module/Install.php:222
+#: src/Module/Install.php:224
 msgid ""
 "The database you specify below should already exist. If it does not, please "
 "create it before continuing."
 msgstr "Wymieniona przez Ciebie baza danych powinna już istnieć. Jeżeli nie, utwórz ją przed kontynuacją."
 
-#: src/Module/Install.php:229
+#: src/Module/Install.php:231
 msgid "Database Server Name"
 msgstr "Nazwa serwera bazy danych"
 
-#: src/Module/Install.php:234
+#: src/Module/Install.php:236
 msgid "Database Login Name"
 msgstr "Nazwa użytkownika bazy danych"
 
-#: src/Module/Install.php:240
+#: src/Module/Install.php:242
 msgid "Database Login Password"
 msgstr "Hasło logowania do bazy danych"
 
-#: src/Module/Install.php:242
+#: src/Module/Install.php:244
 msgid "For security reasons the password must not be empty"
 msgstr "Ze względów bezpieczeństwa hasło nie może być puste"
 
-#: src/Module/Install.php:245
+#: src/Module/Install.php:247
 msgid "Database Name"
 msgstr "Nazwa bazy danych"
 
-#: src/Module/Install.php:249 src/Module/Install.php:278
+#: src/Module/Install.php:251 src/Module/Install.php:280
 msgid "Please select a default timezone for your website"
 msgstr "Proszę wybrać domyślną strefę czasową dla swojej strony"
 
-#: src/Module/Install.php:263
+#: src/Module/Install.php:265
 msgid "Site settings"
 msgstr "Ustawienia strony"
 
-#: src/Module/Install.php:273
+#: src/Module/Install.php:275
 msgid "Site administrator email address"
 msgstr "Adres e-mail administratora strony"
 
-#: src/Module/Install.php:275
+#: src/Module/Install.php:277
 msgid ""
 "Your account email address must match this in order to use the web admin "
 "panel."
 msgstr "Adres e-mail konta musi pasować do tego, aby móc korzystać z panelu administracyjnego."
 
-#: src/Module/Install.php:282
+#: src/Module/Install.php:284
 msgid "System Language:"
 msgstr "Język systemu:"
 
-#: src/Module/Install.php:284
+#: src/Module/Install.php:286
 msgid ""
 "Set the default language for your Friendica installation interface and to "
 "send emails."
 msgstr "Ustaw domyślny język dla interfejsu instalacyjnego Friendica i wysyłaj e-maile."
 
-#: src/Module/Install.php:296
+#: src/Module/Install.php:298
 msgid "Your Friendica site database has been installed."
 msgstr "Twoja baza danych witryny Friendica została zainstalowana."
 
-#: src/Module/Install.php:304
+#: src/Module/Install.php:306
 msgid "Installation finished"
 msgstr "Instalacja zakończona"
 
-#: src/Module/Install.php:326
+#: src/Module/Install.php:328
 msgid "<h1>What next</h1>"
 msgstr "<h1>Co dalej</h1>"
 
-#: src/Module/Install.php:327
+#: src/Module/Install.php:329
 msgid ""
 "IMPORTANT: You will need to [manually] setup a scheduled task for the "
 "worker."
 msgstr "WAŻNE: Będziesz musiał [ręcznie] ustawić zaplanowane zadanie dla pracownika."
 
-#: src/Module/Install.php:330
+#: src/Module/Install.php:332
 #, php-format
 msgid ""
 "Go to your new Friendica node <a href=\"%s/register\">registration page</a> "
@@ -9490,72 +9408,43 @@ msgid ""
 "important, please visit http://friendi.ca"
 msgstr "Aby uzyskać więcej informacji na temat projektu Friendica i dlaczego uważamy, że jest to ważne, odwiedź http://friendi.ca"
 
-#: src/Module/Localtime.php:30
-msgid "Time Conversion"
-msgstr "Zmiana czasu"
-
-#: src/Module/Localtime.php:31
-msgid ""
-"Friendica provides this service for sharing events with other networks and "
-"friends in unknown timezones."
-msgstr "Friendica udostępnia tę usługę do udostępniania wydarzeń innym sieciom i znajomym w nieznanych strefach czasowych."
-
-#: src/Module/Localtime.php:32
-#, php-format
-msgid "UTC time: %s"
-msgstr "Czas UTC %s"
-
-#: src/Module/Localtime.php:35
-#, php-format
-msgid "Current timezone: %s"
-msgstr "Obecna strefa czasowa: %s"
-
-#: src/Module/Localtime.php:39
-#, php-format
-msgid "Converted localtime: %s"
-msgstr "Zmień strefę czasową: %s"
-
-#: src/Module/Localtime.php:43
-msgid "Please select your timezone:"
-msgstr "Wybierz swoją strefę czasową:"
-
-#: src/Module/Login.php:295
+#: src/Module/Login.php:286
 msgid "Create a New Account"
 msgstr "Załóż nowe konto"
 
-#: src/Module/Login.php:328
+#: src/Module/Login.php:319
 msgid "Password: "
 msgstr "Hasło: "
 
-#: src/Module/Login.php:329
+#: src/Module/Login.php:320
 msgid "Remember me"
 msgstr "Zapamiętaj mnie"
 
-#: src/Module/Login.php:332
+#: src/Module/Login.php:323
 msgid "Or login using OpenID: "
 msgstr "Lub zaloguj się za pośrednictwem OpenID: "
 
-#: src/Module/Login.php:338
+#: src/Module/Login.php:329
 msgid "Forgot your password?"
 msgstr "Zapomniałeś swojego hasła?"
 
-#: src/Module/Login.php:341
+#: src/Module/Login.php:332
 msgid "Website Terms of Service"
 msgstr "Warunki korzystania z witryny"
 
-#: src/Module/Login.php:342
+#: src/Module/Login.php:333
 msgid "terms of service"
 msgstr "warunki użytkowania"
 
-#: src/Module/Login.php:344
+#: src/Module/Login.php:335
 msgid "Website Privacy Policy"
 msgstr "Polityka Prywatności Witryny"
 
-#: src/Module/Login.php:345
+#: src/Module/Login.php:336
 msgid "privacy policy"
 msgstr "polityka prywatności"
 
-#: src/Module/Logout.php:27
+#: src/Module/Logout.php:38
 msgid "Logged out."
 msgstr "Wylogowano."
 
@@ -9570,20 +9459,68 @@ msgstr "Strona nie znaleziona."
 #: src/Module/Photo.php:87
 #, php-format
 msgid "Invalid photo with id %s."
-msgstr ""
+msgstr "Nieprawidłowe zdjęcie z identyfikatorem %s."
+
+#: src/Module/Profile/Contacts.php:23 src/Module/Profile/Contacts.php:36
+msgid "User not found."
+msgstr "Użytkownik nie znaleziony."
+
+#: src/Module/Profile/Contacts.php:78
+msgid "No contacts."
+msgstr "Brak kontaktów."
 
-#: src/Module/Profile.php:110 src/Module/Profile.php:113
-#: src/Protocol/OStatus.php:1302
+#: src/Module/Profile/Contacts.php:112
+#, php-format
+msgid "Follower (%s)"
+msgid_plural "Followers (%s)"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+#: src/Module/Profile/Contacts.php:113
+#, php-format
+msgid "Following (%s)"
+msgid_plural "Following (%s)"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+#: src/Module/Profile/Contacts.php:114
+#, php-format
+msgid "Mutual friend (%s)"
+msgid_plural "Mutual friends (%s)"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+#: src/Module/Profile/Contacts.php:116
+#, php-format
+msgid "Contact (%s)"
+msgid_plural "Contacts (%s)"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+#: src/Module/Profile/Contacts.php:125
+msgid "All contacts"
+msgstr "Wszystkie kontakty"
+
+#: src/Module/Profile.php:111 src/Module/Profile.php:114
+#: src/Protocol/OStatus.php:1300
 #, php-format
 msgid "%s's timeline"
 msgstr "oś czasu %s"
 
-#: src/Module/Profile.php:111 src/Protocol/OStatus.php:1306
+#: src/Module/Profile.php:112 src/Protocol/OStatus.php:1304
 #, php-format
 msgid "%s's posts"
 msgstr "wpisy %s"
 
-#: src/Module/Profile.php:112 src/Protocol/OStatus.php:1309
+#: src/Module/Profile.php:113 src/Protocol/OStatus.php:1307
 #, php-format
 msgid "%s's comments"
 msgstr "komentarze %s"
@@ -9643,7 +9580,7 @@ msgstr "Pozostaw puste dla wygenerowanego automatycznie hasła."
 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 ""
+msgstr "Wybierz pseudonim profilu. Musi zaczynać się od znaku tekstowego. Twój adres profilu na tej stronie to \"<strong>nickname@%s</strong>\"."
 
 #: src/Module/Register.php:133
 msgid "Choose a nickname: "
@@ -9681,88 +9618,179 @@ msgstr "Nie można przetworzyć Twojej rejestracji."
 msgid "Your registration is pending approval by the site owner."
 msgstr "Twoja rejestracja oczekuje na zaakceptowanie przez właściciela witryny."
 
-#: src/Module/Settings/TwoFactor/Index.php:50
-msgid "Two-factor authentication successfully disabled."
+#: src/Module/Settings/TwoFactor/AppSpecific.php:36
+#: src/Module/Settings/TwoFactor/Recovery.php:34
+#: src/Module/Settings/TwoFactor/Verify.php:41
+msgid "Please enter your password to access this page."
+msgstr "Wprowadź hasło, aby uzyskać dostęp do tej strony."
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:54
+msgid "App-specific password generation failed: The description is empty."
+msgstr "Generowanie hasła aplikacji nie powiodło się: Opis jest pusty."
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:57
+msgid ""
+"App-specific password generation failed: This description already exists."
+msgstr "Generowanie hasła aplikacji nie powiodło się: Opis ten już istnieje."
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:61
+msgid "New app-specific password generated."
+msgstr "Nowe hasło specyficzne dla aplikacji."
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:67
+msgid "App-specific passwords successfully revoked."
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:86
+#: src/Module/Settings/TwoFactor/AppSpecific.php:77
+msgid "App-specific password successfully revoked."
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:98
+msgid "Two-factor app-specific passwords"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:100
+msgid ""
+"<p>App-specific passwords are randomly generated passwords used instead your"
+" regular password to authenticate your account on third-party applications "
+"that don't support two-factor authentication.</p>"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:101
+msgid ""
+"Make sure to copy your new app-specific password now. You won’t be able to "
+"see it again!"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:104
+msgid "Description"
+msgstr "Opis"
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:105
+msgid "Last Used"
+msgstr "Ostatnio używane"
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:106
+msgid "Revoke"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:107
+msgid "Revoke All"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:110
+msgid ""
+"When you generate a new app-specific password, you must use it right away, "
+"it will be shown to you once after you generate it."
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:111
+msgid "Generate new app-specific password"
+msgstr "Wygeneruj nowe hasło specyficzne dla aplikacji"
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:112
+msgid "Friendiqa on my Fairphone 2..."
+msgstr "Friendiqa na moim Fairphone 2..."
+
+#: src/Module/Settings/TwoFactor/AppSpecific.php:113
+msgid "Generate"
+msgstr ""
+
+#: src/Module/Settings/TwoFactor/Index.php:51
+msgid "Two-factor authentication successfully disabled."
+msgstr "Autoryzacja dwuskładnikowa została pomyślnie wyłączona."
+
+#: src/Module/Settings/TwoFactor/Index.php:92
 msgid ""
 "<p>Use an application on a mobile device to get two-factor authentication "
 "codes when prompted on login.</p>"
-msgstr ""
+msgstr "<p>Użyj aplikacji na urządzeniu mobilnym, aby uzyskać dwuskładnikowe kody uwierzytelniające po wyświetleniu monitu o zalogowanie.</p>"
 
-#: src/Module/Settings/TwoFactor/Index.php:90
+#: src/Module/Settings/TwoFactor/Index.php:96
 msgid "Authenticator app"
 msgstr ""
 
-#: src/Module/Settings/TwoFactor/Index.php:91
+#: src/Module/Settings/TwoFactor/Index.php:97
 msgid "Configured"
 msgstr "Skonfigurowane"
 
-#: src/Module/Settings/TwoFactor/Index.php:91
+#: src/Module/Settings/TwoFactor/Index.php:97
 msgid "Not Configured"
 msgstr "Nie skonfigurowane"
 
-#: src/Module/Settings/TwoFactor/Index.php:92
+#: src/Module/Settings/TwoFactor/Index.php:98
 msgid "<p>You haven't finished configuring your authenticator app.</p>"
-msgstr ""
+msgstr "<p>Nie zakończyłeś konfigurowania aplikacji uwierzytelniającej.</p>"
 
-#: src/Module/Settings/TwoFactor/Index.php:93
+#: src/Module/Settings/TwoFactor/Index.php:99
 msgid "<p>Your authenticator app is correctly configured.</p>"
-msgstr ""
+msgstr "<p>Twoja aplikacja uwierzytelniająca jest poprawnie skonfigurowana.</p>"
 
-#: src/Module/Settings/TwoFactor/Index.php:95
+#: src/Module/Settings/TwoFactor/Index.php:101
 msgid "Recovery codes"
-msgstr ""
+msgstr "Kody odzyskiwania"
 
-#: src/Module/Settings/TwoFactor/Index.php:96
+#: src/Module/Settings/TwoFactor/Index.php:102
 msgid "Remaining valid codes"
-msgstr ""
+msgstr "Pozostałe ważne kody"
 
-#: src/Module/Settings/TwoFactor/Index.php:98
+#: src/Module/Settings/TwoFactor/Index.php:104
 msgid ""
 "<p>These one-use codes can replace an authenticator app code in case you "
 "have lost access to it.</p>"
-msgstr ""
+msgstr "<p>Te jednorazowe kody mogą zastąpić kod aplikacji uwierzytelniającej w przypadku utraty dostępu do niej.</p>"
 
-#: src/Module/Settings/TwoFactor/Index.php:101
+#: src/Module/Settings/TwoFactor/Index.php:106
+msgid "App-specific passwords"
+msgstr "Hasła specyficzne dla aplikacji"
+
+#: src/Module/Settings/TwoFactor/Index.php:107
+msgid "Generated app-specific passwords"
+msgstr "Wygenerowane hasła specyficzne dla aplikacji"
+
+#: src/Module/Settings/TwoFactor/Index.php:109
+msgid ""
+"<p>These randomly generated passwords allow you to authenticate on apps not "
+"supporting two-factor authentication.</p>"
+msgstr "<p>Losowo generowane hasła umożliwiają uwierzytelnianie w aplikacjach nie obsługujących uwierzytelniania dwuskładnikowego.</p>"
+
+#: src/Module/Settings/TwoFactor/Index.php:112
 msgid "Current password:"
 msgstr "Aktualne hasło:"
 
-#: src/Module/Settings/TwoFactor/Index.php:101
+#: src/Module/Settings/TwoFactor/Index.php:112
 msgid ""
 "You need to provide your current password to change two-factor "
 "authentication settings."
-msgstr ""
+msgstr "Musisz podać swoje aktualne hasło, aby zmienić ustawienia uwierzytelniania dwuskładnikowego."
 
-#: src/Module/Settings/TwoFactor/Index.php:102
+#: src/Module/Settings/TwoFactor/Index.php:113
 msgid "Enable two-factor authentication"
-msgstr ""
+msgstr "Włącz uwierzytelnianie dwuskładnikowe"
 
-#: src/Module/Settings/TwoFactor/Index.php:103
+#: src/Module/Settings/TwoFactor/Index.php:114
 msgid "Disable two-factor authentication"
-msgstr ""
+msgstr "Wyłącz uwierzytelnianie dwuskładnikowe"
 
-#: src/Module/Settings/TwoFactor/Index.php:104
+#: src/Module/Settings/TwoFactor/Index.php:115
 msgid "Show recovery codes"
 msgstr "Pokaż kody odzyskiwania"
 
-#: src/Module/Settings/TwoFactor/Index.php:105
+#: src/Module/Settings/TwoFactor/Index.php:116
+msgid "Manage app-specific passwords"
+msgstr "Zarządzaj hasłami specyficznymi dla aplikacji"
+
+#: src/Module/Settings/TwoFactor/Index.php:117
 msgid "Finish app configuration"
 msgstr "Zakończ konfigurację aplikacji"
 
-#: src/Module/Settings/TwoFactor/Recovery.php:34
-#: src/Module/Settings/TwoFactor/Verify.php:41
-msgid "Please enter your password to access this page."
-msgstr ""
-
 #: src/Module/Settings/TwoFactor/Recovery.php:50
 msgid "New recovery codes successfully generated."
-msgstr ""
+msgstr "Wygenerowano nowe kody odzyskiwania."
 
 #: src/Module/Settings/TwoFactor/Recovery.php:76
 msgid "Two-factor recovery codes"
-msgstr ""
+msgstr "Dwuskładnikowe kody odzyskiwania"
 
 #: src/Module/Settings/TwoFactor/Recovery.php:78
 msgid ""
@@ -9777,24 +9805,24 @@ msgstr ""
 msgid ""
 "When you generate new recovery codes, you must copy the new codes. Your old "
 "codes won’t work anymore."
-msgstr ""
+msgstr "Kiedy generujesz nowe kody odzyskiwania, musisz skopiować nowe kody. Twoje stare kody nie będą już działać."
 
 #: src/Module/Settings/TwoFactor/Recovery.php:81
 msgid "Generate new recovery codes"
-msgstr ""
+msgstr "Wygeneruj nowe kody odzyskiwania"
 
 #: src/Module/Settings/TwoFactor/Recovery.php:83
 msgid "Next: Verification"
-msgstr ""
+msgstr "Następny: Weryfikacja"
 
 #: src/Module/Settings/TwoFactor/Verify.php:63
 msgid "Two-factor authentication successfully activated."
-msgstr ""
+msgstr "Uwierzytelnienie dwuskładnikowe zostało pomyślnie aktywowane."
 
 #: src/Module/Settings/TwoFactor/Verify.php:67
-#: src/Module/TwoFactor/Recovery.php:46 src/Module/TwoFactor/Verify.php:41
+#: src/Module/TwoFactor/Recovery.php:46 src/Module/TwoFactor/Verify.php:43
 msgid "Invalid code, please retry."
-msgstr ""
+msgstr "Nieprawidłowy kod, spróbuj ponownie."
 
 #: src/Module/Settings/TwoFactor/Verify.php:96
 #, php-format
@@ -9814,27 +9842,27 @@ msgid ""
 "\t<dt>Hashing algorithm</dt>\n"
 "\t<dd>SHA-1</dd>\n"
 "</dl>"
-msgstr ""
+msgstr "<p>Możesz przesłać ustawienia uwierzytelniania ręcznie:</p>\n<dl>\n\t<dt>Wystawc</dt>\n\t<dd>%s</dd>\n\t<dt>Nazwa konta</dt>\n\t<dd>%s</dd>\n\t<dt>Sekretny klucz</dt>\n\t<dd>%s</dd>\n\t<dt>Typ</dt>\n\t<dd>Oparte na czasie</dd>\n\t<dt>Liczba cyfr</dt>\n\t<dd>6</dd>\n\t<dt>Hashing algorytmu</dt>\n\t<dd>SHA-1</dd>\n</dl>"
 
 #: src/Module/Settings/TwoFactor/Verify.php:116
 msgid "Two-factor code verification"
-msgstr ""
+msgstr "Weryfikacja kodu dwuskładnikowego"
 
 #: src/Module/Settings/TwoFactor/Verify.php:118
 msgid ""
 "<p>Please scan this QR Code with your authenticator app and submit the "
 "provided code.</p>"
-msgstr ""
+msgstr "<p>Zeskanuj kod QR za pomocą aplikacji uwierzytelniającej i prześlij podany kod.</p>"
 
 #: src/Module/Settings/TwoFactor/Verify.php:120
 #, php-format
 msgid ""
 "<p>Or you can open the following URL in your mobile devicde:</p><p><a "
 "href=\"%s\">%s</a></p>"
-msgstr ""
+msgstr "<p>Możesz też otworzyć następujący adres URL w urządzeniu mobilnym:</p><p><a href=\"%s\">%s</a></p>"
 
 #: src/Module/Settings/TwoFactor/Verify.php:126
-#: src/Module/TwoFactor/Verify.php:63
+#: src/Module/TwoFactor/Verify.php:67
 msgid "Please enter a code from your authentication app"
 msgstr "Wprowadź kod z aplikacji uwierzytelniającej"
 
@@ -9860,11 +9888,11 @@ msgstr "Nie znaleziono"
 
 #: src/Module/Special/HTTPException.php:36
 msgid "Internal Server Error"
-msgstr ""
+msgstr "Wewnętrzny błąd serwera"
 
 #: src/Module/Special/HTTPException.php:37
 msgid "Service Unavailable"
-msgstr ""
+msgstr "Usługa Niedostępna "
 
 #: src/Module/Special/HTTPException.php:44
 msgid ""
@@ -9943,167 +9971,332 @@ msgstr "Oświadczenie o prywatności"
 #: src/Module/TwoFactor/Recovery.php:41
 #, php-format
 msgid "Remaining recovery codes: %d"
-msgstr ""
+msgstr "Pozostałe kody odzyskiwania: %d"
 
 #: src/Module/TwoFactor/Recovery.php:65
 msgid "Two-factor recovery"
-msgstr ""
+msgstr "Odzyskiwanie dwuczynnikowe"
 
 #: src/Module/TwoFactor/Recovery.php:66
 msgid ""
 "<p>You can enter one of your one-time recovery codes in case you lost access"
 " to your mobile device.</p>"
-msgstr ""
+msgstr "<p>Możesz wprowadzić jeden ze swoich jednorazowych kodów odzyskiwania w przypadku utraty dostępu do urządzenia mobilnego.</p>"
 
-#: src/Module/TwoFactor/Recovery.php:67 src/Module/TwoFactor/Verify.php:62
+#: src/Module/TwoFactor/Recovery.php:67 src/Module/TwoFactor/Verify.php:66
 #, php-format
 msgid "Don’t have your phone? <a href=\"%s\">Enter a two-factor recovery code</a>"
-msgstr ""
+msgstr "Nie masz telefonu? <a href=\"%s\">Wprowadzić dwuetapowy kod przywracania </a>"
 
 #: src/Module/TwoFactor/Recovery.php:68
 msgid "Please enter a recovery code"
-msgstr ""
+msgstr "Wprowadź kod odzyskiwania"
 
 #: src/Module/TwoFactor/Recovery.php:69
 msgid "Submit recovery code and complete login"
 msgstr ""
 
-#: src/Module/TwoFactor/Verify.php:61
+#: src/Module/TwoFactor/Verify.php:63
 msgid ""
 "<p>Open the two-factor authentication app on your device to get an "
 "authentication code and verify your identity.</p>"
 msgstr ""
 
-#: src/Module/TwoFactor/Verify.php:64
+#: src/Module/TwoFactor/Verify.php:68
 msgid "Verify code and complete login"
 msgstr ""
 
-#: src/Object/Post.php:137
+#: src/Module/Welcome.php:25
+msgid "Welcome to Friendica"
+msgstr "Witamy na Friendica"
+
+#: src/Module/Welcome.php:26
+msgid "New Member Checklist"
+msgstr "Lista nowych członków"
+
+#: src/Module/Welcome.php:27
+msgid ""
+"We would like to offer some tips and links to help make your experience "
+"enjoyable. Click any item to visit the relevant page. A link to this page "
+"will be visible from your home page for two weeks after your initial "
+"registration and then will quietly disappear."
+msgstr "Chcielibyśmy zaproponować kilka porad i linków, które pomogą uczynić twoje doświadczenie przyjemnym. Kliknij dowolny element, aby odwiedzić odpowiednią stronę. Link do tej strony będzie widoczny na stronie głównej przez dwa tygodnie od czasu rejestracji, a następnie zniknie."
+
+#: src/Module/Welcome.php:29
+msgid "Getting Started"
+msgstr "Pierwsze kroki"
+
+#: src/Module/Welcome.php:30
+msgid "Friendica Walk-Through"
+msgstr "Friendica Przejdź-Przez"
+
+#: src/Module/Welcome.php:31
+msgid ""
+"On your <em>Quick Start</em> page - find a brief introduction to your "
+"profile and network tabs, make some new connections, and find some groups to"
+" join."
+msgstr "Na stronie <em>Szybki start</em> - znajdź krótkie wprowadzenie do swojego profilu i kart sieciowych, stwórz nowe połączenia i znajdź kilka grup do przyłączenia się."
+
+#: src/Module/Welcome.php:34
+msgid "Go to Your Settings"
+msgstr "Idź do swoich ustawień"
+
+#: src/Module/Welcome.php:35
+msgid ""
+"On your <em>Settings</em> page -  change your initial password. Also make a "
+"note of your Identity Address. This looks just like an email address - and "
+"will be useful in making friends on the free social web."
+msgstr "Na stronie Ustawienia - zmień swoje początkowe hasło. Zanotuj także swój adres tożsamości. Wygląda to jak adres e-mail - będzie przydatny w nawiązywaniu znajomości w bezpłatnej sieci społecznościowej."
+
+#: src/Module/Welcome.php:36
+msgid ""
+"Review the other settings, particularly the privacy settings. An unpublished"
+" directory listing is like having an unlisted phone number. In general, you "
+"should probably publish your listing - unless all of your friends and "
+"potential friends know exactly how to find you."
+msgstr "Przejrzyj pozostałe ustawienia, w szczególności ustawienia prywatności. Niepublikowany wykaz katalogów jest podobny do niepublicznego numeru telefonu. Ogólnie rzecz biorąc, powinieneś opublikować swój wpis - chyba, że wszyscy twoi znajomi i potencjalni znajomi dokładnie wiedzą, jak Cię znaleźć."
+
+#: src/Module/Welcome.php:40
+msgid ""
+"Upload a profile photo if you have not done so already. Studies have shown "
+"that people with real photos of themselves are ten times more likely to make"
+" friends than people who do not."
+msgstr "Dodaj swoje zdjęcie profilowe jeśli jeszcze tego nie zrobiłeś. Twoje szanse na zwiększenie liczby znajomych rosną dziesięciokrotnie, kiedy na tym zdjęciu jesteś ty."
+
+#: src/Module/Welcome.php:41
+msgid "Edit Your Profile"
+msgstr "Edytuj własny profil"
+
+#: src/Module/Welcome.php:42
+msgid ""
+"Edit your <strong>default</strong> profile to your liking. Review the "
+"settings for hiding your list of friends and hiding the profile from unknown"
+" visitors."
+msgstr "Edytuj swój domyślny profil do swoich potrzeb. Przejrzyj ustawienia ukrywania listy znajomych i ukrywania profilu przed nieznanymi użytkownikami."
+
+#: src/Module/Welcome.php:43
+msgid "Profile Keywords"
+msgstr "Słowa kluczowe profilu"
+
+#: src/Module/Welcome.php:44
+msgid ""
+"Set some public keywords for your default profile which describe your "
+"interests. We may be able to find other people with similar interests and "
+"suggest friendships."
+msgstr "Ustaw kilka publicznych słów kluczowych dla swojego domyślnego profilu, które opisują Twoje zainteresowania. Możemy znaleźć inne osoby o podobnych zainteresowaniach i zaproponować przyjaźnie."
+
+#: src/Module/Welcome.php:46
+msgid "Connecting"
+msgstr "Łączenie"
+
+#: src/Module/Welcome.php:48
+msgid "Importing Emails"
+msgstr "Importowanie e-maili"
+
+#: src/Module/Welcome.php:49
+msgid ""
+"Enter your email access information on your Connector Settings page if you "
+"wish to import and interact with friends or mailing lists from your email "
+"INBOX"
+msgstr "Wprowadź informacje dotyczące dostępu do poczty e-mail na stronie Ustawienia oprogramowania, jeśli chcesz importować i wchodzić w interakcje z przyjaciółmi lub listami adresowymi z poziomu konta e-mail INBOX"
+
+#: src/Module/Welcome.php:50
+msgid "Go to Your Contacts Page"
+msgstr "Idź do strony z Twoimi kontaktami"
+
+#: src/Module/Welcome.php:51
+msgid ""
+"Your Contacts page is your gateway to managing friendships and connecting "
+"with friends on other networks. Typically you enter their address or site "
+"URL in the <em>Add New Contact</em> dialog."
+msgstr "Strona Kontakty jest twoją bramą do zarządzania przyjaciółmi i łączenia się z przyjaciółmi w innych sieciach. Zazwyczaj podaje się adres lub adres URL strony w oknie dialogowym <em>Dodaj nowy kontakt</em>."
+
+#: src/Module/Welcome.php:52
+msgid "Go to Your Site's Directory"
+msgstr "Idż do twojej strony"
+
+#: src/Module/Welcome.php:53
+msgid ""
+"The Directory page lets you find other people in this network or other "
+"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
+"their profile page. Provide your own Identity Address if requested."
+msgstr "Strona Katalog umożliwia znalezienie innych osób w tej sieci lub innych witrynach stowarzyszonych. Poszukaj łącza <em>Połącz</em> lub <em>Śledź</em> na stronie profilu. Jeśli chcesz, podaj swój własny adres tożsamości."
+
+#: src/Module/Welcome.php:54
+msgid "Finding New People"
+msgstr "Znajdowanie nowych osób"
+
+#: src/Module/Welcome.php:55
+msgid ""
+"On the side panel of the Contacts page are several tools to find new "
+"friends. We can match people by interest, look up people by name or "
+"interest, and provide suggestions based on network relationships. On a brand"
+" new site, friend suggestions will usually begin to be populated within 24 "
+"hours."
+msgstr "Na bocznym panelu strony Kontaktów znajduje się kilka narzędzi do znajdowania nowych przyjaciół. Możemy dopasować osoby według zainteresowań, wyszukiwać osoby według nazwisk i zainteresowań oraz dostarczać sugestie oparte na relacjach sieciowych. Na zupełnie nowej stronie sugestie znajomych zwykle zaczynają być wypełniane w ciągu 24 godzin"
+
+#: src/Module/Welcome.php:58
+msgid "Group Your Contacts"
+msgstr "Grupy kontaktów"
+
+#: src/Module/Welcome.php:59
+msgid ""
+"Once you have made some friends, organize them into private conversation "
+"groups from the sidebar of your Contacts page and then you can interact with"
+" each group privately on your Network page."
+msgstr "Gdy zaprzyjaźnisz się z przyjaciółmi, uporządkuj je w prywatne grupy konwersacji na pasku bocznym na stronie Kontakty, a następnie możesz wchodzić w interakcje z każdą grupą prywatnie na stronie Sieć."
+
+#: src/Module/Welcome.php:61
+msgid "Why Aren't My Posts Public?"
+msgstr "Dlaczego moje posty nie są publiczne?"
+
+#: src/Module/Welcome.php:62
+msgid ""
+"Friendica respects your privacy. By default, your posts will only show up to"
+" people you've added as friends. For more information, see the help section "
+"from the link above."
+msgstr "Friendica szanuje Twoją prywatność. Domyślnie Twoje wpisy będą wyświetlane tylko osobom, które dodałeś jako znajomi. Aby uzyskać więcej informacji, zobacz sekcję pomocy na powyższym łączu."
+
+#: src/Module/Welcome.php:64
+msgid "Getting Help"
+msgstr "Otrzymaj pomoc"
+
+#: src/Module/Welcome.php:65
+msgid "Go to the Help Section"
+msgstr "Przejdź do sekcji pomocy"
+
+#: src/Module/Welcome.php:66
+msgid ""
+"Our <strong>help</strong> pages may be consulted for detail on other program"
+" features and resources."
+msgstr "Na naszych stronach <strong>pomocy</strong> można znaleźć szczegółowe informacje na temat innych funkcji programu i zasobów."
+
+#: src/Object/Post.php:138
 msgid "This entry was edited"
 msgstr "Ten wpis został zedytowany"
 
-#: src/Object/Post.php:157
+#: src/Object/Post.php:158
 msgid "Private Message"
 msgstr "Wiadomość prywatna"
 
-#: src/Object/Post.php:199
+#: src/Object/Post.php:200
 msgid "Delete locally"
 msgstr "Usuń lokalnie"
 
-#: src/Object/Post.php:202
+#: src/Object/Post.php:203
 msgid "Delete globally"
 msgstr "Usuń globalnie"
 
-#: src/Object/Post.php:202
+#: src/Object/Post.php:203
 msgid "Remove locally"
 msgstr "Usuń lokalnie"
 
-#: src/Object/Post.php:216
+#: src/Object/Post.php:217
 msgid "save to folder"
 msgstr "zapisz w folderze"
 
-#: src/Object/Post.php:251
+#: src/Object/Post.php:252
 msgid "I will attend"
 msgstr "Będę uczestniczyć"
 
-#: src/Object/Post.php:251
+#: src/Object/Post.php:252
 msgid "I will not attend"
 msgstr "Nie będę uczestniczyć"
 
-#: src/Object/Post.php:251
+#: src/Object/Post.php:252
 msgid "I might attend"
 msgstr "Mogę wziąć udział"
 
-#: src/Object/Post.php:279
+#: src/Object/Post.php:280
 msgid "ignore thread"
 msgstr "zignoruj ​​wątek"
 
-#: src/Object/Post.php:280
+#: src/Object/Post.php:281
 msgid "unignore thread"
 msgstr "odignoruj ​​wątek"
 
-#: src/Object/Post.php:281
+#: src/Object/Post.php:282
 msgid "toggle ignore status"
 msgstr "przełącz status ignorowania"
 
-#: src/Object/Post.php:292
+#: src/Object/Post.php:293
 msgid "add star"
 msgstr "dodaj gwiazdkę"
 
-#: src/Object/Post.php:293
+#: src/Object/Post.php:294
 msgid "remove star"
 msgstr "anuluj gwiazdkę"
 
-#: src/Object/Post.php:294
+#: src/Object/Post.php:295
 msgid "toggle star status"
 msgstr "włącz status gwiazdy"
 
-#: src/Object/Post.php:297
+#: src/Object/Post.php:298
 msgid "starred"
 msgstr "gwiazdką"
 
-#: src/Object/Post.php:301
+#: src/Object/Post.php:302
 msgid "add tag"
 msgstr "dodaj tag"
 
-#: src/Object/Post.php:312
+#: src/Object/Post.php:313
 msgid "like"
 msgstr "lubię to"
 
-#: src/Object/Post.php:313
+#: src/Object/Post.php:314
 msgid "dislike"
 msgstr "nie lubię tego"
 
-#: src/Object/Post.php:316
+#: src/Object/Post.php:317
 msgid "Share this"
 msgstr "Udostępnij to"
 
-#: src/Object/Post.php:316
+#: src/Object/Post.php:317
 msgid "share"
 msgstr "udostępnij"
 
-#: src/Object/Post.php:384
+#: src/Object/Post.php:385
 msgid "to"
 msgstr "do"
 
-#: src/Object/Post.php:385
+#: src/Object/Post.php:386
 msgid "via"
 msgstr "przez"
 
-#: src/Object/Post.php:386
+#: src/Object/Post.php:387
 msgid "Wall-to-Wall"
 msgstr "Wall-to-Wall"
 
-#: src/Object/Post.php:387
+#: src/Object/Post.php:388
 msgid "via Wall-To-Wall:"
 msgstr "via Wall-To-Wall:"
 
-#: src/Object/Post.php:420
+#: src/Object/Post.php:421
 #, php-format
 msgid "Reply to %s"
 msgstr "Odpowiedź %s"
 
-#: src/Object/Post.php:435
+#: src/Object/Post.php:436
 msgid "Notifier task is pending"
 msgstr "Zadanie Notifier jest w toku"
 
-#: src/Object/Post.php:436
+#: src/Object/Post.php:437
 msgid "Delivery to remote servers is pending"
 msgstr "Trwa przesyłanie do serwerów zdalnych"
 
-#: src/Object/Post.php:437
+#: src/Object/Post.php:438
 msgid "Delivery to remote servers is underway"
 msgstr "Trwa dostawa do serwerów zdalnych"
 
-#: src/Object/Post.php:438
+#: src/Object/Post.php:439
 msgid "Delivery to remote servers is mostly done"
 msgstr "Dostawa do zdalnych serwerów jest w większości wykonywana"
 
-#: src/Object/Post.php:439
+#: src/Object/Post.php:440
 msgid "Delivery to remote servers is done"
 msgstr "Trwa dostarczanie do zdalnych serwerów"
 
-#: src/Object/Post.php:459
+#: src/Object/Post.php:460
 #, php-format
 msgid "%d comment"
 msgid_plural "%d comments"
@@ -10112,37 +10305,37 @@ msgstr[1] "%d komentarze"
 msgstr[2] "%d komentarzy"
 msgstr[3] "%d komentarzy"
 
-#: src/Object/Post.php:460
+#: src/Object/Post.php:461
 msgid "Show more"
 msgstr "Pokaż więcej"
 
-#: src/Object/Post.php:461
+#: src/Object/Post.php:462
 msgid "Show fewer"
 msgstr "Pokaż mniej"
 
-#: src/Protocol/Diaspora.php:2438
+#: src/Protocol/Diaspora.php:2476
 msgid "Sharing notification from Diaspora network"
 msgstr "Wspólne powiadomienie z sieci Diaspora"
 
-#: src/Protocol/Diaspora.php:3598
+#: src/Protocol/Diaspora.php:3621
 msgid "Attachments:"
 msgstr "Załączniki:"
 
-#: src/Protocol/OStatus.php:1863
+#: src/Protocol/OStatus.php:1861
 #, php-format
 msgid "%s is now following %s."
 msgstr "%s zaczął(-ęła) obserwować %s."
 
-#: src/Protocol/OStatus.php:1864
+#: src/Protocol/OStatus.php:1862
 msgid "following"
 msgstr "następujący"
 
-#: src/Protocol/OStatus.php:1867
+#: src/Protocol/OStatus.php:1865
 #, php-format
 msgid "%s stopped following %s."
 msgstr "%s przestał(a) obserwować %s."
 
-#: src/Protocol/OStatus.php:1868
+#: src/Protocol/OStatus.php:1866
 msgid "stopped following"
 msgstr "przestał śledzić"
 
@@ -10212,7 +10405,7 @@ msgstr "w %1$d %2$s"
 msgid "%1$d %2$s ago"
 msgstr "%1$d %2$s temu"
 
-#: src/Worker/Delivery.php:450
+#: src/Worker/Delivery.php:472
 msgid "(no subject)"
 msgstr "(bez tematu)"
 
@@ -10254,69 +10447,69 @@ msgstr "luźny"
 msgid "Variations"
 msgstr "Zmiana"
 
-#: view/theme/frio/config.php:105
+#: view/theme/frio/config.php:107
 msgid "Custom"
 msgstr "Niestandardowe"
 
-#: view/theme/frio/config.php:117
+#: view/theme/frio/config.php:119
 msgid "Note"
 msgstr "Uwaga"
 
-#: view/theme/frio/config.php:117
+#: view/theme/frio/config.php:119
 msgid "Check image permissions if all users are allowed to see the image"
 msgstr "Sprawdź uprawnienia do zdjęć, jeśli wszyscy użytkownicy mogą zobaczyć obraz"
 
-#: view/theme/frio/config.php:123
+#: view/theme/frio/config.php:125
 msgid "Select color scheme"
 msgstr "Wybierz schemat kolorów"
 
-#: view/theme/frio/config.php:124
+#: view/theme/frio/config.php:126
 msgid "Copy or paste schemestring"
 msgstr ""
 
-#: view/theme/frio/config.php:124
+#: view/theme/frio/config.php:126
 msgid ""
 "You can copy this string to share your theme with others. Pasting here "
 "applies the schemestring"
-msgstr ""
+msgstr "Możesz skopiować ten ciąg, aby podzielić się swoim motywem z innymi. Wklejanie tutaj stosuje schemat"
 
-#: view/theme/frio/config.php:125
+#: view/theme/frio/config.php:127
 msgid "Navigation bar background color"
 msgstr "Kolor tła paska nawigacyjnego"
 
-#: view/theme/frio/config.php:126
+#: view/theme/frio/config.php:128
 msgid "Navigation bar icon color "
 msgstr "Kolor ikon na pasku nawigacyjnym "
 
-#: view/theme/frio/config.php:127
+#: view/theme/frio/config.php:129
 msgid "Link color"
 msgstr "Kolor łączy"
 
-#: view/theme/frio/config.php:128
+#: view/theme/frio/config.php:130
 msgid "Set the background color"
 msgstr "Ustaw kolor tła"
 
-#: view/theme/frio/config.php:129
+#: view/theme/frio/config.php:131
 msgid "Content background opacity"
 msgstr "Nieprzezroczystość tła treści"
 
-#: view/theme/frio/config.php:130
+#: view/theme/frio/config.php:132
 msgid "Set the background image"
 msgstr "Ustaw obraz tła"
 
-#: view/theme/frio/config.php:131
+#: view/theme/frio/config.php:133
 msgid "Background image style"
 msgstr "Styl tła"
 
-#: view/theme/frio/config.php:136
+#: view/theme/frio/config.php:138
 msgid "Login page background image"
 msgstr "Obraz tła strony logowania"
 
-#: view/theme/frio/config.php:140
+#: view/theme/frio/config.php:142
 msgid "Login page background color"
 msgstr "Kolor tła strony logowania"
 
-#: view/theme/frio/config.php:140
+#: view/theme/frio/config.php:142
 msgid "Leave background image and color empty for theme defaults"
 msgstr "Pozostaw obraz tła i kolor pusty dla domyślnych ustawień kompozycji"
 
@@ -10356,11 +10549,11 @@ msgstr "Mozaika"
 msgid "Repeat image to fill the screen."
 msgstr "Powtórz obraz, aby wypełnić ekran."
 
-#: view/theme/frio/theme.php:239
+#: view/theme/frio/theme.php:238
 msgid "Guest"
 msgstr "Gość"
 
-#: view/theme/frio/theme.php:244
+#: view/theme/frio/theme.php:243
 msgid "Visitor"
 msgstr "Odwiedzający"
 
index cab47a201560b448d632e0010f7ef7f5c73eeffc..8994b877d4ef4b3a54d9ede62167ac59d0a44ff3 100644 (file)
@@ -212,8 +212,6 @@ $a->strings["Item not found."] = "Element nie znaleziony.";
 $a->strings["Do you really want to delete this item?"] = "Czy na pewno chcesz usunąć ten element?";
 $a->strings["Yes"] = "Tak";
 $a->strings["Permission denied."] = "Brak uprawnień.";
-$a->strings["Archives"] = "Archiwum";
-$a->strings["show more"] = "pokaż więcej";
 $a->strings["Authorize application connection"] = "Autoryzacja połączenia aplikacji";
 $a->strings["Return to your app and insert this Securty Code:"] = "Powróć do swojej aplikacji i wpisz ten Kod Bezpieczeństwa:";
 $a->strings["Please login to continue."] = "Zaloguj się aby kontynuować.";
@@ -346,10 +344,6 @@ $a->strings["Diaspora (Socialhome, Hubzilla)"] = "Diaspora (Socialhome, Hubzilla
 $a->strings[" - please do not use this form.  Instead, enter %s into your Diaspora search bar."] = " - proszę nie używać tego formularza. Zamiast tego, wpisz %s w pasku wyszukiwania Diaspory.";
 $a->strings["Your Identity Address:"] = "Twój adres tożsamości:";
 $a->strings["Submit Request"] = "Wyślij zgłoszenie";
-$a->strings["People Search - %s"] = "Szukaj osób - %s";
-$a->strings["Forum Search - %s"] = "Przeszukiwanie forum - %s";
-$a->strings["Connect"] = "Połącz";
-$a->strings["No matches"] = "Brak wyników";
 $a->strings["The requested item doesn't exist or has been deleted."] = "Żądany element nie istnieje lub został usunięty.";
 $a->strings["The feed for this item is unavailable."] = "Kanał dla tego elementu jest niedostępny.";
 $a->strings["Item not found"] = "Nie znaleziono elementu";
@@ -394,6 +388,7 @@ $a->strings["The network type couldn't be detected. Contact can't be added."] =
 $a->strings["Profile URL"] = "Adres URL profilu";
 $a->strings["Tags:"] = "Tagi:";
 $a->strings["Status Messages and Posts"] = "Status wiadomości i postów";
+$a->strings["Suggested contact not found."] = "Nie znaleziono sugerowanego kontaktu.";
 $a->strings["Friend suggestion sent."] = "Wysłana propozycja dodania do znajomych.";
 $a->strings["Suggest Friends"] = "Zaproponuj znajomych";
 $a->strings["Suggest a friend for %s"] = "Zaproponuj znajomych dla %s";
@@ -430,8 +425,10 @@ $a->strings["Manage Identities and/or Pages"] = "Zarządzaj tożsamościami i/lu
 $a->strings["Toggle between different identities or community/group pages which share your account details or which you have been granted \"manage\" permissions"] = "Przełącz między różnymi tożsamościami lub stronami społeczność/grupy, które udostępniają dane Twojego konta lub które otrzymałeś uprawnienia \"zarządzaj\"";
 $a->strings["Select an identity to manage: "] = "Wybierz tożsamość do zarządzania: ";
 $a->strings["No keywords to match. Please add keywords to your default profile."] = "Brak pasujących słów kluczowych. Dodaj słowa kluczowe do domyślnego profilu.";
+$a->strings["Connect"] = "Połącz";
 $a->strings["first"] = "pierwszy";
 $a->strings["next"] = "następny";
+$a->strings["No matches"] = "Brak wyników";
 $a->strings["Profile Match"] = "Dopasowanie profilu";
 $a->strings["New Message"] = "Nowa wiadomość";
 $a->strings["No recipient selected."] = "Nie wybrano odbiorcy.";
@@ -493,40 +490,6 @@ $a->strings["Shared Links"] = "Udostępnione łącza";
 $a->strings["Interesting Links"] = "Interesujące linki";
 $a->strings["Starred"] = "Ulubione";
 $a->strings["Favourite Posts"] = "Ulubione posty";
-$a->strings["Welcome to Friendica"] = "Witamy na Friendica";
-$a->strings["New Member Checklist"] = "Lista nowych członków";
-$a->strings["We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page. A link to this page will be visible from your home page for two weeks after your initial registration and then will quietly disappear."] = "Chcielibyśmy zaproponować kilka porad i linków, które pomogą uczynić twoje doświadczenie przyjemnym. Kliknij dowolny element, aby odwiedzić odpowiednią stronę. Link do tej strony będzie widoczny na stronie głównej przez dwa tygodnie od czasu rejestracji, a następnie zniknie.";
-$a->strings["Getting Started"] = "Pierwsze kroki";
-$a->strings["Friendica Walk-Through"] = "Friendica Przejdź-Przez";
-$a->strings["On your <em>Quick Start</em> page - find a brief introduction to your profile and network tabs, make some new connections, and find some groups to join."] = "Na stronie <em>Szybki start</em> - znajdź krótkie wprowadzenie do swojego profilu i kart sieciowych, stwórz nowe połączenia i znajdź kilka grup do przyłączenia się.";
-$a->strings["Settings"] = "Ustawienia";
-$a->strings["Go to Your Settings"] = "Idź do swoich ustawień";
-$a->strings["On your <em>Settings</em> page -  change your initial password. Also make a note of your Identity Address. This looks just like an email address - and will be useful in making friends on the free social web."] = "Na stronie Ustawienia - zmień swoje początkowe hasło. Zanotuj także swój adres tożsamości. Wygląda to jak adres e-mail - będzie przydatny w nawiązywaniu znajomości w bezpłatnej sieci społecznościowej.";
-$a->strings["Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you."] = "Przejrzyj pozostałe ustawienia, w szczególności ustawienia prywatności. Niepublikowany wykaz katalogów jest podobny do niepublicznego numeru telefonu. Ogólnie rzecz biorąc, powinieneś opublikować swój wpis - chyba, że wszyscy twoi znajomi i potencjalni znajomi dokładnie wiedzą, jak Cię znaleźć.";
-$a->strings["Profile"] = "Profil użytkownika";
-$a->strings["Upload Profile Photo"] = "Wyślij zdjęcie profilowe";
-$a->strings["Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not."] = "Dodaj swoje zdjęcie profilowe jeśli jeszcze tego nie zrobiłeś. Twoje szanse na zwiększenie liczby znajomych rosną dziesięciokrotnie, kiedy na tym zdjęciu jesteś ty.";
-$a->strings["Edit Your Profile"] = "Edytuj własny profil";
-$a->strings["Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors."] = "Edytuj swój domyślny profil do swoich potrzeb. Przejrzyj ustawienia ukrywania listy znajomych i ukrywania profilu przed nieznanymi użytkownikami.";
-$a->strings["Profile Keywords"] = "Słowa kluczowe profilu";
-$a->strings["Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships."] = "Ustaw kilka publicznych słów kluczowych dla swojego domyślnego profilu, które opisują Twoje zainteresowania. Możemy znaleźć inne osoby o podobnych zainteresowaniach i zaproponować przyjaźnie.";
-$a->strings["Connecting"] = "Łączenie";
-$a->strings["Importing Emails"] = "Importowanie e-maili";
-$a->strings["Enter your email access information on your Connector Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = "Wprowadź informacje dotyczące dostępu do poczty e-mail na stronie Ustawienia oprogramowania, jeśli chcesz importować i wchodzić w interakcje z przyjaciółmi lub listami adresowymi z poziomu konta e-mail INBOX";
-$a->strings["Go to Your Contacts Page"] = "Idź do strony z Twoimi kontaktami";
-$a->strings["Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Add New Contact</em> dialog."] = "Strona Kontakty jest twoją bramą do zarządzania przyjaciółmi i łączenia się z przyjaciółmi w innych sieciach. Zazwyczaj podaje się adres lub adres URL strony w oknie dialogowym <em>Dodaj nowy kontakt</em>.";
-$a->strings["Go to Your Site's Directory"] = "Idż do twojej strony";
-$a->strings["The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested."] = "Strona Katalog umożliwia znalezienie innych osób w tej sieci lub innych witrynach stowarzyszonych. Poszukaj łącza <em>Połącz</em> lub <em>Śledź</em> na stronie profilu. Jeśli chcesz, podaj swój własny adres tożsamości.";
-$a->strings["Finding New People"] = "Znajdowanie nowych osób";
-$a->strings["On the side panel of the Contacts page are several tools to find new friends. We can match people by interest, look up people by name or interest, and provide suggestions based on network relationships. On a brand new site, friend suggestions will usually begin to be populated within 24 hours."] = "Na bocznym panelu strony Kontaktów znajduje się kilka narzędzi do znajdowania nowych przyjaciół. Możemy dopasować osoby według zainteresowań, wyszukiwać osoby według nazwisk i zainteresowań oraz dostarczać sugestie oparte na relacjach sieciowych. Na zupełnie nowej stronie sugestie znajomych zwykle zaczynają być wypełniane w ciągu 24 godzin";
-$a->strings["Groups"] = "Grupy";
-$a->strings["Group Your Contacts"] = "Grupy kontaktów";
-$a->strings["Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page."] = "Gdy zaprzyjaźnisz się z przyjaciółmi, uporządkuj je w prywatne grupy konwersacji na pasku bocznym na stronie Kontakty, a następnie możesz wchodzić w interakcje z każdą grupą prywatnie na stronie Sieć.";
-$a->strings["Why Aren't My Posts Public?"] = "Dlaczego moje posty nie są publiczne?";
-$a->strings["Friendica respects your privacy. By default, your posts will only show up to people you've added as friends. For more information, see the help section from the link above."] = "Friendica szanuje Twoją prywatność. Domyślnie Twoje wpisy będą wyświetlane tylko osobom, które dodałeś jako znajomi. Aby uzyskać więcej informacji, zobacz sekcję pomocy na powyższym łączu.";
-$a->strings["Getting Help"] = "Otrzymaj pomoc";
-$a->strings["Go to the Help Section"] = "Przejdź do sekcji pomocy";
-$a->strings["Our <strong>help</strong> pages may be consulted for detail on other program features and resources."] = "Na naszych stronach <strong>pomocy</strong> można znaleźć szczegółowe informacje na temat innych funkcji programu i zasobów.";
 $a->strings["Personal Notes"] = "Notatki";
 $a->strings["Invalid request identifier."] = "Nieprawidłowe żądanie identyfikatora.";
 $a->strings["Notifications"] = "Powiadomienia";
@@ -557,7 +520,6 @@ $a->strings["Gender:"] = "Płeć:";
 $a->strings["Network:"] = "Sieć:";
 $a->strings["No introductions."] = "Brak dostępu.";
 $a->strings["No more %s notifications."] = "Brak kolejnych %s powiadomień.";
-$a->strings["No more system notifications."] = "Nie ma więcej powiadomień systemowych.";
 $a->strings["Post successful."] = "Pomyślnie opublikowano.";
 $a->strings["OpenID protocol error. No ID returned."] = "Błąd protokołu OpenID. Nie znaleziono identyfikatora.";
 $a->strings["Account not found and OpenID registration is not permitted on this site."] = "Konto nie zostało znalezione, a rejestracja OpenID nie jest dozwolona na tej stronie.";
@@ -635,7 +597,6 @@ $a->strings["poke, prod or do other things to somebody"] = "szturchać, zaczepi
 $a->strings["Recipient"] = "Odbiorca";
 $a->strings["Choose what you wish to do to recipient"] = "Wybierz, co chcesz zrobić";
 $a->strings["Make this post private"] = "Ustaw ten post jako prywatny";
-$a->strings["Only logged in users are permitted to perform a probing."] = "Tylko zalogowani użytkownicy mogą wykonywać sondowanie.";
 $a->strings["Profile deleted."] = "Konto usunięte.";
 $a->strings["Profile-"] = "Profil-";
 $a->strings["New profile created."] = "Utworzono nowy profil.";
@@ -673,6 +634,7 @@ $a->strings["Status information"] = "Informacje o stanie";
 $a->strings["Additional information"] = "Dodatkowe informacje";
 $a->strings["Relation"] = "Relacje";
 $a->strings["Miscellaneous"] = "Różny";
+$a->strings["Upload Profile Photo"] = "Wyślij zdjęcie profilowe";
 $a->strings["Your Gender:"] = "Płeć:";
 $a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "<span class=\"heart\">&hearts;</span> Stan cywilny:";
 $a->strings["Sexual Preference:"] = "Preferencje seksualne:";
@@ -733,6 +695,7 @@ $a->strings["Image uploaded successfully."] = "Pomyślnie wysłano zdjęcie.";
 $a->strings["Permission denied"] = "Odmowa dostępu";
 $a->strings["Invalid profile identifier."] = "Nieprawidłowa nazwa użytkownika.";
 $a->strings["Profile Visibility Editor"] = "Ustawienia widoczności profilu";
+$a->strings["Profile"] = "Profil użytkownika";
 $a->strings["Click on a contact to add or remove."] = "Kliknij na kontakt w celu dodania lub usunięcia.";
 $a->strings["Visible To"] = "Widoczne dla";
 $a->strings["All Contacts (with secure profile access)"] = "Wszystkie kontakty (z bezpiecznym dostępem do profilu)";
@@ -746,7 +709,12 @@ $a->strings["Remove My Account"] = "Usuń moje konto";
 $a->strings["This will completely remove your account. Once this has been done it is not recoverable."] = "Spowoduje to całkowite usunięcie Twojego konta. Po wykonaniu tej czynności nie można jej cofnąć.";
 $a->strings["Please enter your password for verification:"] = "Wprowadź hasło w celu weryfikacji:";
 $a->strings["Resubscribing to OStatus contacts"] = "Ponowne subskrybowanie kontaktów OStatus";
-$a->strings["Error"] = "Błąd";
+$a->strings["Error"] = [
+       0 => "Błąd",
+       1 => "Błędów",
+       2 => "Błędy",
+       3 => "Błędów",
+];
 $a->strings["Only logged in users are permitted to perform a search."] = "Tylko zalogowani użytkownicy mogą wyszukiwać.";
 $a->strings["Only one search per minute is permitted for not logged in users."] = "Dla niezalogowanych użytkowników dozwolone jest tylko jedno wyszukiwanie na minutę.";
 $a->strings["Search"] = "Szukaj";
@@ -763,11 +731,13 @@ $a->strings["Delegations"] = "Delegowanie";
 $a->strings["Connected apps"] = "Powiązane aplikacje";
 $a->strings["Export personal data"] = "Eksportuj dane osobiste";
 $a->strings["Remove account"] = "Usuń konto";
+$a->strings["Settings"] = "Ustawienia";
 $a->strings["Missing some important data!"] = "Brakuje ważnych danych!";
 $a->strings["Update"] = "Zaktualizuj";
 $a->strings["Failed to connect with email account using the settings provided."] = "Połączenie z kontem email używając wybranych ustawień nie powiodło się.";
 $a->strings["Email settings updated."] = "Zaktualizowano ustawienia email.";
 $a->strings["Features updated"] = "Funkcje zaktualizowane";
+$a->strings["The theme you chose isn't available."] = "Wybrany motyw jest niedostępny.";
 $a->strings["Relocate message has been send to your contacts"] = "Przeniesienie wiadomości zostało wysłane do Twoich kontaktów";
 $a->strings["Passwords do not match."] = "Hasła nie pasują do siebie.";
 $a->strings["Password update failed. Please try again."] = "Aktualizacja hasła nie powiodła się. Proszę spróbować ponownie.";
@@ -804,6 +774,8 @@ $a->strings["Built-in support for %s connectivity is %s"] = "Wbudowane wsparcie
 $a->strings["GNU Social (OStatus)"] = "GNU Soocial (OStatus)";
 $a->strings["Email access is disabled on this site."] = "Dostęp do e-maila jest wyłączony na tej stronie.";
 $a->strings["General Social Media Settings"] = "Ogólne ustawienia mediów społecznościowych";
+$a->strings["Accept only top level posts by contacts you follow"] = "Akceptuj tylko posty najwyższego poziomu według kontaktów, które obserwujesz";
+$a->strings["The system does an auto completion of threads when a comment arrives. This has got the side effect that can you receive posts that had been started by a non-follower but had been commented by someone you follow. This setting deactivates this behaviour. When activated, you strictly only will receive posts from people you really do follow."] = "System wykonuje automatyczne uzupełnianie wątków, gdy nadejdzie komentarz. Ma to efekt uboczny, że możesz otrzymywać posty, które zostały uruchomione przez osoby, które nie obserwują, ale zostały skomentowane przez kogoś, kogo śledzisz. To ustawienie dezaktywuje to zachowanie. Po aktywacji będziesz otrzymywać wyłącznie posty od osób, które naprawdę śledzisz.";
 $a->strings["Disable Content Warning"] = "Wyłącz ostrzeżenie o treści";
 $a->strings["Users on networks like Mastodon or Pleroma are able to set a content warning field which collapse their post by default. This disables the automatic collapsing and sets the content warning as the post title. Doesn't affect any other content filtering you eventually set up."] = "Użytkownicy w sieciach takich jak Mastodon lub Pleroma mogą ustawić pole ostrzeżenia o treści, które domyślnie zwijać będzie swój wpis. Powoduje wyłączenie automatycznego zwijania i ustawia ostrzeżenie o treści jako tytuł postu. Nie ma wpływu na żadne inne filtrowanie treści, które ostatecznie utworzyłeś.";
 $a->strings["Disable intelligent shortening"] = "Wyłącz inteligentne skracanie";
@@ -988,9 +960,6 @@ $a->strings["No videos selected"] = "Nie zaznaczono filmów";
 $a->strings["View Video"] = "Zobacz film";
 $a->strings["Recent Videos"] = "Ostatnio dodane filmy";
 $a->strings["Upload New Videos"] = "Wstaw nowe filmy";
-$a->strings["No contacts."] = "Brak kontaktów.";
-$a->strings["Visit %s's profile [%s]"] = "Obejrzyj %s's profil [%s]";
-$a->strings["Contacts"] = "Kontakty";
 $a->strings["Number of daily wall messages for %s exceeded. Message failed."] = "Dzienny limit wiadomości %s został przekroczony. Wiadomość została odrzucona.";
 $a->strings["Unable to check your home location."] = "Nie można sprawdzić twojej lokalizacji.";
 $a->strings["No recipient."] = "Brak odbiorcy.";
@@ -1066,8 +1035,7 @@ $a->strings["Oodles"] = "Nadmiar";
 $a->strings["Nonsexual"] = "Nieseksualny(-a)";
 $a->strings["Single"] = "Singiel";
 $a->strings["Lonely"] = "Samotny(-a)";
-$a->strings["Available"] = "Dostępny(-a)";
-$a->strings["Unavailable"] = "Niedostępny(-a)";
+$a->strings["In a relation"] = "W relacji";
 $a->strings["Has crush"] = "Ma sympatię";
 $a->strings["Infatuated"] = "Zakochany(-a)";
 $a->strings["Dating"] = "Randki";
@@ -1108,6 +1076,7 @@ $a->strings["Add/remove mention when a forum page is selected/deselected in ACL
 $a->strings["Explicit Mentions"] = "";
 $a->strings["Add explicit mentions to comment box for manual control over who gets mentioned in replies."] = "Dodaj wyraźne wzmianki do pola komentarza, aby ręcznie kontrolować, kto zostanie wymieniony w odpowiedziach.";
 $a->strings["Network Sidebar"] = "Sieć Pasek Boczny";
+$a->strings["Archives"] = "Archiwum";
 $a->strings["Ability to select posts by date ranges"] = "Wybierz wpisy według zakresów dat";
 $a->strings["Protocol Filter"] = "Filtr protokołu";
 $a->strings["Enable widget to display Network posts only from selected protocols"] = "Włącz widżet, aby wyświetlać posty sieciowe tylko z wybranych protokołów";
@@ -1128,11 +1097,14 @@ $a->strings["Display Membership Date"] = "Wyświetl datę członkostwa";
 $a->strings["Display membership date in profile"] = "Wyświetla datę członkostwa w profilu";
 $a->strings["Forums"] = "Fora";
 $a->strings["External link to forum"] = "Zewnętrzny link do forum";
+$a->strings["show more"] = "pokaż więcej";
 $a->strings["Nothing new here"] = "Brak nowych zdarzeń";
 $a->strings["Clear notifications"] = "Wyczyść powiadomienia";
 $a->strings["@name, !forum, #tags, content"] = "@imię, !forum, #tagi, treść";
 $a->strings["Logout"] = "Wyloguj";
 $a->strings["End this session"] = "Zakończ sesję";
+$a->strings["Login"] = "Zaloguj się";
+$a->strings["Sign in"] = "Zaloguj się";
 $a->strings["Status"] = "Status";
 $a->strings["Your posts and conversations"] = "Twoje posty i rozmowy";
 $a->strings["Your profile page"] = "Twoja strona profilowa";
@@ -1142,8 +1114,6 @@ $a->strings["Your videos"] = "Twoje filmy";
 $a->strings["Your events"] = "Twoje wydarzenia";
 $a->strings["Personal notes"] = "Notatki";
 $a->strings["Your personal notes"] = "Twoje prywatne notatki";
-$a->strings["Login"] = "Zaloguj się";
-$a->strings["Sign in"] = "Zaloguj się";
 $a->strings["Home"] = "Strona domowa";
 $a->strings["Home Page"] = "Strona startowa";
 $a->strings["Register"] = "Zarejestruj";
@@ -1155,6 +1125,7 @@ $a->strings["Addon applications, utilities, games"] = "Wtyczki, aplikacje, narz
 $a->strings["Search site content"] = "Przeszukaj zawartość strony";
 $a->strings["Full Text"] = "Pełny tekst";
 $a->strings["Tags"] = "Tagi";
+$a->strings["Contacts"] = "Kontakty";
 $a->strings["Community"] = "Społeczność";
 $a->strings["Conversations on this and other servers"] = "Rozmowy na tym i innych serwerach";
 $a->strings["Events and Calendar"] = "Wydarzenia i kalendarz";
@@ -1230,6 +1201,11 @@ $a->strings["Random Profile"] = "Domyślny profil";
 $a->strings["Invite Friends"] = "Zaproś znajomych";
 $a->strings["Global Directory"] = "Katalog globalny";
 $a->strings["Local Directory"] = "Katalog lokalny";
+$a->strings["Followers"] = "";
+$a->strings["Following"] = "";
+$a->strings["Mutual friends"] = "Wspólni znajomi";
+$a->strings["Relationships"] = "Relacje";
+$a->strings["All Contacts"] = "Wszystkie kontakty";
 $a->strings["Protocols"] = "Protokoły";
 $a->strings["All Protocols"] = "Wszystkie protokoły";
 $a->strings["Saved Folders"] = "Zapisz w folderach";
@@ -1305,8 +1281,8 @@ $a->strings["Url rewrite is working"] = "Działający adres URL";
 $a->strings["ImageMagick PHP extension is not installed"] = "Rozszerzenie PHP ImageMagick nie jest zainstalowane";
 $a->strings["ImageMagick PHP extension is installed"] = "Rozszerzenie PHP ImageMagick jest zainstalowane";
 $a->strings["ImageMagick supports GIF"] = "ImageMagick obsługuje GIF";
-$a->strings["Could not connect to database."] = "Nie można połączyć się z bazą danych.";
 $a->strings["Database already in use."] = "Baza danych jest już w użyciu.";
+$a->strings["Could not connect to database."] = "Nie można połączyć się z bazą danych.";
 $a->strings["Tuesday"] = "Wtorek";
 $a->strings["Wednesday"] = "Środa";
 $a->strings["Thursday"] = "Czwartek";
@@ -1335,6 +1311,7 @@ $a->strings["Jan"] = "Sty";
 $a->strings["Feb"] = "Lut";
 $a->strings["Mar"] = "Mar";
 $a->strings["Apr"] = "Kwi";
+$a->strings["Jun"] = "Cze";
 $a->strings["Jul"] = "Lip";
 $a->strings["Aug"] = "Sie";
 $a->strings["Sep"] = "Wrz";
@@ -1411,7 +1388,6 @@ $a->strings["l F d, Y \\@ g:i A"] = "l F d, Y \\@ g:i A";
 $a->strings["Starts:"] = "Rozpoczęcie:";
 $a->strings["Finishes:"] = "Zakończenie:";
 $a->strings["all-day"] = "cały dzień";
-$a->strings["Jun"] = "Cze";
 $a->strings["Sept"] = "Wrz";
 $a->strings["No events to display"] = "Brak wydarzeń do wyświetlenia";
 $a->strings["l, F j"] = "l, F j";
@@ -1430,6 +1406,7 @@ $a->strings["A deleted group with this name was revived. Existing item permissio
 $a->strings["Default privacy group for new contacts"] = "Domyślne ustawienia prywatności dla nowych kontaktów";
 $a->strings["Everybody"] = "Wszyscy";
 $a->strings["edit"] = "edytuj";
+$a->strings["Groups"] = "Grupy";
 $a->strings["Edit group"] = "Edytuj grupy";
 $a->strings["Contacts not in any group"] = "Kontakt nie jest w żadnej grupie";
 $a->strings["Create a new group"] = "Stwórz nową grupę";
@@ -1449,11 +1426,12 @@ $a->strings["View on separate page"] = "Zobacz na oddzielnej stronie";
 $a->strings["view on separate page"] = "zobacz na oddzielnej stronie";
 $a->strings["[no subject]"] = "[bez tematu]";
 $a->strings["Edit profile"] = "Edytuj profil";
-$a->strings["Atom feed"] = "Kanał Atom";
 $a->strings["Manage/edit profiles"] = "Zarządzaj profilami";
 $a->strings["Status:"] = "Status:";
 $a->strings["Homepage:"] = "Strona główna:";
 $a->strings["XMPP:"] = "XMPP:";
+$a->strings["Unfollow"] = "";
+$a->strings["Atom feed"] = "Kanał Atom";
 $a->strings["g A l F d"] = "g A I F d";
 $a->strings["F d"] = "F d";
 $a->strings["[today]"] = "[dziś]";
@@ -1487,7 +1465,7 @@ $a->strings["Database storage failed to update %s"] = "Przechowywanie bazy danyc
 $a->strings["Database storage failed to insert data"] = "Magazyn bazy danych nie mógł wstawić danych";
 $a->strings["Filesystem storage failed to create \"%s\". Check you write permissions."] = "Nie można utworzyć magazynu systemu plików \"%s\". Sprawdź, czy masz uprawnienia do zapisu.";
 $a->strings["Filesystem storage failed to save data to \"%s\". Check your write permissions"] = "Nie udało się zapisać danych w pamięci systemu plików \"%s\". Sprawdź swoje uprawnienia do zapisu";
-$a->strings["Storage base path"] = "";
+$a->strings["Storage base path"] = "Ścieżka bazy pamięci masowej";
 $a->strings["Folder where uploaded files are saved. For maximum security, This should be a path outside web server folder tree"] = "Folder, w którym zapisywane są przesłane pliki. Dla maksymalnego bezpieczeństwa, powinna to być ścieżka poza drzewem folderów serwera WWW";
 $a->strings["Enter a valid existing folder"] = "Wprowadź poprawny istniejący folder";
 $a->strings["Login failed"] = "Logowanie nieudane";
@@ -1562,6 +1540,7 @@ $a->strings["No remote contact is blocked from this node."] = "Z tego węzła ni
 $a->strings["Blocked Remote Contacts"] = "Zablokowane kontakty zdalne";
 $a->strings["Block New Remote Contact"] = "Zablokuj nowy kontakt zdalny";
 $a->strings["Photo"] = "Zdjęcie";
+$a->strings["Reason"] = "";
 $a->strings["%s total blocked contact"] = [
        0 => "łącznie %s zablokowany kontakt",
        1 => "łącznie %s zablokowane kontakty",
@@ -1569,20 +1548,22 @@ $a->strings["%s total blocked contact"] = [
        3 => "%s całkowicie zablokowane kontakty",
 ];
 $a->strings["URL of the remote contact to block."] = "Adres URL kontaktu zdalnego do zablokowania.";
-$a->strings["Server added to blocklist."] = "Serwer dodany do listy zablokowanych.";
+$a->strings["Block Reason"] = "";
+$a->strings["Server domain pattern added to blocklist."] = "";
 $a->strings["Site blocklist updated."] = "Zaktualizowano listę bloków witryny.";
-$a->strings["The blocked domain"] = "Zablokowana domena";
+$a->strings["Blocked server domain pattern"] = "";
 $a->strings["Reason for the block"] = "Powód blokowania";
-$a->strings["The reason why you blocked this domain."] = "Powód zablokowania tej domeny.";
-$a->strings["Delete domain"] = "Usuń domenę";
+$a->strings["Delete server domain pattern"] = "";
 $a->strings["Check to delete this entry from the blocklist"] = "Zaznacz, aby usunąć ten wpis z listy bloków";
-$a->strings["Server Blocklist"] = "Lista zablokowanych serwerów";
-$a->strings["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 domains you should also give a reason why you have blocked the remote server."] = "Na tej stronie można zdefiniować czarną listę serwerów ze stowarzyszonej sieci, które nie mogą współdziałać z danym węzłem. Dla wszystkich wprowadzonych domen powinieneś podać powód, dla którego zablokowałeś serwer zdalny.";
-$a->strings["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."] = "Lista zablokowanych serwerów zostanie publicznie udostępniona na stronie /friendica, dzięki czemu użytkownicy i osoby badające problemy z komunikacją mogą łatwo znaleźć przyczynę.";
+$a->strings["Server Domain Pattern Blocklist"] = "";
+$a->strings["This page can be used to define a blacklist of server domain patterns from the federated network that are not allowed to interact with your node. For each domain pattern you should also provide the reason why you block it."] = "Ta strona może zostać użyta do zdefiniowania czarnej listy wzorców domen serwera z sieci stowarzyszonej, które nie mogą współdziałać z twoim węzłem. Dla każdego wzorca domeny należy również podać powód zablokowania go.";
+$a->strings["The list of blocked server domain patterns will be made publically available on the <a href=\"/friendica\">/friendica</a> page so that your users and people investigating communication problems can find the reason easily."] = "";
+$a->strings["<p>The server domain pattern syntax is case-insensitive shell wildcard, comprising the following special characters:</p>\n<ul>\n\t<li><code>*</code>: Any number of characters</li>\n\t<li><code>?</code>: Any single character</li>\n\t<li><code>[&lt;char1&gt;&lt;char2&gt;...]</code>: char1 or char2</li>\n</ul>"] = "";
 $a->strings["Add new entry to block list"] = "Dodaj nowy wpis do listy bloków";
-$a->strings["Server Domain"] = "Domena serwera";
-$a->strings["The domain of the new server to add to the block list. Do not include the protocol."] = "Domena nowego serwera do dodania do listy bloków. Nie dołączaj protokołu.";
+$a->strings["Server Domain Pattern"] = "";
+$a->strings["The domain pattern of the new server to add to the block list. Do not include the protocol."] = "";
 $a->strings["Block reason"] = "Powód zablokowania";
+$a->strings["The reason why you blocked this server domain pattern."] = "Powód zablokowania wzorca domeny serwera.";
 $a->strings["Add Entry"] = "Dodaj wpis";
 $a->strings["Save changes to the blocklist"] = "Zapisz zmiany w liście zablokowanych";
 $a->strings["Current Entries in the Blocklist"] = "Aktualne wpisy na liście zablokowanych";
@@ -1616,6 +1597,7 @@ $a->strings["You need to know the GUID of the item. You can find it e.g. by look
 $a->strings["GUID"] = "GUID";
 $a->strings["The GUID of the item you want to delete."] = "Identyfikator elementu GUID, który chcesz usunąć.";
 $a->strings["Item Guid"] = "Element Guid";
+$a->strings["The logfile '%s' is not writable. No logging possible"] = "Plik dziennika '%s' nie jest zapisywalny. Brak możliwości logowania";
 $a->strings["Log settings updated."] = "Zaktualizowano ustawienia logów.";
 $a->strings["PHP log currently enabled."] = "Dziennik PHP jest obecnie włączony.";
 $a->strings["PHP log currently disabled."] = "Dziennik PHP jest obecnie wyłączony.";
@@ -1664,7 +1646,7 @@ $a->strings["Self-signed certificate, use SSL for local links only (discouraged)
 $a->strings["Don't check"] = "Nie sprawdzaj";
 $a->strings["check the stable version"] = "sprawdź wersję stabilną";
 $a->strings["check the development version"] = "sprawdź wersję rozwojową";
-$a->strings["Database (legacy)"] = "";
+$a->strings["Database (legacy)"] = "Baza danych (legacy)";
 $a->strings["Site"] = "Strona";
 $a->strings["Republish users to directory"] = "Ponownie opublikuj użytkowników w katalogu";
 $a->strings["Registration"] = "Rejestracja";
@@ -1688,7 +1670,7 @@ $a->strings["Additional Info"] = "Dodatkowe informacje";
 $a->strings["For public servers: you can add additional information here that will be listed at %s/servers."] = "W przypadku serwerów publicznych: możesz tu dodać dodatkowe informacje, które będą wymienione na %s/servers.";
 $a->strings["System language"] = "Język systemu";
 $a->strings["System theme"] = "Motyw systemowy";
-$a->strings["Default system theme - may be over-ridden by user profiles - <a href=\"/admin/themes\" id=\"cnftheme\">Change default theme settings</a>"] = "";
+$a->strings["Default system theme - may be over-ridden by user profiles - <a href=\"/admin/themes\" id=\"cnftheme\">Change default theme settings</a>"] = "Domyślny motyw systemu - może być nadpisywany przez profile użytkowników - <a href=\"/admin/themes\" id=\"cnftheme\">Zmień domyślne ustawienia motywu</a>";
 $a->strings["Mobile system theme"] = "Motyw systemu mobilnego";
 $a->strings["Theme for mobile devices"] = "Motyw na urządzenia mobilne";
 $a->strings["SSL link policy"] = "Polityka odnośników SSL";
@@ -1755,8 +1737,6 @@ $a->strings["Posts per user on community page"] = "Lista postów użytkownika na
 $a->strings["The maximum number of posts per user on the community page. (Not valid for \"Global Community\")"] = "Maksymalna liczba postów na użytkownika na stronie społeczności. (Nie dotyczy „Globalnej społeczności”)";
 $a->strings["Disable OStatus support"] = "Wyłącz obsługę 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."] = "Wyłącz wbudowaną kompatybilność z OStatus (StatusNet, GNU Social itd.). Wszystkie rozmowy w OStatus są publiczne, więc czasem będą pojawiać się ostrzeżenia o prywatności.";
-$a->strings["Only import OStatus/ActivityPub threads from our contacts"] = "Importuj wątki OStatus/ActivityPub tylko z naszych kontaktów";
-$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."] = "Normalnie importujemy każdą zawartość z naszych kontaktów OStatus i ActivityPub. W tej opcji przechowujemy tylko wątki uruchomione przez kontakt znany w naszym systemie.";
 $a->strings["OStatus support can only be enabled if threading is enabled."] = "Obsługa OStatus może być włączona tylko wtedy, gdy włączone jest wątkowanie.";
 $a->strings["Diaspora support can't be enabled because Friendica was installed into a sub directory."] = "Obsługa Diaspory nie może być włączona, ponieważ Friendica została zainstalowana w podkatalogu.";
 $a->strings["Enable Diaspora support"] = "Włączyć obsługę Diaspory";
@@ -1770,7 +1750,7 @@ $a->strings["Proxy URL"] = "URL Proxy";
 $a->strings["Network timeout"] = "Network timeout";
 $a->strings["Value is in seconds. Set to 0 for unlimited (not recommended)."] = "Wartość jest w sekundach. Ustaw na 0 dla nieograniczonej (niezalecane).";
 $a->strings["Maximum Load Average"] = "Maksymalne obciążenie średnie";
-$a->strings["Maximum system load before delivery and poll processes are deferred - default %d."] = "";
+$a->strings["Maximum system load before delivery and poll processes are deferred - default %d."] = "Maksymalne obciążenie systemu przed dostarczeniem i procesami odpytywania jest odroczone - domyślnie %d.";
 $a->strings["Maximum Load Average (Frontend)"] = "Maksymalne obciążenie średnie (Frontend)";
 $a->strings["Maximum system load before the frontend quits service - default 50."] = "Maksymalne obciążenie systemu, zanim frontend zakończy pracę - domyślnie 50.";
 $a->strings["Minimal Memory"] = "Minimalna pamięć";
@@ -1784,13 +1764,13 @@ $a->strings["If enabled, the global contacts are checked periodically for missin
 $a->strings["Days between requery"] = "Dni między żądaniem";
 $a->strings["Number of days after which a server is requeried for his contacts."] = "Liczba dni, po upływie których serwer jest żądany dla swoich kontaktów.";
 $a->strings["Discover contacts from other servers"] = "Odkryj kontakty z innych serwerów";
-$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\"."] = "Okresowo sprawdzaj kontakty z innymi serwerami. Możesz wybrać „Użytkownicy”: użytkownicy systemu zdalnego, „Kontakty globalne”: aktywne kontakty znane w systemie. Rozwiązanie awaryjne jest przeznaczone dla serwerów Redmatrix i starszych serwerów friendica, gdzie globalne kontakty nie były dostępne. Powrót awaryjny zwiększa obciążenie serwera, więc zalecane ustawienie to „Użytkownicy, kontakty globalne”.";
 $a->strings["Timeframe for fetching global contacts"] = "Czas pobierania globalnych kontaktów";
 $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."] = "Po aktywowaniu wykrywania ta wartość określa czas działania globalnych kontaktów pobieranych z innych serwerów.";
 $a->strings["Search the local directory"] = "Wyszukaj w lokalnym katalogu";
 $a->strings["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."] = "Wyszukaj lokalny katalog zamiast katalogu globalnego. Podczas wyszukiwania lokalnie każde wyszukiwanie zostanie wykonane w katalogu globalnym w tle. Poprawia to wyniki wyszukiwania, gdy wyszukiwanie jest powtarzane.";
 $a->strings["Publish server information"] = "Publikuj informacje o serwerze";
-$a->strings["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 profiles, number of posts and the activated protocols and connectors. See <a href=\"http://the-federation.info/\">the-federation.info</a> for details."] = "";
+$a->strings["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 profiles, number of posts and the activated protocols and connectors. See <a href=\"http://the-federation.info/\">the-federation.info</a> for details."] = "Jeśli ta opcja jest włączona, ogólne dane dotyczące serwera i użytkowania zostaną opublikowane. Dane zawierają nazwę i wersję serwera, liczbę użytkowników z profilami publicznymi, liczbę postów i aktywowane protokoły i złącza. Szczegółowe informacje można znaleźć na <a href=\"http://the-federation.info/\">the-federation.info</a>.";
 $a->strings["Check upstream version"] = "Sprawdź wersję powyżej";
 $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."] = "Umożliwia sprawdzenie nowych wersji Friendica na github. Jeśli pojawi się nowa wersja, zostaniesz o tym poinformowany w panelu administracyjnym.";
 $a->strings["Suppress Tags"] = "Ukryj tagi";
@@ -1835,26 +1815,26 @@ $a->strings["Address of the relay server where public posts should be send to. F
 $a->strings["Direct relay transfer"] = "Bezpośredni transfer przekaźników";
 $a->strings["Enables the direct transfer to other servers without using the relay servers"] = "Umożliwia bezpośredni transfer do innych serwerów bez korzystania z serwerów przekazujących";
 $a->strings["Relay scope"] = "Zakres przekaźnika";
-$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["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."] = "Mogą to być „wszystkie” lub „tagi”. „wszystkie” oznacza, że ​​każdy publiczny post powinien zostać odebrany. „Tagi” oznaczają, że powinny być odbierane tylko posty z wybranymi tagami.";
 $a->strings["all"] = "wszystko";
 $a->strings["tags"] = "tagi";
 $a->strings["Server tags"] = "Serwer tagów";
 $a->strings["Comma separated list of tags for the \"tags\" subscription."] = "Rozdzielana przecinkami lista tagów dla subskrypcji „tagi”.";
 $a->strings["Allow user tags"] = "Pozwól na tagi użytkowników";
-$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["If enabled, the tags from the saved searches will used for the \"tags\" subscription in addition to the \"relay_server_tags\"."] = "Jeśli ta opcja jest włączona, tagi z zapisanych wyszukiwań będą używane jako subskrypcja „tagów” jako uzupełnienie do \"relay_server_tags\".";
 $a->strings["Start Relocation"] = "Rozpocznij przenoszenie";
 $a->strings["Your DB still runs with MyISAM tables. You should change the engine type to InnoDB. As Friendica will use InnoDB only features in the future, you should change this! See <a href=\"%s\">here</a> for a guide that may be helpful converting the table engines. You may also use the command <tt>php bin/console.php dbstructure toinnodb</tt> of your Friendica installation for an automatic conversion.<br />"] = "Twoja baza danych nadal używa tabel MyISAM. Powinieneś(-naś) zmienić typ silnika na InnoDB. Ponieważ Friendica będzie używać w przyszłości wyłącznie funkcji InnoDB, powinieneś(-naś) to zmienić! Zobacz <a href=\"%s\">tutaj</a> przewodnik, który może być pomocny w konwersji silników tabel. Możesz także użyć polecenia <tt>php bin/console.php dbstructure toinnodb</tt> instalacji Friendica, aby dokonać automatycznej konwersji.<br />";
 $a->strings["There is a new version of Friendica available for download. Your current version is %1\$s, upstream version is %2\$s"] = "Dostępna jest nowa wersja aplikacji Friendica. Twoja aktualna wersja to %1\$s wyższa wersja to %2\$s";
 $a->strings["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."] = "Aktualizacja bazy danych nie powiodła się. Uruchom polecenie \"php bin/console.php dbstructure update\" z wiersza poleceń i sprawdź błędy, które mogą się pojawić.";
-$a->strings["The last update failed. Please run \"php bin/console.php dbstructure update\" from the command line and have a look at the errors that might appear. (Some of the errors are possibly inside the logfile.)"] = "";
+$a->strings["The last update failed. Please run \"php bin/console.php dbstructure update\" from the command line and have a look at the errors that might appear. (Some of the errors are possibly inside the logfile.)"] = "Ostatnia aktualizacja nie powiodła się. Uruchom polecenie \"php bin/console.php dbstructure update\" z wiersza poleceń i spójrz na błędy, które mogą się pojawić. (Niektóre błędy są prawdopodobnie w pliku dziennika).";
 $a->strings["The worker was never executed. Please check your database structure!"] = "Pracownik nigdy nie został stracony. Sprawdź swoją strukturę bazy danych!";
 $a->strings["The last worker execution was on %s UTC. This is older than one hour. Please check your crontab settings."] = "Ostatnie wykonanie robota było w %s UTC. To jest starsze niż jedna godzina. Sprawdź ustawienia crontab.";
-$a->strings["Friendica's configuration now is stored in config/local.config.php, please copy config/local-sample.config.php and move your config from <code>.htconfig.php</code>. See <a href=\"%s\">the Config help page</a> for help with the transition."] = "";
-$a->strings["Friendica's configuration now is stored in config/local.config.php, please copy config/local-sample.config.php and move your config from <code>config/local.ini.php</code>. See <a href=\"%s\">the Config help page</a> for help with the transition."] = "";
+$a->strings["Friendica's configuration now is stored in config/local.config.php, please copy config/local-sample.config.php and move your config from <code>.htconfig.php</code>. See <a href=\"%s\">the Config help page</a> for help with the transition."] = "Konfiguracja Friendiki jest teraz przechowywana w config/local.config.php, skopiuj config/local-sample.config.php i przenieś swoją konfigurację z <code>.htconfig.php</code>. Zobacz <a href=\"%s\">stronę pomocy Config</a>, aby uzyskać pomoc dotyczącą przejścia.";
+$a->strings["Friendica's configuration now is stored in config/local.config.php, please copy config/local-sample.config.php and move your config from <code>config/local.ini.php</code>. See <a href=\"%s\">the Config help page</a> for help with the transition."] = "Konfiguracja Friendiki jest teraz przechowywana w config/local.config.php, skopiuj config/local-sample.config.php i przenieś konfigurację z <code>config/local.ini.php</code>. Zobacz <a href=\"%s\">stronę pomocy Config</a>, aby uzyskać pomoc dotyczącą przejścia.";
 $a->strings["<a href=\"%s\">%s</a> is not reachable on your system. This is a severe configuration issue that prevents server to server communication. See <a href=\"%s\">the installation page</a> for help."] = "<a href=\"%s\">%s</a> nie jest osiągalny w twoim systemie. Jest to poważny problem z konfiguracją, który uniemożliwia komunikację między serwerami. Zobacz pomoc na <a href=\"%s\">stronie instalacji</a>.";
-$a->strings["Friendica's system.basepath was updated from '%s' to '%s'. Please remove the system.basepath from your db to avoid differences."] = "";
-$a->strings["Friendica's current system.basepath '%s' is wrong and the config file '%s' isn't used."] = "";
-$a->strings["Friendica's current system.basepath '%s' is not equal to the config file '%s'. Please fix your configuration."] = "";
+$a->strings["Friendica's system.basepath was updated from '%s' to '%s'. Please remove the system.basepath from your db to avoid differences."] = "System.basepath Friendiki został zaktualizowany z '%s' do '%s'. Usuń system.basepath z bazy danych, aby uniknąć różnic.";
+$a->strings["Friendica's current system.basepath '%s' is wrong and the config file '%s' isn't used."] = "Obecny system.basepath Friendiki '%s' jest nieprawidłowy i plik konfiguracyjny '%s' nie jest używany.";
+$a->strings["Friendica's current system.basepath '%s' is not equal to the config file '%s'. Please fix your configuration."] = "Obecny system.basepath Friendiki '%s' nie jest równy plikowi konfiguracyjnemu '%s'. Napraw konfigurację.";
 $a->strings["Normal Account"] = "Konto normalne";
 $a->strings["Automatic Follower Account"] = "Automatyczne konto obserwatora";
 $a->strings["Public Forum Account"] = "Publiczne konto na forum";
@@ -1939,32 +1919,7 @@ $a->strings["No friends to display."] = "Brak znajomych do wyświetlenia.";
 $a->strings["No installed applications."] = "Brak zainstalowanych aplikacji.";
 $a->strings["Applications"] = "Aplikacje";
 $a->strings["Item was not found."] = "Element nie znaleziony.";
-$a->strings["Source input"] = "Źródło wejściowe";
-$a->strings["BBCode::toPlaintext"] = "BBCode::na prosty tekst";
-$a->strings["BBCode::convert (raw HTML)"] = "BBCode:: konwersjia (raw HTML)";
-$a->strings["BBCode::convert"] = "BBCode::przekształć";
-$a->strings["BBCode::convert => HTML::toBBCode"] = "BBCode::przekształć => HTML::toBBCode";
-$a->strings["BBCode::toMarkdown"] = "BBCode::toMarkdown";
-$a->strings["BBCode::toMarkdown => Markdown::convert"] = "BBCode::toMarkdown => Markdown::przekształć";
-$a->strings["BBCode::toMarkdown => Markdown::toBBCode"] = "BBCode::toMarkdown => Markdown::toBBCode";
-$a->strings["BBCode::toMarkdown =>  Markdown::convert => HTML::toBBCode"] = "BBCode::toMarkdown => Markdown::przekształć => HTML::toBBCode";
-$a->strings["Item Body"] = "";
-$a->strings["Item Tags"] = "";
-$a->strings["Source input (Diaspora format)"] = "Źródło wejściowe (format Diaspora)";
-$a->strings["Markdown::convert (raw HTML)"] = "Markdown::convert (raw HTML)";
-$a->strings["Markdown::convert"] = "Markdown::convert";
-$a->strings["Markdown::toBBCode"] = "Markdown::toBBCode";
-$a->strings["Raw HTML input"] = "Surowe wejście HTML";
-$a->strings["HTML Input"] = "Wejście 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 (raw HTML)";
-$a->strings["HTML::toMarkdown"] = "HTML::toMarkdown";
-$a->strings["HTML::toPlaintext"] = "HTML::toPlaintext";
-$a->strings["Source text"] = "Tekst źródłowy";
-$a->strings["BBCode"] = "BBCode";
-$a->strings["Markdown"] = "Markdown";
-$a->strings["HTML"] = "HTML";
+$a->strings["Submanaged account can't access the administation pages. Please log back in as the master account."] = "Konto podrzędne nie może uzyskać dostępu do stron administracyjnych. Zaloguj się ponownie jako konto główne.";
 $a->strings["Overview"] = "Przegląd";
 $a->strings["Configuration"] = "Konfiguracja";
 $a->strings["Database"] = "Baza danych";
@@ -1973,6 +1928,7 @@ $a->strings["Inspect Deferred Workers"] = "Sprawdź Odroczonych Pracowników";
 $a->strings["Inspect worker Queue"] = "Sprawdź kolejkę pracowników";
 $a->strings["Tools"] = "Narzędzia";
 $a->strings["Contact Blocklist"] = "Lista zablokowanych kontaktów";
+$a->strings["Server Blocklist"] = "Lista zablokowanych serwerów";
 $a->strings["Diagnostics"] = "Diagnostyka";
 $a->strings["PHP Info"] = "Informacje o PHP";
 $a->strings["probe address"] = "adres sondy";
@@ -1981,6 +1937,8 @@ $a->strings["Item Source"] = "";
 $a->strings["Babel"] = "";
 $a->strings["Addon Features"] = "Funkcje dodatkowe";
 $a->strings["User registrations waiting for confirmation"] = "Rejestracje użytkowników czekające na potwierdzenie";
+$a->strings["People Search - %s"] = "Szukaj osób - %s";
+$a->strings["Forum Search - %s"] = "Przeszukiwanie forum - %s";
 $a->strings["This page is missing a url parameter."] = "Na tej stronie brakuje parametru url.";
 $a->strings["The post was created"] = "Post został utworzony";
 $a->strings["%d contact edited."] = [
@@ -1992,6 +1950,7 @@ $a->strings["%d contact edited."] = [
 $a->strings["Could not access contact record."] = "Nie można uzyskać dostępu do rejestru kontaktów.";
 $a->strings["Could not locate selected profile."] = "Nie można znaleźć wybranego profilu.";
 $a->strings["Contact updated."] = "Zaktualizowano kontakt.";
+$a->strings["Contact not found"] = "Nie znaleziono kontaktu";
 $a->strings["Contact has been blocked"] = "Kontakt został zablokowany";
 $a->strings["Contact has been unblocked"] = "Kontakt został odblokowany";
 $a->strings["Contact has been ignored"] = "Kontakt jest ignorowany";
@@ -2023,6 +1982,7 @@ $a->strings["Contact"] = "Kontakt";
 $a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Wybierz profil, który chcesz bezpiecznie wyświetlić %s";
 $a->strings["Their personal note"] = "Ich osobista uwaga";
 $a->strings["Edit contact notes"] = "Edytuj notatki kontaktu";
+$a->strings["Visit %s's profile [%s]"] = "Obejrzyj %s's profil [%s]";
 $a->strings["Block/Unblock contact"] = "Zablokuj/odblokuj kontakt";
 $a->strings["Ignore contact"] = "Ignoruj kontakt";
 $a->strings["Repair URL settings"] = "Napraw ustawienia adresów URL";
@@ -2041,12 +2001,7 @@ $a->strings["Send a notification of every new post of this contact"] = "Wyślij
 $a->strings["Blacklisted keywords"] = "Słowa kluczowe na czarnej liście";
 $a->strings["Comma separated list of keywords that should not be converted to hashtags, when \"Fetch information and keywords\" is selected"] = "Rozdzielana przecinkami lista słów kluczowych, które nie powinny zostać przekonwertowane na hashtagi, gdy wybrana jest opcja 'Pobierz informacje i słowa kluczowe'";
 $a->strings["Actions"] = "Akcja";
-$a->strings["Suggestions"] = "Sugestie";
-$a->strings["Suggest potential friends"] = "Sugerowani znajomi";
-$a->strings["All Contacts"] = "Wszystkie kontakty";
 $a->strings["Show all contacts"] = "Pokaż wszystkie kontakty";
-$a->strings["Unblocked"] = "Odblokowane";
-$a->strings["Only show unblocked contacts"] = "Pokaż tylko odblokowane kontakty";
 $a->strings["Blocked"] = "Zablokowane";
 $a->strings["Only show blocked contacts"] = "Pokaż tylko zablokowane kontakty";
 $a->strings["Ignored"] = "Ignorowane";
@@ -2075,12 +2030,46 @@ $a->strings["Toggle Archive status"] = "Przełącz  status na Archiwalny";
 $a->strings["Delete contact"] = "Usuń kontakt";
 $a->strings["Credits"] = "Zaufany";
 $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 to projekt społecznościowy, który nie byłby możliwy bez pomocy wielu osób. Oto lista osób, które przyczyniły się do tworzenia kodu lub tłumaczenia Friendica. Dziękuję wam wszystkim!";
+$a->strings["Source input"] = "Źródło wejściowe";
+$a->strings["BBCode::toPlaintext"] = "BBCode::na prosty tekst";
+$a->strings["BBCode::convert (raw HTML)"] = "BBCode:: konwersjia (raw HTML)";
+$a->strings["BBCode::convert"] = "BBCode::przekształć";
+$a->strings["BBCode::convert => HTML::toBBCode"] = "BBCode::przekształć => HTML::toBBCode";
+$a->strings["BBCode::toMarkdown"] = "BBCode::toMarkdown";
+$a->strings["BBCode::toMarkdown => Markdown::convert"] = "BBCode::toMarkdown => Markdown::przekształć";
+$a->strings["BBCode::toMarkdown => Markdown::toBBCode"] = "BBCode::toMarkdown => Markdown::toBBCode";
+$a->strings["BBCode::toMarkdown =>  Markdown::convert => HTML::toBBCode"] = "BBCode::toMarkdown => Markdown::przekształć => HTML::toBBCode";
+$a->strings["Item Body"] = "";
+$a->strings["Item Tags"] = "";
+$a->strings["Source input (Diaspora format)"] = "Źródło wejściowe (format Diaspora)";
+$a->strings["Markdown::convert (raw HTML)"] = "Markdown::convert (raw HTML)";
+$a->strings["Markdown::convert"] = "Markdown::convert";
+$a->strings["Markdown::toBBCode"] = "Markdown::toBBCode";
+$a->strings["Raw HTML input"] = "Surowe wejście HTML";
+$a->strings["HTML Input"] = "Wejście 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 (raw HTML)";
+$a->strings["HTML::toMarkdown"] = "HTML::toMarkdown";
+$a->strings["HTML::toPlaintext"] = "HTML::toPlaintext";
+$a->strings["Source text"] = "Tekst źródłowy";
+$a->strings["BBCode"] = "BBCode";
+$a->strings["Markdown"] = "Markdown";
+$a->strings["HTML"] = "HTML";
+$a->strings["You must be logged in to use this module"] = "Musisz być zalogowany, aby korzystać z tego modułu";
+$a->strings["Source URL"] = "Źródłowy adres URL";
+$a->strings["Time Conversion"] = "Zmiana czasu";
+$a->strings["Friendica provides this service for sharing events with other networks and friends in unknown timezones."] = "Friendica udostępnia tę usługę do udostępniania wydarzeń innym sieciom i znajomym w nieznanych strefach czasowych.";
+$a->strings["UTC time: %s"] = "Czas UTC %s";
+$a->strings["Current timezone: %s"] = "Obecna strefa czasowa: %s";
+$a->strings["Converted localtime: %s"] = "Zmień strefę czasową: %s";
+$a->strings["Please select your timezone:"] = "Wybierz swoją strefę czasową:";
+$a->strings["Only logged in users are permitted to perform a probing."] = "Tylko zalogowani użytkownicy mogą wykonywać sondowanie.";
+$a->strings["Lookup address"] = "Wyszukaj adres";
 $a->strings["No entries (some entries may be hidden)."] = "Brak odwiedzin (niektóre odwiedziny mogą być ukryte).";
 $a->strings["Find on this site"] = "Znajdź na tej stronie";
 $a->strings["Results for:"] = "Wyniki dla:";
 $a->strings["Site Directory"] = "Katalog Witryny";
-$a->strings["You must be logged in to use this module"] = "Musisz być zalogowany, aby korzystać z tego modułu";
-$a->strings["Source URL"] = "Źródłowy adres URL";
 $a->strings["Filetag %s saved to item"] = "";
 $a->strings["- select -"] = "- wybierz -";
 $a->strings["No given contact."] = "Brak kontaktu.";
@@ -2102,11 +2091,11 @@ $a->strings["Contact is unavailable."] = "Kontakt jest niedostępny.";
 $a->strings["Contact is deleted."] = "Kontakt został usunięty.";
 $a->strings["Contact is blocked, unable to add it to a group."] = "Kontakt jest zablokowany, nie można go dodać do grupy.";
 $a->strings["Unable to add the contact to the group."] = "Nie można dodać kontaktu do grupy.";
-$a->strings["Contact successfully added to group."] = "";
-$a->strings["Unable to remove the contact from the group."] = "";
-$a->strings["Contact successfully removed from group."] = "";
-$a->strings["Unknown group command."] = "";
-$a->strings["Bad request."] = "";
+$a->strings["Contact successfully added to group."] = "Kontakt został pomyślnie dodany do grupy.";
+$a->strings["Unable to remove the contact from the group."] = "Nie można usunąć kontaktu z grupy.";
+$a->strings["Contact successfully removed from group."] = "Kontakt został pomyślnie usunięty z grupy.";
+$a->strings["Unknown group command."] = "Nieznane polecenie grupy.";
+$a->strings["Bad request."] = "Błędne żądanie.";
 $a->strings["Save Group"] = "Zapisz grupę";
 $a->strings["Filter"] = "Filtr";
 $a->strings["Create a group of contacts/friends."] = "Stwórz grupę znajomych.";
@@ -2122,13 +2111,13 @@ $a->strings["Welcome to %s"] = "Witamy w %s";
 $a->strings["Friendica Communications Server - Setup"] = "Friendica Communications Server - Instalator";
 $a->strings["System check"] = "Sprawdzanie systemu";
 $a->strings["Check again"] = "Sprawdź ponownie";
-$a->strings["Base settings"] = "";
+$a->strings["Base settings"] = "Ustawienia bazy";
 $a->strings["Host name"] = "Nazwa hosta";
-$a->strings["Overwrite this field in case the determinated hostname isn't right, otherweise leave it as is."] = "";
+$a->strings["Overwrite this field in case the determinated hostname isn't right, otherweise leave it as is."] = "Nadpisz to pole w przypadku, gdy określona nazwa hosta nie jest prawidłowa, a pozostałe pozostaw to bez zmian.";
 $a->strings["Base path to installation"] = "Podstawowa ścieżka do instalacji";
 $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."] = "Jeśli system nie może wykryć poprawnej ścieżki do instalacji, wprowadź tutaj poprawną ścieżkę. To ustawienie powinno być ustawione tylko wtedy, gdy używasz ograniczonego systemu i dowiązań symbolicznych do twojego webroota.";
 $a->strings["Sub path of the URL"] = "";
-$a->strings["Overwrite this field in case the sub path determination isn't right, otherwise leave it as is. Leaving this field blank means the installation is at the base URL without sub path."] = "";
+$a->strings["Overwrite this field in case the sub path determination isn't right, otherwise leave it as is. Leaving this field blank means the installation is at the base URL without sub path."] = "Nadpisz to pole w przypadku, gdy określenie ścieżki podrzędnej nie jest prawidłowe, w przeciwnym razie pozostaw je bez zmian. Pozostawienie tego pola pustego oznacza, że ​​instalacja odbywa się pod podstawowym adresem URL bez podścieżki.";
 $a->strings["Database connection"] = "Połączenie z bazą danych";
 $a->strings["In order to install Friendica we need to know how to connect to your database."] = "W celu zainstalowania Friendica musimy wiedzieć jak połączyć się z twoją bazą danych.";
 $a->strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Proszę skontaktuj się ze swoim dostawcą usług hostingowych bądź administratorem strony jeśli masz pytania co do tych ustawień .";
@@ -2173,12 +2162,6 @@ $a->strings["You are cordially invited to join me and other close friends on Fri
 $a->strings["You will need to supply this invitation code: \$invite_code"] = "Musisz podać ten kod zaproszenia: \$invite_code";
 $a->strings["Once you have registered, please connect with me via my profile page at:"] = "Po rejestracji połącz się ze mną na stronie mojego profilu pod adresem:";
 $a->strings["For more information about the Friendica project and why we feel it is important, please visit http://friendi.ca"] = "Aby uzyskać więcej informacji na temat projektu Friendica i dlaczego uważamy, że jest to ważne, odwiedź http://friendi.ca";
-$a->strings["Time Conversion"] = "Zmiana czasu";
-$a->strings["Friendica provides this service for sharing events with other networks and friends in unknown timezones."] = "Friendica udostępnia tę usługę do udostępniania wydarzeń innym sieciom i znajomym w nieznanych strefach czasowych.";
-$a->strings["UTC time: %s"] = "Czas UTC %s";
-$a->strings["Current timezone: %s"] = "Obecna strefa czasowa: %s";
-$a->strings["Converted localtime: %s"] = "Zmień strefę czasową: %s";
-$a->strings["Please select your timezone:"] = "Wybierz swoją strefę czasową:";
 $a->strings["Create a New Account"] = "Załóż nowe konto";
 $a->strings["Password: "] = "Hasło: ";
 $a->strings["Remember me"] = "Zapamiętaj mnie";
@@ -2191,7 +2174,34 @@ $a->strings["privacy policy"] = "polityka prywatności";
 $a->strings["Logged out."] = "Wylogowano.";
 $a->strings["System down for maintenance"] = "System wyłączony w celu konserwacji";
 $a->strings["Page not found."] = "Strona nie znaleziona.";
-$a->strings["Invalid photo with id %s."] = "";
+$a->strings["Invalid photo with id %s."] = "Nieprawidłowe zdjęcie z identyfikatorem %s.";
+$a->strings["User not found."] = "Użytkownik nie znaleziony.";
+$a->strings["No contacts."] = "Brak kontaktów.";
+$a->strings["Follower (%s)"] = [
+       0 => "",
+       1 => "",
+       2 => "",
+       3 => "",
+];
+$a->strings["Following (%s)"] = [
+       0 => "",
+       1 => "",
+       2 => "",
+       3 => "",
+];
+$a->strings["Mutual friend (%s)"] = [
+       0 => "",
+       1 => "",
+       2 => "",
+       3 => "",
+];
+$a->strings["Contact (%s)"] = [
+       0 => "",
+       1 => "",
+       2 => "",
+       3 => "",
+];
+$a->strings["All contacts"] = "Wszystkie kontakty";
 $a->strings["%s's timeline"] = "oś czasu %s";
 $a->strings["%s's posts"] = "wpisy %s";
 $a->strings["%s's comments"] = "komentarze %s";
@@ -2206,7 +2216,7 @@ $a->strings["Your invitation code: "] = "Twój kod zaproszenia: ";
 $a->strings["Your Full Name (e.g. Joe Smith, real or real-looking): "] = "Twoje imię i nazwisko (np. Jan Kowalski, prawdziwe lub wyglądające na prawdziwe): ";
 $a->strings["Your Email Address: (Initial information will be send there, so this has to be an existing address.)"] = "Twój adres e-mail: (Informacje początkowe zostaną wysłane tam, więc musi to być istniejący adres).";
 $a->strings["Leave empty for an auto generated password."] = "Pozostaw puste dla wygenerowanego automatycznie hasła.";
-$a->strings["Choose a profile nickname. This must begin with a text character. Your profile address on this site will then be \"<strong>nickname@%s</strong>\"."] = "";
+$a->strings["Choose a profile nickname. This must begin with a text character. Your profile address on this site will then be \"<strong>nickname@%s</strong>\"."] = "Wybierz pseudonim profilu. Musi zaczynać się od znaku tekstowego. Twój adres profilu na tej stronie to \"<strong>nickname@%s</strong>\".";
 $a->strings["Choose a nickname: "] = "Wybierz pseudonim: ";
 $a->strings["Import your profile to this friendica instance"] = "Zaimportuj swój profil do tej instancji friendica";
 $a->strings["Note: This node explicitly contains adult content"] = "Uwaga: Ten węzeł jawnie zawiera treści dla dorosłych";
@@ -2215,43 +2225,63 @@ $a->strings["Failed to send email message. Here your accout details:<br> login:
 $a->strings["Registration successful."] = "Rejestracja udana.";
 $a->strings["Your registration can not be processed."] = "Nie można przetworzyć Twojej rejestracji.";
 $a->strings["Your registration is pending approval by the site owner."] = "Twoja rejestracja oczekuje na zaakceptowanie przez właściciela witryny.";
-$a->strings["Two-factor authentication successfully disabled."] = "";
-$a->strings["<p>Use an application on a mobile device to get two-factor authentication codes when prompted on login.</p>"] = "";
+$a->strings["Please enter your password to access this page."] = "Wprowadź hasło, aby uzyskać dostęp do tej strony.";
+$a->strings["App-specific password generation failed: The description is empty."] = "Generowanie hasła aplikacji nie powiodło się: Opis jest pusty.";
+$a->strings["App-specific password generation failed: This description already exists."] = "Generowanie hasła aplikacji nie powiodło się: Opis ten już istnieje.";
+$a->strings["New app-specific password generated."] = "Nowe hasło specyficzne dla aplikacji.";
+$a->strings["App-specific passwords successfully revoked."] = "";
+$a->strings["App-specific password successfully revoked."] = "";
+$a->strings["Two-factor app-specific passwords"] = "";
+$a->strings["<p>App-specific passwords are randomly generated passwords used instead your regular password to authenticate your account on third-party applications that don't support two-factor authentication.</p>"] = "";
+$a->strings["Make sure to copy your new app-specific password now. You won’t be able to see it again!"] = "";
+$a->strings["Description"] = "Opis";
+$a->strings["Last Used"] = "Ostatnio używane";
+$a->strings["Revoke"] = "";
+$a->strings["Revoke All"] = "";
+$a->strings["When you generate a new app-specific password, you must use it right away, it will be shown to you once after you generate it."] = "";
+$a->strings["Generate new app-specific password"] = "Wygeneruj nowe hasło specyficzne dla aplikacji";
+$a->strings["Friendiqa on my Fairphone 2..."] = "Friendiqa na moim Fairphone 2...";
+$a->strings["Generate"] = "";
+$a->strings["Two-factor authentication successfully disabled."] = "Autoryzacja dwuskładnikowa została pomyślnie wyłączona.";
+$a->strings["<p>Use an application on a mobile device to get two-factor authentication codes when prompted on login.</p>"] = "<p>Użyj aplikacji na urządzeniu mobilnym, aby uzyskać dwuskładnikowe kody uwierzytelniające po wyświetleniu monitu o zalogowanie.</p>";
 $a->strings["Authenticator app"] = "";
 $a->strings["Configured"] = "Skonfigurowane";
 $a->strings["Not Configured"] = "Nie skonfigurowane";
-$a->strings["<p>You haven't finished configuring your authenticator app.</p>"] = "";
-$a->strings["<p>Your authenticator app is correctly configured.</p>"] = "";
-$a->strings["Recovery codes"] = "";
-$a->strings["Remaining valid codes"] = "";
-$a->strings["<p>These one-use codes can replace an authenticator app code in case you have lost access to it.</p>"] = "";
+$a->strings["<p>You haven't finished configuring your authenticator app.</p>"] = "<p>Nie zakończyłeś konfigurowania aplikacji uwierzytelniającej.</p>";
+$a->strings["<p>Your authenticator app is correctly configured.</p>"] = "<p>Twoja aplikacja uwierzytelniająca jest poprawnie skonfigurowana.</p>";
+$a->strings["Recovery codes"] = "Kody odzyskiwania";
+$a->strings["Remaining valid codes"] = "Pozostałe ważne kody";
+$a->strings["<p>These one-use codes can replace an authenticator app code in case you have lost access to it.</p>"] = "<p>Te jednorazowe kody mogą zastąpić kod aplikacji uwierzytelniającej w przypadku utraty dostępu do niej.</p>";
+$a->strings["App-specific passwords"] = "Hasła specyficzne dla aplikacji";
+$a->strings["Generated app-specific passwords"] = "Wygenerowane hasła specyficzne dla aplikacji";
+$a->strings["<p>These randomly generated passwords allow you to authenticate on apps not supporting two-factor authentication.</p>"] = "<p>Losowo generowane hasła umożliwiają uwierzytelnianie w aplikacjach nie obsługujących uwierzytelniania dwuskładnikowego.</p>";
 $a->strings["Current password:"] = "Aktualne hasło:";
-$a->strings["You need to provide your current password to change two-factor authentication settings."] = "";
-$a->strings["Enable two-factor authentication"] = "";
-$a->strings["Disable two-factor authentication"] = "";
+$a->strings["You need to provide your current password to change two-factor authentication settings."] = "Musisz podać swoje aktualne hasło, aby zmienić ustawienia uwierzytelniania dwuskładnikowego.";
+$a->strings["Enable two-factor authentication"] = "Włącz uwierzytelnianie dwuskładnikowe";
+$a->strings["Disable two-factor authentication"] = "Wyłącz uwierzytelnianie dwuskładnikowe";
 $a->strings["Show recovery codes"] = "Pokaż kody odzyskiwania";
+$a->strings["Manage app-specific passwords"] = "Zarządzaj hasłami specyficznymi dla aplikacji";
 $a->strings["Finish app configuration"] = "Zakończ konfigurację aplikacji";
-$a->strings["Please enter your password to access this page."] = "";
-$a->strings["New recovery codes successfully generated."] = "";
-$a->strings["Two-factor recovery codes"] = "";
+$a->strings["New recovery codes successfully generated."] = "Wygenerowano nowe kody odzyskiwania.";
+$a->strings["Two-factor recovery codes"] = "Dwuskładnikowe kody odzyskiwania";
 $a->strings["<p>Recovery codes can be used to access your account in the event you lose access to your device and cannot receive two-factor authentication codes.</p><p><strong>Put these in a safe spot!</strong> If you lose your device and don’t have the recovery codes you will lose access to your account.</p>"] = "";
-$a->strings["When you generate new recovery codes, you must copy the new codes. Your old codes won’t work anymore."] = "";
-$a->strings["Generate new recovery codes"] = "";
-$a->strings["Next: Verification"] = "";
-$a->strings["Two-factor authentication successfully activated."] = "";
-$a->strings["Invalid code, please retry."] = "";
-$a->strings["<p>Or you can submit the authentication settings manually:</p>\n<dl>\n\t<dt>Issuer</dt>\n\t<dd>%s</dd>\n\t<dt>Account Name</dt>\n\t<dd>%s</dd>\n\t<dt>Secret Key</dt>\n\t<dd>%s</dd>\n\t<dt>Type</dt>\n\t<dd>Time-based</dd>\n\t<dt>Number of digits</dt>\n\t<dd>6</dd>\n\t<dt>Hashing algorithm</dt>\n\t<dd>SHA-1</dd>\n</dl>"] = "";
-$a->strings["Two-factor code verification"] = "";
-$a->strings["<p>Please scan this QR Code with your authenticator app and submit the provided code.</p>"] = "";
-$a->strings["<p>Or you can open the following URL in your mobile devicde:</p><p><a href=\"%s\">%s</a></p>"] = "";
+$a->strings["When you generate new recovery codes, you must copy the new codes. Your old codes won’t work anymore."] = "Kiedy generujesz nowe kody odzyskiwania, musisz skopiować nowe kody. Twoje stare kody nie będą już działać.";
+$a->strings["Generate new recovery codes"] = "Wygeneruj nowe kody odzyskiwania";
+$a->strings["Next: Verification"] = "Następny: Weryfikacja";
+$a->strings["Two-factor authentication successfully activated."] = "Uwierzytelnienie dwuskładnikowe zostało pomyślnie aktywowane.";
+$a->strings["Invalid code, please retry."] = "Nieprawidłowy kod, spróbuj ponownie.";
+$a->strings["<p>Or you can submit the authentication settings manually:</p>\n<dl>\n\t<dt>Issuer</dt>\n\t<dd>%s</dd>\n\t<dt>Account Name</dt>\n\t<dd>%s</dd>\n\t<dt>Secret Key</dt>\n\t<dd>%s</dd>\n\t<dt>Type</dt>\n\t<dd>Time-based</dd>\n\t<dt>Number of digits</dt>\n\t<dd>6</dd>\n\t<dt>Hashing algorithm</dt>\n\t<dd>SHA-1</dd>\n</dl>"] = "<p>Możesz przesłać ustawienia uwierzytelniania ręcznie:</p>\n<dl>\n\t<dt>Wystawc</dt>\n\t<dd>%s</dd>\n\t<dt>Nazwa konta</dt>\n\t<dd>%s</dd>\n\t<dt>Sekretny klucz</dt>\n\t<dd>%s</dd>\n\t<dt>Typ</dt>\n\t<dd>Oparte na czasie</dd>\n\t<dt>Liczba cyfr</dt>\n\t<dd>6</dd>\n\t<dt>Hashing algorytmu</dt>\n\t<dd>SHA-1</dd>\n</dl>";
+$a->strings["Two-factor code verification"] = "Weryfikacja kodu dwuskładnikowego";
+$a->strings["<p>Please scan this QR Code with your authenticator app and submit the provided code.</p>"] = "<p>Zeskanuj kod QR za pomocą aplikacji uwierzytelniającej i prześlij podany kod.</p>";
+$a->strings["<p>Or you can open the following URL in your mobile devicde:</p><p><a href=\"%s\">%s</a></p>"] = "<p>Możesz też otworzyć następujący adres URL w urządzeniu mobilnym:</p><p><a href=\"%s\">%s</a></p>";
 $a->strings["Please enter a code from your authentication app"] = "Wprowadź kod z aplikacji uwierzytelniającej";
 $a->strings["Verify code and enable two-factor authentication"] = "Sprawdź kod i włącz uwierzytelnianie dwuskładnikowe";
 $a->strings["Bad Request"] = "Nieprawidłowe żądanie";
 $a->strings["Unauthorized"] = "Nieautoryzowane";
 $a->strings["Forbidden"] = "Zabronione";
 $a->strings["Not Found"] = "Nie znaleziono";
-$a->strings["Internal Server Error"] = "";
-$a->strings["Service Unavailable"] = "";
+$a->strings["Internal Server Error"] = "Wewnętrzny błąd serwera";
+$a->strings["Service Unavailable"] = "Usługa Niedostępna ";
 $a->strings["The server cannot or will not process the request due to an apparent client error."] = "Serwer nie może lub nie będzie przetwarzać żądania z powodu widocznego błędu klienta.";
 $a->strings["Authentication is required and has failed or has not yet been provided."] = "Uwierzytelnienie jest wymagane i nie powiodło się lub nie zostało jeszcze dostarczone.";
 $a->strings["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."] = "Żądanie było ważne, ale serwer odmawia działania. Użytkownik może nie mieć wymaganych uprawnień do zasobu lub może potrzebować konta.";
@@ -2263,14 +2293,44 @@ $a->strings["At the time of registration, and for providing communications betwe
 $a->strings["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."] = "Te dane są wymagane do komunikacji i są przekazywane do węzłów partnerów komunikacyjnych i są tam przechowywane. Użytkownicy mogą wprowadzać dodatkowe prywatne dane, które mogą być przesyłane na konta partnerów komunikacyjnych.";
 $a->strings["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."] = "W dowolnym momencie zalogowany użytkownik może wyeksportować dane swojego konta z <a href=\"%1\$s/settings/uexport\">ustawień konta</a>. Jeśli użytkownik chce usunąć swoje konto, może to zrobić w<a href=\"%1\$s/removeme\">%1\$s / Usuń mnie</a>. Usunięcie konta będzie trwałe. Skasowanie danych będzie również wymagane od węzłów partnerów komunikacyjnych.";
 $a->strings["Privacy Statement"] = "Oświadczenie o prywatności";
-$a->strings["Remaining recovery codes: %d"] = "";
-$a->strings["Two-factor recovery"] = "";
-$a->strings["<p>You can enter one of your one-time recovery codes in case you lost access to your mobile device.</p>"] = "";
-$a->strings["Don’t have your phone? <a href=\"%s\">Enter a two-factor recovery code</a>"] = "";
-$a->strings["Please enter a recovery code"] = "";
+$a->strings["Remaining recovery codes: %d"] = "Pozostałe kody odzyskiwania: %d";
+$a->strings["Two-factor recovery"] = "Odzyskiwanie dwuczynnikowe";
+$a->strings["<p>You can enter one of your one-time recovery codes in case you lost access to your mobile device.</p>"] = "<p>Możesz wprowadzić jeden ze swoich jednorazowych kodów odzyskiwania w przypadku utraty dostępu do urządzenia mobilnego.</p>";
+$a->strings["Don’t have your phone? <a href=\"%s\">Enter a two-factor recovery code</a>"] = "Nie masz telefonu? <a href=\"%s\">Wprowadzić dwuetapowy kod przywracania </a>";
+$a->strings["Please enter a recovery code"] = "Wprowadź kod odzyskiwania";
 $a->strings["Submit recovery code and complete login"] = "";
 $a->strings["<p>Open the two-factor authentication app on your device to get an authentication code and verify your identity.</p>"] = "";
 $a->strings["Verify code and complete login"] = "";
+$a->strings["Welcome to Friendica"] = "Witamy na Friendica";
+$a->strings["New Member Checklist"] = "Lista nowych członków";
+$a->strings["We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page. A link to this page will be visible from your home page for two weeks after your initial registration and then will quietly disappear."] = "Chcielibyśmy zaproponować kilka porad i linków, które pomogą uczynić twoje doświadczenie przyjemnym. Kliknij dowolny element, aby odwiedzić odpowiednią stronę. Link do tej strony będzie widoczny na stronie głównej przez dwa tygodnie od czasu rejestracji, a następnie zniknie.";
+$a->strings["Getting Started"] = "Pierwsze kroki";
+$a->strings["Friendica Walk-Through"] = "Friendica Przejdź-Przez";
+$a->strings["On your <em>Quick Start</em> page - find a brief introduction to your profile and network tabs, make some new connections, and find some groups to join."] = "Na stronie <em>Szybki start</em> - znajdź krótkie wprowadzenie do swojego profilu i kart sieciowych, stwórz nowe połączenia i znajdź kilka grup do przyłączenia się.";
+$a->strings["Go to Your Settings"] = "Idź do swoich ustawień";
+$a->strings["On your <em>Settings</em> page -  change your initial password. Also make a note of your Identity Address. This looks just like an email address - and will be useful in making friends on the free social web."] = "Na stronie Ustawienia - zmień swoje początkowe hasło. Zanotuj także swój adres tożsamości. Wygląda to jak adres e-mail - będzie przydatny w nawiązywaniu znajomości w bezpłatnej sieci społecznościowej.";
+$a->strings["Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you."] = "Przejrzyj pozostałe ustawienia, w szczególności ustawienia prywatności. Niepublikowany wykaz katalogów jest podobny do niepublicznego numeru telefonu. Ogólnie rzecz biorąc, powinieneś opublikować swój wpis - chyba, że wszyscy twoi znajomi i potencjalni znajomi dokładnie wiedzą, jak Cię znaleźć.";
+$a->strings["Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not."] = "Dodaj swoje zdjęcie profilowe jeśli jeszcze tego nie zrobiłeś. Twoje szanse na zwiększenie liczby znajomych rosną dziesięciokrotnie, kiedy na tym zdjęciu jesteś ty.";
+$a->strings["Edit Your Profile"] = "Edytuj własny profil";
+$a->strings["Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors."] = "Edytuj swój domyślny profil do swoich potrzeb. Przejrzyj ustawienia ukrywania listy znajomych i ukrywania profilu przed nieznanymi użytkownikami.";
+$a->strings["Profile Keywords"] = "Słowa kluczowe profilu";
+$a->strings["Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships."] = "Ustaw kilka publicznych słów kluczowych dla swojego domyślnego profilu, które opisują Twoje zainteresowania. Możemy znaleźć inne osoby o podobnych zainteresowaniach i zaproponować przyjaźnie.";
+$a->strings["Connecting"] = "Łączenie";
+$a->strings["Importing Emails"] = "Importowanie e-maili";
+$a->strings["Enter your email access information on your Connector Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = "Wprowadź informacje dotyczące dostępu do poczty e-mail na stronie Ustawienia oprogramowania, jeśli chcesz importować i wchodzić w interakcje z przyjaciółmi lub listami adresowymi z poziomu konta e-mail INBOX";
+$a->strings["Go to Your Contacts Page"] = "Idź do strony z Twoimi kontaktami";
+$a->strings["Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Add New Contact</em> dialog."] = "Strona Kontakty jest twoją bramą do zarządzania przyjaciółmi i łączenia się z przyjaciółmi w innych sieciach. Zazwyczaj podaje się adres lub adres URL strony w oknie dialogowym <em>Dodaj nowy kontakt</em>.";
+$a->strings["Go to Your Site's Directory"] = "Idż do twojej strony";
+$a->strings["The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested."] = "Strona Katalog umożliwia znalezienie innych osób w tej sieci lub innych witrynach stowarzyszonych. Poszukaj łącza <em>Połącz</em> lub <em>Śledź</em> na stronie profilu. Jeśli chcesz, podaj swój własny adres tożsamości.";
+$a->strings["Finding New People"] = "Znajdowanie nowych osób";
+$a->strings["On the side panel of the Contacts page are several tools to find new friends. We can match people by interest, look up people by name or interest, and provide suggestions based on network relationships. On a brand new site, friend suggestions will usually begin to be populated within 24 hours."] = "Na bocznym panelu strony Kontaktów znajduje się kilka narzędzi do znajdowania nowych przyjaciół. Możemy dopasować osoby według zainteresowań, wyszukiwać osoby według nazwisk i zainteresowań oraz dostarczać sugestie oparte na relacjach sieciowych. Na zupełnie nowej stronie sugestie znajomych zwykle zaczynają być wypełniane w ciągu 24 godzin";
+$a->strings["Group Your Contacts"] = "Grupy kontaktów";
+$a->strings["Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page."] = "Gdy zaprzyjaźnisz się z przyjaciółmi, uporządkuj je w prywatne grupy konwersacji na pasku bocznym na stronie Kontakty, a następnie możesz wchodzić w interakcje z każdą grupą prywatnie na stronie Sieć.";
+$a->strings["Why Aren't My Posts Public?"] = "Dlaczego moje posty nie są publiczne?";
+$a->strings["Friendica respects your privacy. By default, your posts will only show up to people you've added as friends. For more information, see the help section from the link above."] = "Friendica szanuje Twoją prywatność. Domyślnie Twoje wpisy będą wyświetlane tylko osobom, które dodałeś jako znajomi. Aby uzyskać więcej informacji, zobacz sekcję pomocy na powyższym łączu.";
+$a->strings["Getting Help"] = "Otrzymaj pomoc";
+$a->strings["Go to the Help Section"] = "Przejdź do sekcji pomocy";
+$a->strings["Our <strong>help</strong> pages may be consulted for detail on other program features and resources."] = "Na naszych stronach <strong>pomocy</strong> można znaleźć szczegółowe informacje na temat innych funkcji programu i zasobów.";
 $a->strings["This entry was edited"] = "Ten wpis został zedytowany";
 $a->strings["Private Message"] = "Wiadomość prywatna";
 $a->strings["Delete locally"] = "Usuń lokalnie";
@@ -2347,7 +2407,7 @@ $a->strings["Note"] = "Uwaga";
 $a->strings["Check image permissions if all users are allowed to see the image"] = "Sprawdź uprawnienia do zdjęć, jeśli wszyscy użytkownicy mogą zobaczyć obraz";
 $a->strings["Select color scheme"] = "Wybierz schemat kolorów";
 $a->strings["Copy or paste schemestring"] = "";
-$a->strings["You can copy this string to share your theme with others. Pasting here applies the schemestring"] = "";
+$a->strings["You can copy this string to share your theme with others. Pasting here applies the schemestring"] = "Możesz skopiować ten ciąg, aby podzielić się swoim motywem z innymi. Wklejanie tutaj stosuje schemat";
 $a->strings["Navigation bar background color"] = "Kolor tła paska nawigacyjnego";
 $a->strings["Navigation bar icon color "] = "Kolor ikon na pasku nawigacyjnym ";
 $a->strings["Link color"] = "Kolor łączy";
index beea96fc514f403d9e7acfbfe53068d06b13a406..43d006e0901ddd0cc0fd389e07ce77fdadc5370b 100644 (file)
@@ -6,14 +6,17 @@
 <div id="adminpage">
        <h1>{{$title}} - {{$page}}</h1>
        <p>{{$intro}}</p>
-       <p>{{$public}}</p>
+       <p>{{$public nofilter}}</p>
+       {{$syntax nofilter}}
 
        <h2>{{$addtitle}}</h2>
        <form action="{{$baseurl}}/admin/blocklist/server" method="post">
                <input type="hidden" name="form_security_token" value="{{$form_security_token}}">
                {{include file="field_input.tpl" field=$newdomain}}
                {{include file="field_input.tpl" field=$newreason}}
-               <div class="submit"><input type="submit" name="page_blocklist_save" value="{{$submit}}" /></div>
+               <div class="submit">
+                       <button type="submit" class="btn btn-primary" name="page_blocklist_save" value="{{$submit}}">{{$submit}}</button>
+               </div>
        </form>
 
        {{if $entries}}
@@ -26,8 +29,9 @@
                        {{include file="field_input.tpl" field=$e.reason}}
                        {{include file="field_checkbox.tpl" field=$e.delete}}
                {{/foreach}}
-               <div class="submit"><input type="submit" name="page_blocklist_edit" value="{{$savechanges}}" /></div>
+               <div class="submit">
+                       <button type="submit" class="btn btn-primary" name="page_blocklist_edit" value="{{$savechanges}}">{{$savechanges}}</button>
+               </div>
                {{/if}}
        </form>
-
 </div>
index 823753768eba3291c96ae961dc004259ba644175..19774b42553cd07ab800e1dfe0b19369d15999c6 100644 (file)
@@ -59,7 +59,6 @@
        {{include file="field_input.tpl" field=$max_author_posts_community_page}}
 
        {{include file="field_checkbox.tpl" field=$ostatus_disabled}}
-       {{include file="field_checkbox.tpl" field=$ostatus_full_threads}}
 
        {{if $diaspora_able}}
                {{include file="field_checkbox.tpl" field=$diaspora_enabled}}
index 352ff417f0e01ab9812498e5a6165b7dbc26d807..977a5b75b2663eb49f86f80c9c3513b5ced23103 100644 (file)
@@ -10,7 +10,6 @@
                                <input type="hidden" name="parent" value="{{$parent}}" />
                                {{*<!--<input type="hidden" name="return" value="{{$return_path}}" />-->*}}
                                <input type="hidden" name="jsreload" value="{{$jsreload}}" />
-                               <input type="hidden" name="preview" id="comment-preview-inp-{{$id}}" value="0" />
                                <input type="hidden" name="post_id_random" value="{{$rand_num}}" />
 
                                <div class="comment-edit-photo" id="comment-edit-photo-{{$id}}" >
index 3480228c10bd30a733951b5aa4e8b97ac3f49e51..1ce15042613b435dc239d1a800c8f83b0b76e785 100644 (file)
@@ -1,6 +1,6 @@
 
 <div class="vevent">
-       <div class="summary event-summary">{{$title}}</div>
+       <div class="summary event-summary">{{$title nofilter}}</div>
 
        <div class="event-start">
                <span class="event-label">{{$dtstart_label}}</span>&nbsp;
diff --git a/view/templates/item/compose-footer.tpl b/view/templates/item/compose-footer.tpl
new file mode 100644 (file)
index 0000000..697be6f
--- /dev/null
@@ -0,0 +1,251 @@
+<script type="text/javascript">
+       function updateLocationButtonDisplay(location_button, location_input)
+       {
+               location_button.classList.remove('btn-primary');
+               if (location_input.value) {
+                       location_button.disabled = false;
+                       location_button.classList.add('btn-primary');
+                       location_button.title = location_button.dataset.titleClear;
+               } else if (!"geolocation" in navigator) {
+                       location_button.disabled = true;
+                       location_button.title = location_button.dataset.titleUnavailable;
+               } else if (location_button.disabled) {
+                       location_button.title = location_button.dataset.titleDisabled;
+               } else {
+                       location_button.title = location_button.dataset.titleSet;
+               }
+       }
+
+       $(function() {
+               // Jot attachment live preview.
+               let $textarea = $('#comment-edit-text-0');
+               $textarea.linkPreview();
+               $textarea.keyup(function(){
+                       var textlen = $(this).val().length;
+                       $('#character-counter').text(textlen);
+               });
+               $textarea.editor_autocomplete(baseurl+"/acl");
+               $textarea.bbco_autocomplete('bbcode');
+
+               let $acl_allow_input = $('#acl_allow');
+               let $group_allow_input = $('[name=group_allow]');
+               let $contact_allow_input = $('[name=contact_allow]');
+               let $acl_deny_input = $('#acl_deny');
+               let $group_deny_input = $('[name=group_deny]');
+               let $contact_deny_input = $('[name=contact_deny]');
+
+               // Visibility accordion
+
+               // Prevents open panel to collapse
+               // @see https://stackoverflow.com/a/43593116
+               $('[data-toggle="collapse"]').click(function(e) {
+                       target = $(this).attr('href');
+                       if ($(target).hasClass('in')) {
+                               e.preventDefault(); // to stop the page jump to the anchor target.
+                               e.stopPropagation()
+                       }
+               });
+               // Accessibility: enable space and enter to open a panel when focused
+               $('body').on('keyup', '[data-toggle="collapse"]:focus', function (e) {
+                       if (e.key === ' ' || e.key === 'Enter') {
+                               $(this).click();
+                               e.preventDefault();
+                               e.stopPropagation();
+                       }
+               });
+
+               $('#visibility-public-panel').on('show.bs.collapse', function() {
+                       $('#visibility-public').prop('checked', true);
+                       $group_allow_input.prop('disabled', true);
+                       $contact_allow_input.prop('disabled', true);
+                       $group_deny_input.prop('disabled', true);
+                       $contact_deny_input.prop('disabled', true);
+
+                       $('.profile-jot-net input[type=checkbox]').each(function() {
+                               // Restores checkbox state if it had been saved
+                               if ($(this).attr('data-checked') !== undefined) {
+                                       $(this).prop('checked', $(this).attr('data-checked') === 'true');
+                               }
+                       });
+                       $('.profile-jot-net input').attr('disabled', false);
+               });
+
+               $('#visibility-custom-panel').on('show.bs.collapse', function() {
+                       $('#visibility-custom').prop('checked', true);
+                       $group_allow_input.prop('disabled', false);
+                       $contact_allow_input.prop('disabled', false);
+                       $group_deny_input.prop('disabled', false);
+                       $contact_deny_input.prop('disabled', false);
+
+                       $('.profile-jot-net input[type=checkbox]').each(function() {
+                               // Saves current checkbox state
+                               $(this)
+                                       .attr('data-checked', $(this).prop('checked'))
+                                       .prop('checked', false);
+                       });
+                       $('.profile-jot-net input').attr('disabled', 'disabled');
+               });
+
+               if (document.querySelector('input[name="visibility"]:checked').value === 'custom') {
+                       $('#visibility-custom-panel').collapse({parent: '#visibility-accordion'});
+               }
+
+               // Custom visibility tags inputs
+
+               let acl_groups = new Bloodhound({
+                       local: {{$acl_groups|@json_encode nofilter}},
+                       identify: function(obj) { return obj.id; },
+                       datumTokenizer: Bloodhound.tokenizers.obj.whitespace(['name']),
+                       queryTokenizer: Bloodhound.tokenizers.whitespace,
+               });
+               let acl_contacts = new Bloodhound({
+                       local: {{$acl_contacts|@json_encode nofilter}},
+                       identify: function(obj) { return obj.id; },
+                       datumTokenizer: Bloodhound.tokenizers.obj.whitespace(['name', 'addr']),
+                       queryTokenizer: Bloodhound.tokenizers.whitespace,
+               });
+               let acl = new Bloodhound({
+                       local: {{$acl|@json_encode nofilter}},
+                       identify: function(obj) { return obj.id; },
+                       datumTokenizer: Bloodhound.tokenizers.obj.whitespace(['name', 'addr']),
+                       queryTokenizer: Bloodhound.tokenizers.whitespace,
+               });
+               acl.initialize();
+
+               let suggestionTemplate = function (item) {
+                       return '<div><img src="' + item.micro + '" alt="" style="float: left; width: auto; height: 2.8em; margin-right: 0.5em;"> <strong>' + item.name + '</strong><br /><em>' + item.addr + '</em></div>';
+               };
+
+               $acl_allow_input.tagsinput({
+                       confirmKeys: [13, 44],
+                       cancelConfirmKeysOnEmpty: true,
+                       freeInput: false,
+                       tagClass: function(item) {
+                               switch (item.type) {
+                                       case 'group'   : return 'label label-primary';
+                                       case 'contact'  :
+                                       default:
+                                               return 'label label-info';
+                               }
+                       },
+                       itemValue: 'id',
+                       itemText: 'name',
+                       itemThumb: 'micro',
+                       itemTitle: function(item) {
+                               return item.addr;
+                       },
+                       typeaheadjs: {
+                               name: 'contacts',
+                               displayKey: 'name',
+                               templates: {
+                                       suggestion: suggestionTemplate
+                               },
+                               source: acl.ttAdapter()
+                       }
+               });
+
+               $acl_deny_input
+               .tagsinput({
+                       confirmKeys: [13, 44],
+                       freeInput: false,
+                       tagClass: function(item) {
+                               switch (item.type) {
+                                       case 'group'   : return 'label label-primary';
+                                       case 'contact'  :
+                                       default:
+                                               return 'label label-info';
+                               }
+                       },
+                       itemValue: 'id',
+                       itemText: 'name',
+                       itemThumb: 'micro',
+                       itemTitle: function(item) {
+                               return item.addr;
+                       },
+                       typeaheadjs: {
+                               name: 'contacts',
+                               displayKey: 'name',
+                               templates: {
+                                       suggestion: suggestionTemplate
+                               },
+                               source: acl.ttAdapter()
+                       }
+               });
+
+               // Import existing ACL into the tags input fields.
+
+               $group_allow_input.val().split(',').forEach(function (val) {
+                       $acl_allow_input.tagsinput('add', acl_groups.get(val)[0]);
+               });
+               $contact_allow_input.val().split(',').forEach(function (val) {
+                       $acl_allow_input.tagsinput('add', acl_contacts.get(val)[0]);
+               });
+               $group_deny_input.val().split(',').forEach(function (val) {
+                       $acl_deny_input.tagsinput('add', acl_groups.get(val)[0]);
+               });
+               $contact_deny_input.val().split(',').forEach(function (val) {
+                       $acl_deny_input.tagsinput('add', acl_contacts.get(val)[0]);
+               });
+
+               // Anti-duplicate callback + acl fields value generation
+
+               $acl_allow_input.on('itemAdded', function (event) {
+                       // Removes duplicate in the opposite acl box
+                       $acl_deny_input.tagsinput('remove', event.item);
+
+                       // Update the real acl field
+                       $group_allow_input.val('');
+                       $contact_allow_input.val('');
+                       [].forEach.call($acl_allow_input.tagsinput('items'), function (item) {
+                               if (item.type === 'group') {
+                                       $group_allow_input.val($group_allow_input.val() + '<' + item.id + '>');
+                               } else {
+                                       $contact_allow_input.val($contact_allow_input.val() + '<' + item.id + '>');
+                               }
+                       });
+               });
+
+               $acl_deny_input.on('itemAdded', function (event) {
+                       // Removes duplicate in the opposite acl box
+                       $acl_allow_input.tagsinput('remove', event.item);
+
+                       // Update the real acl field
+                       $group_deny_input.val('');
+                       $contact_deny_input.val('');
+                       [].forEach.call($acl_deny_input.tagsinput('items'), function (item) {
+                               if (item.type === 'group') {
+                                       $group_deny_input.val($group_allow_input.val() + '<' + item.id + '>');
+                               } else {
+                                       $contact_deny_input.val($contact_allow_input.val() + '<' + item.id + '>');
+                               }
+                       });
+               });
+
+               let location_button = document.getElementById('profile-location');
+               let location_input = document.getElementById('jot-location');
+
+               updateLocationButtonDisplay(location_button, location_input);
+
+               location_input.addEventListener('change', function () {
+                       updateLocationButtonDisplay(location_button, location_input);
+               });
+               location_input.addEventListener('keyup', function () {
+                       updateLocationButtonDisplay(location_button, location_input);
+               });
+
+               location_button.addEventListener('click', function() {
+                       if (location_input.value) {
+                               location_input.value = '';
+                               updateLocationButtonDisplay(location_button, location_input);
+                       } else if ("geolocation" in navigator) {
+                               navigator.geolocation.getCurrentPosition(function(position) {
+                                       location_input.value = position.coords.latitude + ', ' + position.coords.longitude;
+                                       updateLocationButtonDisplay(location_button, location_input);
+                               }, function (error) {
+                                       location_button.disabled = true;
+                                       updateLocationButtonDisplay(location_button, location_input);
+                               });
+                       }
+               });
+       })
+</script>
diff --git a/view/templates/item/compose.tpl b/view/templates/item/compose.tpl
new file mode 100644 (file)
index 0000000..d18b1a2
--- /dev/null
@@ -0,0 +1,156 @@
+<div class="generic-page-wrapper">
+       <h2>{{$compose_title}}</h2>
+       <div id="profile-jot-wrapper">
+               <form class="comment-edit-form" data-item-id="{{$id}}" id="comment-edit-form-{{$id}}" action="compose/{{$type}}" method="post">
+                   {{*<!--<input type="hidden" name="return" value="{{$return_path}}" />-->*}}
+                       <input type="hidden" name="post_id_random" value="{{$rand_num}}" />
+                       <input type="hidden" name="post_type" value="{{$posttype}}" />
+                       <input type="hidden" name="wall" value="{{$wall}}" />
+
+                       <div id="jot-title-wrap">
+                               <input type="text" name="title" id="jot-title" class="jothidden jotforms form-control" placeholder="{{$placeholdertitle}}" title="{{$placeholdertitle}}" value="{{$title}}" tabindex="1"/>
+                       </div>
+                   {{if $placeholdercategory}}
+                               <div id="jot-category-wrap">
+                                       <input name="category" id="jot-category" class="jothidden jotforms form-control" type="text" placeholder="{{$placeholdercategory}}" title="{{$placeholdercategory}}" value="{{$category}}" tabindex="2"/>
+                               </div>
+                   {{/if}}
+
+                       <p class="comment-edit-bb-{{$id}} comment-icon-list">
+                               <span>
+                                       <button type="button" class="btn btn-sm icon bb-img" aria-label="{{$edimg}}" title="{{$edimg}}" data-role="insert-formatting" data-bbcode="img" data-id="{{$id}}" tabindex="7">
+                                               <i class="fa fa-picture-o"></i>
+                                       </button>
+                                       <button type="button" class="btn btn-sm icon bb-attach" aria-label="{{$edattach}}" title="{{$edattach}}" ondragenter="return commentLinkDrop(event, {{$id}});" ondragover="return commentLinkDrop(event, {{$id}});" ondrop="commentLinkDropper(event);" onclick="commentGetLink({{$id}}, '{{$prompttext}}');" tabindex="8">
+                                               <i class="fa fa-paperclip"></i>
+                                       </button>
+                               </span>
+                               <span>
+                                       <button type="button" class="btn btn-sm icon bb-url" aria-label="{{$edurl}}" title="{{$edurl}}" onclick="insertFormatting('url',{{$id}});" tabindex="9">
+                                               <i class="fa fa-link"></i>
+                                       </button>
+                                       <button type="button" class="btn btn-sm icon underline" aria-label="{{$eduline}}" title="{{$eduline}}" onclick="insertFormatting('u',{{$id}});" tabindex="10">
+                                               <i class="fa fa-underline"></i>
+                                       </button>
+                                       <button type="button" class="btn btn-sm icon italic" aria-label="{{$editalic}}" title="{{$editalic}}" onclick="insertFormatting('i',{{$id}});" tabindex="11">
+                                               <i class="fa fa-italic"></i>
+                                       </button>
+                                       <button type="button" class="btn btn-sm icon bold" aria-label="{{$edbold}}" title="{{$edbold}}" onclick="insertFormatting('b',{{$id}});" tabindex="12">
+                                               <i class="fa fa-bold"></i>
+                                       </button>
+                                       <button type="button" class="btn btn-sm icon quote" aria-label="{{$edquote}}" title="{{$edquote}}" onclick="insertFormatting('quote',{{$id}});" tabindex="13">
+                                               <i class="fa fa-quote-left"></i>
+                                       </button>
+                               </span>
+                       </p>
+                       <p>
+                               <textarea id="comment-edit-text-{{$id}}" class="comment-edit-text form-control text-autosize" name="body" placeholder="{{$default}}" rows="7" tabindex="3">{{$body}}</textarea>
+                       </p>
+
+                       <p class="comment-edit-submit-wrapper">
+{{if $type == 'post'}}
+                               <span role="presentation" class="form-inline">
+                                       <input type="text" name="location" class="form-control" id="jot-location" value="{{$location}}" placeholder="{{$location_set}}"/>
+                                       <button type="button" class="btn btn-sm icon" id="profile-location"
+                                               data-title-set="{{$location_set}}"
+                                               data-title-disabled="{{$location_disabled}}"
+                                               data-title-unavailable="{{$location_unavailable}}"
+                                               data-title-clear="{{$location_clear}}"
+                                               title="{{$location_set}}"
+                                               tabindex="6">
+                                               <i class="fa fa-map-marker" aria-hidden="true"></i>
+                                       </button>
+                               </span>
+{{/if}}
+                               <span role="presentation" id="profile-rotator-wrapper">
+                                       <img role="presentation" id="profile-rotator" src="images/rotator.gif" alt="{{$wait}}" title="{{$wait}}" style="display: none;" />
+                               </span>
+                               <span role="presentation" id="character-counter" class="grey text-info"></span>
+                       {{if $preview}}
+                                       <button type="button" class="btn btn-defaul btn-sm" onclick="preview_comment({{$id}});" id="comment-edit-preview-link-{{$id}}" tabindex="5"><i class="fa fa-eye"></i> {{$preview}}</button>
+                       {{/if}}
+                               <button type="submit" class="btn btn-primary btn-sm" id="comment-edit-submit-{{$id}}" name="submit" tabindex="4"><i class="fa fa-envelope"></i> {{$submit}}</button>
+                       </p>
+
+                       <div id="comment-edit-preview-{{$id}}" class="comment-edit-preview" style="display:none;"></div>
+
+                       <input type="hidden" name="group_allow" value="{{$group_allow}}" {{if $visibility == 'public'}}disabled{{/if}}/>
+                       <input type="hidden" name="contact_allow" value="{{$contact_allow}}" {{if $visibility == 'public'}}disabled{{/if}}/>
+                       <input type="hidden" name="group_deny" value="{{$group_deny}}" {{if $visibility == 'public'}}disabled{{/if}}/>
+                       <input type="hidden" name="contact_deny" value="{{$contact_deny}}" {{if $visibility == 'public'}}disabled{{/if}}/>
+{{if $type == 'post'}}
+                       <h3>Visibility</h3>
+                       <div class="panel-group" id="visibility-accordion" role="tablist" aria-multiselectable="true">
+                               <div class="panel panel-success">
+                                       <div class="panel-heading" id="visibility-public-heading" role="button" data-toggle="collapse" data-parent="#visibility-accordion" href="#visibility-public-panel" aria-expanded="true" aria-controls="visibility-public-panel" tabindex="14">
+                                               <label>
+                                                       <input type="radio" name="visibility" id="visibility-public" value="public" {{if $visibility == 'public'}}checked{{/if}} style="display:none">
+                                                       <i class="fa fa-globe"></i> {{$public_title}}
+                                               </label>
+                                       </div>
+                                       <div id="visibility-public-panel" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="visibility-public-heading">
+                                               <div class="panel-body">
+                                                       <p>{{$public_desc}}</p>
+                    {{if $doesFederate && $jotnets_fields}}
+                        {{if $jotnets_fields|count < 3}}
+                                                       <div class="profile-jot-net">
+                        {{else}}
+                                                       <details class="profile-jot-net">
+                                                       <summary>{{$jotnets_summary}}</summary>
+                        {{/if}}
+
+                        {{foreach $jotnets_fields as $jotnets_field}}
+                            {{if $jotnets_field.type == 'checkbox'}}
+                                {{include file="field_checkbox.tpl" field=$jotnets_field.field}}
+                            {{elseif $jotnets_field.type == 'select'}}
+                                {{include file="field_select.tpl" field=$jotnets_field.field}}
+                            {{/if}}
+                        {{/foreach}}
+
+                        {{if $jotnets_fields|count >= 3}}
+                                                       </details>
+                        {{else}}
+                                                       </div>
+                        {{/if}}
+                    {{/if}}
+                                               </div>
+                                       </div>
+                               </div>
+                               <div class="panel panel-info">
+                                       <div class="panel-heading collapsed" id="visibility-custom-heading" role="button" data-toggle="collapse" data-parent="#visibility-accordion" href="#visibility-custom-panel" aria-expanded="true" aria-controls="visibility-custom-panel" tabindex="15">
+                                               <label>
+                                                       <input type="radio" name="visibility" id="visibility-custom" value="custom" {{if $visibility == 'custom'}}checked{{/if}} style="display:none">
+                                                       <i class="fa fa-lock"></i> {{$custom_title}}
+                                               </label>
+                                       </div>
+                                       <div id="visibility-custom-panel" class="panel-collapse collapse" role="tabpanel" aria-labelledby="visibility-custom-heading">
+                                               <div class="panel-body">
+                                                       <p>{{$custom_desc}}</p>
+
+                                                       <div class="form-group">
+                                                               <label for="acl_allow">Deliver to:</label>
+                                                               <input type="text" class="form-control input-lg" id="acl_allow">
+                                                       </div>
+
+                                                       <div class="form-group">
+                                                               <label for="acl_deny">Except to:</label>
+                                                               <input type="text" class="form-control input-lg" id="acl_deny">
+                                                       </div>
+                                               </div>
+                                       </div>
+                               </div>
+                       </div>
+        {{if $doesFederate}}
+                       <div class="form-group">
+                               <label for="profile-jot-email" id="profile-jot-email-label">{{$emailcc}}</label>
+                               <input type="text" name="emailcc" id="profile-jot-email" class="form-control" title="{{$emtitle}}" />
+                       </div>
+                       <div id="profile-jot-email-end"></div>
+               {{/if}}
+                       <div class="jotplugins">
+                               {{$jotplugins nofilter}}
+                       </div>
+{{/if}}
+               </form>
+       </div>
+</div>
\ No newline at end of file
index 05c87056c69a67ba655e5fd51f13fc49bfec56a1..ad809c9d85a10b017329f563c342df90c39e38b3 100644 (file)
@@ -2,7 +2,7 @@
 
 // Local configuration
 
-// If you're unsure about what any of the config keys below do, please check the config/defaults.config.php for detailed
+// If you're unsure about what any of the config keys below do, please check the static/defaults.config.php for detailed
 // documentation of their data type and behavior.
 
 return [
index d52bf172a0e1957c6802dd51d30e664b100216cc..39dbbde4777a42f5e037dc01b14baac247a33c5e 100644 (file)
@@ -6,7 +6,6 @@
                                <input type="hidden" name="parent" value="{{$parent}}" />
                                <input type="hidden" name="return" value="{{$return_path}}" />
                                <input type="hidden" name="jsreload" value="{{$jsreload}}" />
-                               <input type="hidden" name="preview" id="comment-preview-inp-{{$id}}" value="0" />
 
                                <div class="comment-edit-photo" id="comment-edit-photo-{{$id}}">
                                        <a class="comment-edit-photo-link" href="{{$mylink}}" title="{{$mytitle}}"><img class="my-comment-photo" src="{{$myphoto}}" alt="{{$mytitle}}" title="{{$mytitle}}" /></a>
index 83685d86e50b2da0813fbee33679e9b8f02f9ef6..44e763f393014ada53e9a6b9d1a3dcbbca373b63 100644 (file)
@@ -37,7 +37,7 @@
 {{if $profile.marital}}
 <dl id="aprofile-marital" class="aprofile">
  <dt><span class="heart">&hearts;</span>  {{$profile.marital.0}}</dt>
- <dd>{{$profile.marital.1}}{{if $profile.marital.with}} ({{$profile.marital.with}}){{/if}}{{if $profile.howlong}} {{$profile.howlong}}{{/if}}</dd>
+ <dd>{{$profile.marital.1}}{{if $profile.marital.with}} ({{$profile.marital.with nofilter}}){{/if}}{{if $profile.howlong}} {{$profile.howlong}}{{/if}}</dd>
 </dl>
 {{/if}}
 
index e275e68ce362358bd95a20efbce3557e32329b2f..28f9ffab198c80701fee3264768d527c4099876b 100644 (file)
@@ -11,6 +11,7 @@
 
 <div id="settings_general_expanded" class="settings-block" style="display: none;">
 
+       {{include file="field_checkbox.tpl" field=$accept_only_sharer}}
        {{include file="field_checkbox.tpl" field=$disable_cw}}
        {{include file="field_checkbox.tpl" field=$no_intelligent_shortening}}
        {{include file="field_checkbox.tpl" field=$ostatus_autofriend}}
diff --git a/view/templates/settings/twofactor/app_specific.tpl b/view/templates/settings/twofactor/app_specific.tpl
new file mode 100644 (file)
index 0000000..1f58267
--- /dev/null
@@ -0,0 +1,57 @@
+<div class="generic-page-wrapper">
+       <h1>{{$title}} <a href="help/Two-Factor-Authentication" title="{{$help_label}}" class="btn btn-default btn-sm"><i aria-hidden="true" class="fa fa-question fa-2x"></i></a></h1>
+       <div>{{$message nofilter}}</div>
+
+{{if $generated_app_specific_password}}
+       <div class="panel panel-success">
+               <div class="panel-heading">
+                       ✅ {{$generated_app_specific_password.plaintext_password}}
+               </div>
+               <div class="panel-body">
+            {{$generated_message}}
+               </div>
+       </div>
+{{/if}}
+
+       <form action="settings/2fa/app_specific?t={{$password_security_token}}" method="post">
+               <input type="hidden" name="form_security_token" value="{{$form_security_token}}">
+               <table class="app-specific-passwords table table-hover table-condensed table-striped">
+                       <thead>
+                               <tr>
+                                       <th>{{$description_label}}</th>
+                                       <th>{{$last_used_label}}</th>
+                                       <th><button type="submit" name="action" class="btn btn-primary btn-small" value="revoke_all">{{$revoke_all_label}}</button></th>
+                               </tr>
+                       </thead>
+                       <tbody>
+{{foreach $app_specific_passwords as $app_specific_password}}
+                               <tr{{if $generated_app_specific_password && $app_specific_password.id == $generated_app_specific_password.id}} class="success"{{/if}}>
+                                       <td>
+                               {{$app_specific_password.description}}
+                                       </td>
+                                       <td>
+                                               <span class="time" title="{{$app_specific_password.last_used}}" data-toggle="tooltip">
+                                                       <time datetime="{{$app_specific_password.last_used}}">{{$app_specific_password.ago}}</time>
+                                               </span>
+                                       </td>
+                                       <td>
+                                               <button type="submit" name="revoke_id" class="btn btn-default btn-small" value="{{$app_specific_password.id}}">{{$revoke_label}}</button>
+                                       </td>
+                               </tr>
+{{/foreach}}
+                       </tbody>
+               </table>
+       </form>
+       <form action="settings/2fa/app_specific?t={{$password_security_token}}" method="post">
+               <input type="hidden" name="form_security_token" value="{{$form_security_token}}">
+               <h3>{{$generate_title}}</h3>
+               <p>{{$generate_message}}</p>
+               <div class="form-group">
+                       <label for="app-specific-password-description">{{$description_label}}</label>
+                       <input type="text" maxlength="255" name="description" id="app-specific-password-description" class="form-control" placeholder="{{$description_placeholder_label}}" required/>
+               </div>
+               <p>
+                       <button type="submit" name="action" class="btn btn-large btn-primary" value="generate">{{$generate_label}}</button>
+               </p>
+       </form>
+</div>
index 57bcab19eae90e11d2e084a18efaff953255f916..6cf3fac11976e9a84110fddab33b580623b04240 100644 (file)
 
                {{include file="field_password.tpl" field=$password}}
 
-               <div class="form-group settings-submit-wrapper" >
 {{if !$has_secret}}
-                       <button type="submit" name="action" id="confirm-submit-button" class="btn btn-primary confirm-button" value="enable">{{$enable_label}}</button>
+               <p><button type="submit" name="action" id="confirm-submit-button" class="btn btn-primary confirm-button" value="enable">{{$enable_label}}</button></p>
 {{else}}
-                       <button type="submit" name="action" id="confirm-submit-button" class="btn btn-primary confirm-button" value="disable">{{$disable_label}}</button>
+               <p><button type="submit" name="action" id="confirm-submit-button" class="btn btn-primary confirm-button" value="disable">{{$disable_label}}</button></p>
 {{/if}}
 {{if $has_secret && $verified}}
-                       <button type="submit" name="action" id="confirm-submit-button" class="btn btn-primary confirm-button" value="recovery">{{$recovery_codes_label}}</button>
+               <p><button type="submit" name="action" id="confirm-submit-button" class="btn btn-primary confirm-button" value="recovery">{{$recovery_codes_label}}</button></p>
+               <p><button type="submit" name="action" id="confirm-submit-button" class="btn btn-primary confirm-button" value="app_specific">{{$app_specific_passwords_label}}</button></p>
 {{/if}}
 {{if $has_secret && !$verified}}
-                       <button type="submit" name="action" id="confirm-submit-button" class="btn btn-primary confirm-button" value="configure">{{$configure_label}}</button>
+               <p><button type="submit" name="action" id="confirm-submit-button" class="btn btn-primary confirm-button" value="configure">{{$configure_label}}</button></p>
 {{/if}}
-               </div>
        </form>
 </div>
index d75d6291a3486b24b244361c745edd88c1337d21..2b1fe31421f2785ba5ee47634ca8d8bcc54926bf 100644 (file)
@@ -2,6 +2,17 @@
        <h1>{{$title}}</h1>
        <div>{{$message nofilter}}</div>
 
+{{if $errors}}
+       <div class="panel panel-danger">
+               <div class="panel-heading">{{$errors_label}}</div>
+               <ul class="list-group">
+       {{foreach $errors as $error}}
+                       <li class="list-group-item">{{$error}}</li>
+       {{/foreach}}
+               </ul>
+       </div>
+{{/if}}
+
        <form action="" method="post">
                <input type="hidden" name="form_security_token" value="{{$form_security_token}}">
 
diff --git a/view/templates/widget/trending_tags.tpl b/view/templates/widget/trending_tags.tpl
new file mode 100644 (file)
index 0000000..a2788af
--- /dev/null
@@ -0,0 +1,18 @@
+<div id="trending-tags-sidebar" class="widget">
+       <h3>{{$title}}</h3>
+       <ul>
+{{section name=ol loop=$tags max=10}}
+               <li><a href="search?tag={{$tags[ol].term}}">#{{$tags[ol].term}}</a></li>
+{{/section}}
+       </ul>
+{{if $tags|count > 10}}
+       <details>
+               <summary>{{$more}}</summary>
+               <ul>
+       {{section name=ul loop=$tags start=10}}
+                       <li><a href="search?tag={{$tags[ul].term}}">#{{$tags[ul].term}}</a></li>
+       {{/section}}
+               </ul>
+       </details>
+{{/if}}
+</div>
index bfa5f093884d5cce04866eee21c2abc4bfb9c242..cd14b253c5efe3641ee3e1eedb758ce02a7a9fc3 100644 (file)
@@ -10,7 +10,6 @@
                                <input type="hidden" name="parent" value="{{$parent}}" />
                                {{*<!--<input type="hidden" name="return" value="{{$return_path}}" />-->*}}
                                <input type="hidden" name="jsreload" value="{{$jsreload}}" />
-                               <input type="hidden" name="preview" id="comment-preview-inp-{{$id}}" value="0" />
                                <input type="hidden" name="post_id_random" value="{{$rand_num}}" />
 
                                <div class="comment-edit-photo" id="comment-edit-photo-{{$id}}">
index e5c2e5b9ad25f23e149ab31b8f175dec40750173..197d1281d35ff572972910bafb542d7049fdc548 100644 (file)
@@ -6,7 +6,6 @@
                                <input type="hidden" name="parent" value="{{$parent}}" />
                                <input type="hidden" name="return" value="{{$return_path}}" />
                                <input type="hidden" name="jsreload" value="{{$jsreload}}" />
-                               <input type="hidden" name="preview" id="comment-preview-inp-{{$id}}" value="0" />
 
                                <div class="comment-edit-photo" id="comment-edit-photo-{{$id}}">
                                        <a class="comment-edit-photo-link" href="{{$mylink}}" title="{{$mytitle}}"><img class="my-comment-photo" src="{{$myphoto}}" alt="{{$mytitle}}" title="{{$mytitle}}" /></a>
index d1591273fbe65aef313c8cdf9ae76b1f72cfb6c1..df0f65a6b873e8cd4b301beea015c1e7d5d48333 100644 (file)
@@ -16,15 +16,16 @@ function theme_post(App $a)
        }
 
        if (isset($_POST['frio-settings-submit'])) {
-               PConfig::set(local_user(), 'frio', 'scheme',           defaults($_POST, 'frio_scheme', ''));
-               PConfig::set(local_user(), 'frio', 'nav_bg',           defaults($_POST, 'frio_nav_bg', ''));
-               PConfig::set(local_user(), 'frio', 'nav_icon_color',   defaults($_POST, 'frio_nav_icon_color', ''));
-               PConfig::set(local_user(), 'frio', 'link_color',       defaults($_POST, 'frio_link_color', ''));
-               PConfig::set(local_user(), 'frio', 'background_color', defaults($_POST, 'frio_background_color', ''));
-               PConfig::set(local_user(), 'frio', 'contentbg_transp', defaults($_POST, 'frio_contentbg_transp', ''));
-               PConfig::set(local_user(), 'frio', 'background_image', defaults($_POST, 'frio_background_image', ''));
-               PConfig::set(local_user(), 'frio', 'bg_image_option',  defaults($_POST, 'frio_bg_image_option', ''));
+               PConfig::set(local_user(), 'frio', 'scheme',           $_POST['frio_scheme']           ?? '');
+               PConfig::set(local_user(), 'frio', 'nav_bg',           $_POST['frio_nav_bg']           ?? '');
+               PConfig::set(local_user(), 'frio', 'nav_icon_color',   $_POST['frio_nav_icon_color']   ?? '');
+               PConfig::set(local_user(), 'frio', 'link_color',       $_POST['frio_link_color']       ?? '');
+               PConfig::set(local_user(), 'frio', 'background_color', $_POST['frio_background_color'] ?? '');
+               PConfig::set(local_user(), 'frio', 'contentbg_transp', $_POST['frio_contentbg_transp'] ?? '');
+               PConfig::set(local_user(), 'frio', 'background_image', $_POST['frio_background_image'] ?? '');
+               PConfig::set(local_user(), 'frio', 'bg_image_option',  $_POST['frio_bg_image_option']  ?? '');
                PConfig::set(local_user(), 'frio', 'css_modified',     time());
+               PConfig::set(local_user(), 'frio', 'enable_compose',   $_POST['frio_enable_compose']   ?? 0);
        }
 }
 
@@ -35,17 +36,18 @@ function theme_admin_post(App $a)
        }
 
        if (isset($_POST['frio-settings-submit'])) {
-               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', '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', 'css_modified',     time());
+               Config::set('frio', 'enable_compose',   $_POST['frio_enable_compose']   ?? 0);
        }
 }
 
@@ -56,15 +58,18 @@ function theme_content(App $a)
        }
        $arr = [];
 
-       $arr['scheme']           = PConfig::get(local_user(), 'frio', 'scheme', PConfig::get(local_user(), 'frio', 'schema'));
+       $node_scheme = Config::get('frio', 'scheme', Config::get('frio', 'scheme'));
+
+       $arr['scheme']           = PConfig::get(local_user(), 'frio', 'scheme', PConfig::get(local_user(), 'frio', 'schema', $node_scheme));
        $arr['share_string']     = '';
-       $arr['nav_bg']           = PConfig::get(local_user(), 'frio', 'nav_bg');
-       $arr['nav_icon_color']   = PConfig::get(local_user(), 'frio', 'nav_icon_color');
-       $arr['link_color']       = PConfig::get(local_user(), 'frio', 'link_color');
-       $arr['background_color'] = PConfig::get(local_user(), 'frio', 'background_color');
-       $arr['contentbg_transp'] = PConfig::get(local_user(), 'frio', 'contentbg_transp');
-       $arr['background_image'] = PConfig::get(local_user(), 'frio', 'background_image');
-       $arr['bg_image_option']  = PConfig::get(local_user(), 'frio', 'bg_image_option');
+       $arr['nav_bg']           = PConfig::get(local_user(), 'frio', 'nav_bg'          , Config::get('frio', 'nav_bg'));
+       $arr['nav_icon_color']   = PConfig::get(local_user(), 'frio', 'nav_icon_color'  , Config::get('frio', 'nav_icon_color'));
+       $arr['link_color']       = PConfig::get(local_user(), 'frio', 'link_color'      , Config::get('frio', 'link_color'));
+       $arr['background_color'] = PConfig::get(local_user(), 'frio', 'background_color', Config::get('frio', 'background_color'));
+       $arr['contentbg_transp'] = PConfig::get(local_user(), 'frio', 'contentbg_transp', Config::get('frio', 'contentbg_transp'));
+       $arr['background_image'] = PConfig::get(local_user(), 'frio', 'background_image', Config::get('frio', 'background_image'));
+       $arr['bg_image_option']  = PConfig::get(local_user(), 'frio', 'bg_image_option' , Config::get('frio', 'bg_image_option'));
+       $arr['enable_compose']   = PConfig::get(local_user(), 'frio', 'enable_compose'  , Config::get('frio', 'enable_compose'));
 
        return frio_form($arr);
 }
@@ -76,7 +81,7 @@ function theme_admin(App $a)
        }
        $arr = [];
 
-       $arr['scheme']           = Config::get('frio', 'scheme', Config::get('frio', 'scheme'));
+       $arr['scheme']           = Config::get('frio', 'scheme', Config::get('frio', 'schema'));
        $arr['share_string']     = '';
        $arr['nav_bg']           = Config::get('frio', 'nav_bg');
        $arr['nav_icon_color']   = Config::get('frio', 'nav_icon_color');
@@ -87,6 +92,7 @@ function theme_admin(App $a)
        $arr['bg_image_option']  = Config::get('frio', 'bg_image_option');
        $arr['login_bg_image']   = Config::get('frio', 'login_bg_image');
        $arr['login_bg_color']   = Config::get('frio', 'login_bg_color');
+       $arr['enable_compose']   = Config::get('frio', 'enable_compose');
 
        return frio_form($arr);
 }
@@ -130,6 +136,7 @@ function frio_form($arr)
                '$background_image' => array_key_exists('background_image', $disable) ? '' : ['frio_background_image', L10n::t('Set the background image'), $arr['background_image'], $background_image_help, false],
                '$bg_image_options_title' => L10n::t('Background image style'),
                '$bg_image_options' => Image::get_options($arr),
+               '$enable_compose'   => ['frio_enable_compose', L10n::t('Enable Compose page'), $arr['enable_compose'], L10n::t('This replaces the jot modal window for writing new posts with a link to <a href="compose">the new Compose page</a>.')],
        ];
 
        if (array_key_exists('login_bg_image', $arr) && !array_key_exists('login_bg_image', $disable)) {
index 2a5706c85968c5098919904e444232b468510d2e..c986b7232c9d3847ebe677ab16a83e9324d41629 100644 (file)
@@ -192,7 +192,6 @@ blockquote {
     background-image: none;
     text-shadow: none;
     border-radius: 3px;
-    outline: 0!important;
     margin-bottom: 0;
     font-size: 14px;
     font-weight: 600;
@@ -1314,7 +1313,8 @@ section ul.tabs {
 section #jotOpen {
     display: none;
 }
-#jotOpen {
+#jotOpen,
+#composeOpen {
     margin-top: 3px;
     float: right;
 }
@@ -1372,7 +1372,8 @@ section #jotOpen {
 #jot-text-wrap .preview textarea {
     width: 100%;
 }
-#preview_profile-jot-text {
+#preview_profile-jot-text,
+.comment-edit-form .preview {
     position: relative;
     padding: 0px 10px;
     margin-top: -2px;
@@ -1383,7 +1384,8 @@ section #jotOpen {
     background: #fff;
     color: #555;
 }
-textarea#profile-jot-text:focus + #preview_profile-jot-text {
+textarea#profile-jot-text:focus + #preview_profile-jot-text,
+textarea.comment-edit-text:focus + .comment-edit-form .preview {
     border: 2px solid #6fdbe8;
     border-top: none;
 }
@@ -1621,8 +1623,6 @@ textarea#profile-jot-text:focus + #preview_profile-jot-text {
     padding: 15px;
 }
 .panel .panel-body {
-    padding: 15px;
-    font-size: 14px;
     word-wrap: break-word;
 }
 .panel .panel-body .wall-item-content {
@@ -1668,13 +1668,19 @@ aside .panel-body {
 
 /* wall items */
 .wall-item-container {
-    background-color: rgba(0, 0, 0, 0.03);
-    padding: 0.5em;
     border-top: 1px solid rgba(255, 255, 255, 0.8);
 }
 
+.wall-item-container.panel-body {
+    padding: 0;
+    border-top: none;
+    overflow: hidden;
+}
+
 .wall-item-container .media {
     margin-top: 0;
+    padding: 10px;
+    background-color: rgba(0, 0, 0, 0.03);
 }
 
 /* wall items contact photo */
@@ -1738,8 +1744,8 @@ aside .panel-body {
     top: 10px;
 }
 .comment .nav-pills.preferences {
-    right: 0px;
-    top: 0px;
+    right: 5px;
+    top: 5px;
 }
 .wall-item-network {
     font-size: 13px;
@@ -1897,7 +1903,7 @@ code > .hl-main {
 }
 .wall-item-tags,
 .itemedited {
-    margin-top: 10px;
+    margin: 10px 0;
     font-size: 13px;
 }
 
@@ -1920,7 +1926,7 @@ code > .hl-main {
 /* item social action buttons */
 .wall-item-actions {
     display: flex;
-    margin: .5em 0;
+    margin: 0;
     justify-content: space-between;
 }
 .wall-item-actions a, .wall-item-actions button {
@@ -1961,6 +1967,10 @@ code > .hl-main {
     margin: 0 .3em;
 }
 
+.wall-item-responses > div > p {
+    margin: 0;
+}
+
 /* wall item hover effects */
 .wall-item-container .wall-item-links,
 .wall-item-container .wall-item-actions,
@@ -2008,7 +2018,6 @@ code > .hl-main {
     margin-bottom: 0;
 }
 .comment-container {
-    margin-top: 10px;
     margin-bottom: 0px;
     border-top-left-radius: 3px;
     border-top-right-radius: 3px;
@@ -2125,7 +2134,6 @@ img.acpopup-img {
 .wall-item-container.thread_level_6,
 .wall-item-container.thread_level_7 {
     margin-left: 15px;
-    margin-right: -0.5em;
 }
 /* Menubar Tabs */
 section > .tabbar-wrapper {
@@ -3419,7 +3427,6 @@ section .profile-match-wrapper {
     background-image: none;
     text-shadow: none;
     border-radius: 3px;
-    outline: 0!important;
     margin-bottom: 0;
     font-size: 14px;
     font-weight: 600;
@@ -3438,7 +3445,6 @@ section .profile-match-wrapper {
     background-image: none;
     text-shadow: none;
     border-radius: 3px;
-    outline: 0!important;
     margin-bottom: 0;
     font-size: 14px;
     font-weight: 600;
@@ -3531,6 +3537,10 @@ section .profile-match-wrapper {
                padding: 10px;
        }
 
+    .toplevel_item > .wall-item-container {
+        padding: 0;
+    }
+
        .wall-spacer {
                height: 0px;
        }
diff --git a/view/theme/frio/frameworks/friendica-tagsinput/LICENSE b/view/theme/frio/frameworks/friendica-tagsinput/LICENSE
new file mode 100644 (file)
index 0000000..58bc985
--- /dev/null
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2013 Tim Schlechter
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/view/theme/frio/frameworks/friendica-tagsinput/friendica-tagsinput-typeahead.css b/view/theme/frio/frameworks/friendica-tagsinput/friendica-tagsinput-typeahead.css
new file mode 100644 (file)
index 0000000..8cec654
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * friendica-tagsinput v0.8.0
+ * 
+ */
+
+.twitter-typeahead .tt-query,
+.twitter-typeahead .tt-hint {
+    margin-bottom: 0;
+}
+
+.twitter-typeahead .tt-hint
+{
+    display: none;
+}
+
+.tt-menu {
+    position: absolute;
+    top: 100%;
+    left: 0;
+    z-index: 1000;
+    display: none;
+    float: left;
+    min-width: 160px;
+    padding: 5px 0;
+    margin: 2px 0 0;
+    list-style: none;
+    font-size: 14px;
+    background-color: #ffffff;
+    border: 1px solid #cccccc;
+    border: 1px solid rgba(0, 0, 0, 0.15);
+    border-radius: 4px;
+    -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+    box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+    background-clip: padding-box;
+    cursor: pointer;
+}
+
+.tt-suggestion {
+    display: block;
+    padding: 3px 20px;
+    clear: both;
+    font-weight: normal;
+    line-height: 1.428571429;
+    color: #333333;
+    white-space: nowrap;
+}
+
+.tt-suggestion:hover,
+.tt-suggestion:focus {
+    color: #ffffff;
+    text-decoration: none;
+    outline: 0;
+    background-color: #428bca;
+}
diff --git a/view/theme/frio/frameworks/friendica-tagsinput/friendica-tagsinput.css b/view/theme/frio/frameworks/friendica-tagsinput/friendica-tagsinput.css
new file mode 100644 (file)
index 0000000..f2e1197
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * friendica-tagsinput v0.8.0
+ * 
+ */
+
+.friendica-tagsinput {
+  background-color: #fff;
+  border: 1px solid #ccc;
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  display: inline-block;
+  padding: 4px 6px;
+  color: #555;
+  vertical-align: middle;
+  border-radius: 4px;
+  max-width: 100%;
+  line-height: 22px;
+  cursor: text;
+  height: auto;
+}
+.friendica-tagsinput.input-lg {
+  line-height: 27px;
+}
+.friendica-tagsinput input {
+  border: none;
+  box-shadow: none;
+  outline: none;
+  background-color: transparent;
+  padding: 0 6px;
+  margin: 0;
+  width: auto;
+  max-width: inherit;
+}
+.friendica-tagsinput.form-control input::-moz-placeholder {
+  color: #777;
+  opacity: 1;
+}
+.friendica-tagsinput.form-control input:-ms-input-placeholder {
+  color: #777;
+}
+.friendica-tagsinput.form-control input::-webkit-input-placeholder {
+  color: #777;
+}
+.friendica-tagsinput input:focus {
+  border: none;
+  box-shadow: none;
+}
+.friendica-tagsinput .tag {
+  margin: 0 2px 2px 0;
+  color: white;
+  font-weight: normal;
+}
+.friendica-tagsinput .tag img {
+  width: auto;
+  height: 1.5em;
+  vertical-align: text-top;
+  margin-right: 8px;
+}
+.friendica-tagsinput .tag [data-role="remove"] {
+  margin-left: 8px;
+  cursor: pointer;
+}
+.friendica-tagsinput .tag [data-role="remove"]:after {
+  content: "x";
+  padding: 0px 2px;
+  font-weight: bold;
+}
+.friendica-tagsinput .tag [data-role="remove"]:hover {
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+.friendica-tagsinput .tag [data-role="remove"]:hover:active {
+  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
diff --git a/view/theme/frio/frameworks/friendica-tagsinput/friendica-tagsinput.js b/view/theme/frio/frameworks/friendica-tagsinput/friendica-tagsinput.js
new file mode 100644 (file)
index 0000000..2e83eed
--- /dev/null
@@ -0,0 +1,695 @@
+/*
+ * friendica-tagsinput v0.8.0
+ * Based on bootstrap-tagsinput v0.8.0
+ *
+ * Adds:
+ * - optional thumbnail
+ * - copying source input element class to the pseudo-input element
+ *
+ */
+
+(function ($) {
+  "use strict";
+
+  var defaultOptions = {
+    tagClass: function(item) {
+      return 'label label-info';
+    },
+    focusClass: 'focus',
+    itemValue: function(item) {
+      return item ? item.toString() : item;
+    },
+    itemText: function(item) {
+      return this.itemValue(item);
+    },
+    itemTitle: function(item) {
+      return null;
+    },
+    itemThumb: function(item) {
+      return null;
+    },
+    freeInput: true,
+    addOnBlur: true,
+    maxTags: undefined,
+    maxChars: undefined,
+    confirmKeys: [13, 44],
+    delimiter: ',',
+    delimiterRegex: null,
+    cancelConfirmKeysOnEmpty: false,
+    onTagExists: function(item, $tag) {
+      $tag.hide().fadeIn();
+    },
+    trimValue: false,
+    allowDuplicates: false,
+    triggerChange: true
+  };
+
+  /**
+   * Constructor function
+   */
+  function TagsInput(element, options) {
+    this.isInit = true;
+    this.itemsArray = [];
+
+    this.$element = $(element);
+    this.$element.hide();
+
+    this.isSelect = (element.tagName === 'SELECT');
+    this.multiple = (this.isSelect && element.hasAttribute('multiple'));
+    this.objectItems = options && options.itemValue;
+    this.placeholderText = element.hasAttribute('placeholder') ? this.$element.attr('placeholder') : '';
+    this.inputSize = Math.max(1, this.placeholderText.length);
+
+    this.$container = $('<div class="friendica-tagsinput"></div>');
+    this.$container.addClass(this.$element.attr('class'));
+    this.$input = $('<input type="text" placeholder="' + this.placeholderText + '"/>').appendTo(this.$container);
+
+    this.$element.before(this.$container);
+
+    this.build(options);
+    this.isInit = false;
+  }
+
+  TagsInput.prototype = {
+    constructor: TagsInput,
+
+    /**
+     * Adds the given item as a new tag. Pass true to dontPushVal to prevent
+     * updating the elements val()
+     */
+    add: function(item, dontPushVal, options) {
+      let self = this;
+
+      if (self.options.maxTags && self.itemsArray.length >= self.options.maxTags)
+        return;
+
+      // Ignore falsey values, except false
+      if (item !== false && !item)
+        return;
+
+      // Trim value
+      if (typeof item === "string" && self.options.trimValue) {
+        item = $.trim(item);
+      }
+
+      // Throw an error when trying to add an object while the itemValue option was not set
+      if (typeof item === "object" && !self.objectItems)
+        throw("Can't add objects when itemValue option is not set");
+
+      // Ignore strings only containg whitespace
+      if (item.toString().match(/^\s*$/))
+        return;
+
+      // If SELECT but not multiple, remove current tag
+      if (self.isSelect && !self.multiple && self.itemsArray.length > 0)
+        self.remove(self.itemsArray[0]);
+
+      if (typeof item === "string" && this.$element[0].tagName === 'INPUT') {
+        var delimiter = (self.options.delimiterRegex) ? self.options.delimiterRegex : self.options.delimiter;
+        var items = item.split(delimiter);
+        if (items.length > 1) {
+          for (var i = 0; i < items.length; i++) {
+            this.add(items[i], true);
+          }
+
+          if (!dontPushVal)
+            self.pushVal(self.options.triggerChange);
+          return;
+        }
+      }
+
+      var itemValue = self.options.itemValue(item),
+          itemText = self.options.itemText(item),
+          tagClass = self.options.tagClass(item),
+          itemTitle = self.options.itemTitle(item),
+          itemThumb = self.options.itemThumb(item);
+
+      // Ignore items allready added
+      var existing = $.grep(self.itemsArray, function(item) { return self.options.itemValue(item) === itemValue; } )[0];
+      if (existing && !self.options.allowDuplicates) {
+        // Invoke onTagExists
+        if (self.options.onTagExists) {
+          var $existingTag = $(".tag", self.$container).filter(function() { return $(this).data("item") === existing; });
+          self.options.onTagExists(item, $existingTag);
+        }
+        return;
+      }
+
+      // if length greater than limit
+      if (self.items().toString().length + item.length + 1 > self.options.maxInputLength)
+        return;
+
+      // raise beforeItemAdd arg
+      var beforeItemAddEvent = $.Event('beforeItemAdd', { item: item, cancel: false, options: options});
+      self.$element.trigger(beforeItemAddEvent);
+      if (beforeItemAddEvent.cancel)
+        return;
+
+      // register item in internal array and map
+      self.itemsArray.push(item);
+
+      // add a tag element
+      var $tag = $('<span class="tag ' + htmlEncode(tagClass) + (itemTitle !== null ? ('" title="' + itemTitle) : '') + '">' +
+          (itemThumb !== null ? '<img src="' + itemThumb + '" alt="">' : '') +
+          htmlEncode(itemText) + '<span data-role="remove"></span>' +
+          '</span>');
+      $tag.data('item', item);
+      self.findInputWrapper().before($tag);
+      $tag.after(' ');
+
+      // Check to see if the tag exists in its raw or uri-encoded form
+      var optionExists = (
+          $('option[value="' + encodeURIComponent(itemValue) + '"]', self.$element).length ||
+          $('option[value="' + htmlEncode(itemValue) + '"]', self.$element).length
+      );
+
+      // add <option /> if item represents a value not present in one of the <select />'s options
+      if (self.isSelect && !optionExists) {
+        var $option = $('<option selected>' + htmlEncode(itemText) + '</option>');
+        $option.data('item', item);
+        $option.attr('value', itemValue);
+        self.$element.append($option);
+      }
+
+      if (!dontPushVal)
+        self.pushVal(self.options.triggerChange);
+
+      // Add class when reached maxTags
+      if (self.options.maxTags === self.itemsArray.length || self.items().toString().length === self.options.maxInputLength)
+        self.$container.addClass('friendica-tagsinput-max');
+
+      // If using typeahead, once the tag has been added, clear the typeahead value so it does not stick around in the input.
+      if ($('.typeahead, .twitter-typeahead', self.$container).length) {
+        self.$input.typeahead('val', '');
+      }
+
+      if (this.isInit) {
+        self.$element.trigger($.Event('itemAddedOnInit', { item: item, options: options }));
+      } else {
+        self.$element.trigger($.Event('itemAdded', { item: item, options: options }));
+      }
+    },
+
+    /**
+     * Removes the given item. Pass true to dontPushVal to prevent updating the
+     * elements val()
+     */
+    remove: function(item, dontPushVal, options) {
+      var self = this;
+
+      if (self.objectItems) {
+        if (typeof item === "object")
+          item = $.grep(self.itemsArray, function(other) { return self.options.itemValue(other) ==  self.options.itemValue(item); } );
+        else
+          item = $.grep(self.itemsArray, function(other) { return self.options.itemValue(other) ==  item; } );
+
+        item = item[item.length-1];
+      }
+
+      if (item) {
+        var beforeItemRemoveEvent = $.Event('beforeItemRemove', { item: item, cancel: false, options: options });
+        self.$element.trigger(beforeItemRemoveEvent);
+        if (beforeItemRemoveEvent.cancel)
+          return;
+
+        $('.tag', self.$container).filter(function() { return $(this).data('item') === item; }).remove();
+        $('option', self.$element).filter(function() { return $(this).data('item') === item; }).remove();
+        if($.inArray(item, self.itemsArray) !== -1)
+          self.itemsArray.splice($.inArray(item, self.itemsArray), 1);
+      }
+
+      if (!dontPushVal)
+        self.pushVal(self.options.triggerChange);
+
+      // Remove class when reached maxTags
+      if (self.options.maxTags > self.itemsArray.length)
+        self.$container.removeClass('friendica-tagsinput-max');
+
+      self.$element.trigger($.Event('itemRemoved',  { item: item, options: options }));
+    },
+
+    /**
+     * Removes all items
+     */
+    removeAll: function() {
+      var self = this;
+
+      $('.tag', self.$container).remove();
+      $('option', self.$element).remove();
+
+      while(self.itemsArray.length > 0)
+        self.itemsArray.pop();
+
+      self.pushVal(self.options.triggerChange);
+    },
+
+    /**
+     * Refreshes the tags so they match the text/value of their corresponding
+     * item.
+     */
+    refresh: function() {
+      var self = this;
+      $('.tag', self.$container).each(function() {
+        var $tag = $(this),
+            item = $tag.data('item'),
+            itemValue = self.options.itemValue(item),
+            itemText = self.options.itemText(item),
+            tagClass = self.options.tagClass(item);
+
+          // Update tag's class and inner text
+          $tag.attr('class', null);
+          $tag.addClass('tag ' + htmlEncode(tagClass));
+          $tag.contents().filter(function() {
+            return this.nodeType == 3;
+          })[0].nodeValue = htmlEncode(itemText);
+
+          if (self.isSelect) {
+            var option = $('option', self.$element).filter(function() { return $(this).data('item') === item; });
+            option.attr('value', itemValue);
+          }
+      });
+    },
+
+    /**
+     * Returns the items added as tags
+     */
+    items: function() {
+      return this.itemsArray;
+    },
+
+    /**
+     * Assembly value by retrieving the value of each item, and set it on the
+     * element.
+     */
+    pushVal: function() {
+      var self = this,
+          val = $.map(self.items(), function(item) {
+            return self.options.itemValue(item).toString();
+          });
+
+      self.$element.val(val, true);
+
+      if (self.options.triggerChange)
+        self.$element.trigger('change');
+    },
+
+    /**
+     * Initializes the tags input behaviour on the element
+     */
+    build: function(options) {
+      var self = this;
+
+      self.options = $.extend({}, defaultOptions, options);
+      // When itemValue is set, freeInput should always be false
+      if (self.objectItems)
+        self.options.freeInput = false;
+
+      makeOptionItemFunction(self.options, 'itemValue');
+      makeOptionItemFunction(self.options, 'itemText');
+      makeOptionItemFunction(self.options, 'itemThumb');
+      makeOptionFunction(self.options, 'tagClass');
+
+      // Typeahead Bootstrap version 2.3.2
+      if (self.options.typeahead) {
+        var typeahead = self.options.typeahead || {};
+
+        makeOptionFunction(typeahead, 'source');
+
+        self.$input.typeahead($.extend({}, typeahead, {
+          source: function (query, process) {
+            function processItems(items) {
+              var texts = [];
+
+              for (var i = 0; i < items.length; i++) {
+                var text = self.options.itemText(items[i]);
+                map[text] = items[i];
+                texts.push(text);
+              }
+              process(texts);
+            }
+
+            this.map = {};
+            var map = this.map,
+                data = typeahead.source(query);
+
+            if ($.isFunction(data.success)) {
+              // support for Angular callbacks
+              data.success(processItems);
+            } else if ($.isFunction(data.then)) {
+              // support for Angular promises
+              data.then(processItems);
+            } else {
+              // support for functions and jquery promises
+              $.when(data)
+                  .then(processItems);
+            }
+          },
+          updater: function (text) {
+            self.add(this.map[text]);
+            return this.map[text];
+          },
+          matcher: function (text) {
+            return (text.toLowerCase().indexOf(this.query.trim().toLowerCase()) !== -1);
+          },
+          sorter: function (texts) {
+            return texts.sort();
+          },
+          highlighter: function (text) {
+            var regex = new RegExp( '(' + this.query + ')', 'gi' );
+            return text.replace( regex, "<strong>$1</strong>" );
+          }
+        }));
+      }
+
+      // typeahead.js
+      if (self.options.typeaheadjs) {
+        var typeaheadConfig = null;
+        var typeaheadDatasets = {};
+
+        // Determine if main configurations were passed or simply a dataset
+        var typeaheadjs = self.options.typeaheadjs;
+        if ($.isArray(typeaheadjs)) {
+          typeaheadConfig = typeaheadjs[0];
+          typeaheadDatasets = typeaheadjs[1];
+        } else {
+          typeaheadDatasets = typeaheadjs;
+        }
+
+        self.$input.typeahead(typeaheadConfig, typeaheadDatasets).on('typeahead:selected', $.proxy(function (obj, datum) {
+          if (typeaheadDatasets.valueKey)
+            self.add(datum[typeaheadDatasets.valueKey]);
+          else
+            self.add(datum);
+          self.$input.typeahead('val', '');
+        }, self));
+      }
+
+      self.$container.on('click', $.proxy(function(event) {
+        if (! self.$element.attr('disabled')) {
+          self.$input.removeAttr('disabled');
+        }
+        self.$input.focus();
+      }, self));
+
+      if (self.options.addOnBlur && self.options.freeInput) {
+        self.$input.on('focusout', $.proxy(function(event) {
+          // HACK: only process on focusout when no typeahead opened, to
+          //       avoid adding the typeahead text as tag
+          if ($('.typeahead, .twitter-typeahead', self.$container).length === 0) {
+            self.add(self.$input.val());
+            self.$input.val('');
+          }
+        }, self));
+      }
+
+      // Toggle the 'focus' css class on the container when it has focus
+      self.$container.on({
+        focusin: function() {
+          self.$container.addClass(self.options.focusClass);
+        },
+        focusout: function() {
+          self.$container.removeClass(self.options.focusClass);
+        },
+      });
+
+      self.$container.on('keydown', 'input', $.proxy(function(event) {
+        var $input = $(event.target),
+            $inputWrapper = self.findInputWrapper();
+
+        if (self.$element.attr('disabled')) {
+          self.$input.attr('disabled', 'disabled');
+          return;
+        }
+
+        switch (event.which) {
+            // BACKSPACE
+          case 8:
+            if (doGetCaretPosition($input[0]) === 0) {
+              var prev = $inputWrapper.prev();
+              if (prev.length) {
+                self.remove(prev.data('item'));
+              }
+            }
+            break;
+
+            // DELETE
+          case 46:
+            if (doGetCaretPosition($input[0]) === 0) {
+              var next = $inputWrapper.next();
+              if (next.length) {
+                self.remove(next.data('item'));
+              }
+            }
+            break;
+
+            // LEFT ARROW
+          case 37:
+            // Try to move the input before the previous tag
+            var $prevTag = $inputWrapper.prev();
+            if ($input.val().length === 0 && $prevTag[0]) {
+              $prevTag.before($inputWrapper);
+              $input.focus();
+            }
+            break;
+            // RIGHT ARROW
+          case 39:
+            // Try to move the input after the next tag
+            var $nextTag = $inputWrapper.next();
+            if ($input.val().length === 0 && $nextTag[0]) {
+              $nextTag.after($inputWrapper);
+              $input.focus();
+            }
+            break;
+          default:
+            // ignore
+        }
+
+        // Reset internal input's size
+        var textLength = $input.val().length,
+            wordSpace = Math.ceil(textLength / 5),
+            size = textLength + wordSpace + 1;
+        $input.attr('size', Math.max(this.inputSize, $input.val().length));
+      }, self));
+
+      self.$container.on('keypress', 'input', $.proxy(function(event) {
+        var $input = $(event.target);
+
+        if (self.$element.attr('disabled')) {
+          self.$input.attr('disabled', 'disabled');
+          return;
+        }
+
+        var text = $input.val(),
+            maxLengthReached = self.options.maxChars && text.length >= self.options.maxChars;
+        if (self.options.freeInput && (keyCombinationInList(event, self.options.confirmKeys) || maxLengthReached)) {
+          // Only attempt to add a tag if there is data in the field
+          if (text.length !== 0) {
+            self.add(maxLengthReached ? text.substr(0, self.options.maxChars) : text);
+            $input.val('');
+          }
+
+          // If the field is empty, let the event triggered fire as usual
+          if (self.options.cancelConfirmKeysOnEmpty === false) {
+            event.preventDefault();
+          }
+        }
+
+        // Reset internal input's size
+        var textLength = $input.val().length,
+            wordSpace = Math.ceil(textLength / 5),
+            size = textLength + wordSpace + 1;
+        $input.attr('size', Math.max(this.inputSize, $input.val().length));
+      }, self));
+
+      // Remove icon clicked
+      self.$container.on('click', '[data-role=remove]', $.proxy(function(event) {
+        if (self.$element.attr('disabled')) {
+          return;
+        }
+        self.remove($(event.target).closest('.tag').data('item'));
+      }, self));
+
+      // Only add existing value as tags when using strings as tags
+      if (self.options.itemValue === defaultOptions.itemValue) {
+        if (self.$element[0].tagName === 'INPUT') {
+          self.add(self.$element.val());
+        } else {
+          $('option', self.$element).each(function() {
+            self.add($(this).attr('value'), true);
+          });
+        }
+      }
+    },
+
+    /**
+     * Removes all tagsinput behaviour and unregsiter all event handlers
+     */
+    destroy: function() {
+      var self = this;
+
+      // Unbind events
+      self.$container.off('keypress', 'input');
+      self.$container.off('click', '[role=remove]');
+
+      self.$container.remove();
+      self.$element.removeData('tagsinput');
+      self.$element.show();
+    },
+
+    /**
+     * Sets focus on the tagsinput
+     */
+    focus: function() {
+      this.$input.focus();
+    },
+
+    /**
+     * Returns the internal input element
+     */
+    input: function() {
+      return this.$input;
+    },
+
+    /**
+     * Returns the element which is wrapped around the internal input. This
+     * is normally the $container, but typeahead.js moves the $input element.
+     */
+    findInputWrapper: function() {
+      var elt = this.$input[0],
+          container = this.$container[0];
+      while(elt && elt.parentNode !== container)
+        elt = elt.parentNode;
+
+      return $(elt);
+    }
+  };
+
+  /**
+   * Register JQuery plugin
+   */
+  $.fn.tagsinput = function(arg1, arg2, arg3) {
+    var results = [];
+
+    this.each(function() {
+      var tagsinput = $(this).data('tagsinput');
+      // Initialize a new tags input
+      if (!tagsinput) {
+          tagsinput = new TagsInput(this, arg1);
+          $(this).data('tagsinput', tagsinput);
+          results.push(tagsinput);
+
+          if (this.tagName === 'SELECT') {
+              $('option', $(this)).attr('selected', 'selected');
+          }
+
+          // Init tags from $(this).val()
+          $(this).val($(this).val());
+      } else if (!arg1 && !arg2) {
+          // tagsinput already exists
+          // no function, trying to init
+          results.push(tagsinput);
+      } else if(tagsinput[arg1] !== undefined) {
+          // Invoke function on existing tags input
+            if(tagsinput[arg1].length === 3 && arg3 !== undefined){
+               var retVal = tagsinput[arg1](arg2, null, arg3);
+            }else{
+               var retVal = tagsinput[arg1](arg2);
+            }
+          if (retVal !== undefined)
+              results.push(retVal);
+      }
+    });
+
+    if ( typeof arg1 == 'string') {
+      // Return the results from the invoked function calls
+      return results.length > 1 ? results : results[0];
+    } else {
+      return results;
+    }
+  };
+
+  $.fn.tagsinput.Constructor = TagsInput;
+
+  /**
+   * Most options support both a string or number as well as a function as
+   * option value. This function makes sure that the option with the given
+   * key in the given options is wrapped in a function
+   */
+  function makeOptionItemFunction(options, key) {
+    if (typeof options[key] !== 'function') {
+      var propertyName = options[key];
+      options[key] = function(item) { return item[propertyName]; };
+    }
+  }
+  function makeOptionFunction(options, key) {
+    if (typeof options[key] !== 'function') {
+      var value = options[key];
+      options[key] = function() { return value; };
+    }
+  }
+  /**
+   * HtmlEncodes the given value
+   */
+  var htmlEncodeContainer = $('<div />');
+  function htmlEncode(value) {
+    if (value) {
+      return htmlEncodeContainer.text(value).html();
+    } else {
+      return '';
+    }
+  }
+
+  /**
+   * Returns the position of the caret in the given input field
+   * http://flightschool.acylt.com/devnotes/caret-position-woes/
+   */
+  function doGetCaretPosition(oField) {
+    var iCaretPos = 0;
+    if (document.selection) {
+      oField.focus ();
+      var oSel = document.selection.createRange();
+      oSel.moveStart ('character', -oField.value.length);
+      iCaretPos = oSel.text.length;
+    } else if (oField.selectionStart || oField.selectionStart == '0') {
+      iCaretPos = oField.selectionStart;
+    }
+    return (iCaretPos);
+  }
+
+  /**
+    * Returns boolean indicates whether user has pressed an expected key combination.
+    * @param object keyPressEvent: JavaScript event object, refer
+    *     http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+    * @param object lookupList: expected key combinations, as in:
+    *     [13, {which: 188, shiftKey: true}]
+    */
+  function keyCombinationInList(keyPressEvent, lookupList) {
+      var found = false;
+      $.each(lookupList, function (index, keyCombination) {
+          if (typeof (keyCombination) === 'number' && keyPressEvent.which === keyCombination) {
+              found = true;
+              return false;
+          }
+
+          if (keyPressEvent.which === keyCombination.which) {
+              var alt = !keyCombination.hasOwnProperty('altKey') || keyPressEvent.altKey === keyCombination.altKey,
+                  shift = !keyCombination.hasOwnProperty('shiftKey') || keyPressEvent.shiftKey === keyCombination.shiftKey,
+                  ctrl = !keyCombination.hasOwnProperty('ctrlKey') || keyPressEvent.ctrlKey === keyCombination.ctrlKey;
+              if (alt && shift && ctrl) {
+                  found = true;
+                  return false;
+              }
+          }
+      });
+
+      return found;
+  }
+
+  /**
+   * Initialize tagsinput behaviour on inputs and selects which have
+   * data-role=tagsinput
+   */
+  $(function() {
+    $("input[data-role=tagsinput], select[multiple][data-role=tagsinput]").tagsinput();
+  });
+})(window.jQuery);
diff --git a/view/theme/frio/img/none.png b/view/theme/frio/img/none.png
new file mode 100644 (file)
index 0000000..c8375db
Binary files /dev/null and b/view/theme/frio/img/none.png differ
index 16d60b61d1014585c781a99a47f16a61b624f978..b43cf5ce4364ffef9fcdc6c18ba86f5346ff3737 100644 (file)
-/**\r
- * Filebrowser - Friendica Communications Server\r
- *\r
- * Copyright (c) 2010-2015 the Friendica Project\r
- *\r
- * This program is free software: you can redistribute it and/or modify\r
- * it under the terms of the GNU Affero General Public License as published by\r
- * the Free Software Foundation, either version 3 of the License, or\r
- * (at your option) any later version.\r
- *\r
- * This code handle user interaction for image/file upload/browser dialog.\r
- * Is loaded from filebrowser_plain.tpl\r
- *\r
- * To load filebrowser in colorbox, call\r
- *\r
- *      Dialog.doImageBrowser(eventname, id);\r
- *\r
- * or\r
- *\r
- *      Dialog.doFileBrowser(eventname, id);\r
- *\r
- * where:\r
- *\r
- *             eventname: event name to catch return value\r
- *             id: id returned to event handler\r
- *\r
- * When user select an item, an event in fired in parent page, on body element\r
- * The event is named\r
- *\r
- *             fbrowser.<type>.[<eventname>]\r
- *\r
- * <type> will be one of "image" or "file", and the event handler will\r
- * get the following params:\r
- *\r
- *             filemane: filename of item choosed by user\r
- *             embed: bbcode to embed element into posts\r
- *             id: id from caller code\r
- *\r
- * example:\r
- *\r
- *             // open dialog for select an image for a textarea with id "myeditor"\r
- *             var id="myeditor";\r
- *             Dialog.doImageBrowser("example", id);\r
- *\r
- *             // setup event handler to get user selection\r
- *             $("body").on("fbrowser.image.example", function(event, filename, bbcode, id) {\r
- *                     // close colorbox\r
- *                     $.colorbox.close();\r
- *                     // replace textxarea text with bbcode\r
- *                     $(id).value = bbcode;\r
- *             });\r
- **/\r
-\r
-\r
-/*\r
- * IMPORTANT\r
- *\r
- *  This is a modified version to work with\r
- *  the frio theme.and bootstrap modals\r
- *\r
- *  The origninal file is under:\r
- *  js/filebrowser.js\r
- *\r
- */\r
-\r
-\r
-var FileBrowser = {\r
-       nickname : "",\r
-       type : "",\r
-       event: "",\r
-       folder: "",\r
-       id : null,\r
-\r
-       init: function(nickname, type, hash) {\r
-               FileBrowser.nickname = nickname;\r
-               FileBrowser.type = type;\r
-               FileBrowser.event = "fbrowser."+type;\r
-\r
-               if (hash!=="") {\r
-                       var h = hash.replace("#","");\r
-                       var destination = h.split("-")[0];\r
-                       FileBrowser.id = h.split("-")[1];\r
-                       FileBrowser.event = FileBrowser.event + "." + destination;\r
-                       if (destination === "comment") {\r
-                               // Get the comment textimput field\r
-                               var commentElm = document.getElementById("comment-edit-text-" + FileBrowser.id);\r
-                       }\r
-               };\r
-\r
-               console.log("FileBrowser: " + nickname,  type, FileBrowser.event, FileBrowser.id);\r
-\r
-               FileBrowser.postLoad();\r
-\r
-               $(".error .close").on("click", function(e) {\r
-                       e.preventDefault();\r
-                       $(".error").addClass("hidden");\r
-               });\r
-\r
-               // Click on album link\r
-               $(".fbrowser").on("click", ".folders a, .path a", function(e) {\r
-                       e.preventDefault();\r
-                       var url = baseurl + "/fbrowser/" + FileBrowser.type + "/" + this.dataset.folder + "?mode=none&theme=frio";\r
-                       FileBrowser.folder = this.dataset.folder;\r
-\r
-                       FileBrowser.loadContent(url);\r
-               });\r
-\r
-               //Embed on click\r
-               $(".fbrowser").on('click', ".photo-album-photo-link", function(e) {\r
-                       e.preventDefault();\r
-\r
-                       var embed = "";\r
-                       if (FileBrowser.type === "image") {\r
-                               embed = "[url=" + this.dataset.link + "][img]" + this.dataset.img + "[/img][/url]";\r
-                       }\r
-                       if (FileBrowser.type === "file") {\r
-                               // attachment links are "baseurl/attach/id"; we need id\r
-                               embed = "[attachment]" + this.dataset.link.split("/").pop() + "[/attachment]";\r
-                       }\r
-\r
-                       // Delete prefilled Text of the comment input\r
-                       // Note: not the best solution but function commentOpenUI don't\r
-                       // work as expected (we need a way to wait until commentOpenUI would be finished).\r
-                       // As for now we insert pieces of this function here\r
-                       if ((commentElm !== null) && (typeof commentElm !== "undefined")) {\r
-                               if (commentElm.value === "") {\r
-                                       $("#comment-edit-text-" + FileBrowser.id).addClass("comment-edit-text-full").removeClass("comment-edit-text-empty");\r
-                                       $("#comment-edit-submit-wrapper-" + FileBrowser.id).show();\r
-                                       $("#comment-edit-text-" + FileBrowser.id).attr('tabindex','9');\r
-                                       $("#comment-edit-submit-" + FileBrowser.id).attr('tabindex','10');\r
-                               }\r
-\r
-                       }\r
-\r
-                       console.log(FileBrowser.event, this.dataset.filename, embed, FileBrowser.id);\r
-\r
-                       $("body").trigger(FileBrowser.event, [\r
-                               this.dataset.filename,\r
-                               embed,\r
-                               FileBrowser.id,\r
-                               this.dataset.img\r
-                       ]);\r
-\r
-                       // Close model\r
-                       $('#modal').modal('hide');\r
-                       // Update autosize for this textarea\r
-                       autosize.update($(".text-autosize"));\r
-               });\r
-\r
-               // EventListener for switching between image and file mode\r
-               $(".fbrowser").on('click', ".fbswitcher .btn", function(e) {\r
-                       e.preventDefault();\r
-                       FileBrowser.type = this.getAttribute("data-mode");\r
-                       $(".fbrowser").removeClass().addClass("fbrowser " + FileBrowser.type);\r
-                       url = baseurl + "/fbrowser/" + FileBrowser.type + "?mode=none&theme=frio";\r
-\r
-                       FileBrowser.loadContent(url);\r
-               });\r
-       },\r
-\r
-       // Initialize the AjaxUpload for the upload buttons\r
-       uploadButtons: function() {\r
-               if ($("#upload-image").length) {\r
-                       // To get the albumname we need to convert it from hex\r
-                       var albumname = hex2bin(FileBrowser.folder);\r
-                       //AjaxUpload for images\r
-                       var image_uploader = new window.AjaxUpload(\r
-                               'upload-image',\r
-                               {       action: 'wall_upload/' + FileBrowser.nickname + '?response=json&album=' + albumname,\r
-                                       name: 'userfile',\r
-                                       responseType: 'json',\r
-                                       onSubmit: function(file, ext) {\r
-                                               $(".fbrowser-content").hide();\r
-                                               $(".fbrowser .profile-rotator-wrapper").show();\r
-                                               $(".error").addClass('hidden');\r
-                                       },\r
-                                       onComplete: function(file,response) {\r
-                                               if (response['error'] != undefined) {\r
-                                                       $(".error span").html(response['error']);\r
-                                                       $(".error").removeClass('hidden');\r
-                                                       $(".fbrowser .profile-rotator-wrapper").hide();\r
-                                                       $(".fbrowser-content").show();\r
-                                                       return;\r
-                                               }\r
-\r
-                                               var url = baseurl + "/fbrowser/" + FileBrowser.type + "/" + FileBrowser.folder + "?mode=none&theme=frio";\r
-                                               // load new content to fbrowser window\r
-                                               FileBrowser.loadContent(url);\r
-                                       }\r
-                               }\r
-                       );\r
-               }\r
-\r
-               if ($("#upload-file").length) {\r
-                       //AjaxUpload for files\r
-                       var file_uploader = new window.AjaxUpload(\r
-                               'upload-file',\r
-                               {       action: 'wall_attach/' + FileBrowser.nickname + '?response=json',\r
-                                       name: 'userfile',\r
-                                       onSubmit: function(file, ext) {\r
-                                               $(".fbrowser-content").hide();\r
-                                               $(".fbrowser .profile-rotator-wrapper").show();\r
-                                               $(".error").addClass('hidden');\r
-                                       },\r
-                                       onComplete: function(file,response) {\r
-                                               if (response['error']!= undefined) {\r
-                                                       $(".error span").html(response['error']);\r
-                                                       $(".error").removeClass('hidden');\r
-                                                       $('#profile-rotator').hide();\r
-                                                       $(".fbrowser-content").show();\r
-                                                       return;\r
-                                               }\r
-\r
-                                               var url = baseurl + "/fbrowser/" + FileBrowser.type + "?mode=none&theme=frio";\r
-                                               // Load new content to fbrowser window\r
-                                               FileBrowser.loadContent(url);\r
-                                       }\r
-                               }\r
-                       );\r
-               }\r
-       },\r
-\r
-       // Stuff which should be executed if ne content was loaded\r
-       postLoad: function() {\r
-               FileBrowser.initGallery();\r
-               $(".fbrowser .fbswitcher .btn").removeClass("active");\r
-               $(".fbrowser .fbswitcher [data-mode=" + FileBrowser.type + "]").addClass("active");\r
-               // We need to add the AjaxUpload to the button\r
-               FileBrowser.uploadButtons();\r
-       },\r
-\r
-       // Load new content (e.g. change photo album)\r
-       loadContent: function(url) {\r
-               $(".fbrowser-content").hide();\r
-               $(".fbrowser .profile-rotator-wrapper").show();\r
-\r
-               // load new content to fbrowser window\r
-               $(".fbrowser").load(url, function(responseText, textStatus) {\r
-                       $(".profile-rotator-wrapper").hide();\r
-                       if (textStatus === 'success') {\r
-                               $(".fbrowser_content").show();\r
-                               FileBrowser.postLoad();\r
-                       }\r
-               });\r
-       },\r
-\r
-       // Initialize justified Gallery\r
-       initGallery: function() {\r
-               $(".fbrowser.image .fbrowser-content-container").justifiedGallery({\r
-                       'rowHeight': 80,\r
-                       'margins': 4,\r
-                       'border': 0\r
-               });\r
-       }\r
-};\r
+/**
+ * Filebrowser - Friendica Communications Server
+ *
+ * Copyright (c) 2010-2015 the Friendica Project
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This code handle user interaction for image/file upload/browser dialog.
+ * Is loaded from filebrowser_plain.tpl
+ *
+ * To load filebrowser in colorbox, call
+ *
+ *      Dialog.doImageBrowser(eventname, id);
+ *
+ * or
+ *
+ *      Dialog.doFileBrowser(eventname, id);
+ *
+ * where:
+ *
+ *             eventname: event name to catch return value
+ *             id: id returned to event handler
+ *
+ * When user select an item, an event in fired in parent page, on body element
+ * The event is named
+ *
+ *             fbrowser.<type>.[<eventname>]
+ *
+ * <type> will be one of "image" or "file", and the event handler will
+ * get the following params:
+ *
+ *             filemane: filename of item choosed by user
+ *             embed: bbcode to embed element into posts
+ *             id: id from caller code
+ *
+ * example:
+ *
+ *             // open dialog for select an image for a textarea with id "myeditor"
+ *             var id="myeditor";
+ *             Dialog.doImageBrowser("example", id);
+ *
+ *             // setup event handler to get user selection
+ *             $("body").on("fbrowser.image.example", function(event, filename, bbcode, id) {
+ *                     // close colorbox
+ *                     $.colorbox.close();
+ *                     // replace textxarea text with bbcode
+ *                     $(id).value = bbcode;
+ *             });
+ **/
+
+
+/*
+ * IMPORTANT
+ *
+ *  This is a modified version to work with
+ *  the frio theme.and bootstrap modals
+ *
+ *  The origninal file is under:
+ *  js/filebrowser.js
+ *
+ */
+
+
+var FileBrowser = {
+       nickname : "",
+       type : "",
+       event: "",
+       folder: "",
+       id : null,
+
+       init: function(nickname, type, hash) {
+               FileBrowser.nickname = nickname;
+               FileBrowser.type = type;
+               FileBrowser.event = "fbrowser."+type;
+
+               if (hash!=="") {
+                       var h = hash.replace("#","");
+                       var destination = h.split("-")[0];
+                       FileBrowser.id = h.split("-")[1];
+                       FileBrowser.event = FileBrowser.event + "." + destination;
+                       if (destination === "comment") {
+                               // Get the comment textimput field
+                               var commentElm = document.getElementById("comment-edit-text-" + FileBrowser.id);
+                       }
+               };
+
+               console.log("FileBrowser: " + nickname,  type, FileBrowser.event, FileBrowser.id);
+
+               FileBrowser.postLoad();
+
+               $(".error .close").on("click", function(e) {
+                       e.preventDefault();
+                       $(".error").addClass("hidden");
+               });
+
+               // Click on album link
+               $(".fbrowser").on("click", ".folders a, .path a", function(e) {
+                       e.preventDefault();
+                       var url = baseurl + "/fbrowser/" + FileBrowser.type + "/" + this.dataset.folder + "?mode=none&theme=frio";
+                       FileBrowser.folder = this.dataset.folder;
+
+                       FileBrowser.loadContent(url);
+               });
+
+               //Embed on click
+               $(".fbrowser").on('click', ".photo-album-photo-link", function(e) {
+                       e.preventDefault();
+
+                       var embed = "";
+                       if (FileBrowser.type === "image") {
+                               embed = "[url=" + this.dataset.link + "][img=" + this.dataset.img + "][/img][/url]";
+                       }
+                       if (FileBrowser.type === "file") {
+                               // attachment links are "baseurl/attach/id"; we need id
+                               embed = "[attachment]" + this.dataset.link.split("/").pop() + "[/attachment]";
+                       }
+
+                       // Delete prefilled Text of the comment input
+                       // Note: not the best solution but function commentOpenUI don't
+                       // work as expected (we need a way to wait until commentOpenUI would be finished).
+                       // As for now we insert pieces of this function here
+                       if ((commentElm !== null) && (typeof commentElm !== "undefined")) {
+                               if (commentElm.value === "") {
+                                       $("#comment-edit-text-" + FileBrowser.id).addClass("comment-edit-text-full").removeClass("comment-edit-text-empty");
+                                       $("#comment-edit-submit-wrapper-" + FileBrowser.id).show();
+                                       $("#comment-edit-text-" + FileBrowser.id).attr('tabindex','9');
+                                       $("#comment-edit-submit-" + FileBrowser.id).attr('tabindex','10');
+                               }
+
+                       }
+
+                       console.log(FileBrowser.event, this.dataset.filename, embed, FileBrowser.id);
+
+                       $("body").trigger(FileBrowser.event, [
+                               this.dataset.filename,
+                               embed,
+                               FileBrowser.id,
+                               this.dataset.img
+                       ]);
+
+                       // Close model
+                       $('#modal').modal('hide');
+                       // Update autosize for this textarea
+                       autosize.update($(".text-autosize"));
+               });
+
+               // EventListener for switching between image and file mode
+               $(".fbrowser").on('click', ".fbswitcher .btn", function(e) {
+                       e.preventDefault();
+                       FileBrowser.type = this.getAttribute("data-mode");
+                       $(".fbrowser").removeClass().addClass("fbrowser " + FileBrowser.type);
+                       url = baseurl + "/fbrowser/" + FileBrowser.type + "?mode=none&theme=frio";
+
+                       FileBrowser.loadContent(url);
+               });
+       },
+
+       // Initialize the AjaxUpload for the upload buttons
+       uploadButtons: function() {
+               if ($("#upload-image").length) {
+                       // To get the albumname we need to convert it from hex
+                       var albumname = hex2bin(FileBrowser.folder);
+                       //AjaxUpload for images
+                       var image_uploader = new window.AjaxUpload(
+                               'upload-image',
+                               {       action: 'wall_upload/' + FileBrowser.nickname + '?response=json&album=' + albumname,
+                                       name: 'userfile',
+                                       responseType: 'json',
+                                       onSubmit: function(file, ext) {
+                                               $(".fbrowser-content").hide();
+                                               $(".fbrowser .profile-rotator-wrapper").show();
+                                               $(".error").addClass('hidden');
+                                       },
+                                       onComplete: function(file,response) {
+                                               if (response['error'] != undefined) {
+                                                       $(".error span").html(response['error']);
+                                                       $(".error").removeClass('hidden');
+                                                       $(".fbrowser .profile-rotator-wrapper").hide();
+                                                       $(".fbrowser-content").show();
+                                                       return;
+                                               }
+
+                                               var url = baseurl + "/fbrowser/" + FileBrowser.type + "/" + FileBrowser.folder + "?mode=none&theme=frio";
+                                               // load new content to fbrowser window
+                                               FileBrowser.loadContent(url);
+                                       }
+                               }
+                       );
+               }
+
+               if ($("#upload-file").length) {
+                       //AjaxUpload for files
+                       var file_uploader = new window.AjaxUpload(
+                               'upload-file',
+                               {       action: 'wall_attach/' + FileBrowser.nickname + '?response=json',
+                                       name: 'userfile',
+                                       onSubmit: function(file, ext) {
+                                               $(".fbrowser-content").hide();
+                                               $(".fbrowser .profile-rotator-wrapper").show();
+                                               $(".error").addClass('hidden');
+                                       },
+                                       onComplete: function(file,response) {
+                                               if (response['error']!= undefined) {
+                                                       $(".error span").html(response['error']);
+                                                       $(".error").removeClass('hidden');
+                                                       $('#profile-rotator').hide();
+                                                       $(".fbrowser-content").show();
+                                                       return;
+                                               }
+
+                                               var url = baseurl + "/fbrowser/" + FileBrowser.type + "?mode=none&theme=frio";
+                                               // Load new content to fbrowser window
+                                               FileBrowser.loadContent(url);
+                                       }
+                               }
+                       );
+               }
+       },
+
+       // Stuff which should be executed if ne content was loaded
+       postLoad: function() {
+               FileBrowser.initGallery();
+               $(".fbrowser .fbswitcher .btn").removeClass("active");
+               $(".fbrowser .fbswitcher [data-mode=" + FileBrowser.type + "]").addClass("active");
+               // We need to add the AjaxUpload to the button
+               FileBrowser.uploadButtons();
+       },
+
+       // Load new content (e.g. change photo album)
+       loadContent: function(url) {
+               $(".fbrowser-content").hide();
+               $(".fbrowser .profile-rotator-wrapper").show();
+
+               // load new content to fbrowser window
+               $(".fbrowser").load(url, function(responseText, textStatus) {
+                       $(".profile-rotator-wrapper").hide();
+                       if (textStatus === 'success') {
+                               $(".fbrowser_content").show();
+                               FileBrowser.postLoad();
+                       }
+               });
+       },
+
+       // Initialize justified Gallery
+       initGallery: function() {
+               $(".fbrowser.image .fbrowser-content-container").justifiedGallery({
+                       'rowHeight': 80,
+                       'margins': 4,
+                       'border': 0
+               });
+       }
+};
index 594fa256346a96db8063cc5b5869c289a2020a2e..44a24b30a11884e1cfae92537a5247922d5a6012 100644 (file)
@@ -64,9 +64,24 @@ $(document).ready(function(){
        });
 
        // add Jot botton to the scecond navbar
-       if( $("section #jotOpen").length ) {
-               $("section #jotOpen").appendTo("#topbar-second > .container > #navbar-button");
-               if( $("#jot-popup").is(":hidden")) $("#topbar-second > .container > #navbar-button #jotOpen").hide();
+       let $jotButton = $("#jotOpen");
+       let $composeButton = $("#composeOpen");
+       if (compose) {
+               $jotButton.hide();
+               if ($composeButton.length) {
+                       $composeButton.appendTo("#topbar-second > .container > #navbar-button");
+                       if($("#jot-popup").is(":hidden")) {
+                               $composeButton.hide();
+                       }
+               }
+       } else {
+               $composeButton.hide();
+               if ($jotButton.length) {
+                       $jotButton.appendTo("#topbar-second > .container > #navbar-button");
+                       if($("#jot-popup").is(":hidden")) {
+                               $jotButton.hide();
+                       }
+               }
        }
 
        // show bulk deletion button at network page if checkbox is checked
@@ -711,7 +726,7 @@ function scrollToItem(elementId) {
                return;
        }
 
-       var $el = $(document.getElementById(elementId));
+       var $el = $('#' + elementId +  ' > .media');
        // Test if the Item exists
        if (!$el.length) {
                return;
index b297fcb48174629de382d2609c542ec5835e8039..22bb995804a474cd032d74f1bb479351fdf7577a 100644 (file)
@@ -53,6 +53,10 @@ $is_singleuser_class = $is_singleuser ? "is-singleuser" : "is-not-singleuser";
                        $nav_bg = PConfig::get($uid, 'frio', 'nav_bg');
                }
 
+               if (empty($nav_bg)) {
+                       $nav_bg = Config::get('frio', 'nav_bg');
+               }
+
                if (empty($nav_bg) || !is_string($nav_bg)) {
                        $nav_bg = "#708fa0";
                }
@@ -79,7 +83,7 @@ $is_singleuser_class = $is_singleuser ? "is-singleuser" : "is-not-singleuser";
        // special minimal style for modal dialogs
        if ($minimal) {
 ?>
-        <!-- <?php echo __FILE__ ?> -->
+               <!-- <?php echo __FILE__ ?> -->
                <section class="minimal">
                        <?php if (!empty($page['content'])) echo $page['content']; ?>
                        <div id="page-footer"></div>
index 6a8aaf2c2819fcd06e1e292573c4b1934b421be1..c39e672dfa4dd74781ecc1c9d23e54496861dc10 100644 (file)
@@ -14,50 +14,41 @@ $schemecss = '';
 $schemecssfile = false;
 $scheme_modified = 0;
 
-if ($a->module !== 'install') {
-       // Get the UID of the profile owner.
-       $uid = defaults($_REQUEST, 'puid', 0);
-       if ($uid) {
-               PConfig::load($uid, 'frio');
-
-               // Load the profile owners pconfig.
-               $scheme           = PConfig::get($uid, 'frio', 'scheme', PConfig::get($uid, 'frio', 'schema'));
-               $nav_bg           = PConfig::get($uid, 'frio', 'nav_bg');
-               $nav_icon_color   = PConfig::get($uid, 'frio', 'nav_icon_color');
-               $link_color       = PConfig::get($uid, 'frio', 'link_color');
-               $background_color = PConfig::get($uid, 'frio', 'background_color');
-               $contentbg_transp = PConfig::get($uid, 'frio', 'contentbg_transp');
-               $background_image = PConfig::get($uid, 'frio', 'background_image');
-               $bg_image_option  = PConfig::get($uid, 'frio', 'bg_image_option');
-               $modified         = PConfig::get($uid, 'frio', 'css_modified');
-
-               // There is maybe the case that the user did never modify the theme settings.
-               // In this case we store the present time.
-               if (empty($modified)) {
-                       PConfig::set($uid, 'frio', 'css_modified', time());
-               }
-       } else {
-               Config::load('frio');
-
-               // Load frios system config.
-               $scheme           = Config::get('frio', 'scheme', Config::get('frio', 'schema'));
-               $nav_bg           = Config::get('frio', 'nav_bg');
-               $nav_icon_color   = Config::get('frio', 'nav_icon_color');
-               $link_color       = Config::get('frio', 'link_color');
-               $background_color = Config::get('frio', 'background_color');
-               $contentbg_transp = Config::get('frio', 'contentbg_transp');
-               $background_image = Config::get('frio', 'background_image');
-               $bg_image_option  = Config::get('frio', 'bg_image_option');
-               $login_bg_image   = Config::get('frio', 'login_bg_image');
-               $login_bg_color   = Config::get('frio', 'login_bg_color');
-               $modified         = Config::get('frio', 'css_modified');
-
-               // There is maybe the case that the user did never modify the theme settings.
-               // In this case we store the present time.
-               if (empty($modified)) {
-                       Config::set('frio', 'css_modified', time());
-               }
-       }
+Config::load('frio');
+
+// Default to hard-coded values for empty settings
+$scheme           = Config::get('frio', 'scheme', Config::get('frio', 'schema'));
+$nav_bg           = Config::get('frio', 'nav_bg')           ?: '#708fa0';
+$nav_icon_color   = Config::get('frio', 'nav_icon_color')   ?: '#ffffff';
+$link_color       = Config::get('frio', 'link_color')       ?: '#6fdbe8';
+$background_color = Config::get('frio', 'background_color') ?: '#ededed';
+$contentbg_transp = Config::get('frio', 'contentbg_transp') ?: '';
+$background_image = Config::get('frio', 'background_image') ?: 'img/none.png';
+$bg_image_option  = Config::get('frio', 'bg_image_option')  ?: '';
+$login_bg_image   = Config::get('frio', 'login_bg_image')   ?: '';
+$login_bg_color   = Config::get('frio', 'login_bg_color')   ?: '';
+$modified         = Config::get('frio', 'css_modified')     ?: time();
+
+if (!$login_bg_image && !$login_bg_color) {
+       $login_bg_image = 'img/login_bg.jpg';
+}
+$login_bg_color = $login_bg_color ?: '#ededed';
+
+// Get the UID of the profile owner.
+$uid = $_REQUEST['puid'] ?? 0;
+if ($uid) {
+       PConfig::load($uid, 'frio');
+
+       // Only override display settings that have actually been set
+       $scheme           = PConfig::get($uid, 'frio', 'scheme', PConfig::get($uid, 'frio', 'schema')) ?: $scheme;
+       $nav_bg           = PConfig::get($uid, 'frio', 'nav_bg')           ?: $nav_bg;
+       $nav_icon_color   = PConfig::get($uid, 'frio', 'nav_icon_color')   ?: $nav_icon_color;
+       $link_color       = PConfig::get($uid, 'frio', 'link_color')       ?: $link_color;
+       $background_color = PConfig::get($uid, 'frio', 'background_color') ?: $background_color;
+       $contentbg_transp = PConfig::get($uid, 'frio', 'contentbg_transp') ?: $contentbg_transp;
+       $background_image = PConfig::get($uid, 'frio', 'background_image') ?: $background_image;
+       $bg_image_option  = PConfig::get($uid, 'frio', 'bg_image_option')  ?: $bg_image_option;
+       $modified         = PConfig::get($uid, 'frio', 'css_modified')     ?: $modified;
 }
 
 // Now load the scheme.  If a value is changed above, we'll keep the settings
@@ -94,24 +85,6 @@ if (!$scheme) {
        }
 }
 
-//Set some defaults - we have to do this after pulling owner settings, and we have to check for each setting
-//individually.  If we don't, we'll have problems if a user has set one, but not all options.
-$nav_bg           = (empty($nav_bg)           ? '#708fa0'      : $nav_bg);
-$nav_icon_color   = (empty($nav_icon_color)   ? '#fff'         : $nav_icon_color);
-$link_color       = (empty($link_color)       ? '#6fdbe8'      : $link_color);
-$background_color = (empty($background_color) ? '#ededed'      : $background_color);
-// The background image can not be empty. So we use a dummy jpg if no image was set.
-$background_image = (empty($background_image) ? 'img/none.jpg' : $background_image);
-$modified         = (empty($modified)         ? time()         : $modified);
-
-
-// set a default login bg image if no custom image and no custom bg color are set.
-if (empty($login_bg_image) && empty($login_bg_color)) {
-       $login_bg_image = 'img/login_bg.jpg';
-}
-$login_bg_color   = (empty($login_bg_color)   ? '#ededed'      : $login_bg_color);
-$login_bg_image   = (empty($login_bg_image)   ? ''             : $login_bg_image);
-
 $contentbg_transp = ((isset($contentbg_transp) && $contentbg_transp != '') ? $contentbg_transp : 100);
 
 // Calculate some colors in dependance of existing colors.
index 1f43b412b786c613bdabea15cf880c136f262252..59f02dba56ebb34c5385990f0adf38493fee9ad0 100644 (file)
@@ -37,7 +37,7 @@
                        <div class="section-subtitle-wrapper" role="tab" id="admin-settings-contactblock-blocked">
                                <h4>
                                        <a class="accordion-toggle collapsed" data-toggle="collapse" data-parent="#admin-settings" href="#admin-settings-contactblock-blocked-collapse" aria-expanded="{{if count($contacts) > 0}}true{{else}}false{{/if}}" aria-controls="admin-settings-contactblock-blocked-collapse">
-                                               {{$h_contacts}} ({{count($contacts)}})
+                                               {{$h_contacts}} ({{$total_contacts}})
                                        </a>
                                </h4>
                        </div>
index 4c0a6ce06667a241cd9add9be8ac16547975e4d7..12ea0b83a4e4f50affcf9c1b33591d037b8e5f81 100644 (file)
                                        {{include file="field_input.tpl" field=$max_author_posts_community_page}}
 
                                        {{include file="field_checkbox.tpl" field=$ostatus_disabled}}
-                                       {{include file="field_checkbox.tpl" field=$ostatus_full_threads}}
 
                                        {{if $diaspora_able}}
                                        {{include file="field_checkbox.tpl" field=$diaspora_enabled}}
                                        {{include file="field_input.tpl" field=$optimize_fragmentation}}
                                        {{include file="field_input.tpl" field=$abandon_days}}
                                        {{include file="field_input.tpl" field=$temppath}}
-                                       {{include file="field_input.tpl" field=$basepath}}
                                        {{include file="field_checkbox.tpl" field=$suppress_tags}}
                                        {{include file="field_checkbox.tpl" field=$nodeinfo}}
                                        {{include file="field_select.tpl" field=$check_new_version_url}}
index 98b3c4563632f1e203e5fc61c803bbde1b663607..b60f5c429e8fb76074ff7e94092e336967d14105 100644 (file)
@@ -10,7 +10,6 @@
                <input type="hidden" name="parent" value="{{$parent}}" />
                {{*<!--<input type="hidden" name="return" value="{{$return_path}}" />-->*}}
                <input type="hidden" name="jsreload" value="{{$jsreload}}" />
-               <input type="hidden" name="preview" id="comment-preview-inp-{{$id}}" value="0" />
                <input type="hidden" name="post_id_random" value="{{$rand_num}}" />
 
                <p class="comment-edit-bb-{{$id}} comment-icon-list">
index d5ba1bcc458e4f503947fc2548f194e57e750e13..71d598e23b65f6ade23a74906c2b202be6a59e03 100644 (file)
@@ -1,6 +1,6 @@
 {{* The button to open the jot - in This theme we move the button with js to the second nav bar *}}
 <button class="btn btn-sm btn-main pull-right" id="jotOpen" aria-label="{{$new_post}}" title="{{$new_post}}" onclick="jotShow();"><i class="fa fa-pencil-square-o fa-2x"></i></button>
-
+<a class="btn btn-sm btn-main pull-right" id="composeOpen" href="compose/{{$posttype}}{{if $content}}?body={{$content}}{{/if}}" aria-label="{{$new_post}}" title="{{$new_post}}"><i class="fa fa-pencil-square-o fa-2x"></i></a>
 
 <div id="jot-content">
        <div id="jot-sections">
                                                <li><button type="button" class="btn-link" id="profile-nolocation" onclick="jotClearLocation();" title="{{$noloc}}">{{$shortnoloc}}</button></li>
                                                -->
 
-                                               <li role="presentation" class="pull-right"><button class="btn btn-primary" type="submit" id="profile-jot-submit" name="submit" ><i class="fa fa-slideshare fa-fw" aria-hidden="true"></i> {{$share}}</button></li>
+                                               <li role="presentation" class="pull-right"><button class="btn btn-primary" type="submit" id="profile-jot-submit" name="submit" ><i class="fa fa-paper-plane fa-fw" aria-hidden="true"></i> {{$share}}</button></li>
                                                <li role="presentation" id="character-counter" class="grey jothidden text-info pull-right"></li>
                                                <li role="presentation" id="profile-rotator-wrapper" class="pull-right" style="display: {{$visitor}};" >
                                                        <img role="presentation" id="profile-rotator" src="images/rotator.gif" alt="{{$wait}}" title="{{$wait}}" style="display: none;" />
 
                                <div id="jot-preview-share" class="minimize" aria-labelledby="jot-preview-lnk" role="tabpanel" aria-hidden="true">
                                        <ul id="profile-jot-preview-submit-wrapper" class="jothidden nav nav-pills">
-                                               <li role="presentation" class="pull-right"><button class="btn btn-primary" type="submit" id="profile-jot-peview-submit" name="submit" ><i class="fa fa-slideshare fa-fw" aria-hidden="true"></i> {{$share}}</button></li>
+                                               <li role="presentation" class="pull-right"><button class="btn btn-primary" type="submit" id="profile-jot-peview-submit" name="submit" ><i class="fa fa-paper-plane fa-fw" aria-hidden="true"></i> {{$share}}</button></li>
                                        </ul>
                                </div>
 
index d64eae9c49a3169a1fc09f7e90fdc44ef5e95eeb..a3bcdc976d1cb89d357b21a10d3dbccc793e3296 100644 (file)
@@ -69,9 +69,9 @@
 
                                        {{* The notifications dropdown *}}
                                        {{if $nav.notifications}}
-                                               <li id="nav-notification" class="nav-segment hidden-xs" role="presentation">
+                                               <li id="nav-notification" class="nav-segment" role="presentation">
                                                        <a href="{{$nav.notifications.0}}" rel="#nav-notifications-menu" data-toggle="tooltip" aria-label="{{$nav.notifications.1}}" title="{{$nav.notifications.1}}" role="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
-                                                               <i class="fa fa-exclamation-circle fa-lg" aria-hidden="true"></i>
+                                                               <i class="fa fa-bell fa-lg" aria-hidden="true"></i>
                                                                <span role="menuitem" class="sr-only">{{$nav.notifications.1}}</span>
                                                                <span id="notify-update" class="nav-notify-badge badge nav-notify dropdown" data-toggle="dropdown"></span>
                                                        </a>
                                                        {{/foreach}}
                                                        <li role="presentation" class="divider"></li>
                                                        {{if $nav.notifications}}
-                                                       <li role="presentation"><a role="menuitem" href="{{$nav.notifications.all.0}}" title="{{$nav.notifications.1}}"><i class="fa fa-exclamation-circle fa-fw" aria-hidden="true"></i> {{$nav.notifications.1}}</a></li>
+                                                       <li role="presentation"><a role="menuitem" href="{{$nav.notifications.all.0}}" title="{{$nav.notifications.1}}"><i class="fa fa-bell fa-fw" aria-hidden="true"></i> {{$nav.notifications.1}}</a></li>
                                                        {{/if}}
                                                        {{if $nav.messages}}
                                                        <li role="presentation"><a role="menuitem" class="nav-commlink {{$nav.messages.2}} {{$sel.messages}}" href="{{$nav.messages.0}}" title="{{$nav.messages.3}}" ><i class="fa fa-envelope fa-fw" aria-hidden="true"></i> {{$nav.messages.1}} <span id="mail-update-li" class="nav-mail-badge badge nav-notify"></span></a></li>
                                                <li role="menuitem" class="list-group-item"><a role="menuitem" class="{{$usermenu.2}}" href="{{$usermenu.0}}" title="{{$usermenu.3}}">{{$usermenu.1}}</a></li>
                                                {{/foreach}}
                                                {{if $nav.notifications}}
-                                               <li role="presentation" class="list-group-item"><a role="menuitem" href="{{$nav.notifications.all.0}}" title="{{$nav.notifications.1}}"><i class="fa fa-exclamation-circle fa-fw" aria-hidden="true"></i> {{$nav.notifications.1}}</a></li>
+                                               <li role="presentation" class="list-group-item"><a role="menuitem" href="{{$nav.notifications.all.0}}" title="{{$nav.notifications.1}}"><i class="fa fa-bell fa-fw" aria-hidden="true"></i> {{$nav.notifications.1}}</a></li>
                                                {{/if}}
                                                {{if $nav.contacts}}
                                                <li role="presentation" class="list-group-item"><a role="menuitem" class="nav-link {{$nav.contacts.2}}" href="{{$nav.contacts.0}}" title="{{$nav.contacts.3}}"><i class="fa fa-users fa-fw" aria-hidden="true"></i> {{$nav.contacts.1}}</a></li>
index 82bddcfc61c2870596fbefe523ef2377ccac7460..91e9dafe4426dad38458ea974a9ab23372df57f6 100644 (file)
@@ -70,7 +70,7 @@
                <div id="photo-tags">{{$tags.title}}
                        {{foreach $tags.tags as $t}}
                        <span class="category label btn-success sm">
-                               <span class="p-category">{{$t.name}}</span>
+                               <span class="p-category">{{$t.name nofilter}}</span>
                                {{if $t.removeurl}} <a href="{{$t.removeurl}}">(X)</a> {{/if}}
                        </span>
                        {{/foreach}}
index a35955c1707ee15b6a6ed7e95968128214fad279..3ca4000e6ac080d55f4a9812a3d7448e3057e6f6 100644 (file)
@@ -74,7 +74,7 @@
                        <div id="aprofile-marital" class="col-lg-12 col-md-12 col-sm-12 col-xs-12 aprofile">
                                <hr class="profile-separator">
                                <div class="col-lg-4 col-md-4 col-sm-4 col-xs-12 profile-label-name text-muted"><span class="heart">&hearts;</span>  {{$profile.marital.0}}</div>
-                               <div class="col-lg-8 col-md-8 col-sm-8 col-xs-12 profile-entry">{{$profile.marital.1}}{{if $profile.marital.with}} ({{$profile.marital.with}}){{/if}}{{if $profile.howlong}} {{$profile.howlong}}{{/if}}</div>
+                               <div class="col-lg-8 col-md-8 col-sm-8 col-xs-12 profile-entry">{{$profile.marital.1}}{{if $profile.marital.with}} ({{$profile.marital.with nofilter}}){{/if}}{{if $profile.howlong}} {{$profile.howlong}}{{/if}}</div>
                        </div>
                        {{/if}}
 
index d256a17dada3018cf4312928a281ebfca0369c6b..1673a9c9990d61d5b354246afb05c721ec7dd39c 100644 (file)
        <div id="vcard-short-info-wrapper" style="display: none;">
                <div id="vcard-short-info" class="media" style="display: none">
                        <div id="vcard-short-photo-wrapper" class="pull-left">
-                               <img class="media-object" src="{{$profile.photo}}" alt="{{$profile.name}}" />
+                               {{if $profile.picdate}}
+                               <img class="media-object" src="{{$profile.photo}}?rev={{$profile.picdate}}" alt="{{$profile.name}}"></a>
+                               {{else}}
+                               <img class="media-object" src="{{$profile.photo}}" alt="{{$profile.name}}"></a>
+                               {{/if}}
                        </div>
 
                        <div id="vcard-short-desc" class="media-body">
index bf8de450c46a703a279671b74a95c86b1db1fb6e..30c2ca6b4af360b80805315c89a29b28af222476 100644 (file)
@@ -20,6 +20,8 @@
                                <div id="content-settings-content" class="panel-collapse collapse" role="tabpanel" aria-labelledby="content-settings">
                                        <div class="section-content-wrapper">
 
+                                               {{include file="field_checkbox.tpl" field=$accept_only_sharer}}
+
                                                {{include file="field_checkbox.tpl" field=$disable_cw}}
 
                                                {{include file="field_checkbox.tpl" field=$no_intelligent_shortening}}
index 94a0a78802be17731923f1c385aaeb0fc8a31e28..de73dc2f1593676e159c0aec5e59fd5321969e12 100644 (file)
@@ -1,21 +1,21 @@
-{{if $delivery.queue_count >= -1 && $delivery.queue_count !== '' && $delivery.queue_count !== null}}\r
-<span class="delivery">\r
-       &bull;\r
-       {{if $delivery.queue_count == 0}}\r
-               <i class="fa fa-hourglass-o" aria-hidden="true" title="{{$delivery.notifier_pending}}"></i>\r
-               <span class="sr-only">{{$delivery.notifier_pending}}</span>\r
-       {{elseif $delivery.queue_done == 0}}\r
-               <i class="fa fa-hourglass" aria-hidden="true" title="{{$delivery.delivery_pending}} {{$item.delivery.queue_done}}/{{$item.delivery.queue_count}}"></i>\r
-               <span class="sr-only">{{$delivery.delivery_pending}}</span>\r
-       {{elseif $delivery.queue_done / $delivery.queue_count < 0.75}}\r
-               <i class="fa fa-paper-plane-o" aria-hidden="true" title="{{$delivery.delivery_underway}} {{$item.delivery.queue_done}}/{{$item.delivery.queue_count}}"></i>\r
-               <span class="sr-only">{{$delivery.delivery_underway}}</span>\r
-       {{elseif $delivery.queue_done < $delivery.queue_count}}\r
-               <i class="fa fa-paper-plane" aria-hidden="true" title="{{$delivery.delivery_almost}} {{$item.delivery.queue_done}}/{{$item.delivery.queue_count}}"></i>\r
-               <span class="sr-only">{{$delivery.delivery_almost}}</span>\r
-       {{else}}\r
-               <i class="fa fa-paper-plane" aria-hidden="true" title="{{$delivery.delivery_done}} {{$item.delivery.queue_done}}/{{$item.delivery.queue_count}}"></i>\r
-               <span class="sr-only">{{$delivery.delivery_done}}</span>\r
-       {{/if}}\r
-</span>\r
-{{/if}}\r
+{{if $delivery.queue_count >= -1 && $delivery.queue_count !== '' && $delivery.queue_count !== null}}
+<span class="delivery">
+       &bull;
+       {{if $delivery.queue_count == 0}}
+               <i class="fa fa-hourglass-o" aria-hidden="true" title="{{$delivery.notifier_pending}}"></i>
+               <span class="sr-only">{{$delivery.notifier_pending}}</span>
+       {{elseif $delivery.queue_done == 0}}
+               <i class="fa fa-hourglass" aria-hidden="true" title="{{$delivery.delivery_pending}} {{$item.delivery.queue_done}}/{{$item.delivery.queue_count}}"></i>
+               <span class="sr-only">{{$delivery.delivery_pending}}</span>
+       {{elseif $delivery.queue_done / $delivery.queue_count < 0.75}}
+               <i class="fa fa-paper-plane-o" aria-hidden="true" title="{{$delivery.delivery_underway}} {{$item.delivery.queue_done}}/{{$item.delivery.queue_count}}"></i>
+               <span class="sr-only">{{$delivery.delivery_underway}}</span>
+       {{elseif $delivery.queue_done < $delivery.queue_count}}
+               <i class="fa fa-paper-plane" aria-hidden="true" title="{{$delivery.delivery_almost}} {{$item.delivery.queue_done}}/{{$item.delivery.queue_count}}"></i>
+               <span class="sr-only">{{$delivery.delivery_almost}}</span>
+       {{else}}
+               <i class="fa fa-check" aria-hidden="true" title="{{$delivery.delivery_done}} {{$item.delivery.queue_done}}/{{$item.delivery.queue_count}}"></i>
+               <span class="sr-only">{{$delivery.delivery_done}}</span>
+       {{/if}}
+</span>
+{{/if}}
index 3ac6282cabc3f02df46f76fe305a6ea66c3b7122..9c32558b8ebde183722d47c0c2c9312c3859da86 100644 (file)
        });
 </script>
 
+<div class="form-group">
+    {{include file="field_checkbox.tpl" field=$enable_compose}}
+</div>
+
 <div class="settings-submit-wrapper form-group pull-right">
        <button type="submit" value="{{$submit}}" class="settings-submit btn btn-primary" name="frio-settings-submit">{{$submit}}</button>
 </div>
index bd069f5cd7e87f3cb6ed28784911f89f7d195a80..21923737c03d2523a79010ec32b667296a33a399 100644 (file)
@@ -70,9 +70,9 @@ as the value of $top_child_total (this is done at the end of this file)
 
 {{* Use a different div container in dependence max thread-level = 7 *}}
 {{if $item.thread_level<7}}
-<div class="item-{{$item.id}} wall-item-container {{$item.indent}} {{$item.shiny}} {{$item.network}} thread_level_{{$item.thread_level}} {{if $item.thread_level==1}}panel-body h-entry{{else}}u-comment h-cite{{/if}}" id="item-{{$item.guid}}"><!-- wall-item-container -->
+<div class="item-{{$item.id}} wall-item-container {{$item.indent}} {{$item.network}} thread_level_{{$item.thread_level}} {{if $item.thread_level==1}}panel-body h-entry{{else}}u-comment h-cite{{/if}}" id="item-{{$item.guid}}"><!-- wall-item-container -->
 {{else}}
-<div class="item-{{$item.id}} wall-item-container {{$item.indent}} {{$item.shiny}} {{$item.network}} thread_level_7 u-comment h-cite" id="item-{{$item.guid}}">
+<div class="item-{{$item.id}} wall-item-container {{$item.indent}} {{$item.network}} thread_level_7 u-comment h-cite" id="item-{{$item.guid}}">
 {{/if}}
 {{if $item.thread_level==1}}
 <span class="commented" style="display: none;">{{$item.commented}}</span>
@@ -80,7 +80,7 @@ as the value of $top_child_total (this is done at the end of this file)
 <span class="created" style="display: none;">{{$item.created_date}}</span>
 <span class="id" style="display: none;">{{$item.id}}</span>
 {{/if}}
-       <div class="media">
+       <div class="media {{$item.shiny}}">
                {{* Put addional actions in a top-right dropdown menu *}}
 
                <ul class="nav nav-pills preferences">
@@ -269,11 +269,6 @@ as the value of $top_child_total (this is done at the end of this file)
 
                {{* item content *}}
                <div class="wall-item-content {{$item.type}}" id="wall-item-content-{{$item.id}}">
-                       {{* insert some space if it's an top-level post *}}
-                       {{if $item.thread_level==1}}
-                       <div class="wall-spacer">&nbsp;</div> <!-- use padding/margin instead-->
-                       {{/if}}
-
                        {{if $item.title}}
                        <span class="wall-item-title" id="wall-item-title-{{$item.id}}"><h4 class="media-heading"><a href="{{$item.plink.href}}" class="{{$item.sparkle}} p-name">{{$item.title}}</a></h4><br /></span>
                        {{/if}}
@@ -396,30 +391,22 @@ as the value of $top_child_total (this is done at the end of this file)
                {{if $item.thread_level!=1}}
                </div><!--./media-body from for comments-->
                {{/if}}
-
-               {{foreach $item.children as $child}}
-                       {{*
-                       {{if $child.type == tag}}
-                               {{include file="wall_item_tag.tpl" item=$child}}
-                       {{else}}
-                               {{include file="{{$item.template}}" item=$child}}
-                       {{/if}}
-                       *}}
-                       {{include file="{{$item.template}}" item=$child}}
-               {{/foreach}}
-
-               {{* Insert the comment box of the top level post at the bottom of the thread.
-                       Display this comment box if there are any comments. If not hide it. In this
-                       case it could be opend with the "comment" button *}}
-               {{if $item.comment && $item.thread_level==1}}
-                       {{if $item.total_comments_num}}
-                       <div class="comment-fake-form" id="comment-fake-form-{{$item.id}}">
-                               <textarea id="comment-fake-text-{{$item.id}}" class="comment-fake-text-empty form-control" placeholder="{{$item.reply_label}}" onFocus="commentOpenUI(this, {{$item.id}});"  rows="1"></textarea>
-                       </div>
-                       {{/if}}
-                       <div class="wall-item-comment-wrapper well well-small" id="item-comments-{{$item.id}}" data-display="block" style="display: none">{{$item.comment nofilter}}</div>
+       </div>
+       {{foreach $item.children as $child}}
+               {{include file="{{$item.template}}" item=$child}}
+       {{/foreach}}
+
+       {{* Insert the comment box of the top level post at the bottom of the thread.
+               Display this comment box if there are any comments. If not hide it. In this
+               case it could be opend with the "comment" button *}}
+       {{if $item.comment && $item.thread_level==1}}
+               {{if $item.total_comments_num}}
+               <div class="comment-fake-form" id="comment-fake-form-{{$item.id}}">
+                       <textarea id="comment-fake-text-{{$item.id}}" class="comment-fake-text-empty form-control" placeholder="{{$item.reply_label}}" onFocus="commentOpenUI(this, {{$item.id}});"  rows="1"></textarea>
+               </div>
                {{/if}}
-       </div><!-- /media -->
+               <div class="wall-item-comment-wrapper well well-small" id="item-comments-{{$item.id}}" data-display="block" style="display: none">{{$item.comment nofilter}}</div>
+       {{/if}}
 </div><!-- ./panel-body or ./wall-item-container -->
 
 {{if $mode == display}}
index 9c4205c886d26b260b7894047bc530bcb059c83f..5995f54374171f4b2e701e31a8b96f182f22f621 100644 (file)
@@ -14,9 +14,8 @@ use Friendica\Core\Config;
 use Friendica\Core\Hook;
 use Friendica\Core\L10n;
 use Friendica\Core\Logger;
-use Friendica\Core\PConfig;
 use Friendica\Core\Renderer;
-use Friendica\Core\System;
+use Friendica\Core\Session;
 use Friendica\Database\DBA;
 use Friendica\Model;
 use Friendica\Module;
@@ -42,6 +41,14 @@ function frio_init(App $a)
                        </script>
 EOT;
        }
+
+       $enable_compose = \Friendica\Core\PConfig::get(local_user(), 'frio', 'enable_compose');
+       $compose = $enable_compose === '1' || $enable_compose === null && Config::get('frio', 'enable_compose') ? 1 : 0;
+       $a->page['htmlhead'] .= <<< HTML
+               <script type="text/javascript">
+                       var compose = $compose;
+               </script>
+HTML;
 }
 
 function frio_install()
@@ -201,7 +208,7 @@ function frio_remote_nav($a, &$nav)
        // get the homelink from $_XSESSION
        $homelink = Model\Profile::getMyURL();
        if (!$homelink) {
-               $homelink = defaults($_SESSION, 'visitor_home', '');
+               $homelink = Session::get('visitor_home', '');
        }
 
        // split up the url in it's parts (protocol,domain/directory, /profile/, nickname
index 774ffac2757e887a511a6ba6ad181b40f42cb71f..1fa4e333ed7bd46c6b904f906f0526610b3111b6 100644 (file)
@@ -5,7 +5,6 @@
                                <input type="hidden" name="parent" value="{{$parent}}" />
                                {{*<!--<input type="hidden" name="return" value="{{$return_path}}" />-->*}}
                                <input type="hidden" name="jsreload" value="{{$jsreload}}" />
-                               <input type="hidden" name="preview" id="comment-preview-inp-{{$id}}" value="0" />
                                <input type="hidden" name="post_id_random" value="{{$rand_num}}" />
 
                                <div class="comment-edit-photo" id="comment-edit-photo-{{$id}}">
index 160c3c371d11d73675421f0de270335f1761b2bb..7ad0717568b7cae0d9c86407493b5205aa7abaf4 100644 (file)
@@ -1,4 +1,4 @@
-aside, header, #nav-search-box, #nav-admin-link, #nav-messages-linkmenu,  #activitiy-by-date-tab, #shared-links-tab,
+aside, header, #nav-search-box, #nav-admin-link, #nav-messages-linkmenu,  #activitiy-by-date-tab, #shared-links-tab, #nav-logout-link,
 .wall-item-location {
   display: none;
 }
index 8ccdccb80d2878f17e9e9d8ab395ec11e3864e11..0e2cbb5bbfe01d7b099ce5e3ae31fe990e5b6d57 100644 (file)
@@ -10,7 +10,6 @@
                                <input type="hidden" name="parent" value="{{$parent}}" />
                                {{*<!--<input type="hidden" name="return" value="{{$return_path}}" />-->*}}
                                <input type="hidden" name="jsreload" value="{{$jsreload}}" />
-                               <input type="hidden" name="preview" id="comment-preview-inp-{{$id}}" value="0" />
                                <input type="hidden" name="post_id_random" value="{{$rand_num}}" />
 
                                <div class="comment-edit-photo" id="comment-edit-photo-{{$id}}">