Merge branch 'friendica:2022.12-rc' into new_image_presentation

This commit is contained in:
MarekBenjamin 2022-12-08 20:40:58 +01:00 committed by GitHub
commit 75d857c595
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 5182 additions and 4681 deletions

View file

@ -150,6 +150,8 @@ class Router
if ($this->baseRoutesFilepath && !file_exists($this->baseRoutesFilepath)) {
throw new HTTPException\InternalServerErrorException('Routes file path does\'n exist.');
}
$this->parameters = [$this->server];
}
/**
@ -293,18 +295,16 @@ class Router
$dispatcher = new FriendicaGroupCountBased($this->getCachedDispatchData());
$this->parameters = [$this->server];
try {
// Check if the HTTP method is OPTIONS and return the special Options Module with the possible HTTP methods
if ($this->args->getMethod() === static::OPTIONS) {
$this->moduleClass = Options::class;
$this->parameters = ['allowedMethods' => $dispatcher->getOptions($cmd)];
$this->parameters[] = ['AllowedMethods' => $dispatcher->getOptions($cmd)];
} else {
$routeInfo = $dispatcher->dispatch($this->args->getMethod(), $cmd);
if ($routeInfo[0] === Dispatcher::FOUND) {
$this->moduleClass = $routeInfo[1];
$this->parameters[] = $routeInfo[2];
$this->parameters[] = $routeInfo[2];
} else if ($routeInfo[0] === Dispatcher::METHOD_NOT_ALLOWED) {
throw new HTTPException\MethodNotAllowedException($this->l10n->t('Method not allowed for this module. Allowed method(s): %s', implode(', ', $routeInfo[1])));
} else {

View file

@ -68,6 +68,12 @@ class BBCode
const TOP_ANCHOR = '<br class="top-anchor">';
const BOTTOM_ANCHOR = '<br class="button-anchor">';
const PREVIEW_NONE = 0;
const PREVIEW_NO_IMAGE = 1;
const PREVIEW_LARGE = 2;
const PREVIEW_SMALL = 3;
/**
* Fetches attachment data that were generated the old way
*
@ -654,7 +660,7 @@ class BBCode
* @return string
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function convertAttachment(string $text, int $simplehtml = self::INTERNAL, bool $tryoembed = true, array $data = [], int $uriid = 0): string
public static function convertAttachment(string $text, int $simplehtml = self::INTERNAL, bool $tryoembed = true, array $data = [], int $uriid = 0, int $preview_mode = self::PREVIEW_LARGE): string
{
DI::profiler()->startRecording('rendering');
$data = $data ?: self::getAttachmentData($text);
@ -689,12 +695,18 @@ class BBCode
$return = sprintf('<div class="type-%s">', $data['type']);
}
if ($preview_mode == self::PREVIEW_NO_IMAGE) {
unset($data['image']);
unset($data['preview']);
}
if (!empty($data['title']) && !empty($data['url'])) {
$preview_class = $preview_mode == self::PREVIEW_LARGE ? 'attachment-image' : 'attachment-preview';
if (!empty($data['image']) && empty($data['text']) && ($data['type'] == 'photo')) {
$return .= sprintf('<a href="%s" target="_blank" rel="noopener noreferrer"><img src="%s" alt="" title="%s" class="attachment-image" /></a>', $data['url'], self::proxyUrl($data['image'], $simplehtml, $uriid), $data['title']);
$return .= sprintf('<a href="%s" target="_blank" rel="noopener noreferrer"><img src="%s" alt="" title="%s" class="' . $preview_class . '" /></a>', $data['url'], self::proxyUrl($data['image'], $simplehtml, $uriid), $data['title']);
} else {
if (!empty($data['image'])) {
$return .= sprintf('<a href="%s" target="_blank" rel="noopener noreferrer"><img src="%s" alt="" title="%s" class="attachment-image" /></a><br>', $data['url'], self::proxyUrl($data['image'], $simplehtml, $uriid), $data['title']);
$return .= sprintf('<a href="%s" target="_blank" rel="noopener noreferrer"><img src="%s" alt="" title="%s" class="' . $preview_class . '" /></a><br>', $data['url'], self::proxyUrl($data['image'], $simplehtml, $uriid), $data['title']);
} elseif (!empty($data['preview'])) {
$return .= sprintf('<a href="%s" target="_blank" rel="noopener noreferrer"><img src="%s" alt="" title="%s" class="attachment-preview" /></a><br>', $data['url'], self::proxyUrl($data['preview'], $simplehtml, $uriid), $data['title']);
}

View file

@ -222,7 +222,7 @@ class Item
$content_fields['raw-body'] = Post\Media::insertFromBody($item['uri-id'], $content_fields['raw-body']);
$content_fields['raw-body'] = self::setHashtags($content_fields['raw-body']);
Post\Media::insertFromRelevantUrl($item['uri-id'], $content_fields['raw-body']);
Post\Media::insertFromRelevantUrl($item['uri-id'], $content_fields['raw-body'], $fields['body'], $item['author-network']);
Post\Content::update($item['uri-id'], $content_fields);
}
@ -1190,7 +1190,8 @@ class Item
$item['raw-body'] = Post\Media::insertFromBody($item['uri-id'], $item['raw-body']);
$item['raw-body'] = self::setHashtags($item['raw-body']);
Post\Media::insertFromRelevantUrl($item['uri-id'], $item['raw-body']);
$author = Contact::getById($item['author-id'], ['network']);
Post\Media::insertFromRelevantUrl($item['uri-id'], $item['raw-body'], $item['body'], $author['network'] ?? '');
// Check for hashtags in the body and repair or add hashtag links
$item['body'] = self::setHashtags($item['body']);
@ -3007,7 +3008,7 @@ class Item
$item['hashtags'] = $tags['hashtags'];
$item['mentions'] = $tags['mentions'];
$body = $item['body'] ?? '';
$body = $item['body'] = Post\Media::removeFromEndOfBody($item['body'] ?? '');
$fields = ['uri-id', 'uri', 'body', 'title', 'author-name', 'author-link', 'author-avatar', 'guid', 'created', 'plink', 'network', 'has-media', 'quote-uri-id', 'post-type'];
@ -3328,8 +3329,9 @@ class Item
private static function addVisualAttachments(array $attachments, array $item, string $content, bool $shared): string
{
DI::profiler()->startRecording('rendering');
$leading = '';
$leading = '';
$trailing = '';
$images = [];
// @todo In the future we should make a single for the template engine with all media in it. This allows more flexibilty.
foreach ($attachments['visual'] as $attachment) {
@ -3384,19 +3386,19 @@ class Item
if (self::containsLink($item['body'], $src_url)) {
continue;
}
$media = Renderer::replaceMacros(Renderer::getMarkupTemplate('content/image.tpl'), [
'$image' => [
'src' => $src_url,
'preview' => $preview_url,
'attachment' => $attachment,
],
]);
// On Diaspora posts the attached pictures are leading
if ($item['network'] == Protocol::DIASPORA) {
$leading .= $media;
} else {
$trailing .= $media;
}
$images[] = ['src' => $src_url, 'preview' => $preview_url, 'attachment' => $attachment];
}
}
foreach ($images as $image) {
$media = Renderer::replaceMacros(Renderer::getMarkupTemplate('content/image.tpl'), [
'$image' => $image,
]);
// On Diaspora posts the attached pictures are leading
if ($item['network'] == Protocol::DIASPORA) {
$leading .= $media;
} else {
$trailing .= $media;
}
}
@ -3514,7 +3516,10 @@ class Item
}
// @todo Use a template
$rendered = BBCode::convertAttachment('', BBCode::INTERNAL, false, $data, $uriid);
$preview_mode = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'system', 'preview_mode', BBCode::PREVIEW_LARGE);
if ($preview_mode != BBCode::PREVIEW_NONE) {
$rendered = BBCode::convertAttachment('', BBCode::INTERNAL, false, $data, $uriid, $preview_mode);
}
} elseif (!self::containsLink($content, $data['url'], Post\Media::HTML)) {
$rendered = Renderer::replaceMacros(Renderer::getMarkupTemplate('content/link.tpl'), [
'$url' => $data['url'],

View file

@ -66,6 +66,7 @@ class Media
* Insert a post-media record
*
* @param array $media
* @param bool $force
* @return void
*/
public static function insert(array $media, bool $force = false)
@ -229,20 +230,9 @@ class Media
}
if ($media['type'] == self::HTML) {
$data = ParseUrl::getSiteinfoCached($media['url'], false);
$media['preview'] = $data['images'][0]['src'] ?? null;
$media['preview-height'] = $data['images'][0]['height'] ?? null;
$media['preview-width'] = $data['images'][0]['width'] ?? null;
$media['blurhash'] = $data['images'][0]['blurhash'] ?? null;
$media['description'] = $data['text'] ?? null;
$media['name'] = $data['title'] ?? null;
$media['author-url'] = $data['author_url'] ?? null;
$media['author-name'] = $data['author_name'] ?? null;
$media['author-image'] = $data['author_img'] ?? null;
$media['publisher-url'] = $data['publisher_url'] ?? null;
$media['publisher-name'] = $data['publisher_name'] ?? null;
$media['publisher-image'] = $data['publisher_img'] ?? null;
$media = self::addPage($media);
}
return $media;
}
@ -345,6 +335,31 @@ class Media
return $media;
}
/**
* Add page infos for HTML entries
*
* @param array $media
* @return array
*/
private static function addPage(array $media): array
{
$data = ParseUrl::getSiteinfoCached($media['url'], false);
$media['preview'] = $data['images'][0]['src'] ?? null;
$media['preview-height'] = $data['images'][0]['height'] ?? null;
$media['preview-width'] = $data['images'][0]['width'] ?? null;
$media['blurhash'] = $data['images'][0]['blurhash'] ?? null;
$media['description'] = $data['text'] ?? null;
$media['name'] = $data['title'] ?? null;
$media['author-url'] = $data['author_url'] ?? null;
$media['author-name'] = $data['author_name'] ?? null;
$media['author-image'] = $data['author_img'] ?? null;
$media['publisher-url'] = $data['publisher_url'] ?? null;
$media['publisher-name'] = $data['publisher_name'] ?? null;
$media['publisher-image'] = $data['publisher_img'] ?? null;
return $media;
}
/**
* Fetch media data from local resources
* @param array $media
@ -446,13 +461,14 @@ class Media
* @param string $body
* @return string Body without media links
*/
public static function insertFromBody(int $uriid, string $body): string
public static function insertFromBody(int $uriid, string $body, bool $endmatch = false): string
{
$endmatchpattern = $endmatch ? '\z' : '';
// Simplify image codes
$unshared_body = $body = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '[img]$3[/img]', $body);
$unshared_body = $body = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]$endmatchpattern/ism", '[img]$3[/img]', $body);
$attachments = [];
if (preg_match_all("#\[url=([^\]]+?)\]\s*\[img=([^\[\]]*)\]([^\[\]]*)\[\/img\]\s*\[/url\]#ism", $body, $pictures, PREG_SET_ORDER)) {
if (preg_match_all("#\[url=([^\]]+?)\]\s*\[img=([^\[\]]*)\]([^\[\]]*)\[\/img\]\s*\[/url\]$endmatchpattern#ism", $body, $pictures, PREG_SET_ORDER)) {
foreach ($pictures as $picture) {
if (!self::isPictureLink($picture[1], $picture[2])) {
continue;
@ -464,14 +480,14 @@ class Media
}
}
if (preg_match_all("/\[img=([^\[\]]*)\]([^\[\]]*)\[\/img\]/Usi", $body, $pictures, PREG_SET_ORDER)) {
if (preg_match_all("/\[img=([^\[\]]*)\]([^\[\]]*)\[\/img\]$endmatchpattern/Usi", $body, $pictures, PREG_SET_ORDER)) {
foreach ($pictures as $picture) {
$body = str_replace($picture[0], '', $body);
$attachments[$picture[1]] = ['uri-id' => $uriid, 'type' => self::IMAGE, 'url' => $picture[1], 'description' => $picture[2]];
}
}
if (preg_match_all("#\[url=([^\]]+?)\]\s*\[img\]([^\[]+?)\[/img\]\s*\[/url\]#ism", $body, $pictures, PREG_SET_ORDER)) {
if (preg_match_all("#\[url=([^\]]+?)\]\s*\[img\]([^\[]+?)\[/img\]\s*\[/url\]$endmatchpattern#ism", $body, $pictures, PREG_SET_ORDER)) {
foreach ($pictures as $picture) {
if (!self::isPictureLink($picture[1], $picture[2])) {
continue;
@ -483,41 +499,58 @@ class Media
}
}
if (preg_match_all("/\[img\]([^\[\]]*)\[\/img\]/ism", $body, $pictures, PREG_SET_ORDER)) {
if (preg_match_all("/\[img\]([^\[\]]*)\[\/img\]$endmatchpattern/ism", $body, $pictures, PREG_SET_ORDER)) {
foreach ($pictures as $picture) {
$body = str_replace($picture[0], '', $body);
$attachments[$picture[1]] = ['uri-id' => $uriid, 'type' => self::IMAGE, 'url' => $picture[1]];
}
}
if (preg_match_all("/\[audio\]([^\[\]]*)\[\/audio\]/ism", $body, $audios, PREG_SET_ORDER)) {
if (preg_match_all("/\[audio\]([^\[\]]*)\[\/audio\]$endmatchpattern/ism", $body, $audios, PREG_SET_ORDER)) {
foreach ($audios as $audio) {
$body = str_replace($audio[0], '', $body);
$attachments[$audio[1]] = ['uri-id' => $uriid, 'type' => self::AUDIO, 'url' => $audio[1]];
}
}
if (preg_match_all("/\[video\]([^\[\]]*)\[\/video\]/ism", $body, $videos, PREG_SET_ORDER)) {
if (preg_match_all("/\[video\]([^\[\]]*)\[\/video\]$endmatchpattern/ism", $body, $videos, PREG_SET_ORDER)) {
foreach ($videos as $video) {
$body = str_replace($video[0], '', $body);
$attachments[$video[1]] = ['uri-id' => $uriid, 'type' => self::VIDEO, 'url' => $video[1]];
}
}
foreach ($attachments as $attachment) {
if (Post\Link::exists($uriid, $attachment['preview'] ?? $attachment['url'])) {
continue;
}
if ($uriid != 0) {
foreach ($attachments as $attachment) {
if (Post\Link::exists($uriid, $attachment['preview'] ?? $attachment['url'])) {
continue;
}
// Only store attachments that are part of the unshared body
if (Item::containsLink($unshared_body, $attachment['preview'] ?? $attachment['url'], $attachment['type'])) {
self::insert($attachment);
// Only store attachments that are part of the unshared body
if (Item::containsLink($unshared_body, $attachment['preview'] ?? $attachment['url'], $attachment['type'])) {
self::insert($attachment);
}
}
}
return trim($body);
}
/**
* Remove media that is at the end of the body
*
* @param string $body
* @return string
*/
public static function removeFromEndOfBody(string $body): string
{
do {
$prebody = $body;
$body = self::insertFromBody(0, $body, true);
} while ($prebody != $body);
return $body;
}
/**
* Add media links from a relevant url in the body
*
@ -525,7 +558,7 @@ class Media
* @param string $body
* @return void
*/
public static function insertFromRelevantUrl(int $uriid, string $body)
public static function insertFromRelevantUrl(int $uriid, string $body, string $fullbody, string $network)
{
// Remove all hashtags and mentions
$body = preg_replace("/([#@!])\[url\=(.*?)\](.*?)\[\/url\]/ism", '', $body);
@ -534,7 +567,10 @@ class Media
if (preg_match_all("/\[url\](https?:.*?)\[\/url\]/ism", $body, $matches)) {
foreach ($matches[1] as $url) {
Logger::info('Got page url (link without description)', ['uri-id' => $uriid, 'url' => $url]);
self::insert(['uri-id' => $uriid, 'type' => self::UNKNOWN, 'url' => $url]);
self::insert(['uri-id' => $uriid, 'type' => self::UNKNOWN, 'url' => $url], false, $network);
if ($network == Protocol::DFRN) {
self::revertHTMLType($uriid, $url, $fullbody);
}
}
}
@ -542,11 +578,31 @@ class Media
if (preg_match_all("/\[url\=(https?:.*?)\].*?\[\/url\]/ism", $body, $matches)) {
foreach ($matches[1] as $url) {
Logger::info('Got page url (link with description)', ['uri-id' => $uriid, 'url' => $url]);
self::insert(['uri-id' => $uriid, 'type' => self::UNKNOWN, 'url' => $url]);
self::insert(['uri-id' => $uriid, 'type' => self::UNKNOWN, 'url' => $url], false, $network);
if ($network == Protocol::DFRN) {
self::revertHTMLType($uriid, $url, $fullbody);
}
}
}
}
/**
* Revert the media type of links to UNKNOWN for DFRN posts when they aren't attached
*
* @param integer $uriid
* @param string $url
* @param string $body
* @return void
*/
private static function revertHTMLType(int $uriid, string $url, string $body)
{
$attachment = BBCode::getAttachmentData($body);
if (!empty($attachment['url']) && Network::getUrlMatch($attachment['url'], $url)) {
return;
}
DBA::update('post-media', ['type' => self::UNKNOWN], ['uri-id' => $uriid, 'type' => self::HTML, 'url' => $url]);
}
/**
* Add media links from the attachment field
*
@ -615,7 +671,7 @@ class Media
*/
public static function getByURIId(int $uri_id, array $types = [])
{
$condition = ['uri-id' => $uri_id];
$condition = ["`uri-id` = ? AND `type` != ?", $uri_id, self::UNKNOWN];
if (!empty($types)) {
$condition = DBA::mergeConditions($condition, ['type' => $types]);
@ -634,7 +690,7 @@ class Media
*/
public static function existsByURIId(int $uri_id, array $types = []): bool
{
$condition = ['uri-id' => $uri_id];
$condition = ["`uri-id` = ? AND `type` != ?", $uri_id, self::UNKNOWN];
if (!empty($types)) {
$condition = DBA::mergeConditions($condition, ['type' => $types]);

View file

@ -21,7 +21,9 @@
namespace Friendica\Module\Settings;
use Friendica\Content\Text\BBCode;
use Friendica\Core\Hook;
use Friendica\Core\Logger;
use Friendica\Core\Renderer;
use Friendica\Core\Theme;
use Friendica\Database\DBA;
@ -55,6 +57,7 @@ class Display extends BaseSettings
$enable_dislike = !empty($_POST['enable_dislike']) ? intval($_POST['enable_dislike']) : 0;
$display_resharer = !empty($_POST['display_resharer']) ? intval($_POST['display_resharer']) : 0;
$stay_local = !empty($_POST['stay_local']) ? intval($_POST['stay_local']) : 0;
$preview_mode = !empty($_POST['preview_mode']) ? intval($_POST['preview_mode']) : 0;
$browser_update = !empty($_POST['browser_update']) ? intval($_POST['browser_update']) : 0;
if ($browser_update != -1) {
$browser_update = $browser_update * 1000;
@ -91,6 +94,7 @@ class Display extends BaseSettings
DI::pConfig()->set(DI::userSession()->getLocalUserId(), 'system', 'display_resharer' , $display_resharer);
DI::pConfig()->set(DI::userSession()->getLocalUserId(), 'system', 'stay_local' , $stay_local);
DI::pConfig()->set(DI::userSession()->getLocalUserId(), 'system', 'first_day_of_week' , $first_day_of_week);
DI::pConfig()->set(DI::userSession()->getLocalUserId(), 'system', 'preview_mode' , $preview_mode);
if (in_array($theme, Theme::getAllowedList())) {
if ($theme == $user['theme']) {
@ -175,7 +179,7 @@ class Display extends BaseSettings
$enable_dislike = !DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'system', 'hide_dislike', 0);
$display_resharer = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'system', 'display_resharer', 0);
$stay_local = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'system', 'stay_local', 0);
$preview_mode = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'system', 'preview_mode', BBCode::PREVIEW_LARGE);
$first_day_of_week = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'system', 'first_day_of_week', 0);
$weekdays = [
@ -188,6 +192,13 @@ class Display extends BaseSettings
6 => DI::l10n()->t("Saturday")
];
$preview_modes = [
BBCode::PREVIEW_NONE => DI::l10n()->t('No preview'),
BBCode::PREVIEW_NO_IMAGE => DI::l10n()->t('No image'),
BBCode::PREVIEW_SMALL => DI::l10n()->t('Small Image'),
BBCode::PREVIEW_LARGE => DI::l10n()->t('Large Image'),
];
$theme_config = '';
if ($themeconfigfile = Theme::getConfigFile($theme_selected)) {
require_once $themeconfigfile;
@ -222,6 +233,7 @@ class Display extends BaseSettings
'$enable_dislike' => ['enable_dislike' , DI::l10n()->t('Display the Dislike feature'), $enable_dislike, DI::l10n()->t('Display the Dislike button and dislike reactions on posts and comments.')],
'$display_resharer' => ['display_resharer' , DI::l10n()->t('Display the resharer'), $display_resharer, DI::l10n()->t('Display the first resharer as icon and text on a reshared item.')],
'$stay_local' => ['stay_local' , DI::l10n()->t('Stay local'), $stay_local, DI::l10n()->t("Don't go to a remote system when following a contact link.")],
'$preview_mode' => ['preview_mode' , DI::l10n()->t('Link preview mode'), $preview_mode, 'Appearance of the link preview that is added to each post with a link.', $preview_modes, false],
'$first_day_of_week' => ['first_day_of_week', DI::l10n()->t('Beginning of week:'), $first_day_of_week, '', $weekdays, false],
]);

View file

@ -734,6 +734,9 @@ class Image
public function getBlurHash(): string
{
$image = New Image($this->asString());
if (empty($image)) {
return '';
}
$width = $image->getWidth();
$height = $image->getHeight();
@ -749,7 +752,11 @@ class Image
$row = [];
for ($x = 0; $x < $width; ++$x) {
if ($image->isImagick()) {
$colors = $image->image->getImagePixelColor($x, $y)->getColor();
try {
$colors = $image->image->getImagePixelColor($x, $y)->getColor();
} catch (\Throwable $th) {
return '';
}
$row[] = [$colors['r'], $colors['g'], $colors['b']];
} else {
$index = imagecolorat($image->image, $x, $y);

View file

@ -711,7 +711,7 @@ class DFRN
*/
private static function getAttachment($doc, $root, array $item)
{
foreach (Post\Media::getByURIId($item['uri-id'], [Post\Media::DOCUMENT, Post\Media::TORRENT, Post\Media::UNKNOWN]) as $attachment) {
foreach (Post\Media::getByURIId($item['uri-id'], [Post\Media::DOCUMENT, Post\Media::TORRENT]) as $attachment) {
$attributes = ['rel' => 'enclosure',
'href' => $attachment['url'],
'type' => $attachment['mimetype']];

View file

@ -499,7 +499,7 @@ class Diaspora
}
if (!($fields = self::validPosting($msg))) {
Logger::warning('Invalid posting');
Logger::warning('Invalid posting', ['msg' => $msg]);
return false;
}
@ -534,7 +534,7 @@ class Diaspora
if (is_null($fields)) {
$private = true;
if (!($fields = self::validPosting($msg))) {
Logger::warning('Invalid posting');
Logger::warning('Invalid posting', ['msg' => $msg]);
return false;
}
} else {
@ -3387,7 +3387,7 @@ class Diaspora
$body = '### ' . html_entity_decode($title) . "\n\n" . $body;
}
$attachments = Post\Media::getByURIId($item['uri-id'], [Post\Media::DOCUMENT, Post\Media::TORRENT, Post\Media::UNKNOWN]);
$attachments = Post\Media::getByURIId($item['uri-id'], [Post\Media::DOCUMENT, Post\Media::TORRENT]);
if (!empty($attachments)) {
$body .= "\n[hr]\n";
foreach ($attachments as $attachment) {

View file

@ -1186,7 +1186,7 @@ class OStatus
}
}
foreach (Post\Media::getByURIId($item['uri-id'], [Post\Media::DOCUMENT, Post\Media::TORRENT, Post\Media::UNKNOWN]) as $attachment) {
foreach (Post\Media::getByURIId($item['uri-id'], [Post\Media::DOCUMENT, Post\Media::TORRENT]) as $attachment) {
$attributes = ['rel' => 'enclosure',
'href' => $attachment['url'],
'type' => $attachment['mimetype']];

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 2022.12-rc\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-12-04 06:41-0500\n"
"POT-Creation-Date: 2022-12-07 07:12+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -47,7 +47,7 @@ msgstr ""
#: src/Module/Register.php:245 src/Module/Search/Directory.php:37
#: src/Module/Settings/Account.php:50 src/Module/Settings/Account.php:407
#: src/Module/Settings/Delegation.php:41 src/Module/Settings/Delegation.php:69
#: src/Module/Settings/Display.php:41 src/Module/Settings/Display.php:119
#: src/Module/Settings/Display.php:43 src/Module/Settings/Display.php:123
#: src/Module/Settings/Profile/Photo/Crop.php:165
#: src/Module/Settings/Profile/Photo/Index.php:111
#: src/Module/Settings/RemoveMe.php:117 src/Module/Settings/UserExport.php:80
@ -858,7 +858,7 @@ msgstr ""
msgid "Enter user nickname: "
msgstr ""
#: src/Console/User.php:182 src/Model/User.php:661
#: src/Console/User.php:182 src/Model/User.php:662
#: src/Module/Api/Twitter/ContactEndpoint.php:74
#: src/Module/Moderation/Users/Active.php:71
#: src/Module/Moderation/Users/Blocked.php:71
@ -1670,7 +1670,7 @@ msgstr ""
#: src/Content/Nav.php:197 src/Content/Nav.php:257
#: src/Module/BaseProfile.php:85 src/Module/BaseProfile.php:88
#: src/Module/BaseProfile.php:96 src/Module/BaseProfile.php:99
#: src/Module/Settings/Display.php:205 view/theme/frio/theme.php:242
#: src/Module/Settings/Display.php:216 view/theme/frio/theme.php:242
#: view/theme/frio/theme.php:246
msgid "Calendar"
msgstr ""
@ -1909,39 +1909,39 @@ msgstr ""
msgid "last"
msgstr ""
#: src/Content/Text/BBCode.php:1003 src/Content/Text/BBCode.php:1865
#: src/Content/Text/BBCode.php:1866
#: src/Content/Text/BBCode.php:1015 src/Content/Text/BBCode.php:1877
#: src/Content/Text/BBCode.php:1878
msgid "Image/photo"
msgstr ""
#: src/Content/Text/BBCode.php:1220
#: src/Content/Text/BBCode.php:1232
#, php-format
msgid ""
"<a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">%2$s</a> %3$s"
msgstr ""
#: src/Content/Text/BBCode.php:1245 src/Model/Item.php:3536
#: src/Model/Item.php:3542 src/Model/Item.php:3543
#: src/Content/Text/BBCode.php:1257 src/Model/Item.php:3539
#: src/Model/Item.php:3545 src/Model/Item.php:3546
msgid "Link to source"
msgstr ""
#: src/Content/Text/BBCode.php:1783 src/Content/Text/HTML.php:940
#: src/Content/Text/BBCode.php:1795 src/Content/Text/HTML.php:940
msgid "Click to open/close"
msgstr ""
#: src/Content/Text/BBCode.php:1814
#: src/Content/Text/BBCode.php:1826
msgid "$1 wrote:"
msgstr ""
#: src/Content/Text/BBCode.php:1870 src/Content/Text/BBCode.php:1871
#: src/Content/Text/BBCode.php:1882 src/Content/Text/BBCode.php:1883
msgid "Encrypted content"
msgstr ""
#: src/Content/Text/BBCode.php:2098
#: src/Content/Text/BBCode.php:2110
msgid "Invalid source protocol"
msgstr ""
#: src/Content/Text/BBCode.php:2113
#: src/Content/Text/BBCode.php:2125
msgid "Invalid link protocol"
msgstr ""
@ -2542,37 +2542,37 @@ msgid "Could not connect to database."
msgstr ""
#: src/Core/L10n.php:403 src/Model/Event.php:430
#: src/Module/Settings/Display.php:183
#: src/Module/Settings/Display.php:187
msgid "Monday"
msgstr ""
#: src/Core/L10n.php:403 src/Model/Event.php:431
#: src/Module/Settings/Display.php:184
#: src/Module/Settings/Display.php:188
msgid "Tuesday"
msgstr ""
#: src/Core/L10n.php:403 src/Model/Event.php:432
#: src/Module/Settings/Display.php:185
#: src/Module/Settings/Display.php:189
msgid "Wednesday"
msgstr ""
#: src/Core/L10n.php:403 src/Model/Event.php:433
#: src/Module/Settings/Display.php:186
#: src/Module/Settings/Display.php:190
msgid "Thursday"
msgstr ""
#: src/Core/L10n.php:403 src/Model/Event.php:434
#: src/Module/Settings/Display.php:187
#: src/Module/Settings/Display.php:191
msgid "Friday"
msgstr ""
#: src/Core/L10n.php:403 src/Model/Event.php:435
#: src/Module/Settings/Display.php:188
#: src/Module/Settings/Display.php:192
msgid "Saturday"
msgstr ""
#: src/Core/L10n.php:403 src/Model/Event.php:429
#: src/Module/Settings/Display.php:182
#: src/Module/Settings/Display.php:186
msgid "Sunday"
msgstr ""
@ -2874,63 +2874,63 @@ msgstr ""
msgid "Forum"
msgstr ""
#: src/Model/Contact.php:2831
#: src/Model/Contact.php:2849
msgid "Disallowed profile URL."
msgstr ""
#: src/Model/Contact.php:2836 src/Module/Friendica.php:82
#: src/Model/Contact.php:2854 src/Module/Friendica.php:82
msgid "Blocked domain"
msgstr ""
#: src/Model/Contact.php:2841
#: src/Model/Contact.php:2859
msgid "Connect URL missing."
msgstr ""
#: src/Model/Contact.php:2850
#: src/Model/Contact.php:2868
msgid ""
"The contact could not be added. Please check the relevant network "
"credentials in your Settings -> Social Networks page."
msgstr ""
#: src/Model/Contact.php:2892
#: src/Model/Contact.php:2910
msgid "The profile address specified does not provide adequate information."
msgstr ""
#: src/Model/Contact.php:2894
#: src/Model/Contact.php:2912
msgid "No compatible communication protocols or feeds were discovered."
msgstr ""
#: src/Model/Contact.php:2897
#: src/Model/Contact.php:2915
msgid "An author or name was not found."
msgstr ""
#: src/Model/Contact.php:2900
#: src/Model/Contact.php:2918
msgid "No browser URL could be matched to this address."
msgstr ""
#: src/Model/Contact.php:2903
#: src/Model/Contact.php:2921
msgid ""
"Unable to match @-style Identity Address with a known protocol or email "
"contact."
msgstr ""
#: src/Model/Contact.php:2904
#: src/Model/Contact.php:2922
msgid "Use mailto: in front of address to force email check."
msgstr ""
#: src/Model/Contact.php:2910
#: src/Model/Contact.php:2928
msgid ""
"The profile address specified belongs to a network which has been disabled "
"on this site."
msgstr ""
#: src/Model/Contact.php:2915
#: src/Model/Contact.php:2933
msgid ""
"Limited profile. This person will be unable to receive direct/personal "
"notifications from you."
msgstr ""
#: src/Model/Contact.php:2974
#: src/Model/Contact.php:2992
msgid "Unable to retrieve contact information."
msgstr ""
@ -3100,44 +3100,44 @@ msgstr ""
msgid "Content warning: %s"
msgstr ""
#: src/Model/Item.php:3448
#: src/Model/Item.php:3451
msgid "bytes"
msgstr ""
#: src/Model/Item.php:3479
#: src/Model/Item.php:3482
#, php-format
msgid "%2$s (%3$d%%, %1$d vote)"
msgid_plural "%2$s (%3$d%%, %1$d votes)"
msgstr[0] ""
msgstr[1] ""
#: src/Model/Item.php:3481
#: src/Model/Item.php:3484
#, php-format
msgid "%2$s (%1$d vote)"
msgid_plural "%2$s (%1$d votes)"
msgstr[0] ""
msgstr[1] ""
#: src/Model/Item.php:3486
#: src/Model/Item.php:3489
#, php-format
msgid "%d voter. Poll end: %s"
msgid_plural "%d voters. Poll end: %s"
msgstr[0] ""
msgstr[1] ""
#: src/Model/Item.php:3488
#: src/Model/Item.php:3491
#, php-format
msgid "%d voter."
msgid_plural "%d voters."
msgstr[0] ""
msgstr[1] ""
#: src/Model/Item.php:3490
#: src/Model/Item.php:3493
#, php-format
msgid "Poll end: %s"
msgstr ""
#: src/Model/Item.php:3524 src/Model/Item.php:3525
#: src/Model/Item.php:3527 src/Model/Item.php:3528
msgid "View on separate page"
msgstr ""
@ -3145,7 +3145,7 @@ msgstr ""
msgid "[no subject]"
msgstr ""
#: src/Model/Photo.php:1145 src/Module/Media/Photo/Upload.php:198
#: src/Model/Photo.php:1152 src/Module/Media/Photo/Upload.php:198
msgid "Wall Photos"
msgstr ""
@ -3294,146 +3294,146 @@ msgstr ""
msgid "Contact information and Social Networks"
msgstr ""
#: src/Model/User.php:212 src/Model/User.php:1102
#: src/Model/User.php:213 src/Model/User.php:1103
msgid "SERIOUS ERROR: Generation of security keys failed."
msgstr ""
#: src/Model/User.php:570 src/Model/User.php:603
#: src/Model/User.php:571 src/Model/User.php:604
msgid "Login failed"
msgstr ""
#: src/Model/User.php:635
#: src/Model/User.php:636
msgid "Not enough information to authenticate"
msgstr ""
#: src/Model/User.php:752
#: src/Model/User.php:753
msgid "Password can't be empty"
msgstr ""
#: src/Model/User.php:794
#: src/Model/User.php:795
msgid "Empty passwords are not allowed."
msgstr ""
#: src/Model/User.php:798
#: src/Model/User.php:799
msgid ""
"The new password has been exposed in a public data dump, please choose "
"another."
msgstr ""
#: src/Model/User.php:802
#: src/Model/User.php:803
msgid "The password length is limited to 72 characters."
msgstr ""
#: src/Model/User.php:806
#: src/Model/User.php:807
msgid ""
"The password can't contain accentuated letters, white spaces or colons (:)"
msgstr ""
#: src/Model/User.php:985
#: src/Model/User.php:986
msgid "Passwords do not match. Password unchanged."
msgstr ""
#: src/Model/User.php:992
#: src/Model/User.php:993
msgid "An invitation is required."
msgstr ""
#: src/Model/User.php:996
#: src/Model/User.php:997
msgid "Invitation could not be verified."
msgstr ""
#: src/Model/User.php:1004
#: src/Model/User.php:1005
msgid "Invalid OpenID url"
msgstr ""
#: src/Model/User.php:1017 src/Security/Authentication.php:241
#: src/Model/User.php:1018 src/Security/Authentication.php:241
msgid ""
"We encountered a problem while logging in with the OpenID you provided. "
"Please check the correct spelling of the ID."
msgstr ""
#: src/Model/User.php:1017 src/Security/Authentication.php:241
#: src/Model/User.php:1018 src/Security/Authentication.php:241
msgid "The error message was:"
msgstr ""
#: src/Model/User.php:1023
#: src/Model/User.php:1024
msgid "Please enter the required information."
msgstr ""
#: src/Model/User.php:1037
#: src/Model/User.php:1038
#, php-format
msgid ""
"system.username_min_length (%s) and system.username_max_length (%s) are "
"excluding each other, swapping values."
msgstr ""
#: src/Model/User.php:1044
#: src/Model/User.php:1045
#, php-format
msgid "Username should be at least %s character."
msgid_plural "Username should be at least %s characters."
msgstr[0] ""
msgstr[1] ""
#: src/Model/User.php:1048
#: src/Model/User.php:1049
#, php-format
msgid "Username should be at most %s character."
msgid_plural "Username should be at most %s characters."
msgstr[0] ""
msgstr[1] ""
#: src/Model/User.php:1056
#: src/Model/User.php:1057
msgid "That doesn't appear to be your full (First Last) name."
msgstr ""
#: src/Model/User.php:1061
#: src/Model/User.php:1062
msgid "Your email domain is not among those allowed on this site."
msgstr ""
#: src/Model/User.php:1065
#: src/Model/User.php:1066
msgid "Not a valid email address."
msgstr ""
#: src/Model/User.php:1068
#: src/Model/User.php:1069
msgid "The nickname was blocked from registration by the nodes admin."
msgstr ""
#: src/Model/User.php:1072 src/Model/User.php:1078
#: src/Model/User.php:1073 src/Model/User.php:1079
msgid "Cannot use that email."
msgstr ""
#: src/Model/User.php:1084
#: src/Model/User.php:1085
msgid "Your nickname can only contain a-z, 0-9 and _."
msgstr ""
#: src/Model/User.php:1092 src/Model/User.php:1149
#: src/Model/User.php:1093 src/Model/User.php:1150
msgid "Nickname is already registered. Please choose another."
msgstr ""
#: src/Model/User.php:1136 src/Model/User.php:1140
#: src/Model/User.php:1137 src/Model/User.php:1141
msgid "An error occurred during registration. Please try again."
msgstr ""
#: src/Model/User.php:1163
#: src/Model/User.php:1164
msgid "An error occurred creating your default profile. Please try again."
msgstr ""
#: src/Model/User.php:1170
#: src/Model/User.php:1171
msgid "An error occurred creating your self contact. Please try again."
msgstr ""
#: src/Model/User.php:1175
#: src/Model/User.php:1176
msgid "Friends"
msgstr ""
#: src/Model/User.php:1179
#: src/Model/User.php:1180
msgid ""
"An error occurred creating your default contact group. Please try again."
msgstr ""
#: src/Model/User.php:1218
#: src/Model/User.php:1219
msgid "Profile Photos"
msgstr ""
#: src/Model/User.php:1411
#: src/Model/User.php:1412
#, php-format
msgid ""
"\n"
@ -3441,7 +3441,7 @@ msgid ""
"\t\t\tthe administrator of %2$s has set up an account for you."
msgstr ""
#: src/Model/User.php:1414
#: src/Model/User.php:1415
#, php-format
msgid ""
"\n"
@ -3479,12 +3479,12 @@ msgid ""
"\t\tThank you and welcome to %4$s."
msgstr ""
#: src/Model/User.php:1447 src/Model/User.php:1554
#: src/Model/User.php:1448 src/Model/User.php:1555
#, php-format
msgid "Registration details for %s"
msgstr ""
#: src/Model/User.php:1467
#: src/Model/User.php:1468
#, php-format
msgid ""
"\n"
@ -3500,12 +3500,12 @@ msgid ""
"\t\t"
msgstr ""
#: src/Model/User.php:1486
#: src/Model/User.php:1487
#, php-format
msgid "Registration at %s"
msgstr ""
#: src/Model/User.php:1510
#: src/Model/User.php:1511
#, php-format
msgid ""
"\n"
@ -3514,7 +3514,7 @@ msgid ""
"\t\t\t"
msgstr ""
#: src/Model/User.php:1518
#: src/Model/User.php:1519
#, php-format
msgid ""
"\n"
@ -3623,7 +3623,7 @@ msgstr ""
#: src/Module/Settings/Account.php:560 src/Module/Settings/Addons.php:81
#: src/Module/Settings/Connectors.php:159
#: src/Module/Settings/Connectors.php:244
#: src/Module/Settings/Delegation.php:169 src/Module/Settings/Display.php:200
#: src/Module/Settings/Delegation.php:169 src/Module/Settings/Display.php:211
#: src/Module/Settings/Features.php:76
msgid "Save Settings"
msgstr ""
@ -3975,11 +3975,11 @@ msgstr ""
msgid "%s is no valid input for maximum image size"
msgstr ""
#: src/Module/Admin/Site.php:342 src/Module/Settings/Display.php:137
#: src/Module/Admin/Site.php:342 src/Module/Settings/Display.php:141
msgid "No special theme for mobile devices"
msgstr ""
#: src/Module/Admin/Site.php:359 src/Module/Settings/Display.php:147
#: src/Module/Admin/Site.php:359 src/Module/Settings/Display.php:151
#, php-format
msgid "%s - (Experimental)"
msgstr ""
@ -8120,12 +8120,12 @@ msgstr ""
msgid "The Photo with id %s is not available."
msgstr ""
#: src/Module/Photo.php:174
#: src/Module/Photo.php:178
#, php-format
msgid "Invalid external resource with url %s."
msgstr ""
#: src/Module/Photo.php:176
#: src/Module/Photo.php:180
#, php-format
msgid "Invalid photo with id %s."
msgstr ""
@ -9529,125 +9529,145 @@ msgstr ""
msgid "No entries."
msgstr ""
#: src/Module/Settings/Display.php:106
#: src/Module/Settings/Display.php:110
msgid "The theme you chose isn't available."
msgstr ""
#: src/Module/Settings/Display.php:145
#: src/Module/Settings/Display.php:149
#, php-format
msgid "%s - (Unsupported)"
msgstr ""
#: src/Module/Settings/Display.php:196
msgid "No preview"
msgstr ""
#: src/Module/Settings/Display.php:197
msgid "No image"
msgstr ""
#: src/Module/Settings/Display.php:198
msgid "Small Image"
msgstr ""
#: src/Module/Settings/Display.php:199
msgid "Large Image"
msgstr ""
#: src/Module/Settings/Display.php:210
msgid "Display Settings"
msgstr ""
#: src/Module/Settings/Display.php:201
#: src/Module/Settings/Display.php:212
msgid "General Theme Settings"
msgstr ""
#: src/Module/Settings/Display.php:202
#: src/Module/Settings/Display.php:213
msgid "Custom Theme Settings"
msgstr ""
#: src/Module/Settings/Display.php:203
#: src/Module/Settings/Display.php:214
msgid "Content Settings"
msgstr ""
#: src/Module/Settings/Display.php:204 view/theme/duepuntozero/config.php:86
#: src/Module/Settings/Display.php:215 view/theme/duepuntozero/config.php:86
#: view/theme/frio/config.php:172 view/theme/quattro/config.php:88
#: view/theme/vier/config.php:136
msgid "Theme settings"
msgstr ""
#: src/Module/Settings/Display.php:211
#: src/Module/Settings/Display.php:222
msgid "Display Theme:"
msgstr ""
#: src/Module/Settings/Display.php:212
#: src/Module/Settings/Display.php:223
msgid "Mobile Theme:"
msgstr ""
#: src/Module/Settings/Display.php:215
#: src/Module/Settings/Display.php:226
msgid "Number of items to display per page:"
msgstr ""
#: src/Module/Settings/Display.php:215 src/Module/Settings/Display.php:216
#: src/Module/Settings/Display.php:226 src/Module/Settings/Display.php:227
msgid "Maximum of 100 items"
msgstr ""
#: src/Module/Settings/Display.php:216
#: src/Module/Settings/Display.php:227
msgid "Number of items to display per page when viewed from mobile device:"
msgstr ""
#: src/Module/Settings/Display.php:217
#: src/Module/Settings/Display.php:228
msgid "Update browser every xx seconds"
msgstr ""
#: src/Module/Settings/Display.php:217
#: src/Module/Settings/Display.php:228
msgid "Minimum of 10 seconds. Enter -1 to disable it."
msgstr ""
#: src/Module/Settings/Display.php:218
#: src/Module/Settings/Display.php:229
msgid "Automatic updates only at the top of the post stream pages"
msgstr ""
#: src/Module/Settings/Display.php:218
#: src/Module/Settings/Display.php:229
msgid ""
"Auto update may add new posts at the top of the post stream pages, which can "
"affect the scroll position and perturb normal reading if it happens anywhere "
"else the top of the page."
msgstr ""
#: src/Module/Settings/Display.php:219
#: src/Module/Settings/Display.php:230
msgid "Display emoticons"
msgstr ""
#: src/Module/Settings/Display.php:219
#: src/Module/Settings/Display.php:230
msgid "When enabled, emoticons are replaced with matching symbols."
msgstr ""
#: src/Module/Settings/Display.php:220
#: src/Module/Settings/Display.php:231
msgid "Infinite scroll"
msgstr ""
#: src/Module/Settings/Display.php:220
#: src/Module/Settings/Display.php:231
msgid "Automatic fetch new items when reaching the page end."
msgstr ""
#: src/Module/Settings/Display.php:221
#: src/Module/Settings/Display.php:232
msgid "Enable Smart Threading"
msgstr ""
#: src/Module/Settings/Display.php:221
#: src/Module/Settings/Display.php:232
msgid "Enable the automatic suppression of extraneous thread indentation."
msgstr ""
#: src/Module/Settings/Display.php:222
#: src/Module/Settings/Display.php:233
msgid "Display the Dislike feature"
msgstr ""
#: src/Module/Settings/Display.php:222
#: src/Module/Settings/Display.php:233
msgid "Display the Dislike button and dislike reactions on posts and comments."
msgstr ""
#: src/Module/Settings/Display.php:223
#: src/Module/Settings/Display.php:234
msgid "Display the resharer"
msgstr ""
#: src/Module/Settings/Display.php:223
#: src/Module/Settings/Display.php:234
msgid "Display the first resharer as icon and text on a reshared item."
msgstr ""
#: src/Module/Settings/Display.php:224
#: src/Module/Settings/Display.php:235
msgid "Stay local"
msgstr ""
#: src/Module/Settings/Display.php:224
#: src/Module/Settings/Display.php:235
msgid "Don't go to a remote system when following a contact link."
msgstr ""
#: src/Module/Settings/Display.php:226
#: src/Module/Settings/Display.php:236
msgid "Link preview mode"
msgstr ""
#: src/Module/Settings/Display.php:238
msgid "Beginning of week:"
msgstr ""
@ -11330,7 +11350,7 @@ msgstr ""
msgid "%1$d %2$s ago"
msgstr ""
#: src/Worker/Delivery.php:534
#: src/Worker/Delivery.php:533
msgid "(no subject)"
msgstr ""

File diff suppressed because it is too large Load diff

View file

@ -147,16 +147,9 @@ $a->strings['Album was empty.'] = 'Album ist leer.';
$a->strings['Failed to delete the photo.'] = 'Das Foto konnte nicht gelöscht werden.';
$a->strings['a photo'] = 'einem Foto';
$a->strings['%1$s was tagged in %2$s by %3$s'] = '%1$s wurde von %3$s in %2$s getaggt';
$a->strings['Image exceeds size limit of %s'] = 'Bildgröße überschreitet das Limit von %s';
$a->strings['Image upload didn\'t complete, please try again'] = 'Der Upload des Bildes war nicht vollständig. Bitte versuche es erneut.';
$a->strings['Image file is missing'] = 'Bilddatei konnte nicht gefunden werden.';
$a->strings['Server can\'t accept new file upload at this time, please contact your administrator'] = 'Der Server kann derzeit keine neuen Datei-Uploads akzeptieren. Bitte kontaktiere deinen Administrator.';
$a->strings['Image file is empty.'] = 'Bilddatei ist leer.';
$a->strings['Unable to process image.'] = 'Konnte das Bild nicht bearbeiten.';
$a->strings['Image upload failed.'] = 'Hochladen des Bildes gescheitert.';
$a->strings['Public access denied.'] = 'Öffentlicher Zugriff verweigert.';
$a->strings['No photos selected'] = 'Keine Bilder ausgewählt';
$a->strings['Access to this item is restricted.'] = 'Zugriff zu diesem Eintrag wurde eingeschränkt.';
$a->strings['The maximum accepted image size is %s'] = 'Die maximale erlaubte Größe von Bildern beträgt %s';
$a->strings['Upload Photos'] = 'Bilder hochladen';
$a->strings['New album name: '] = 'Name des neuen Albums: ';
$a->strings['or select existing album:'] = 'oder wähle ein bestehendes Album:';
@ -385,6 +378,9 @@ $a->strings['Tag Cloud'] = 'Schlagwortwolke';
$a->strings['Provide a personal tag cloud on your profile page'] = 'Wortwolke aus den von dir verwendeten Schlagwörtern im Profil anzeigen';
$a->strings['Display Membership Date'] = 'Mitgliedschaftsdatum anzeigen';
$a->strings['Display membership date in profile'] = 'Das Datum der Registrierung deines Accounts im Profil anzeigen';
$a->strings['Advanced Calendar Settings'] = 'Erweiterte Kalender Einstellungen';
$a->strings['Allow anonymous access to your calendar'] = 'Erlaube anonymen Zugriff auf deinen Kalender';
$a->strings['Allows anonymous visitors to consult your calendar and your public events. Contact birthday events are private to you.'] = 'Anonyme Besucher können deinen Kalender öffnen und dort deine öffentliche Ereignisse einsehen. Geburtstage deiner Kontakte sind nicht öffentlich.';
$a->strings['Forums'] = 'Foren';
$a->strings['External link to forum'] = 'Externer Link zum Forum';
$a->strings['show less'] = 'weniger anzeigen';
@ -1083,6 +1079,7 @@ $a->strings['Command'] = 'Befehl';
$a->strings['Job Parameters'] = 'Parameter der Aufgabe';
$a->strings['Created'] = 'Erstellt';
$a->strings['Priority'] = 'Priorität';
$a->strings['%s is no valid input for maximum image size'] = '%s ist keine gültige Angabe der maximalen Größe von Bildern';
$a->strings['No special theme for mobile devices'] = 'Kein spezielles Theme für mobile Geräte verwenden.';
$a->strings['%s - (Experimental)'] = '%s - (Experimentell)';
$a->strings['No community page'] = 'Keine Gemeinschaftsseite';
@ -1147,7 +1144,11 @@ $a->strings['Displays the menu entry for the Help pages from the navigation menu
$a->strings['Single user instance'] = 'Ein-Nutzer Instanz';
$a->strings['Make this instance multi-user or single-user for the named user'] = 'Bestimmt, ob es sich bei dieser Instanz um eine Installation mit nur einen Nutzer oder mit mehreren Nutzern handelt.';
$a->strings['Maximum image size'] = 'Maximale Bildgröße';
$a->strings['Maximum size in bytes of uploaded images. Default is 0, which means no limits. Be aware that this setting does not affect server-side upload limits.'] = 'Maximal akzeptierte Dateigröße in Bytes eines hochzuladenden Bilds. Der Standard ist 0 und entspricht keiner Beschränkung der Dateigröße. Beachte, dass diese Einstellung nicht die serverseitigen Beschränkungen von Dateigrößen beeinflusst.';
$a->strings['Maximum size in bytes of uploaded images. Default is 0, which means no limits. You can put k, m, or g behind the desired value for KiB, MiB, GiB, respectively.
The value of <code>upload_max_filesize</code> in your <code>PHP.ini</code> needs be set to at least the desired limit.
Currently <code>upload_max_filesize</code> is set to %s (%sB)'] = 'Die maximale Größe von Bildern in Bytes. Grundeinstellung ist 0, welches keine Limitierung durch die Bildgröße bedeutet. Du kannst k, m oder g als Abkürzung hinter der Zahl angeben um KiB, MIB oder GiB zu definieren.
Der Wert der <code>1upload_max_filesize1</code> Variable in der <code>php.ini</code> Datei muss diesem Limit mindestens entsprechen.
Derzeit ist <code>3upload_max_filesize3</code> auf %s (%sB) gesetzt.';
$a->strings['Maximum image length'] = 'Maximale Bildlänge';
$a->strings['Maximum length in pixels of the longest side of uploaded images. Default is -1, which means no limits.'] = 'Maximale Länge in Pixeln der längsten Seite eines hochgeladenen Bildes. Grundeinstellung ist -1, was keine Einschränkung bedeutet.';
$a->strings['JPEG image quality'] = 'Qualität des JPEG Bildes';
@ -1331,6 +1332,8 @@ $a->strings['Show some informations regarding the needed information to operate
$a->strings['Privacy Statement Preview'] = 'Vorschau: Datenschutzerklärung';
$a->strings['The Terms of Service'] = 'Die Nutzungsbedingungen';
$a->strings['Enter the Terms of Service for your node here. You can use BBCode. Headers of sections should be [h2] and below.'] = 'Füge hier die Nutzungsbedingungen deines Knotens ein. Du kannst BBCode zur Formatierung verwenden. Überschriften sollten [h2] oder darunter sein.';
$a->strings['The rules'] = 'Die Regeln';
$a->strings['Enter your system rules here. Each line represents one rule.'] = 'Gib die Regeln deines Server hier ein. Jede Zeile steht für eine Regel.';
$a->strings['API endpoint %s %s is not implemented'] = 'API Endpunkt %s %s ist nicht implementiert';
$a->strings['The API endpoint is currently not implemented but might be in the future.'] = 'The API endpoint is currently not implemented but might be in the future.';
$a->strings['Missing parameters'] = 'Fehlende Parameter';
@ -1410,8 +1413,9 @@ $a->strings['Event Starts:'] = 'Veranstaltungsbeginn:';
$a->strings['Required'] = 'Benötigt';
$a->strings['Finish date/time is not known or not relevant'] = 'Enddatum/-zeit ist nicht bekannt oder nicht relevant';
$a->strings['Event Finishes:'] = 'Veranstaltungsende:';
$a->strings['Description:'] = 'Beschreibung';
$a->strings['Title:'] = 'Titel:';
$a->strings['Title (BBCode not allowed)'] = 'Titel (BBCode nicht erlaubt)';
$a->strings['Description (BBCode allowed)'] = 'Beschreibung (BBCode erlaubt)';
$a->strings['Location (BBCode not allowed)'] = 'Ort (BBCode nicht erlaubt)';
$a->strings['Share this event'] = 'Veranstaltung teilen';
$a->strings['Basic'] = 'Allgemein';
$a->strings['This calendar format is not supported'] = 'Dieses Kalenderformat wird nicht unterstützt.';
@ -1803,6 +1807,9 @@ $a->strings['Sorry, maybe your upload is bigger than the PHP configuration allow
$a->strings['Or - did you try to upload an empty file?'] = 'Oder - hast du versucht, eine leere Datei hochzuladen?';
$a->strings['File exceeds size limit of %s'] = 'Die Datei ist größer als das erlaubte Limit von %s';
$a->strings['File upload failed.'] = 'Hochladen der Datei fehlgeschlagen.';
$a->strings['Unable to process image.'] = 'Konnte das Bild nicht bearbeiten.';
$a->strings['Image exceeds size limit of %s'] = 'Bildgröße überschreitet das Limit von %s';
$a->strings['Image upload failed.'] = 'Hochladen des Bildes gescheitert.';
$a->strings['List of all users'] = 'Liste aller Benutzerkonten';
$a->strings['Active'] = 'Aktive';
$a->strings['List of active accounts'] = 'Liste der aktiven Benutzerkonten';
@ -2059,6 +2066,10 @@ $a->strings['Remove Item Tag'] = 'Gegenstands-Tag entfernen';
$a->strings['Select a tag to remove: '] = 'Wähle ein Tag zum Entfernen aus: ';
$a->strings['Remove'] = 'Entfernen';
$a->strings['No contacts.'] = 'Keine Kontakte.';
$a->strings['Image upload didn\'t complete, please try again'] = 'Der Upload des Bildes war nicht vollständig. Bitte versuche es erneut.';
$a->strings['Image file is missing'] = 'Bilddatei konnte nicht gefunden werden.';
$a->strings['Server can\'t accept new file upload at this time, please contact your administrator'] = 'Der Server kann derzeit keine neuen Datei-Uploads akzeptieren. Bitte kontaktiere deinen Administrator.';
$a->strings['Image file is empty.'] = 'Bilddatei ist leer.';
$a->strings['View Album'] = 'Album betrachten';
$a->strings['Profile not found.'] = 'Profil nicht gefunden.';
$a->strings['You\'re currently viewing your profile as <b>%s</b> <a href="%s" class="btn btn-sm pull-right">Cancel</a>'] = 'Du betrachtest dein Profil gerade als <b>%s</b> <a href="%s" class="btn btn-sm pull-right">Abbrechen</a>';
@ -2072,6 +2083,7 @@ $a->strings['%d year old'] = [
0 => '%d Jahr alt',
1 => '%d Jahre alt',
];
$a->strings['Description:'] = 'Beschreibung';
$a->strings['Forums:'] = 'Foren:';
$a->strings['View profile as:'] = 'Das Profil aus der Sicht von jemandem anderen betrachten:';
$a->strings['View as'] = 'Betrachten als';
@ -2086,6 +2098,8 @@ $a->strings['Friend/Connection Request'] = 'Kontaktanfrage';
$a->strings['Enter your Webfinger address (user@domain.tld) or profile URL here. If this isn\'t supported by your system, you have to subscribe to <strong>%s</strong> or <strong>%s</strong> directly on your system.'] = 'Gib entweder deine Webfinger- (user@domain.tld) oder die Profil-Adresse an. Wenn dies von deinem System nicht unterstützt wird, folge bitte <strong>%s</strong> oder <strong>%s</strong> direkt von deinem System. ';
$a->strings['If you are not yet a member of the free social web, <a href="%s">follow this link to find a public Friendica node and join us today</a>.'] = 'Solltest du das freie Soziale Netzwerk noch nicht benutzen, kannst du <a href="%s">diesem Link folgen</a> um eine öffentliche Friendica Instanz zu finden um noch heute dem Netzwerk beizutreten.';
$a->strings['Your Webfinger address or profile URL:'] = 'Deine Webfinger Adresse oder Profil-URL';
$a->strings['Restricted profile'] = 'Eingeschränktes Profil';
$a->strings['This profile has been restricted which prevents access to their public content from anonymous visitors.'] = 'Das Profil wurde eingeschränkt, dies verhindert den Zugriff auf öffentliche Beiträge durch anonyme Besucher des Profils.';
$a->strings['Scheduled'] = 'Zeitplan';
$a->strings['Content'] = 'Inhalt';
$a->strings['Remove post'] = 'Beitrag entfernen';
@ -2238,8 +2252,8 @@ $a->strings['Allow your profile to be searchable globally?'] = 'Darf dein Profil
$a->strings['Activate this setting if you want others to easily find and follow you. Your profile will be searchable on remote systems. This setting also determines whether Friendica will inform search engines that your profile should be indexed or not.'] = 'Aktiviere diese Einstellung, wenn du von anderen einfach gefunden und gefolgt werden möchtest. Dei Profil wird dann auf anderen Systemen leicht durchsuchbar. Außerdem regelt diese Einstellung ob Friendica Suchmaschinen mitteilen soll, ob dein Profil indiziert werden soll oder nicht.';
$a->strings['Hide your contact/friend list from viewers of your profile?'] = 'Liste der Kontakte vor Betrachtern des Profil verbergen?';
$a->strings['A list of your contacts is displayed on your profile page. Activate this option to disable the display of your contact list.'] = 'Auf deiner Profilseite wird eine Liste deiner Kontakte angezeigt. Aktiviere diese Option wenn du das nicht möchtest.';
$a->strings['Hide your profile details from anonymous viewers?'] = 'Profil-Details vor unbekannten Betrachtern verbergen?';
$a->strings['Anonymous visitors will only see your profile picture, your display name and the nickname you are using on your profile page. Your public posts and replies will still be accessible by other means.'] = 'Anonyme Besucher deines Profils werden ausschließlich dein Profilbild, deinen Namen sowie deinen Spitznamen sehen. Deine öffentlichen Beiträge und Kommentare werden weiterhin sichtbar sein.';
$a->strings['Hide your public content from anonymous viewers'] = 'Verbirg die öffentliche Inhalte vor anonymen Besuchern';
$a->strings['Anonymous visitors will only see your basic profile details. Your public posts and replies will still be freely accessible on the remote servers of your followers and through relays.'] = 'Anonyme Besucher deines Profils werden nur grundlegende Informationen angezeigt bekommen. Deine öffentlichen Beiträge und Kommentare werden weiterhin frei zugänglich auf den Servern deiner Kontakte und über Relays sein.';
$a->strings['Make public posts unlisted'] = 'Öffentliche Beiträge nicht listen';
$a->strings['Your public posts will not appear on the community pages or in search results, nor be sent to relay servers. However they can still appear on public feeds on remote servers.'] = 'Deine öffentlichen Beiträge werden nicht auf der Gemeinschaftsseite oder in den Suchergebnissen erscheinen, außerdem werden sie nicht an Relay-Server geschickt. Sie werden aber weiterhin in allen öffentlichen Feeds, auch auf entfernten Servern, erscheinen.';
$a->strings['Make all posted pictures accessible'] = 'Alle geposteten Bilder zugreifbar machen';
@ -2355,6 +2369,10 @@ $a->strings['Add'] = 'Hinzufügen';
$a->strings['No entries.'] = 'Keine Einträge.';
$a->strings['The theme you chose isn\'t available.'] = 'Das gewählte Theme ist nicht verfügbar';
$a->strings['%s - (Unsupported)'] = '%s - (Nicht unterstützt)';
$a->strings['No preview'] = 'Keine Vorschau';
$a->strings['No image'] = 'Kein Bild';
$a->strings['Small Image'] = 'Kleines Bild';
$a->strings['Large Image'] = 'Große Bilder';
$a->strings['Display Settings'] = 'Anzeige-Einstellungen';
$a->strings['General Theme Settings'] = 'Allgemeine Theme-Einstellungen';
$a->strings['Custom Theme Settings'] = 'Benutzerdefinierte Theme-Einstellungen';
@ -2381,6 +2399,7 @@ $a->strings['Display the resharer'] = 'Teilenden anzeigen';
$a->strings['Display the first resharer as icon and text on a reshared item.'] = 'Zeige das Profilbild des ersten Kontakts von dem ein Beitrag geteilt wurde.';
$a->strings['Stay local'] = 'Bleib lokal';
$a->strings['Don\'t go to a remote system when following a contact link.'] = 'Gehe nicht zu einem Remote-System, wenn einem Kontaktlink gefolgt wird';
$a->strings['Link preview mode'] = 'Vorschau Modus für Links';
$a->strings['Beginning of week:'] = 'Wochenbeginn:';
$a->strings['Additional Features'] = 'Zusätzliche Features';
$a->strings['Connected Apps'] = 'Verbundene Programme';
@ -2552,6 +2571,7 @@ Die E-Mail-Adresse wird nur zur Benachrichtigung des Nutzers verwendet, sie wird
$a->strings['This data is required for communication and is passed on to the nodes of the communication partners and is stored there. Users can enter additional private data that may be transmitted to the communication partners accounts.'] = 'Diese Daten sind für die Kommunikation notwendig und werden an die Knoten der Kommunikationspartner übermittelt und dort gespeichert. Nutzer können weitere, private Angaben machen, die ebenfalls an die verwendeten Server der Kommunikationspartner übermittelt werden können.';
$a->strings['At any point in time a logged in user can export their account data from the <a href="%1$s/settings/userexport">account settings</a>. If the user wants to delete their account they can do so at <a href="%1$s/settings/removeme">%1$s/settings/removeme</a>. The deletion of the account will be permanent. Deletion of the data will also be requested from the nodes of the communication partners.'] = 'Angemeldete Nutzer können ihre Nutzerdaten jederzeit von den <a href="%1$s/settings/userexport">Kontoeinstellungen</a> aus exportieren. Wenn ein Nutzer wünscht das Nutzerkonto zu löschen, so ist dies jederzeit unter <a href="%1$s/settings/removeme">%1$s/settings/removeme</a> möglich. Die Löschung des Nutzerkontos ist permanent. Die Löschung der Daten wird auch von den Knoten der Kommunikationspartner angefordert.';
$a->strings['Privacy Statement'] = 'Datenschutzerklärung';
$a->strings['Rules'] = 'Regeln';
$a->strings['Parameter uri_id is missing.'] = 'Der Parameter uri_id fehlt.';
$a->strings['User imports on closed servers can only be done by an administrator.'] = 'Auf geschlossenen Servern können ausschließlich die Administratoren Benutzerkonten importieren.';
$a->strings['Move account'] = 'Account umziehen';

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -20,6 +20,7 @@
{{include file="field_checkbox.tpl" field=$enable_dislike}}
{{include file="field_checkbox.tpl" field=$display_resharer}}
{{include file="field_checkbox.tpl" field=$stay_local}}
{{include file="field_select.tpl" field=$preview_mode}}
<h2>{{$calendar_title}}</h2>
{{include file="field_select.tpl" field=$first_day_of_week}}

View file

@ -67,6 +67,7 @@
{{include file="field_checkbox.tpl" field=$enable_dislike}}
{{include file="field_checkbox.tpl" field=$display_resharer}}
{{include file="field_checkbox.tpl" field=$stay_local}}
{{include file="field_select.tpl" field=$preview_mode}}
</div>
<div class="panel-footer">
<button type="submit" name="submit" class="btn btn-primary" value="{{$submit}}">{{$submit}}</button>