Merge remote-tracking branch 'upstream/develop' into manage

This commit is contained in:
Michael 2019-09-30 06:30:13 +00:00
commit d41399496e
50 changed files with 16732 additions and 15722 deletions

View File

@ -1,24 +1,27 @@
Version 2019.09-dev (UNRELEASED)
Version 2019.09 (2019-09-29)
Friendica Core:
Update to the translations (CS, DE, FR, JA, NL, PL) [translation teams]
Update to the translations (CS, DE, EN GB, EN US, FR, JA, NL, PL) [translation teams]
Update to the themes (frio, vier) [JeroenED, MrPetovan, tobiasd, vinzv]
Update to the documentation [guzzisti, vinzv]
Update to the documentation [annando, tobiasd, guzzisti, vinzv]
Enhanced the log output of the background process [annando]
Enhanced the vcard translation in the profile (JeroenED)
Enhanced the vcard translation in the profile [JeroenED]
Enhanced the delivery count [annando]
Enhanced ActivityPub envelopes [MrPetovan]
Enhanced communication about deleted accounts via AP [annando]
Enhanced the following process [annando]
Enhanced the tests [nupplaphil]
Enhanced the frontend worker [annando]
Enhanced the front-end worker [annando]
Enhanced the img format to allow alternative texts [annando]
Enhanced the detection of supported protocols for contacts [annando]
Enhanced the reshare of items [annando]
Enhanced the re-share of items [annando]
Enhanced 2FA process [MrPetovan]
Enhanced server wide theme settings [MrPetovan]
Enhanced config loading process [MrPetovan, nupplaphil]
Enhanced handling of emoticons [MrPetovan]
Fixed a bug in the admin panel leading to orphand options [tobiasd]
Enhanced performance [annando]
Fixed a bug in the admin panel leading to orphaned options [tobiasd]
Fixed a problem that could lead to duplicated Pleroma contacts [annando]
Fixed a problem with the hide profile setting [annando]
Fixed the problem sending out the post when hitting the enter key in the ACL dialog [MrPetovan]
Fixed a bug in HTML special character escaping of event titles [MrPetovan]
Fixed a bug in HTML special character conversion in item titles [MrPetovan]
@ -26,7 +29,19 @@ Version 2019.09-dev (UNRELEASED)
Fixed a bug that prevented the display of images in some postings from diaspora* [MrPetovan]
Fixed a bug in setting the permissions on uploaded images [annando]
Fixed a bug that lead to potentially unwanted importing threads started by contacts of contacts [annando]
Fixed implicit self mentions [MrPetovan]
Fixed display of register links on closed nodes landing pages [MrPetovan]
Fixed the display of [spoiler] tags [MrPetovan]
Fixed an issue with photo permissions in private mails [annando]
Fixed a bug in the process of following Pleroma accounts [annando]
Fixed a bug that caused notifications about locally deleted items [annando]
Fixed the link to the source of an event [MrPetovan]
Fixed a problem that caused authors from twitter postings having no profile pic [annando]
Fixed a bug in BBCode -> Markdown conversation for font size [annando]
Fixed a BBCode parser problem with the audio tag [MrPetovan]
Fixed a session problem [annando]
Fixed a problem with the auto-installer [nupplaphil]
Fixed a bug with magic links redirection for non profiles [annando]
General code cleaning [annando, MrPetovan, nupplaphil]
Removed contacts auto completion (in /contacts [MrPetovan]
Replaced FontAwesome by ForkAwesome in frio theme [vinzv]
@ -37,19 +52,29 @@ Version 2019.09-dev (UNRELEASED)
Added support of wildcards to server block lists [MrPetovan]
Added app specific passwords when using 2FA [MrPetovan]
Added fetching of postings via URL to interact with public postings [annando]
Added opt-out flag for federated search engines and associated header information for profiles [annando]
Friendica Addons:
Update to the translation (CS, DE, FR, JA, NL SV) [translation teams]
Update to the translation (CS, DE, EN GB, EN US, ES, FR, JA, NL SV) [translation teams]
General code cleanup [nupplaphil, Quix0r]
blockbot:
Added translations
Added more bots [annando]
Added admin panel settings [annando]
tumblr:
Changed used URLs to https adopting tumblrs change [annando]
twitter:
Enhanced handling of multi image postings [annando]
Enhanced display of quoted tweets [MrPetovan]
Added alternative text support for images [annando]
Closed Issues:
3816, 4815, 6384, 6675, 7235, 7293, 7314, 7317, 7337, 7338, 7346,
7350, 7367, 7383, 7396, 7397, 7401, 7406, 7408, 7426, 7428, 7456,
7442, 7457, 7468, 7471, 7473, 7488, 7497, 7498, 7501, 7507, 7522,
7527, 7536, 7542, 7545, 7576, 7586
870, 1605, 2199, 3239, 3816, 4117, 4815, 5721, 6384, 6521, 6553,
6675, 7212, 7235, 7285, 7293, 7314, 7317, 7337, 7338, 7346, 7350,
7367, 7383, 7396, 7397, 7401, 7406, 7408, 7426, 7428, 7456, 7442,
7457, 7468, 7471, 7473, 7488, 7497, 7498, 7501, 7507, 7521, 7526,
7527, 7536, 7542, 7545, 7576, 7586, 7594, 7597, 7603, 7610, 7618,
7629, 7635, 7638, 7663, 7665, 7672
Version 2019.06 (2019-06-23)
Friendica Core:

View File

@ -1 +1 @@
2019.09-rc
2019.12-dev

View File

@ -36,6 +36,7 @@ use Dice\Dice;
use Friendica\App\Mode;
use Friendica\BaseObject;
use Friendica\Util\ExAuth;
use Psr\Log\LoggerInterface;
if (sizeof($_SERVER["argv"]) == 0) {
die();
@ -54,6 +55,8 @@ chdir($directory);
require dirname(__DIR__) . '/vendor/autoload.php';
$dice = (new Dice())->addRules(include __DIR__ . '/../static/dependencies.config.php');
$dice = $dice->addRule(LoggerInterface::class,['constructParams' => ['auth_ejabberd']]);
BaseObject::setDependencyInjection($dice);
$appMode = $dice->create(Mode::class);

View File

@ -2,9 +2,11 @@
<?php
use Dice\Dice;
use Psr\Log\LoggerInterface;
require dirname(__DIR__) . '/vendor/autoload.php';
$dice = (new Dice())->addRules(include __DIR__ . '/../static/dependencies.config.php');
$dice = $dice->addRule(LoggerInterface::class,['constructParams' => ['console']]);
(new Friendica\Core\Console($dice, $argv))->execute();

View File

@ -12,6 +12,7 @@ use Friendica\Core\Config;
use Friendica\Core\Logger;
use Friendica\Core\Worker;
use Friendica\Database\DBA;
use Psr\Log\LoggerInterface;
// Get options
$shortopts = 'f';
@ -33,6 +34,7 @@ if (!file_exists("boot.php") && (sizeof($_SERVER["argv"]) != 0)) {
require dirname(__DIR__) . '/vendor/autoload.php';
$dice = (new Dice())->addRules(include __DIR__ . '/../static/dependencies.config.php');
$dice = $dice->addRule(LoggerInterface::class,['constructParams' => ['daemon']]);
\Friendica\BaseObject::setDependencyInjection($dice);
$a = \Friendica\BaseObject::getApp();

View File

@ -11,6 +11,7 @@ use Friendica\BaseObject;
use Friendica\Core\Config;
use Friendica\Core\Update;
use Friendica\Core\Worker;
use Psr\Log\LoggerInterface;
// Get options
$shortopts = 'sn';
@ -32,6 +33,7 @@ if (!file_exists("boot.php") && (sizeof($_SERVER["argv"]) != 0)) {
require dirname(__DIR__) . '/vendor/autoload.php';
$dice = (new Dice())->addRules(include __DIR__ . '/../static/dependencies.config.php');
$dice = $dice->addRule(LoggerInterface::class,['constructParams' => ['worker']]);
BaseObject::setDependencyInjection($dice);
$a = BaseObject::getApp();

View File

@ -31,7 +31,7 @@ use Friendica\Util\DateTimeFormat;
define('FRIENDICA_PLATFORM', 'Friendica');
define('FRIENDICA_CODENAME', 'Dalmatian Bellflower');
define('FRIENDICA_VERSION', '2019.09-rc');
define('FRIENDICA_VERSION', '2019.12-dev');
define('DFRN_PROTOCOL_VERSION', '2.23');
define('NEW_UPDATE_ROUTINE_VERSION', 1170);
@ -413,7 +413,7 @@ function public_contact()
*
* @return int|bool visitor_id or false
*/
function remote_user()
function remote_user($uid = null)
{
// You cannot be both local and remote.
// Unncommented by rabuzarus because remote authentication to local
@ -422,13 +422,22 @@ function remote_user()
// return false;
// }
if (empty($_SESSION)) {
if (empty($_SESSION['authenticated'])) {
return false;
}
if (!empty($_SESSION['authenticated']) && !empty($_SESSION['visitor_id'])) {
if (!is_null($uid) && !empty($_SESSION['remote'])) {
/// @todo replace it with this:
// if (!empty($_SESSION['remote'][$uid])) ...
foreach ($_SESSION['remote'] as $visitor) {
if ($visitor['uid'] == $uid) {
return $visitor['cid'];
}
}
} elseif (is_null($uid) && !empty($_SESSION['visitor_id'])) {
return intval($_SESSION['visitor_id']);
}
return false;
}

564
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -602,6 +602,9 @@ While taking pictures in the woods I had a really strange encounter...</td>
The [abstract] element is not working with connectors where we post HTML directly, like Tumblr, Wordpress or Pump.io.
For the native connections--that is to e.g. Friendica, Hubzilla, Diaspora or GNU Social--the full posting is used and the contacts instance will display the posting as desired.
For postings that are delivered via ActivityPub, the text from the abstract is placed in the summary field.
On Mastodon this field is used for the content warning.
## Special
<table class="bbcodes">

View File

@ -580,6 +580,9 @@ F&uuml;r Verbindungen zu Netzwerken, zu denen Friendica den HTML Code postet, wi
Bei nativen Verbindungen; das hei&szlig;t zu z.B. Friendica, Hubzilla, Diaspora oder GNU Social Kontakten; wird der ungek&uuml;rzte Beitrag &uuml;bertragen.
Die Instanz des Kontakts k&uuml;mmert sich um die Darstellung.
Wird ein Beitrag über das ActivityPub Protokoll &uuml;bermittelt, wird der Text des Abstracts f&uuml;r das "summary" (Zusammenfassung) Feld verwendet.
Dieses Feld wird von Mastodon f&uuml;r die Inhaltswarnung (content warning) verwendet.
## Special
<table class="bbcodes">

View File

@ -10,24 +10,14 @@ Wir freuen uns nicht, wenn Leute Friendica verlassen, aber wenn du deinen Accoun
in deinem Webbrowser. Du musst dabei eingeloggt sein.
Du wirst nach deinem Passwort gefragt, um die Anfrage zu bestätigen.
Wenn dieses mit deinem gespeichertem Passwort übereinstimmt, dann wird dein Account sofort gelöscht.
Anders als andere Netzwerke, behalten wir die Daten **nicht** für eine gewisse Zeit, falls du deine Meinung noch änderst.
Deine Nutzerdetails, deine Unterhaltungen, deine Photos, deine Freunde - alles; wird sofort gelöscht und du wirst ausgeloggt.
Wenn dieses mit deinem gespeichertem Passwort übereinstimmt, dann wird dein Account als "gelöscht" markiert.
Dies passiert sofort und kann nicht rückgängig gemacht werden.
Die meisten Deiner Inhalte und Benutzerdaten werden kurzfristig danach durch Hintergrundprozesse gelöscht.
Wenn Beiträge ablaufen, schicken wir Mitteilungen an Friendica, um diese zu löschen.
Diaspora hat keine automatische Löschfunktion, so dass diese Funktion in dem Netzwerk deaktiviert ist.
Und hoffentlich ist klar, dass das Löschen auch in anderen Netzwerken nicht funktioniert.
Wenn du manuell einen Beitrag bzw. eine Reihe von Beiträgen löschst, dann senden wir individuelle Mitteilungen zu Friendica und Diaspora für jeden gelöschten Post.
Parallel dazu senden wir eine Mitteilung an die Server deiner Kontakte, damit sie deine dort vorliegenden Daten ebenfalls löschen.
Wir haben keinen Einfluss darauf, wie sorgfältig und ob überhaupt diese Systeme der Löschaufforderung nachgehen.
Diaspora versäumt dieses oft.
Aus technischen Gründen benötigen wir für die Übetragung dieser Mitteilung ein paar Benutzerdaten.
Diese Daten werden dann nach einer Frist von etwa sieben Tagen ebenfalls gelöscht.
Wenn du einen Beitrag löscht, aber jemand diesem Beitrag folgt, wird es trotzdem gelöscht.
Dein Wunsch hat Priorität.
Wenn du deinen Account löscht, dann löschen wir alle Beiträge, dein Profil, die Nutzerdaten etc. sofort.
Um einen Gesamtlöschauftrag zu versenden, bräuchten wir zunächst noch deinen Account; auch, um deinen Freunden zu zeigen, wer diese Anfrage stellt.
Das können wir nicht tun, wenn du keinen Account mehr hast.
Deine Freunde können möglicherweise noch deine Beiträge sehen, wenn dein Account gelöscht wurde, aber es gibt keinen öffentlichen Ort in Friendica mehr, wo diese angeschaut werden können.
Wenn du Freunde bei Diaspora hast, kann es sein, dass deine Beiträge weiterhin vorhanden und für andere aus diesem Netzwerk sichtbar sind.
Wir speichern deinen Benutzernamen dauerhaft, damit sich niemand einen Account unter deinem Spitznamen anlegen kann.

View File

@ -13,6 +13,7 @@ if (!file_exists(__DIR__ . '/vendor/autoload.php')) {
require __DIR__ . '/vendor/autoload.php';
$dice = (new Dice())->addRules(include __DIR__ . '/static/dependencies.config.php');
$dice = $dice->addRule(Friendica\App\Mode::class, ['call' => [['determineRunMode', [false, $_SERVER], Dice::CHAIN_CALL]]]);
\Friendica\BaseObject::setDependencyInjection($dice);

View File

@ -227,6 +227,7 @@ function community_getitems($start, $itemspage, $content, $accounttype)
$values = [$start, $itemspage];
}
/// @todo Use "unsearchable" here as well (instead of "hidewall")
$r = DBA::p("SELECT `item`.`uri`, `author`.`url` AS `author-link` FROM `thread`
STRAIGHT_JOIN `user` ON `user`.`uid` = `thread`.`uid` AND NOT `user`.`hidewall`
STRAIGHT_JOIN `item` ON `item`.`id` = `thread`.`iid`
@ -237,9 +238,9 @@ function community_getitems($start, $itemspage, $content, $accounttype)
return DBA::toArray($r);
} elseif ($content == 'global') {
if (!is_null($accounttype)) {
$condition = ["`uid` = ? AND `owner`.`contact-type` = ?", 0, $accounttype];
$condition = ["`uid` = ? AND NOT `author`.`unsearchable` AND NOT `owner`.`unsearchable` AND `owner`.`contact-type` = ?", 0, $accounttype];
} else {
$condition = ['uid' => 0];
$condition = ["`uid` = ? AND NOT `author`.`unsearchable` AND NOT `owner`.`unsearchable`", 0];
}
$r = Item::selectThreadForUser(0, ['uri'], $condition, ['order' => ['commented' => true], 'limit' => [$start, $itemspage]]);

View File

@ -114,7 +114,7 @@ function dfrn_poll_init(App $a)
$_SESSION['remote'] = [];
}
$_SESSION['remote'][] = ['cid' => $r[0]['id'], 'uid' => $r[0]['uid'], 'url' => $r[0]['url']];
$_SESSION['remote'][$r[0]['uid']] = ['cid' => $r[0]['id'], 'uid' => $r[0]['uid']];
$_SESSION['visitor_id'] = $r[0]['id'];
$_SESSION['visitor_home'] = $r[0]['url'];
@ -521,7 +521,7 @@ function dfrn_poll_content(App $a)
$_SESSION['remote'] = [];
}
$_SESSION['remote'][] = ['cid' => $r[0]['id'], 'uid' => $r[0]['uid'], 'url' => $r[0]['url']];
$_SESSION['remote'][$r[0]['uid']] = ['cid' => $r[0]['id'], 'uid' => $r[0]['uid']];
$_SESSION['visitor_id'] = $r[0]['id'];
$_SESSION['visitor_home'] = $r[0]['url'];
$_SESSION['visitor_visiting'] = $r[0]['uid'];

View File

@ -284,10 +284,6 @@ function item_post(App $a) {
$private = ((strlen($str_group_allow) || strlen($str_contact_allow) || strlen($str_group_deny) || strlen($str_contact_deny)) ? 1 : 0);
if ($user['hidewall']) {
$private = 2;
}
// If this is a comment, set the permissions from the parent.
if ($toplevel_item) {

View File

@ -49,11 +49,15 @@ function notifications_post(App $a)
if ($_POST['submit'] == L10n::t('Discard')) {
DBA::delete('intro', ['id' => $intro_id]);
if (!$fid) {
// The check for pending is in case the friendship was already approved
// and we just want to get rid of the pending contact
// When the contact entry had been created just for that intro, we want to get rid of it now
$condition = ['id' => $contact_id, 'uid' => local_user(),
'self' => false, 'pending' => true, 'rel' => [0, Contact::FOLLOWER]];
if (DBA::exists('contact', $condition)) {
$contact_pending = DBA::exists('contact', $condition);
// Remove the "pending" to stop the reappearing in any case
DBA::update('contact', ['pending' => false], ['id' => $contact_id]);
if ($contact_pending) {
Contact::remove($contact_id);
}
}

View File

@ -154,17 +154,8 @@ function photos_post(App $a)
if (local_user() && (local_user() == $page_owner_uid)) {
$can_post = true;
} elseif ($community_page && remote_user()) {
$contact_id = 0;
if (!empty($_SESSION['remote']) && is_array($_SESSION['remote'])) {
foreach ($_SESSION['remote'] as $v) {
if ($v['uid'] == $page_owner_uid) {
$contact_id = $v['cid'];
break;
}
}
}
} elseif ($community_page && remote_user($page_owner_uid)) {
$contact_id = remote_user($page_owner_uid);
if ($contact_id > 0) {
if (DBA::exists('contact', ['id' => $contact_id, 'uid' => $page_owner_uid, 'blocked' => false, 'pending' => false])) {

View File

@ -594,7 +594,7 @@ function profiles_content(App $a) {
'$default' => (($is_default) ? '<p id="profile-edit-default-desc">' . L10n::t('This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet.') . '</p>' : ""),
'$name' => ['name', L10n::t('Your Full Name:'), $r[0]['name']],
'$pdesc' => ['pdesc', L10n::t('Title/Description:'), $r[0]['pdesc']],
'$dob' => Temporal::getDateofBirthField($r[0]['dob']),
'$dob' => Temporal::getDateofBirthField($r[0]['dob'], $a->user['timezone']),
'$hide_friends' => $hide_friends,
'$address' => ['address', L10n::t('Street Address:'), $r[0]['address']],
'$locality' => ['locality', L10n::t('Locality/City:'), $r[0]['locality']],

View File

@ -15,16 +15,16 @@ function redir_init(App $a) {
$url = defaults($_GET, 'url', '');
$quiet = !empty($_GET['quiet']) ? '&quiet=1' : '';
$con_url = defaults($_GET, 'conurl', '');
if ($a->argc > 1 && intval($a->argv[1])) {
$cid = intval($a->argv[1]);
} elseif (local_user() && !empty($con_url)) {
$cid = Contact::getIdForURL($con_url, local_user());
} else {
$cid = 0;
}
// Try magic auth before the legacy stuff
redir_magic($a, $cid, $url);
if (!empty($cid)) {
$fields = ['id', 'uid', 'nurl', 'url', 'addr', 'name', 'network', 'poll', 'issued-id', 'dfrn-id', 'duplex', 'pending'];
$contact = DBA::selectFirst('contact', $fields, ['id' => $cid, 'uid' => [0, local_user()]]);
@ -140,3 +140,63 @@ function redir_init(App $a) {
notice(L10n::t('Contact not found.'));
$a->internalRedirect();
}
function redir_magic($a, $cid, $url)
{
$visitor = Profile::getMyURL();
if (!empty($visitor)) {
Logger::info('Got my url', ['visitor' => $visitor]);
}
/// @todo Most likely these lines are superfluous. We will remove them in the next version
if (empty($visitor) && remote_user()) {
$contact = DBA::selectFirst('contact', ['url'], ['id' => remote_user()]);
if (!empty($contact['url'])) {
$visitor = $contact['url'];
Logger::info('Got remote user', ['visitor' => $visitor]);
}
}
if (empty($visitor) && local_user()) {
$contact = DBA::selectFirst('contact', ['url'], ['id' => local_user()]);
if (!empty($contact['url'])) {
$visitor = $contact['url'];
Logger::info('Got local user', ['visitor' => $visitor]);
}
}
$contact = DBA::selectFirst('contact', ['url'], ['id' => $cid]);
if (!DBA::isResult($contact)) {
Logger::info('Contact not found', ['id' => $cid]);
// Shouldn't happen under normal conditions
notice(L10n::t('Contact not found.'));
if (!empty($url)) {
$a->redirect($url);
} else {
$a->internalRedirect();
}
} else {
$contact_url = $contact['url'];
$target_url = defaults($url, $contact_url);
}
$basepath = Contact::getBasepath($contact_url);
// We don't use magic auth when there is no visitor, we are on the same system or we visit our own stuff
if (empty($visitor) || Strings::compareLink($basepath, System::baseUrl()) || Strings::compareLink($contact_url, $visitor)) {
Logger::info('Redirecting without magic', ['target' => $target_url, 'visitor' => $visitor, 'contact' => $contact_url]);
$a->redirect($target_url);
}
// Test for magic auth on the target system
$serverret = Network::curl($basepath . '/magic');
if ($serverret->isSuccess()) {
$separator = strpos($target_url, '?') ? '&' : '?';
$target_url .= $separator . 'zrl=' . urlencode($visitor) . '&addr=' . urlencode($contact_url);
Logger::info('Redirecting with magic', ['target' => $target_url, 'visitor' => $visitor, 'contact' => $contact_url]);
$a->redirect($target_url);
} else {
Logger::info('No magic for contact', ['contact' => $contact_url]);
}
}

View File

@ -106,15 +106,16 @@ class Mode
/**
* Checks if the site is called via a backend process
*
* @param bool $isBackend True, if the call is from a backend script (daemon, worker, ...)
* @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)
public function determineRunMode(bool $isBackend, Module $module, array $server, MobileDetect $mobileDetect)
{
$isBackend = basename(($server['PHP_SELF'] ?? ''), '.php') !== 'index' ||
$isBackend = $isBackend ||
$module->isBackend();
$isMobile = $mobileDetect->isMobile();
$isTablet = $mobileDetect->isTablet();

View File

@ -129,16 +129,13 @@ HELP;
$config_file = $this->getOption(['f', 'file']);
if (!empty($config_file)) {
if ($config_file != 'config' . DIRECTORY_SEPARATOR . 'local.config.php') {
// Copy config file
$this->out("Copying config file...\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");
}
if (!file_exists($config_file)) {
throw new RuntimeException("ERROR: Config file does not exist.\n");
}
//reload the config cache
$loader = new ConfigFileLoader($basePathConf);
$loader = new ConfigFileLoader($config_file);
$loader->setupCache($configCache);
} else {
@ -195,7 +192,7 @@ HELP;
$installer->createConfig($configCache);
}
$this->out(" Complete!\n\n");
$this->out("Complete!\n\n");
// Check database connection
$this->out("Checking database...\n");
@ -219,6 +216,14 @@ HELP;
throw new RuntimeException($errorMessage);
}
if (!empty($config_file) && $config_file != 'config' . DIRECTORY_SEPARATOR . 'local.config.php') {
// Copy config file
$this->out("Copying config file...\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");
}
}
$this->out(" Complete!\n\n");
// Install theme

View File

@ -1466,6 +1466,11 @@ class BBCode extends BaseObject
$text = str_replace('[hr]', '<hr />', $text);
if (!$for_plaintext) {
// Autolinker for isolated URLs
$text = preg_replace(Strings::autoLinkRegEx(), '[url]$1[/url]', $text);
}
// This is actually executed in Item::prepareBody()
$nosmile = strpos($text, '[nosmile]') !== false;
@ -1648,9 +1653,7 @@ class BBCode extends BaseObject
$text = Smilies::replace($text);
}
// if the HTML is used to generate plain text, then don't do this search, but replace all URL of that kind to text
if (!$for_plaintext) {
$text = preg_replace(Strings::autoLinkRegEx(), '[url]$1[/url]', $text);
if (in_array($simple_html, [7, 9])) {
$text = preg_replace_callback("/\[url\](.*?)\[\/url\]/ism", 'self::convertUrlForOStatusCallback', $text);
$text = preg_replace_callback("/\[url\=(.*?)\](.*?)\[\/url\]/ism", 'self::convertUrlForOStatusCallback', $text);

View File

@ -42,14 +42,32 @@ class HTML
return $cleaned;
}
private static function tagToBBCode(DOMDocument $doc, $tag, $attributes, $startbb, $endbb)
/**
* Search all instances of a specific HTML tag node in the provided DOM document and replaces them with BBCode text nodes.
*
* @see HTML::tagToBBCodeSub()
*/
private static function tagToBBCode(DOMDocument $doc, string $tag, array $attributes, string $startbb, string $endbb, bool $ignoreChildren = false)
{
do {
$done = self::tagToBBCodeSub($doc, $tag, $attributes, $startbb, $endbb);
$done = self::tagToBBCodeSub($doc, $tag, $attributes, $startbb, $endbb, $ignoreChildren);
} while ($done);
}
private static function tagToBBCodeSub(DOMDocument $doc, $tag, $attributes, $startbb, $endbb)
/**
* Search the first specific HTML tag node in the provided DOM document and replaces it with BBCode text nodes.
*
* @param DOMDocument $doc
* @param string $tag HTML tag name
* @param array $attributes Array of attributes to match and optionally use the value from
* @param string $startbb BBCode tag opening
* @param string $endbb BBCode tag closing
* @param bool $ignoreChildren If set to false, the HTML tag children will be appended as text inside the BBCode tag
* Otherwise, they will be entirely ignored. Useful for simple BBCode that draw their
* inner value from an attribute value and disregard the tag children.
* @return bool Whether a replacement was done
*/
private static function tagToBBCodeSub(DOMDocument $doc, string $tag, array $attributes, string $startbb, string $endbb, bool $ignoreChildren = false)
{
$savestart = str_replace('$', '\x01', $startbb);
$replace = false;
@ -98,7 +116,7 @@ class HTML
$node->parentNode->insertBefore($StartCode, $node);
if ($node->hasChildNodes()) {
if (!$ignoreChildren && $node->hasChildNodes()) {
/** @var \DOMNode $child */
foreach ($node->childNodes as $key => $child) {
/* Remove empty text nodes at the start or at the end of the children list */
@ -296,14 +314,14 @@ 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]');
self::tagToBBCode($doc, 'img', ['src' => '/(.+)/', 'alt' => '/(.+)/'], '[img=$1]$2', '[/img]', true);
self::tagToBBCode($doc, 'img', ['src' => '/(.+)/', 'width' => '/(\d+)/', 'height' => '/(\d+)/'], '[img=$2x$3]$1', '[/img]', true);
self::tagToBBCode($doc, 'img', ['src' => '/(.+)/'], '[img]$1', '[/img]', true);
self::tagToBBCode($doc, 'video', ['src' => '/(.+)/'], '[video]$1', '[/video]');
self::tagToBBCode($doc, 'audio', ['src' => '/(.+)/'], '[audio]$1', '[/audio]');
self::tagToBBCode($doc, 'iframe', ['src' => '/(.+)/'], '[iframe]$1', '[/iframe]');
self::tagToBBCode($doc, 'video', ['src' => '/(.+)/'], '[video]$1', '[/video]', true);
self::tagToBBCode($doc, 'audio', ['src' => '/(.+)/'], '[audio]$1', '[/audio]', true);
self::tagToBBCode($doc, 'iframe', ['src' => '/(.+)/'], '[iframe]$1', '[/iframe]', true);
self::tagToBBCode($doc, 'key', [], '[code]', '[/code]');
self::tagToBBCode($doc, 'code', [], '[code]', '[/code]');

View File

@ -337,16 +337,9 @@ class Widget
return;
}
$cid = $zcid = 0;
$zcid = 0;
if (!empty($_SESSION['remote'])) {
foreach ($_SESSION['remote'] as $visitor) {
if ($visitor['uid'] == $profile_uid) {
$cid = $visitor['cid'];
break;
}
}
}
$cid = remote_user($profile_uid);
if (!$cid) {
if (Profile::getMyURL()) {

View File

@ -9,8 +9,10 @@ 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\DateTimeFormat;
use Friendica\Util\Strings;
/**
* High-level Session service class
@ -118,8 +120,21 @@ class Session
'my_url' => $a->getBaseURL() . '/profile/' . $user_record['nickname'],
'my_address' => $user_record['nickname'] . '@' . substr($a->getBaseURL(), strpos($a->getBaseURL(), '://') + 3),
'addr' => defaults($_SERVER, 'REMOTE_ADDR', '0.0.0.0'),
'remote' => []
]);
$remote_contacts = DBA::select('contact', ['id', 'uid'], ['nurl' => Strings::normaliseLink($_SESSION['my_url']), 'rel' => [Contact::FOLLOWER, Contact::FRIEND], 'self' => false]);
while ($contact = DBA::fetch($remote_contacts)) {
if (($contact['uid'] == 0) || Contact::isBlockedByUser($contact['id'], $contact['uid'])) {
continue;
}
/// @todo Change it to this format to save space
// $_SESSION['remote'][$contact['uid']] = $contact['id'];
$_SESSION['remote'][$contact['uid']] = ['cid' => $contact['id'], 'uid' => $contact['uid']];
}
DBA::close($remote_contacts);
$member_since = strtotime($user_record['register_date']);
self::set('new_member', time() < ($member_since + ( 60 * 60 * 24 * 14)));

View File

@ -90,9 +90,12 @@ class Database
public function connect()
{
if (!is_null($this->connection) && $this->connected()) {
return true;
return $this->connected;
}
// Reset connected state
$this->connected = false;
$port = 0;
$serveraddr = trim($this->configCache->get('database', 'hostname'));
$serverdata = explode(':', $serveraddr);
@ -187,19 +190,20 @@ class Database
*/
public function disconnect()
{
if (is_null($this->connection)) {
return;
if (!is_null($this->connection)) {
switch ($this->driver) {
case 'pdo':
$this->connection = null;
break;
case 'mysqli':
$this->connection->close();
$this->connection = null;
break;
}
}
switch ($this->driver) {
case 'pdo':
$this->connection = null;
break;
case 'mysqli':
$this->connection->close();
$this->connection = null;
break;
}
$this->driver = null;
$this->connected = false;
}
/**
@ -369,6 +373,7 @@ class Database
$connected = $this->connection->ping();
break;
}
return $connected;
}

View File

@ -38,19 +38,17 @@ class LoggerFactory
'Friendica\\Util\\Logger',
];
/**
* Retrieve the channel based on the __FILE__
*
* @return string
*/
private function findChannel()
private $channel;
public function __construct(string $channel)
{
return basename($_SERVER['PHP_SELF'], '.php');
$this->channel = $channel;
}
/**
* Creates a new PSR-3 compliant logger instances
*
* @param Database $database The Friendica Database instance
* @param Configuration $config The config
* @param Profiler $profiler The profiler of the app
*
@ -59,7 +57,7 @@ class LoggerFactory
* @throws \Exception
* @throws InternalServerErrorException
*/
public function create(Database $database, Configuration $config, Profiler $profiler)
public function create( Database $database, Configuration $config, Profiler $profiler)
{
if (empty($config->get('system', 'debugging', false))) {
$logger = new VoidLogger();
@ -76,7 +74,7 @@ class LoggerFactory
$loggerTimeZone = new \DateTimeZone('UTC');
Monolog\Logger::setTimezone($loggerTimeZone);
$logger = new Monolog\Logger($this->findChannel());
$logger = new Monolog\Logger($this->channel);
$logger->pushProcessor(new Monolog\Processor\PsrLogMessageProcessor());
$logger->pushProcessor(new Monolog\Processor\ProcessIdProcessor());
$logger->pushProcessor(new Monolog\Processor\UidProcessor());
@ -91,7 +89,7 @@ class LoggerFactory
break;
case 'syslog':
$logger = new SyslogLogger($this->findChannel(), $introspection, $loglevel);
$logger = new SyslogLogger($this->channel, $introspection, $loglevel);
break;
case 'stream':
@ -99,7 +97,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($this->findChannel(), $stream, $introspection, $loglevel);
$logger = new StreamLogger($this->channel, $stream, $introspection, $loglevel);
} else {
$logger = new VoidLogger();
}

View File

@ -270,14 +270,17 @@ class Contact extends BaseObject
* @param string $url The contact link
*
* @return string basepath
* @return boolean $dont_update Don't update the contact
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function getBasepath($url)
public static function getBasepath($url, $dont_update = false)
{
$contact = DBA::selectFirst('contact', ['baseurl'], ['uid' => 0, 'nurl' => Strings::normaliseLink($url)]);
if (!empty($contact['baseurl'])) {
return $contact['baseurl'];
} elseif ($dont_update) {
return '';
}
self::updateFromProbeByURL($url, true);
@ -290,6 +293,18 @@ class Contact extends BaseObject
return '';
}
/**
* Check if the given contact url is on the same server
*
* @param string $url The contact link
*
* @return boolean Is it the same server?
*/
public static function isLocal($url)
{
return Strings::compareLink(self::getBasepath($url, true), System::baseUrl());
}
/**
* Returns the public contact id of the given user id
*
@ -668,21 +683,21 @@ class Contact extends BaseObject
public static function updateSelfFromUserID($uid, $update_avatar = false)
{
$fields = ['id', 'name', 'nick', 'location', 'about', 'keywords', 'gender', 'avatar',
'xmpp', 'contact-type', 'forum', 'prv', 'avatar-date', 'url', 'nurl',
'xmpp', 'contact-type', 'forum', 'prv', 'avatar-date', 'url', 'nurl', 'unsearchable',
'photo', 'thumb', 'micro', 'addr', 'request', 'notify', 'poll', 'confirm', 'poco'];
$self = DBA::selectFirst('contact', $fields, ['uid' => $uid, 'self' => true]);
if (!DBA::isResult($self)) {
return;
}
$fields = ['nickname', 'page-flags', 'account-type'];
$fields = ['nickname', 'page-flags', 'account-type', 'hidewall'];
$user = DBA::selectFirst('user', $fields, ['uid' => $uid]);
if (!DBA::isResult($user)) {
return;
}
$fields = ['name', 'photo', 'thumb', 'about', 'address', 'locality', 'region',
'country-name', 'gender', 'pub_keywords', 'xmpp'];
'country-name', 'gender', 'pub_keywords', 'xmpp', 'net-publish'];
$profile = DBA::selectFirst('profile', $fields, ['uid' => $uid, 'is-default' => true]);
if (!DBA::isResult($profile)) {
return;
@ -727,6 +742,7 @@ class Contact extends BaseObject
$fields['avatar'] = System::baseUrl() . '/photo/profile/' .$uid . '.' . $file_suffix;
$fields['forum'] = $user['page-flags'] == User::PAGE_FLAGS_COMMUNITY;
$fields['prv'] = $user['page-flags'] == User::PAGE_FLAGS_PRVGROUP;
$fields['unsearchable'] = $user['hidewall'] || !$profile['net-publish'];
// it seems as if ported accounts can have wrong values, so we make sure that now everything is fine.
$fields['url'] = System::baseUrl() . '/profile/' . $user['nickname'];
@ -1177,7 +1193,7 @@ class Contact extends BaseObject
$sparkle = false;
if (($contact['network'] === Protocol::DFRN) && !$contact['self'] && empty($contact['pending'])) {
$sparkle = true;
$profile_link = System::baseUrl() . '/redir/' . $contact['id'] . '?url=' . $contact['url'];
$profile_link = System::baseUrl() . '/redir/' . $contact['id'];
} else {
$profile_link = $contact['url'];
}
@ -1462,7 +1478,6 @@ class Contact extends BaseObject
if (empty($data)) {
$data = Probe::uri($url, "", $uid);
// Ensure that there is a gserver entry
if (!empty($data['baseurl']) && ($data['network'] != Protocol::PHANTOM)) {
PortableContact::checkServer($data['baseurl']);
@ -2021,9 +2036,8 @@ class Contact extends BaseObject
return true;
}
// If Probe::uri fails the network code will be different (mostly "feed" or "unkn")
if (!in_array($ret['network'], Protocol::NATIVE_SUPPORT) ||
(in_array($ret['network'], [Protocol::FEED, Protocol::PHANTOM]) && ($ret['network'] != $contact['network']))) {
// If Probe::uri fails the network code will be different ("feed" or "unkn")
if (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]);
}
@ -2063,7 +2077,7 @@ class Contact extends BaseObject
}
}
if ($ret['network'] != Protocol::FEED) {
if (!empty($ret['photo']) && ($ret['network'] != Protocol::FEED)) {
self::updateAvatar($ret['photo'], $uid, $id, $update || $force);
}
@ -2487,6 +2501,9 @@ class Contact extends BaseObject
['id' => $contact['id'], 'uid' => $importer['uid']]);
}
// Ensure to always have the correct network type, independent from the connection request method
self::updateFromProbe($contact['id'], '', true);
return true;
} else {
// send email notification to owner?
@ -2512,15 +2529,14 @@ class Contact extends BaseObject
'writable' => 1,
]);
$contact_record = [
'id' => DBA::lastInsertId(),
'network' => $network,
'name' => $name,
'url' => $url,
'photo' => $photo
];
$contact_id = DBA::lastInsertId();
Contact::updateAvatar($photo, $importer["uid"], $contact_record["id"], true);
// Ensure to always have the correct network type, independent from the connection request method
self::updateFromProbe($contact_id, '', true);
Contact::updateAvatar($photo, $importer["uid"], $contact_id, true);
$contact_record = DBA::selectFirst('contact', ['id', 'network', 'name', 'url', 'photo'], ['id' => $contact_id]);
/// @TODO Encapsulate this into a function/method
$fields = ['uid', 'username', 'email', 'page-flags', 'notify-flags', 'language'];
@ -2728,7 +2744,7 @@ class Contact extends BaseObject
$redirect = 'redir/' . $contact['id'];
if ($url != '') {
if (($url != '') && !Strings::compareLink($contact['url'], $url)) {
$redirect .= '?url=' . $url;
}

View File

@ -248,7 +248,7 @@ class Profile
*/
public static function getByNickname($nickname, $uid = 0, $profile_id = 0)
{
if (remote_user() && !empty($_SESSION['remote'])) {
if (remote_user($uid) && !empty($_SESSION['remote'])) {
foreach ($_SESSION['remote'] as $visitor) {
if ($visitor['uid'] == $uid) {
$contact = DBA::selectFirst('contact', ['profile-id'], ['id' => $visitor['cid']]);
@ -1124,13 +1124,13 @@ class Profile
/// @todo replace this and the query for this variable with some cleaner functionality
$_SESSION['remote'] = [];
$remote_contacts = DBA::select('contact', ['id', 'uid'], ['nurl' => $visitor['nurl'], 'rel' => [Contact::FOLLOWER, Contact::FRIEND]]);
$remote_contacts = DBA::select('contact', ['id', 'uid'], ['nurl' => $visitor['nurl'], 'rel' => [Contact::FOLLOWER, Contact::FRIEND], 'self' => false]);
while ($contact = DBA::fetch($remote_contacts)) {
if (($contact['uid'] == 0) || Contact::isBlockedByUser($visitor['id'], $contact['uid'])) {
continue;
}
$_SESSION['remote'][] = ['cid' => $contact['id'], 'uid' => $contact['uid'], 'url' => $visitor['url']];
$_SESSION['remote'][$contact['uid']] = ['cid' => $contact['id'], 'uid' => $contact['uid']];
}
$a->contact = $visitor;

View File

@ -33,13 +33,10 @@ class Magic extends BaseModule
$test = (!empty($_REQUEST['test']) ? intval($_REQUEST['test']) : 0);
$owa = (!empty($_REQUEST['owa']) ? intval($_REQUEST['owa']) : 0);
// NOTE: I guess $dest isn't just the profile url (could be also
// other profile pages e.g. photo). We need to find a solution
// to be able to redirct to other pages than the contact profile.
$cid = Contact::getIdForURL($dest);
if (!$cid && !empty($addr)) {
if (!empty($addr)) {
$cid = Contact::getIdForURL($addr);
} else {
$cid = Contact::getIdForURL($dest);
}
if (!$cid) {

View File

@ -36,7 +36,6 @@ class Contacts extends BaseModule
throw new \Friendica\Network\HTTPException\NotFoundException(L10n::t('User not found.'));
}
$a->data['user'] = $user;
$a->profile_uid = $user['uid'];
Profile::load($a, $nickname);

View File

@ -1504,10 +1504,39 @@ class Probe
$data['baseurl'] = 'https://twitter.com';
$curlResult = Network::curl($data['url'], false);
if ($curlResult->isSuccess()) {
return $data;
if (!$curlResult->isSuccess()) {
return [];
}
return [];
$body = $curlResult->getBody();
$doc = new DOMDocument();
@$doc->loadHTML($body);
$xpath = new DOMXPath($doc);
$list = $xpath->query('//img[@class]');
foreach ($list as $node) {
$img_attr = [];
if ($node->attributes->length) {
foreach ($node->attributes as $attribute) {
$img_attr[$attribute->name] = $attribute->value;
}
}
if (empty($img_attr['class'])) {
continue;
}
if (strpos($img_attr['class'], 'ProfileAvatar-image') !== false) {
if (!empty($img_attr['src'])) {
$data['photo'] = $img_attr['src'];
}
if (!empty($img_attr['alt'])) {
$data['name'] = $img_attr['alt'];
}
}
}
return $data;
}
/**

View File

@ -544,6 +544,10 @@ class Transmitter
$contacts = DBA::select('contact', ['url', 'network', 'protocol'], $condition);
while ($contact = DBA::fetch($contacts)) {
if (Contact::isLocal($contact['url'])) {
continue;
}
if (!in_array($contact['network'], $networks) && ($contact['protocol'] != Protocol::ACTIVITYPUB)) {
continue;
}
@ -611,6 +615,10 @@ class Transmitter
if ($receiver == $item_profile['followers']) {
$inboxes = array_merge($inboxes, self::fetchTargetInboxesforUser($uid, $personal));
} else {
if (Contact::isLocal($receiver)) {
continue;
}
$profile = APContact::getByURL($receiver, false);
if (!empty($profile)) {
if (empty($profile['sharedinbox']) || $personal || $blindcopy) {

View File

@ -33,7 +33,7 @@ class Security extends BaseObject
return true;
}
if (remote_user()) {
if (remote_user($owner)) {
// use remembered decision and avoid a DB lookup for each and every display item
// DO NOT use this function if there are going to be multiple owners
// We have a contact-id for an authenticated remote user, this block determines if the contact
@ -44,17 +44,7 @@ class Security extends BaseObject
} elseif ($verified === 1) {
return false;
} else {
$cid = 0;
if (!empty($_SESSION['remote'])) {
foreach ($_SESSION['remote'] as $visitor) {
if ($visitor['uid'] == $owner) {
$cid = $visitor['cid'];
break;
}
}
}
$cid = remote_user($owner);
if (!$cid) {
return false;
}

View File

@ -122,13 +122,12 @@ class Temporal
* @brief Wrapper for date selector, tailored for use in birthday fields.
*
* @param string $dob Date of Birth
* @param string $timezone
* @return string Formatted HTML
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \Exception
*/
public static function getDateofBirthField($dob)
public static function getDateofBirthField(string $dob, string $timezone = 'UTC')
{
$a = \get_app();
list($year, $month, $day) = sscanf($dob, '%4d-%2d-%2d');
if ($dob < '0000-01-01') {
@ -137,7 +136,7 @@ class Temporal
$value = DateTimeFormat::utc(($year > 1000) ? $dob : '1000-' . $month . '-' . $day, 'Y-m-d');
}
$age = (intval($value) ? self::getAgeByTimezone($value, $a->user["timezone"], $a->user["timezone"]) : "");
$age = (intval($value) ? self::getAgeByTimezone($value, $timezone, $timezone) : "");
$tpl = Renderer::getMarkupTemplate("field_input.tpl");
$o = Renderer::replaceMacros($tpl,

View File

@ -304,8 +304,11 @@ class CronJobs
/// - set contact-id in item when not present
// Add intro entries for pending contacts
// We don't do this for DFRN entries since such revived contact requests seem to mostly fail.
$pending_contacts = DBA::p("SELECT `uid`, `id`, `url`, `network`, `created` FROM `contact`
WHERE `pending` AND `rel` IN (?, ?) AND NOT EXISTS (SELECT `id` FROM `intro` WHERE `contact-id` = `contact`.`id`)", 0, Contact::FOLLOWER);
WHERE `pending` AND `rel` IN (?, ?) AND `network` != ?
AND NOT EXISTS (SELECT `id` FROM `intro` WHERE `contact-id` = `contact`.`id`)",
0, Contact::FOLLOWER, Protocol::DFRN);
while ($contact = DBA::fetch($pending_contacts)) {
DBA::insert('intro', ['uid' => $contact['uid'], 'contact-id' => $contact['id'], 'blocked' => false,
'hash' => Strings::getRandomHex(), 'datetime' => $contact['created']]);

View File

@ -568,6 +568,11 @@ class Notifier
*/
private static function skipDFRN($contact, $item, $cmd)
{
// Use DFRN if we are on the same site
if (!empty($contact['url']) && Contact::isLocal($contact['url'])) {
return false;
}
// 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;

View File

@ -34,7 +34,7 @@
use Friendica\Database\DBA;
if (!defined('DB_UPDATE_VERSION')) {
define('DB_UPDATE_VERSION', 1322);
define('DB_UPDATE_VERSION', 1323);
}
return [

View File

@ -62,7 +62,7 @@ return [
],
App\Mode::class => [
'call' => [
['determineRunMode', [$_SERVER], Dice::CHAIN_CALL],
['determineRunMode', [true, $_SERVER], Dice::CHAIN_CALL],
['determine', [], Dice::CHAIN_CALL],
],
],
@ -114,12 +114,18 @@ return [
*/
LoggerInterface::class => [
'instanceOf' => Factory\LoggerFactory::class,
'constructParams' => [
'index',
],
'call' => [
['create', [], Dice::CHAIN_CALL],
['create', ['index'], Dice::CHAIN_CALL],
],
],
'$devLogger' => [
'instanceOf' => Factory\LoggerFactory::class,
'constructParams' => [
'dev',
],
'call' => [
['createDev', [], Dice::CHAIN_CALL],
]

View File

@ -3,17 +3,9 @@
* This file is loaded by PHPUnit before any test.
*/
use PHPUnit\DbUnit\DataSet\YamlDataSet;
use PHPUnit\DbUnit\TestCaseTrait;
use PHPUnit\Framework\TestCase;
// Backward compatibility
if (!class_exists(TestCase::class)) {
class_alias(PHPUnit_Framework_TestCase::class, TestCase::class);
}
if (!trait_exists(TestCaseTrait::class)) {
class_alias(PHPUnit_Extensions_Database_TestCase_Trait::class, TestCaseTrait::class);
}
if (!class_exists(YamlDataSet::class)) {
class_alias(PHPUnit_Extensions_Database_DataSet_YamlDataSet::class, YamlDataSet::class);
}

View File

@ -183,13 +183,13 @@ class ModeTest extends MockedTest
/**
* Test if not called by index is backend
*/
public function testIsBackendNotIndex()
public function testIsBackendNotIsBackend()
{
$server = ['PHP_SELF' => '/daemon.php'];
$server = [];
$module = new Module();
$mobileDetect = new MobileDetect();
$mode = (new Mode())->determineRunMode($module, $server, $mobileDetect);
$mode = (new Mode())->determineRunMode(true, $module, $server, $mobileDetect);
$this->assertTrue($mode->isBackend());
}
@ -199,11 +199,11 @@ class ModeTest extends MockedTest
*/
public function testIsBackendButIndex()
{
$server = ['PHP_SELF' => '/index.php'];
$server = [];
$module = new Module(Module::DEFAULT, Module::DEFAULT_CLASS, true);
$mobileDetect = new MobileDetect();
$mode = (new Mode())->determineRunMode($module, $server, $mobileDetect);
$mode = (new Mode())->determineRunMode(false, $module, $server, $mobileDetect);
$this->assertTrue($mode->isBackend());
}
@ -213,11 +213,11 @@ class ModeTest extends MockedTest
*/
public function testIsNotBackend()
{
$server = ['PHP_SELF' => '/index.php'];
$server = [];
$module = new Module(Module::DEFAULT, Module::DEFAULT_CLASS, false);
$mobileDetect = new MobileDetect();
$mode = (new Mode())->determineRunMode($module, $server, $mobileDetect);
$mode = (new Mode())->determineRunMode(false, $module, $server, $mobileDetect);
$this->assertFalse($mode->isBackend());
}
@ -235,7 +235,7 @@ class ModeTest extends MockedTest
$module = new Module(Module::DEFAULT, Module::DEFAULT_CLASS, false);
$mobileDetect = new MobileDetect();
$mode = (new Mode())->determineRunMode($module, $server, $mobileDetect);
$mode = (new Mode())->determineRunMode(true, $module, $server, $mobileDetect);
$this->assertTrue($mode->isAjax());
}
@ -249,7 +249,7 @@ class ModeTest extends MockedTest
$module = new Module(Module::DEFAULT, Module::DEFAULT_CLASS, false);
$mobileDetect = new MobileDetect();
$mode = (new Mode())->determineRunMode($module, $server, $mobileDetect);
$mode = (new Mode())->determineRunMode(true, $module, $server, $mobileDetect);
$this->assertFalse($mode->isAjax());
}
@ -265,7 +265,7 @@ class ModeTest extends MockedTest
$mobileDetect->shouldReceive('isMobile')->andReturn(true);
$mobileDetect->shouldReceive('isTablet')->andReturn(true);
$mode = (new Mode())->determineRunMode($module, $server, $mobileDetect);
$mode = (new Mode())->determineRunMode(true, $module, $server, $mobileDetect);
$this->assertTrue($mode->isMobile());
$this->assertTrue($mode->isTablet());
@ -283,7 +283,7 @@ class ModeTest extends MockedTest
$mobileDetect->shouldReceive('isMobile')->andReturn(false);
$mobileDetect->shouldReceive('isTablet')->andReturn(false);
$mode = (new Mode())->determineRunMode($module, $server, $mobileDetect);
$mode = (new Mode())->determineRunMode(true, $module, $server, $mobileDetect);
$this->assertFalse($mode->isMobile());
$this->assertFalse($mode->isTablet());

View File

@ -179,41 +179,48 @@ class BBCodeTest extends MockedTest
'bug-2199-named-size' => [
'expectedHtml' => '<span style="font-size: xx-large; line-height: initial;">Test text</span>',
'text' => '[size=xx-large]Test text[/size]',
'simpleHtml' => 0,
],
'bug-2199-numeric-size' => [
'expectedHtml' => '<span style="font-size: 24px; line-height: initial;">Test text</span>',
'text' => '[size=24]Test text[/size]',
'simpleHtml' => 0,
],
'bug-2199-diaspora-no-named-size' => [
'expectedHtml' => 'Test text',
'text' => '[size=xx-large]Test text[/size]',
'try_oembed' => false,
// Triggers the diaspora compatible output
'simpleHtml' => 3,
],
'bug-2199-diaspora-no-numeric-size' => [
'expectedHtml' => 'Test text',
'text' => '[size=24]Test text[/size]',
'try_oembed' => false,
// Triggers the diaspora compatible output
'simpleHtml' => 3,
],
'bug-7665-audio-tag' => [
'expectedHtml' => '<audio src="http://www.cendrones.fr/colloque2017/jonathanbocquet.mp3" controls="controls"><a href="http://www.cendrones.fr/colloque2017/jonathanbocquet.mp3">http://www.cendrones.fr/colloque2017/jonathanbocquet.mp3</a></audio>',
'text' => '[audio]http://www.cendrones.fr/colloque2017/jonathanbocquet.mp3[/audio]',
'try_oembed' => true,
],
];
}
/**
* Test convert bbcodes to HTML
*
* @dataProvider dataBBCodes
*
* @param string $expectedHtml Expected HTML output
* @param string $text BBCode text
* @param bool $try_oembed Whether to convert multimedia BBCode tag
* @param int $simpleHtml BBCode::convert method $simple_html parameter value, optional.
* @param bool $forPlaintext BBCode::convert method $for_plaintext parameter value, optional.
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public function testConvert($expectedHtml, $text, $simpleHtml = 0, $forPlaintext = false)
public function testConvert($expectedHtml, $text, $try_oembed = false, $simpleHtml = 0, $forPlaintext = false)
{
$actual = BBCode::convert($text, false, $simpleHtml, $forPlaintext);
$actual = BBCode::convert($text, $try_oembed, $simpleHtml, $forPlaintext);
$this->assertEquals($expectedHtml, $actual);
}

View File

@ -50,4 +50,30 @@ class HTMLTest extends MockedTest
$this->assertEquals($expected, $output);
}
public function dataHTMLText()
{
return [
'bug-7665-audio-tag' => [
'expectedBBCode' => '[audio]http://www.cendrones.fr/colloque2017/jonathanbocquet.mp3[/audio]',
'html' => '<audio src="http://www.cendrones.fr/colloque2017/jonathanbocquet.mp3" controls="controls"><a href="http://www.cendrones.fr/colloque2017/jonathanbocquet.mp3">http://www.cendrones.fr/colloque2017/jonathanbocquet.mp3</a></audio>',
],
];
}
/**
* Test convert bbcodes to HTML
*
* @dataProvider dataHTMLText
*
* @param string $expectedBBCode Expected BBCode output
* @param string $html HTML text
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public function testToBBCode($expectedBBCode, $html)
{
$actual = HTML::toBBCode($html);
$this->assertEquals($expectedBBCode, $actual);
}
}

View File

@ -384,3 +384,15 @@ function update_1318()
Worker::add(PRIORITY_LOW, 'ProfileUpdate');
return Update::SUCCESS;
}
function update_1323()
{
$users = DBA::select('user', ['uid']);
while ($user = DBA::fetch($users)) {
Contact::updateSelfFromUserID($user['uid']);
}
DBA::close($users);
return Update::SUCCESS;
}

View File

@ -45,8 +45,8 @@ msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-09-12 09:52+0200\n"
"PO-Revision-Date: 2019-09-14 05:33+0000\n"
"POT-Creation-Date: 2019-09-15 07:45+0200\n"
"PO-Revision-Date: 2019-09-16 08:06+0000\n"
"Last-Translator: Tobias Diekershoff <tobias.diekershoff@gmx.net>\n"
"Language-Team: German (http://www.transifex.com/Friendica/friendica/language/de/)\n"
"MIME-Version: 1.0\n"
@ -67,12 +67,12 @@ msgstr "Möchtest du wirklich dieses Item löschen?"
#: 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/Register.php:97 src/Module/Contact.php:423
#: mod/follow.php:163 mod/message.php:150 mod/suggest.php:73
#: 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:97 src/Module/Contact.php:423
msgid "Yes"
msgstr "Ja"
@ -80,8 +80,8 @@ msgstr "Ja"
#: 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:426
#: mod/photos.php:1191 mod/suggest.php:76 mod/settings.php:678
#: mod/settings.php:704 src/Module/Contact.php:426
msgid "Cancel"
msgstr "Abbrechen"
@ -98,9 +98,9 @@ msgstr "Abbrechen"
#: mod/message.php:56 mod/message.php:101 mod/network.php:37 mod/notes.php:27
#: 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 mod/events.php:208 mod/item.php:170
#: mod/notifications.php:73 src/Module/Attach.php:42
#: mod/profile_photo.php:197 mod/suggest.php:39 mod/events.php:208
#: mod/item.php:170 mod/notifications.php:73 mod/settings.php:52
#: mod/settings.php:165 mod/settings.php:667 src/Module/Attach.php:42
#: 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
@ -1740,7 +1740,7 @@ msgstr "Neues Profil anlegen"
msgid "Access denied."
msgstr "Zugriff verweigert."
#: mod/cal.php:140 mod/display.php:303 src/Module/Profile.php:184
#: mod/cal.php:140 mod/display.php:303 src/Module/Profile.php:185
msgid "Access to this profile has been restricted."
msgstr "Der Zugriff zu diesem Profil wurde eingeschränkt."
@ -2985,6 +2985,331 @@ msgstr "Beiträge, die mit %s getaggt sind"
msgid "Results for: %s"
msgstr "Ergebnisse für: %s"
#: mod/subthread.php:104
#, php-format
msgid "%1$s is following %2$s's %3$s"
msgstr "%1$s folgt %2$s %3$s"
#: mod/suggest.php:28
msgid "Contact suggestion successfully ignored."
msgstr "Kontaktvorschlag erfolgreich ignoriert."
#: mod/suggest.php:52
msgid ""
"No suggestions available. If this is a new site, please try again in 24 "
"hours."
msgstr "Keine Vorschläge verfügbar. Falls der Server frisch aufgesetzt wurde, versuche es bitte in 24 Stunden noch einmal."
#: mod/suggest.php:71
msgid "Do you really want to delete this suggestion?"
msgstr "Möchtest du wirklich diese Empfehlung löschen?"
#: mod/suggest.php:89 mod/suggest.php:109
msgid "Ignore/Hide"
msgstr "Ignorieren/Verbergen"
#: mod/suggest.php:119 view/theme/vier/theme.php:204 src/Content/Widget.php:69
msgid "Friend Suggestions"
msgstr "Kontaktvorschläge"
#: mod/uexport.php:52
msgid "Export account"
msgstr "Account exportieren"
#: 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:53
msgid "Export all"
msgstr "Alles exportieren"
#: 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/uexport.php:59 mod/settings.php:131
#: src/Module/BaseSettingsModule.php:89
msgid "Export personal data"
msgstr "Persönliche Daten exportieren"
#: mod/videos.php:123
msgid "No videos selected"
msgstr "Keine Videos ausgewählt"
#: mod/videos.php:280 src/Model/Item.php:3477
msgid "View Video"
msgstr "Video ansehen"
#: mod/videos.php:295
msgid "Recent Videos"
msgstr "Neueste Videos"
#: mod/videos.php:297
msgid "Upload New Videos"
msgstr "Neues Video hochladen"
#: mod/display.php:254 mod/display.php:339
msgid "The requested item doesn't exist or has been deleted."
msgstr "Der angeforderte Beitrag existiert nicht oder wurde gelöscht."
#: mod/display.php:417
msgid "The feed for this item is unavailable."
msgstr "Der Feed für diesen Beitrag ist nicht verfügbar."
#: 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/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/events.php:385
msgid "Create New Event"
msgstr "Neue Veranstaltung erstellen"
#: mod/events.php:508
msgid "Event details"
msgstr "Veranstaltungsdetails"
#: mod/events.php:509
msgid "Starting date and Title are required."
msgstr "Anfangszeitpunkt und Titel werden benötigt"
#: mod/events.php:510 mod/events.php:515
msgid "Event Starts:"
msgstr "Veranstaltungsbeginn:"
#: 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/events.php:525 mod/events.php:530
msgid "Event Finishes:"
msgstr "Veranstaltungsende:"
#: mod/events.php:536 mod/events.php:549
msgid "Adjust for viewer timezone"
msgstr "An Zeitzone des Betrachters anpassen"
#: mod/events.php:538
msgid "Description:"
msgstr "Beschreibung"
#: mod/events.php:540 mod/notifications.php:272 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/Directory.php:137
#: src/Module/Contact.php:607
msgid "Location:"
msgstr "Ort:"
#: mod/events.php:542 mod/events.php:544
msgid "Title:"
msgstr "Titel:"
#: mod/events.php:545 mod/events.php:546
msgid "Share this event"
msgstr "Veranstaltung teilen"
#: mod/events.php:553 src/Model/Profile.php:890
msgid "Basic"
msgstr "Allgemein"
#: mod/events.php:554 src/Model/Profile.php:891 src/Module/Admin/Site.php:573
#: src/Module/Contact.php:880
msgid "Advanced"
msgstr "Erweitert"
#: mod/events.php:571
msgid "Failed to remove event"
msgstr "Entfernen der Veranstaltung fehlgeschlagen"
#: mod/events.php:573
msgid "Event removed"
msgstr "Veranstaltung enfternt"
#: mod/item.php:123
msgid "Unable to locate original post."
msgstr "Konnte den Originalbeitrag nicht finden."
#: mod/item.php:323
msgid "Empty post discarded."
msgstr "Leerer Beitrag wurde verworfen."
#: mod/item.php:803
#, 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/item.php:805
#, php-format
msgid "You may visit them online at %s"
msgstr "Du kannst sie online unter %s besuchen"
#: 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/item.php:810
#, php-format
msgid "%s posted an update."
msgstr "%s hat ein Update veröffentlicht."
#: mod/notifications.php:40
msgid "Invalid request identifier."
msgstr "Invalid request identifier."
#: mod/notifications.php:96 src/Content/Nav.php:249
msgid "Notifications"
msgstr "Benachrichtigungen"
#: mod/notifications.php:115
msgid "Network Notifications"
msgstr "Netzwerkbenachrichtigungen"
#: mod/notifications.php:120
msgid "System Notifications"
msgstr "Systembenachrichtigungen"
#: mod/notifications.php:125
msgid "Personal Notifications"
msgstr "Persönliche Benachrichtigungen"
#: mod/notifications.php:130
msgid "Home Notifications"
msgstr "Pinnwandbenachrichtigungen"
#: mod/notifications.php:153
msgid "Show unread"
msgstr "Ungelesene anzeigen"
#: mod/notifications.php:153
msgid "Show all"
msgstr "Alle anzeigen"
#: mod/notifications.php:164
msgid "Show Ignored Requests"
msgstr "Zeige ignorierte Anfragen"
#: mod/notifications.php:164
msgid "Hide Ignored Requests"
msgstr "Verberge ignorierte Anfragen"
#: mod/notifications.php:177 mod/notifications.php:262
msgid "Notification type:"
msgstr "Art der Benachrichtigung:"
#: mod/notifications.php:180
msgid "Suggested by:"
msgstr "Vorgeschlagen von:"
#: mod/notifications.php:192 mod/notifications.php:279
#: src/Module/Contact.php:594
msgid "Hide this contact from others"
msgstr "Verbirg diesen Kontakt vor Anderen"
#: mod/notifications.php:194 mod/notifications.php:288
#: src/Model/Contact.php:1238 src/Module/Admin/Users.php:286
msgid "Approve"
msgstr "Genehmigen"
#: mod/notifications.php:214
msgid "Claims to be known to you: "
msgstr "Behauptet, dich zu kennen: "
#: mod/notifications.php:215
msgid "yes"
msgstr "ja"
#: mod/notifications.php:215
msgid "no"
msgstr "nein"
#: mod/notifications.php:216 mod/notifications.php:220
msgid "Shall your connection be bidirectional or not?"
msgstr "Soll die Verbindung beidseitig sein oder nicht?"
#: mod/notifications.php:217 mod/notifications.php:221
#, 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/notifications.php:218
#, 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/notifications.php:222
#, 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/notifications.php:233
msgid "Friend"
msgstr "Kontakt"
#: mod/notifications.php:234
msgid "Sharer"
msgstr "Teilender"
#: mod/notifications.php:234
msgid "Subscriber"
msgstr "Abonnent"
#: mod/notifications.php:274 src/Model/Profile.php:453
#: src/Model/Profile.php:832 src/Module/Directory.php:145
#: src/Module/Contact.php:611
msgid "About:"
msgstr "Über:"
#: mod/notifications.php:278 src/Model/Profile.php:450
#: src/Model/Profile.php:771 src/Module/Directory.php:142
msgid "Gender:"
msgstr "Geschlecht:"
#: mod/notifications.php:285 src/Model/Profile.php:558
#: src/Module/Contact.php:295
msgid "Network:"
msgstr "Netzwerk:"
#: mod/notifications.php:299
msgid "No introductions."
msgstr "Keine Kontaktanfragen."
#: mod/notifications.php:333
#, php-format
msgid "No more %s notifications."
msgstr "Keine weiteren %s-Benachrichtigungen"
#: mod/openid.php:30
msgid "OpenID protocol error. No ID returned."
msgstr "OpenID Protokollfehler. Keine ID zurückgegeben."
#: mod/openid.php:60
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/openid.php:108 src/Module/Login.php:88 src/Module/Login.php:139
msgid "Login failed."
msgstr "Anmeldung fehlgeschlagen."
#: mod/settings.php:65 src/Module/BaseSettingsModule.php:24
msgid "Account"
msgstr "Nutzerkonto"
@ -3029,11 +3354,6 @@ msgstr "Delegationen"
msgid "Connected apps"
msgstr "Verbundene Programme"
#: 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:138 src/Module/BaseSettingsModule.php:96
msgid "Remove account"
msgstr "Konto löschen"
@ -3605,6 +3925,13 @@ msgid ""
"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:1095
msgid ""
"This setting also determines whether Friendica will inform search engines "
"that your profile should be indexed or not. Third-party search engines may "
"or may not respect this setting."
msgstr "Diese Einstellung bestimmt auch, ob Friendica Suchmaschinen mitteilt, dass das Profil indiziert werden darf oder nicht. Ob sich Suchmaschinen von Drittanbietern daran halten, kann Friendica nicht beeinflussen."
#: 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?"
@ -3905,326 +4232,6 @@ msgstr "Wenn du dein Profil von einem anderen Server umgezogen hast und einige d
msgid "Resend relocate message to contacts"
msgstr "Umzugsbenachrichtigung erneut an Kontakte senden"
#: mod/subthread.php:104
#, php-format
msgid "%1$s is following %2$s's %3$s"
msgstr "%1$s folgt %2$s %3$s"
#: mod/suggest.php:28
msgid "Contact suggestion successfully ignored."
msgstr "Kontaktvorschlag erfolgreich ignoriert."
#: mod/suggest.php:52
msgid ""
"No suggestions available. If this is a new site, please try again in 24 "
"hours."
msgstr "Keine Vorschläge verfügbar. Falls der Server frisch aufgesetzt wurde, versuche es bitte in 24 Stunden noch einmal."
#: mod/suggest.php:71
msgid "Do you really want to delete this suggestion?"
msgstr "Möchtest du wirklich diese Empfehlung löschen?"
#: mod/suggest.php:89 mod/suggest.php:109
msgid "Ignore/Hide"
msgstr "Ignorieren/Verbergen"
#: mod/suggest.php:119 view/theme/vier/theme.php:204 src/Content/Widget.php:69
msgid "Friend Suggestions"
msgstr "Kontaktvorschläge"
#: mod/uexport.php:52
msgid "Export account"
msgstr "Account exportieren"
#: 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:53
msgid "Export all"
msgstr "Alles exportieren"
#: 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/videos.php:123
msgid "No videos selected"
msgstr "Keine Videos ausgewählt"
#: mod/videos.php:280 src/Model/Item.php:3477
msgid "View Video"
msgstr "Video ansehen"
#: mod/videos.php:295
msgid "Recent Videos"
msgstr "Neueste Videos"
#: mod/videos.php:297
msgid "Upload New Videos"
msgstr "Neues Video hochladen"
#: mod/display.php:254 mod/display.php:339
msgid "The requested item doesn't exist or has been deleted."
msgstr "Der angeforderte Beitrag existiert nicht oder wurde gelöscht."
#: mod/display.php:417
msgid "The feed for this item is unavailable."
msgstr "Der Feed für diesen Beitrag ist nicht verfügbar."
#: 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/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/events.php:385
msgid "Create New Event"
msgstr "Neue Veranstaltung erstellen"
#: mod/events.php:508
msgid "Event details"
msgstr "Veranstaltungsdetails"
#: mod/events.php:509
msgid "Starting date and Title are required."
msgstr "Anfangszeitpunkt und Titel werden benötigt"
#: mod/events.php:510 mod/events.php:515
msgid "Event Starts:"
msgstr "Veranstaltungsbeginn:"
#: 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/events.php:525 mod/events.php:530
msgid "Event Finishes:"
msgstr "Veranstaltungsende:"
#: mod/events.php:536 mod/events.php:549
msgid "Adjust for viewer timezone"
msgstr "An Zeitzone des Betrachters anpassen"
#: mod/events.php:538
msgid "Description:"
msgstr "Beschreibung"
#: mod/events.php:540 mod/notifications.php:272 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/Directory.php:137
#: src/Module/Contact.php:607
msgid "Location:"
msgstr "Ort:"
#: mod/events.php:542 mod/events.php:544
msgid "Title:"
msgstr "Titel:"
#: mod/events.php:545 mod/events.php:546
msgid "Share this event"
msgstr "Veranstaltung teilen"
#: mod/events.php:553 src/Model/Profile.php:890
msgid "Basic"
msgstr "Allgemein"
#: mod/events.php:554 src/Model/Profile.php:891 src/Module/Admin/Site.php:573
#: src/Module/Contact.php:880
msgid "Advanced"
msgstr "Erweitert"
#: mod/events.php:571
msgid "Failed to remove event"
msgstr "Entfernen der Veranstaltung fehlgeschlagen"
#: mod/events.php:573
msgid "Event removed"
msgstr "Veranstaltung enfternt"
#: mod/item.php:123
msgid "Unable to locate original post."
msgstr "Konnte den Originalbeitrag nicht finden."
#: mod/item.php:323
msgid "Empty post discarded."
msgstr "Leerer Beitrag wurde verworfen."
#: mod/item.php:803
#, 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/item.php:805
#, php-format
msgid "You may visit them online at %s"
msgstr "Du kannst sie online unter %s besuchen"
#: 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/item.php:810
#, php-format
msgid "%s posted an update."
msgstr "%s hat ein Update veröffentlicht."
#: mod/notifications.php:40
msgid "Invalid request identifier."
msgstr "Invalid request identifier."
#: mod/notifications.php:96 src/Content/Nav.php:249
msgid "Notifications"
msgstr "Benachrichtigungen"
#: mod/notifications.php:115
msgid "Network Notifications"
msgstr "Netzwerkbenachrichtigungen"
#: mod/notifications.php:120
msgid "System Notifications"
msgstr "Systembenachrichtigungen"
#: mod/notifications.php:125
msgid "Personal Notifications"
msgstr "Persönliche Benachrichtigungen"
#: mod/notifications.php:130
msgid "Home Notifications"
msgstr "Pinnwandbenachrichtigungen"
#: mod/notifications.php:153
msgid "Show unread"
msgstr "Ungelesene anzeigen"
#: mod/notifications.php:153
msgid "Show all"
msgstr "Alle anzeigen"
#: mod/notifications.php:164
msgid "Show Ignored Requests"
msgstr "Zeige ignorierte Anfragen"
#: mod/notifications.php:164
msgid "Hide Ignored Requests"
msgstr "Verberge ignorierte Anfragen"
#: mod/notifications.php:177 mod/notifications.php:262
msgid "Notification type:"
msgstr "Art der Benachrichtigung:"
#: mod/notifications.php:180
msgid "Suggested by:"
msgstr "Vorgeschlagen von:"
#: mod/notifications.php:192 mod/notifications.php:279
#: src/Module/Contact.php:594
msgid "Hide this contact from others"
msgstr "Verbirg diesen Kontakt vor Anderen"
#: mod/notifications.php:194 mod/notifications.php:288
#: src/Model/Contact.php:1238 src/Module/Admin/Users.php:286
msgid "Approve"
msgstr "Genehmigen"
#: mod/notifications.php:214
msgid "Claims to be known to you: "
msgstr "Behauptet, dich zu kennen: "
#: mod/notifications.php:215
msgid "yes"
msgstr "ja"
#: mod/notifications.php:215
msgid "no"
msgstr "nein"
#: mod/notifications.php:216 mod/notifications.php:220
msgid "Shall your connection be bidirectional or not?"
msgstr "Soll die Verbindung beidseitig sein oder nicht?"
#: mod/notifications.php:217 mod/notifications.php:221
#, 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/notifications.php:218
#, 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/notifications.php:222
#, 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/notifications.php:233
msgid "Friend"
msgstr "Kontakt"
#: mod/notifications.php:234
msgid "Sharer"
msgstr "Teilender"
#: mod/notifications.php:234
msgid "Subscriber"
msgstr "Abonnent"
#: mod/notifications.php:274 src/Model/Profile.php:453
#: src/Model/Profile.php:832 src/Module/Directory.php:145
#: src/Module/Contact.php:611
msgid "About:"
msgstr "Über:"
#: mod/notifications.php:278 src/Model/Profile.php:450
#: src/Model/Profile.php:771 src/Module/Directory.php:142
msgid "Gender:"
msgstr "Geschlecht:"
#: mod/notifications.php:285 src/Model/Profile.php:558
#: src/Module/Contact.php:295
msgid "Network:"
msgstr "Netzwerk:"
#: mod/notifications.php:299
msgid "No introductions."
msgstr "Keine Kontaktanfragen."
#: mod/notifications.php:333
#, php-format
msgid "No more %s notifications."
msgstr "Keine weiteren %s-Benachrichtigungen"
#: mod/openid.php:30
msgid "OpenID protocol error. No ID returned."
msgstr "OpenID Protokollfehler. Keine ID zurückgegeben."
#: mod/openid.php:60
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/openid.php:108 src/Module/Login.php:88 src/Module/Login.php:139
msgid "Login failed."
msgstr "Anmeldung fehlgeschlagen."
#: view/theme/duepuntozero/config.php:55 src/Model/User.php:745
msgid "default"
msgstr "Standard"
@ -4570,31 +4577,6 @@ msgstr "Schnell-Start"
msgid "Help"
msgstr "Hilfe"
#: src/Core/ACL.php:288 src/Module/Item/Compose.php:139
msgid "Post to Email"
msgstr "An E-Mail senden"
#: src/Core/ACL.php:300
msgid "Visible to everybody"
msgstr "Für jeden sichtbar"
#: src/Core/ACL.php:311
msgid "Connectors"
msgstr "Connectoren"
#: src/Core/ACL.php:313
msgid "Hide your profile details from unknown viewers?"
msgstr "Profil-Details vor unbekannten Betrachtern verbergen?"
#: 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/Core/ACL.php:315
msgid "Close"
msgstr "Schließen"
#: src/Core/L10n/L10n.php:370 src/Model/Event.php:397
msgid "Tuesday"
msgstr "Dienstag"
@ -5201,6 +5183,31 @@ msgstr "Bitte lade ein Profilbild hoch."
msgid "Welcome back %s"
msgstr "Willkommen zurück %s"
#: src/Core/ACL.php:288 src/Module/Item/Compose.php:139
msgid "Post to Email"
msgstr "An E-Mail senden"
#: src/Core/ACL.php:300
msgid "Visible to everybody"
msgstr "Für jeden sichtbar"
#: src/Core/ACL.php:311
msgid "Connectors"
msgstr "Connectoren"
#: src/Core/ACL.php:313
msgid "Hide your profile details from unknown viewers?"
msgstr "Profil-Details vor unbekannten Betrachtern verbergen?"
#: 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/Core/ACL.php:315
msgid "Close"
msgstr "Schließen"
#: src/Util/Temporal.php:147 src/Model/Profile.php:784
msgid "Birthday:"
msgstr "Geburtstag:"
@ -5271,36 +5278,6 @@ msgstr "in %1$d %2$s"
msgid "%1$d %2$s ago"
msgstr "vor %1$d %2$s"
#: src/Content/Text/BBCode.php:465
msgid "view full size"
msgstr "Volle Größe anzeigen"
#: src/Content/Text/BBCode.php:899 src/Content/Text/BBCode.php:1562
#: src/Content/Text/BBCode.php:1563
msgid "Image/photo"
msgstr "Bild/Foto"
#: src/Content/Text/BBCode.php:1017
#, 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:1489 src/Content/Text/BBCode.php:1511
msgid "$1 wrote:"
msgstr "$1 hat geschrieben:"
#: src/Content/Text/BBCode.php:1565 src/Content/Text/BBCode.php:1566
msgid "Encrypted content"
msgstr "Verschlüsselter Inhalt"
#: src/Content/Text/BBCode.php:1790
msgid "Invalid source protocol"
msgstr "Ungültiges Quell-Protokoll"
#: src/Content/Text/BBCode.php:1805
msgid "Invalid link protocol"
msgstr "Ungültiges Link-Protokoll"
#: src/Content/Text/HTML.php:793
msgid "Loading more entries..."
msgstr "lade weitere Einträge..."
@ -5327,11 +5304,40 @@ msgstr "Volltext"
msgid "Tags"
msgstr "Tags"
#: src/Content/Text/HTML.php:944 src/Model/Item.php:3527
#: src/Model/Item.php:3538
#: src/Content/Text/HTML.php:944 src/Content/Text/BBCode.php:1478
msgid "Click to open/close"
msgstr "Zum Öffnen/Schließen klicken"
#: src/Content/Text/BBCode.php:465
msgid "view full size"
msgstr "Volle Größe anzeigen"
#: src/Content/Text/BBCode.php:899 src/Content/Text/BBCode.php:1560
#: src/Content/Text/BBCode.php:1561
msgid "Image/photo"
msgstr "Bild/Foto"
#: src/Content/Text/BBCode.php:1017
#, 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:1509
msgid "$1 wrote:"
msgstr "$1 hat geschrieben:"
#: src/Content/Text/BBCode.php:1563 src/Content/Text/BBCode.php:1564
msgid "Encrypted content"
msgstr "Verschlüsselter Inhalt"
#: src/Content/Text/BBCode.php:1788
msgid "Invalid source protocol"
msgstr "Ungültiges Quell-Protokoll"
#: src/Content/Text/BBCode.php:1803
msgid "Invalid link protocol"
msgstr "Ungültiges Link-Protokoll"
#: src/Content/Widget/CalendarExport.php:64
msgid "Export"
msgstr "Exportieren"
@ -6172,7 +6178,7 @@ msgstr "Veranstaltung kopieren"
msgid "Delete event"
msgstr "Veranstaltung löschen"
#: src/Model/Event.php:626 src/Model/Item.php:3578 src/Model/Item.php:3585
#: src/Model/Event.php:626 src/Model/Item.php:3547 src/Model/Item.php:3554
msgid "link to source"
msgstr "Link zum Originalbeitrag"
@ -6517,37 +6523,6 @@ msgstr "Gruppenname:"
msgid "Edit groups"
msgstr "Gruppen bearbeiten"
#: src/Model/Item.php:3313
msgid "activity"
msgstr "Aktivität"
#: src/Model/Item.php:3315 src/Object/Post.php:474
msgid "comment"
msgid_plural "comments"
msgstr[0] "Kommentar"
msgstr[1] "Kommentare"
#: src/Model/Item.php:3318
msgid "post"
msgstr "Beitrag"
#: src/Model/Item.php:3417
#, php-format
msgid "Content warning: %s"
msgstr "Inhaltswarnung: %s"
#: src/Model/Item.php:3494
msgid "bytes"
msgstr "Byte"
#: src/Model/Item.php:3572
msgid "View on separate page"
msgstr "Auf separater Seite ansehen"
#: src/Model/Item.php:3573
msgid "view on separate page"
msgstr "auf separater Seite ansehen"
#: src/Model/Mail.php:113 src/Model/Mail.php:250
msgid "[no subject]"
msgstr "[kein Betreff]"
@ -6697,18 +6672,49 @@ msgstr "Tipps für neue Nutzer"
msgid "OpenWebAuth: %1$s welcomes %2$s"
msgstr "OpenWebAuth: %1$s heißt %2$s herzlich willkommen"
#: src/Protocol/OStatus.php:1300 src/Module/Profile.php:118
#: src/Module/Profile.php:121
#: src/Model/Item.php:3313
msgid "activity"
msgstr "Aktivität"
#: src/Model/Item.php:3315 src/Object/Post.php:474
msgid "comment"
msgid_plural "comments"
msgstr[0] "Kommentar"
msgstr[1] "Kommentare"
#: src/Model/Item.php:3318
msgid "post"
msgstr "Beitrag"
#: src/Model/Item.php:3417
#, php-format
msgid "Content warning: %s"
msgstr "Inhaltswarnung: %s"
#: src/Model/Item.php:3494
msgid "bytes"
msgstr "Byte"
#: src/Model/Item.php:3541
msgid "View on separate page"
msgstr "Auf separater Seite ansehen"
#: src/Model/Item.php:3542
msgid "view on separate page"
msgstr "auf separater Seite ansehen"
#: src/Protocol/OStatus.php:1300 src/Module/Profile.php:119
#: src/Module/Profile.php:122
#, php-format
msgid "%s's timeline"
msgstr "Timeline von %s"
#: src/Protocol/OStatus.php:1304 src/Module/Profile.php:119
#: src/Protocol/OStatus.php:1304 src/Module/Profile.php:120
#, php-format
msgid "%s's posts"
msgstr "Beiträge von %s"
#: src/Protocol/OStatus.php:1307 src/Module/Profile.php:120
#: src/Protocol/OStatus.php:1307 src/Module/Profile.php:121
#, php-format
msgid "%s's comments"
msgstr "Kommentare von %s"

View File

@ -670,6 +670,78 @@ $a->strings["Only one search per minute is permitted for not logged in users."]
$a->strings["Search"] = "Suche";
$a->strings["Items tagged with: %s"] = "Beiträge, die mit %s getaggt sind";
$a->strings["Results for: %s"] = "Ergebnisse für: %s";
$a->strings["%1\$s is following %2\$s's %3\$s"] = "%1\$s folgt %2\$s %3\$s";
$a->strings["Contact suggestion successfully ignored."] = "Kontaktvorschlag erfolgreich ignoriert.";
$a->strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "Keine Vorschläge verfügbar. Falls der Server frisch aufgesetzt wurde, versuche es bitte in 24 Stunden noch einmal.";
$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["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["Export personal data"] = "Persönliche Daten exportieren";
$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["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["Event can not end before it has started."] = "Die Veranstaltung kann nicht enden, bevor sie beginnt.";
$a->strings["Event title and start time are required."] = "Der Veranstaltungstitel und die Anfangszeit müssen angegeben werden.";
$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["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";
$a->strings["Description:"] = "Beschreibung";
$a->strings["Location:"] = "Ort:";
$a->strings["Title:"] = "Titel:";
$a->strings["Share this event"] = "Veranstaltung teilen";
$a->strings["Basic"] = "Allgemein";
$a->strings["Advanced"] = "Erweitert";
$a->strings["Failed to remove event"] = "Entfernen der Veranstaltung fehlgeschlagen";
$a->strings["Event removed"] = "Veranstaltung enfternt";
$a->strings["Unable to locate original post."] = "Konnte den Originalbeitrag nicht finden.";
$a->strings["Empty post discarded."] = "Leerer Beitrag wurde verworfen.";
$a->strings["This message was sent to you by %s, a member of the Friendica social network."] = "Diese Nachricht wurde dir von %s geschickt, einem Mitglied des Sozialen Netzwerks Friendica.";
$a->strings["You may visit them online at %s"] = "Du kannst sie online unter %s besuchen";
$a->strings["Please contact the sender by replying to this post if you do not wish to receive these messages."] = "Falls du diese Beiträge nicht erhalten möchtest, kontaktiere bitte den Autor, indem du auf diese Nachricht antwortest.";
$a->strings["%s posted an update."] = "%s hat ein Update veröffentlicht.";
$a->strings["Invalid request identifier."] = "Invalid request identifier.";
$a->strings["Notifications"] = "Benachrichtigungen";
$a->strings["Network Notifications"] = "Netzwerkbenachrichtigungen";
$a->strings["System Notifications"] = "Systembenachrichtigungen";
$a->strings["Personal Notifications"] = "Persönliche Benachrichtigungen";
$a->strings["Home Notifications"] = "Pinnwandbenachrichtigungen";
$a->strings["Show unread"] = "Ungelesene anzeigen";
$a->strings["Show all"] = "Alle anzeigen";
$a->strings["Show Ignored Requests"] = "Zeige ignorierte Anfragen";
$a->strings["Hide Ignored Requests"] = "Verberge ignorierte Anfragen";
$a->strings["Notification type:"] = "Art der Benachrichtigung:";
$a->strings["Suggested by:"] = "Vorgeschlagen von:";
$a->strings["Hide this contact from others"] = "Verbirg diesen Kontakt vor Anderen";
$a->strings["Approve"] = "Genehmigen";
$a->strings["Claims to be known to you: "] = "Behauptet, dich zu kennen: ";
$a->strings["yes"] = "ja";
$a->strings["no"] = "nein";
$a->strings["Shall your connection be bidirectional or not?"] = "Soll die Verbindung beidseitig sein oder nicht?";
$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."] = "Akzeptierst du %s als Kontakt, erlaubst du damit das Lesen deiner Beiträge und abonnierst selbst auch die Beiträge von %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."] = "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.";
$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."] = "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.";
$a->strings["Friend"] = "Kontakt";
$a->strings["Sharer"] = "Teilender";
$a->strings["Subscriber"] = "Abonnent";
$a->strings["About:"] = "Über:";
$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["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["Account"] = "Nutzerkonto";
$a->strings["Two-factor authentication"] = "Zwei-Faktor Authentifizierung";
$a->strings["Profiles"] = "Profile";
@ -679,7 +751,6 @@ $a->strings["Social Networks"] = "Soziale Netzwerke";
$a->strings["Addons"] = "Addons";
$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!";
@ -809,6 +880,7 @@ $a->strings["Publish your default profile in your local site directory?"] = "Dar
$a->strings["Your profile will be published in this node's <a href=\"%s\">local directory</a>. Your profile details may be publicly visible depending on the system settings."] = "Dein Profil wird im <a href=\"%s\">lokalen Verzeichnis</a> dieses Knotens veröffentlicht. Je nach Systemeinstellungen kann es öffentlich auffindbar sein.";
$a->strings["Publish your default profile in the global social directory?"] = "Darf dein Standardprofil im weltweiten Verzeichnis veröffentlicht werden?";
$a->strings["Your profile will be published in the global friendica directories (e.g. <a href=\"%s\">%s</a>). Your profile will be visible in public."] = "Dein Profil wird in den globalen Friendica-Verzeichnissen (z.B. <a href=\"%s\">%s</a>) veröffentlicht. Dein Profil wird öffentlich auffindbar sein.";
$a->strings["This setting also determines whether Friendica will inform search engines that your profile should be indexed or not. Third-party search engines may or may not respect this setting."] = "Diese Einstellung bestimmt auch, ob Friendica Suchmaschinen mitteilt, dass das Profil indiziert werden darf oder nicht. Ob sich Suchmaschinen von Drittanbietern daran halten, kann Friendica nicht beeinflussen.";
$a->strings["Hide your contact/friend list from viewers of your default profile?"] = "Liste der Kontakte vor Betrachtern des Standardprofils verbergen?";
$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"] = "Die Liste deiner Kontakte wird nicht in deinem Standard-Profil angezeigt werden. Du kannst für jedes weitere Profil diese Entscheidung separat einstellen.";
$a->strings["Hide your profile details from anonymous viewers?"] = "Profil-Details vor unbekannten Betrachtern verbergen?";
@ -879,77 +951,6 @@ $a->strings["Change the behaviour of this account for special situations"] = "Ve
$a->strings["Relocate"] = "Umziehen";
$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."] = "Wenn du dein Profil von einem anderen Server umgezogen hast und einige deiner Kontakte deine Beiträge nicht erhalten, verwende diesen Button.";
$a->strings["Resend relocate message to contacts"] = "Umzugsbenachrichtigung erneut an Kontakte senden";
$a->strings["%1\$s is following %2\$s's %3\$s"] = "%1\$s folgt %2\$s %3\$s";
$a->strings["Contact suggestion successfully ignored."] = "Kontaktvorschlag erfolgreich ignoriert.";
$a->strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "Keine Vorschläge verfügbar. Falls der Server frisch aufgesetzt wurde, versuche es bitte in 24 Stunden noch einmal.";
$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["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["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["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["Event can not end before it has started."] = "Die Veranstaltung kann nicht enden, bevor sie beginnt.";
$a->strings["Event title and start time are required."] = "Der Veranstaltungstitel und die Anfangszeit müssen angegeben werden.";
$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["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";
$a->strings["Description:"] = "Beschreibung";
$a->strings["Location:"] = "Ort:";
$a->strings["Title:"] = "Titel:";
$a->strings["Share this event"] = "Veranstaltung teilen";
$a->strings["Basic"] = "Allgemein";
$a->strings["Advanced"] = "Erweitert";
$a->strings["Failed to remove event"] = "Entfernen der Veranstaltung fehlgeschlagen";
$a->strings["Event removed"] = "Veranstaltung enfternt";
$a->strings["Unable to locate original post."] = "Konnte den Originalbeitrag nicht finden.";
$a->strings["Empty post discarded."] = "Leerer Beitrag wurde verworfen.";
$a->strings["This message was sent to you by %s, a member of the Friendica social network."] = "Diese Nachricht wurde dir von %s geschickt, einem Mitglied des Sozialen Netzwerks Friendica.";
$a->strings["You may visit them online at %s"] = "Du kannst sie online unter %s besuchen";
$a->strings["Please contact the sender by replying to this post if you do not wish to receive these messages."] = "Falls du diese Beiträge nicht erhalten möchtest, kontaktiere bitte den Autor, indem du auf diese Nachricht antwortest.";
$a->strings["%s posted an update."] = "%s hat ein Update veröffentlicht.";
$a->strings["Invalid request identifier."] = "Invalid request identifier.";
$a->strings["Notifications"] = "Benachrichtigungen";
$a->strings["Network Notifications"] = "Netzwerkbenachrichtigungen";
$a->strings["System Notifications"] = "Systembenachrichtigungen";
$a->strings["Personal Notifications"] = "Persönliche Benachrichtigungen";
$a->strings["Home Notifications"] = "Pinnwandbenachrichtigungen";
$a->strings["Show unread"] = "Ungelesene anzeigen";
$a->strings["Show all"] = "Alle anzeigen";
$a->strings["Show Ignored Requests"] = "Zeige ignorierte Anfragen";
$a->strings["Hide Ignored Requests"] = "Verberge ignorierte Anfragen";
$a->strings["Notification type:"] = "Art der Benachrichtigung:";
$a->strings["Suggested by:"] = "Vorgeschlagen von:";
$a->strings["Hide this contact from others"] = "Verbirg diesen Kontakt vor Anderen";
$a->strings["Approve"] = "Genehmigen";
$a->strings["Claims to be known to you: "] = "Behauptet, dich zu kennen: ";
$a->strings["yes"] = "ja";
$a->strings["no"] = "nein";
$a->strings["Shall your connection be bidirectional or not?"] = "Soll die Verbindung beidseitig sein oder nicht?";
$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."] = "Akzeptierst du %s als Kontakt, erlaubst du damit das Lesen deiner Beiträge und abonnierst selbst auch die Beiträge von %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."] = "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.";
$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."] = "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.";
$a->strings["Friend"] = "Kontakt";
$a->strings["Sharer"] = "Teilender";
$a->strings["Subscriber"] = "Abonnent";
$a->strings["About:"] = "Über:";
$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["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["default"] = "Standard";
$a->strings["greenzero"] = "greenzero";
$a->strings["purplezero"] = "purplezero";
@ -1030,12 +1031,6 @@ $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["Tuesday"] = "Dienstag";
$a->strings["Wednesday"] = "Mittwoch";
$a->strings["Thursday"] = "Donnerstag";
@ -1173,6 +1168,12 @@ $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["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["Birthday:"] = "Geburtstag:";
$a->strings["YYYY-MM-DD or MM-DD"] = "YYYY-MM-DD oder MM-DD";
$a->strings["never"] = "nie";
@ -1190,13 +1191,6 @@ $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";
@ -1204,6 +1198,13 @@ $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["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["Export"] = "Exportieren";
$a->strings["Export calendar as ical"] = "Kalender als ical exportieren";
$a->strings["Export calendar as csv"] = "Kalender als csv exportieren";
@ -1488,16 +1489,6 @@ $a->strings["Contacts not in any group"] = "Kontakte in keiner Gruppe";
$a->strings["Create a new group"] = "Neue Gruppe erstellen";
$a->strings["Group Name: "] = "Gruppenname:";
$a->strings["Edit groups"] = "Gruppen bearbeiten";
$a->strings["activity"] = "Aktivität";
$a->strings["comment"] = [
0 => "Kommentar",
1 => "Kommentare",
];
$a->strings["post"] = "Beitrag";
$a->strings["Content warning: %s"] = "Inhaltswarnung: %s";
$a->strings["bytes"] = "Byte";
$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["Manage/edit profiles"] = "Profile verwalten/editieren";
@ -1534,6 +1525,16 @@ $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["activity"] = "Aktivität";
$a->strings["comment"] = [
0 => "Kommentar",
1 => "Kommentare",
];
$a->strings["post"] = "Beitrag";
$a->strings["Content warning: %s"] = "Inhaltswarnung: %s";
$a->strings["bytes"] = "Byte";
$a->strings["View on separate page"] = "Auf separater Seite ansehen";
$a->strings["view on separate page"] = "auf separater Seite ansehen";
$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";

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff