diff --git a/classes/db/api.php b/classes/db/api.php new file mode 100644 index 000000000..9be04cff9 --- /dev/null +++ b/classes/db/api.php @@ -0,0 +1,888 @@ +wrap(self::STATUS_ERR, array("error" => 'NOT_LOGGED_IN')); + return false; + } + + if ($_SESSION["uid"] && $method != "logout" && !get_pref('ENABLE_API_ACCESS')) { + $this->wrap(self::STATUS_ERR, array("error" => 'API_DISABLED')); + return false; + } + + $this->seq = (int) $_REQUEST['seq']; + + return true; + } + return false; + } + + function wrap($status, $reply) { + print json_encode(array("seq" => $this->seq, + "status" => $status, + "content" => $reply)); + } + + function getVersion() { + $rv = array("version" => VERSION); + $this->wrap(self::STATUS_OK, $rv); + } + + function getApiLevel() { + $rv = array("level" => self::API_LEVEL); + $this->wrap(self::STATUS_OK, $rv); + } + + function login() { + @session_destroy(); + @session_start(); + + $login = $this->dbh->escape_string($_REQUEST["user"]); + $password = $_REQUEST["password"]; + $password_base64 = base64_decode($_REQUEST["password"]); + + if (SINGLE_USER_MODE) $login = "admin"; + + $result = $this->dbh->query("SELECT id FROM ttrss_users WHERE login = '$login'"); + + if ($this->dbh->num_rows($result) != 0) { + $uid = $this->dbh->fetch_result($result, 0, "id"); + } else { + $uid = 0; + } + + if (!$uid) { + $this->wrap(self::STATUS_ERR, array("error" => "LOGIN_ERROR")); + return; + } + + if (get_pref("ENABLE_API_ACCESS", $uid)) { + if (authenticate_user($login, $password)) { // try login with normal password + $this->wrap(self::STATUS_OK, array("session_id" => session_id(), + "api_level" => self::API_LEVEL)); + } else if (authenticate_user($login, $password_base64)) { // else try with base64_decoded password + $this->wrap(self::STATUS_OK, array("session_id" => session_id(), + "api_level" => self::API_LEVEL)); + } else { // else we are not logged in + user_error("Failed login attempt for $login from {$_SERVER['REMOTE_ADDR']}", E_USER_WARNING); + $this->wrap(self::STATUS_ERR, array("error" => "LOGIN_ERROR")); + } + } else { + $this->wrap(self::STATUS_ERR, array("error" => "API_DISABLED")); + } + + } + + function logout() { + logout_user(); + $this->wrap(self::STATUS_OK, array("status" => "OK")); + } + + function isLoggedIn() { + $this->wrap(self::STATUS_OK, array("status" => $_SESSION["uid"] != '')); + } + + function getUnread() { + $feed_id = $this->dbh->escape_string($_REQUEST["feed_id"]); + $is_cat = $this->dbh->escape_string($_REQUEST["is_cat"]); + + if ($feed_id) { + $this->wrap(self::STATUS_OK, array("unread" => getFeedUnread($feed_id, $is_cat))); + } else { + $this->wrap(self::STATUS_OK, array("unread" => getGlobalUnread())); + } + } + + /* Method added for ttrss-reader for Android */ + function getCounters() { + $this->wrap(self::STATUS_OK, getAllCounters()); + } + + function getFeeds() { + $cat_id = $this->dbh->escape_string($_REQUEST["cat_id"]); + $unread_only = sql_bool_to_bool($_REQUEST["unread_only"]); + $limit = (int) $this->dbh->escape_string($_REQUEST["limit"]); + $offset = (int) $this->dbh->escape_string($_REQUEST["offset"]); + $include_nested = sql_bool_to_bool($_REQUEST["include_nested"]); + + $feeds = $this->api_get_feeds($cat_id, $unread_only, $limit, $offset, $include_nested); + + $this->wrap(self::STATUS_OK, $feeds); + } + + function getCategories() { + $unread_only = sql_bool_to_bool($_REQUEST["unread_only"]); + $enable_nested = sql_bool_to_bool($_REQUEST["enable_nested"]); + $include_empty = sql_bool_to_bool($_REQUEST['include_empty']); + + // TODO do not return empty categories, return Uncategorized and standard virtual cats + + if ($enable_nested) + $nested_qpart = "parent_cat IS NULL"; + else + $nested_qpart = "true"; + + $result = $this->dbh->query("SELECT + id, title, order_id, (SELECT COUNT(id) FROM + ttrss_feeds WHERE + ttrss_feed_categories.id IS NOT NULL AND cat_id = ttrss_feed_categories.id) AS num_feeds, + (SELECT COUNT(id) FROM + ttrss_feed_categories AS c2 WHERE + c2.parent_cat = ttrss_feed_categories.id) AS num_cats + FROM ttrss_feed_categories + WHERE $nested_qpart AND owner_uid = " . + $_SESSION["uid"]); + + $cats = array(); + + while ($line = $this->dbh->fetch_assoc($result)) { + if ($include_empty || $line["num_feeds"] > 0 || $line["num_cats"] > 0) { + $unread = getFeedUnread($line["id"], true); + + if ($enable_nested) + $unread += getCategoryChildrenUnread($line["id"]); + + if ($unread || !$unread_only) { + array_push($cats, array("id" => $line["id"], + "title" => $line["title"], + "unread" => $unread, + "order_id" => (int) $line["order_id"], + )); + } + } + } + + foreach (array(-2,-1,0) as $cat_id) { + if ($include_empty || !$this->isCategoryEmpty($cat_id)) { + $unread = getFeedUnread($cat_id, true); + + if ($unread || !$unread_only) { + array_push($cats, array("id" => $cat_id, + "title" => getCategoryTitle($cat_id), + "unread" => $unread)); + } + } + } + + $this->wrap(self::STATUS_OK, $cats); + } + + function getHeadlines() { + $feed_id = $this->dbh->escape_string($_REQUEST["feed_id"]); + if ($feed_id != "") { + + if (is_numeric($feed_id)) $feed_id = (int) $feed_id; + + $limit = (int)$this->dbh->escape_string($_REQUEST["limit"]); + + if (!$limit || $limit >= 200) $limit = 200; + + $offset = (int)$this->dbh->escape_string($_REQUEST["skip"]); + $filter = $this->dbh->escape_string($_REQUEST["filter"]); + $is_cat = sql_bool_to_bool($_REQUEST["is_cat"]); + $show_excerpt = sql_bool_to_bool($_REQUEST["show_excerpt"]); + $show_content = sql_bool_to_bool($_REQUEST["show_content"]); + /* all_articles, unread, adaptive, marked, updated */ + $view_mode = $this->dbh->escape_string($_REQUEST["view_mode"]); + $include_attachments = sql_bool_to_bool($_REQUEST["include_attachments"]); + $since_id = (int)$this->dbh->escape_string($_REQUEST["since_id"]); + $include_nested = sql_bool_to_bool($_REQUEST["include_nested"]); + $sanitize_content = !isset($_REQUEST["sanitize"]) || + sql_bool_to_bool($_REQUEST["sanitize"]); + $force_update = sql_bool_to_bool($_REQUEST["force_update"]); + $has_sandbox = sql_bool_to_bool($_REQUEST["has_sandbox"]); + $excerpt_length = (int)$this->dbh->escape_string($_REQUEST["excerpt_length"]); + $check_first_id = (int)$this->dbh->escape_string($_REQUEST["check_first_id"]); + $include_header = sql_bool_to_bool($_REQUEST["include_header"]); + + $_SESSION['hasSandbox'] = $has_sandbox; + + $skip_first_id_check = false; + + $override_order = false; + switch ($_REQUEST["order_by"]) { + case "title": + $override_order = "ttrss_entries.title"; + break; + case "date_reverse": + $override_order = "score DESC, date_entered, updated"; + $skip_first_id_check = true; + break; + case "feed_dates": + $override_order = "updated DESC"; + break; + } + + /* do not rely on params below */ + + $search = $this->dbh->escape_string($_REQUEST["search"]); + + list($headlines, $headlines_header) = $this->api_get_headlines($feed_id, $limit, $offset, + $filter, $is_cat, $show_excerpt, $show_content, $view_mode, $override_order, + $include_attachments, $since_id, $search, + $include_nested, $sanitize_content, $force_update, $excerpt_length, $check_first_id, $skip_first_id_check); + + if ($include_header) { + $this->wrap(self::STATUS_OK, array($headlines_header, $headlines)); + } else { + $this->wrap(self::STATUS_OK, $headlines); + } + } else { + $this->wrap(self::STATUS_ERR, array("error" => 'INCORRECT_USAGE')); + } + } + + function updateArticle() { + $article_ids = array_filter(explode(",", $this->dbh->escape_string($_REQUEST["article_ids"])), is_numeric); + $mode = (int) $this->dbh->escape_string($_REQUEST["mode"]); + $data = $this->dbh->escape_string($_REQUEST["data"]); + $field_raw = (int)$this->dbh->escape_string($_REQUEST["field"]); + + $field = ""; + $set_to = ""; + + switch ($field_raw) { + case 0: + $field = "marked"; + $additional_fields = ",last_marked = NOW()"; + break; + case 1: + $field = "published"; + $additional_fields = ",last_published = NOW()"; + break; + case 2: + $field = "unread"; + $additional_fields = ",last_read = NOW()"; + break; + case 3: + $field = "note"; + }; + + switch ($mode) { + case 1: + $set_to = "true"; + break; + case 0: + $set_to = "false"; + break; + case 2: + $set_to = "NOT $field"; + break; + } + + if ($field == "note") $set_to = "'$data'"; + + if ($field && $set_to && count($article_ids) > 0) { + + $article_ids = join(", ", $article_ids); + + $result = $this->dbh->query("UPDATE ttrss_user_entries SET $field = $set_to $additional_fields WHERE ref_id IN ($article_ids) AND owner_uid = " . $_SESSION["uid"]); + + $num_updated = $this->dbh->affected_rows($result); + + if ($num_updated > 0 && $field == "unread") { + $result = $this->dbh->query("SELECT DISTINCT feed_id FROM ttrss_user_entries + WHERE ref_id IN ($article_ids)"); + + while ($line = $this->dbh->fetch_assoc($result)) { + ccache_update($line["feed_id"], $_SESSION["uid"]); + } + } + + if ($num_updated > 0 && $field == "published") { + if (PUBSUBHUBBUB_HUB) { + $rss_link = get_self_url_prefix() . + "/public.php?op=rss&id=-2&key=" . + get_feed_access_key(-2, false); + + $p = new Publisher(PUBSUBHUBBUB_HUB); + $pubsub_result = $p->publish_update($rss_link); + } + } + + $this->wrap(self::STATUS_OK, array("status" => "OK", + "updated" => $num_updated)); + + } else { + $this->wrap(self::STATUS_ERR, array("error" => 'INCORRECT_USAGE')); + } + + } + + function getArticle() { + + $article_id = join(",", array_filter(explode(",", $this->dbh->escape_string($_REQUEST["article_id"])), is_numeric)); + $sanitize_content = !isset($_REQUEST["sanitize"]) || + sql_bool_to_bool($_REQUEST["sanitize"]); + + if ($article_id) { + + $query = "SELECT id,title,link,content,feed_id,comments,int_id, + marked,unread,published,score,note,lang, + ".SUBSTRING_FOR_DATE."(updated,1,16) as updated, + author,(SELECT title FROM ttrss_feeds WHERE id = feed_id) AS feed_title, + (SELECT site_url FROM ttrss_feeds WHERE id = feed_id) AS site_url, + (SELECT hide_images FROM ttrss_feeds WHERE id = feed_id) AS hide_images + FROM ttrss_entries,ttrss_user_entries + WHERE id IN ($article_id) AND ref_id = id AND owner_uid = " . + $_SESSION["uid"] ; + + $result = $this->dbh->query($query); + + $articles = array(); + + if ($this->dbh->num_rows($result) != 0) { + + while ($line = $this->dbh->fetch_assoc($result)) { + + $attachments = get_article_enclosures($line['id']); + + $article = array( + "id" => $line["id"], + "title" => $line["title"], + "link" => $line["link"], + "labels" => get_article_labels($line['id']), + "unread" => sql_bool_to_bool($line["unread"]), + "marked" => sql_bool_to_bool($line["marked"]), + "published" => sql_bool_to_bool($line["published"]), + "comments" => $line["comments"], + "author" => $line["author"], + "updated" => (int) strtotime($line["updated"]), + "feed_id" => $line["feed_id"], + "attachments" => $attachments, + "score" => (int)$line["score"], + "feed_title" => $line["feed_title"], + "note" => $line["note"], + "lang" => $line["lang"] + ); + + if ($sanitize_content) { + $article["content"] = sanitize( + $line["content"], + sql_bool_to_bool($line['hide_images']), + false, $line["site_url"], false, $line["id"]); + } else { + $article["content"] = $line["content"]; + } + + foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_RENDER_ARTICLE_API) as $p) { + $article = $p->hook_render_article_api(array("article" => $article)); + } + + + array_push($articles, $article); + + } + } + + $this->wrap(self::STATUS_OK, $articles); + } else { + $this->wrap(self::STATUS_ERR, array("error" => 'INCORRECT_USAGE')); + } + } + + function getConfig() { + $config = array( + "icons_dir" => ICONS_DIR, + "icons_url" => ICONS_URL); + + $config["daemon_is_running"] = file_is_locked("update_daemon.lock"); + + $result = $this->dbh->query("SELECT COUNT(*) AS cf FROM + ttrss_feeds WHERE owner_uid = " . $_SESSION["uid"]); + + $num_feeds = $this->dbh->fetch_result($result, 0, "cf"); + + $config["num_feeds"] = (int)$num_feeds; + + $this->wrap(self::STATUS_OK, $config); + } + + function updateFeed() { + require_once "include/rssfuncs.php"; + + $feed_id = (int) $this->dbh->escape_string($_REQUEST["feed_id"]); + + if (!ini_get("open_basedir")) { + update_rss_feed($feed_id, true); + } + + $this->wrap(self::STATUS_OK, array("status" => "OK")); + } + + function catchupFeed() { + $feed_id = $this->dbh->escape_string($_REQUEST["feed_id"]); + $is_cat = $this->dbh->escape_string($_REQUEST["is_cat"]); + + catchup_feed($feed_id, $is_cat); + + $this->wrap(self::STATUS_OK, array("status" => "OK")); + } + + function getPref() { + $pref_name = $this->dbh->escape_string($_REQUEST["pref_name"]); + + $this->wrap(self::STATUS_OK, array("value" => get_pref($pref_name))); + } + + function getLabels() { + //$article_ids = array_filter(explode(",", $this->dbh->escape_string($_REQUEST["article_ids"])), is_numeric); + + $article_id = (int)$_REQUEST['article_id']; + + $rv = array(); + + $result = $this->dbh->query("SELECT id, caption, fg_color, bg_color + FROM ttrss_labels2 + WHERE owner_uid = '".$_SESSION['uid']."' ORDER BY caption"); + + if ($article_id) + $article_labels = get_article_labels($article_id); + else + $article_labels = array(); + + while ($line = $this->dbh->fetch_assoc($result)) { + + $checked = false; + foreach ($article_labels as $al) { + if (feed_to_label_id($al[0]) == $line['id']) { + $checked = true; + break; + } + } + + array_push($rv, array( + "id" => (int)label_to_feed_id($line['id']), + "caption" => $line['caption'], + "fg_color" => $line['fg_color'], + "bg_color" => $line['bg_color'], + "checked" => $checked)); + } + + $this->wrap(self::STATUS_OK, $rv); + } + + function setArticleLabel() { + + $article_ids = array_filter(explode(",", $this->dbh->escape_string($_REQUEST["article_ids"])), is_numeric); + $label_id = (int) $this->dbh->escape_string($_REQUEST['label_id']); + $assign = (bool) $this->dbh->escape_string($_REQUEST['assign']) == "true"; + + $label = $this->dbh->escape_string(label_find_caption( + feed_to_label_id($label_id), $_SESSION["uid"])); + + $num_updated = 0; + + if ($label) { + + foreach ($article_ids as $id) { + + if ($assign) + label_add_article($id, $label, $_SESSION["uid"]); + else + label_remove_article($id, $label, $_SESSION["uid"]); + + ++$num_updated; + + } + } + + $this->wrap(self::STATUS_OK, array("status" => "OK", + "updated" => $num_updated)); + + } + + function index($method) { + $plugin = PluginHost::getInstance()->get_api_method(strtolower($method)); + + if ($plugin && method_exists($plugin, $method)) { + $reply = $plugin->$method(); + + $this->wrap($reply[0], $reply[1]); + + } else { + $this->wrap(self::STATUS_ERR, array("error" => 'UNKNOWN_METHOD', "method" => $method)); + } + } + + function shareToPublished() { + $title = $this->dbh->escape_string(strip_tags($_REQUEST["title"])); + $url = $this->dbh->escape_string(strip_tags($_REQUEST["url"])); + $content = $this->dbh->escape_string(strip_tags($_REQUEST["content"])); + + if (Article::create_published_article($title, $url, $content, "", $_SESSION["uid"])) { + $this->wrap(self::STATUS_OK, array("status" => 'OK')); + } else { + $this->wrap(self::STATUS_ERR, array("error" => 'Publishing failed')); + } + } + + static function api_get_feeds($cat_id, $unread_only, $limit, $offset, $include_nested = false) { + + $feeds = array(); + + /* Labels */ + + if ($cat_id == -4 || $cat_id == -2) { + $counters = getLabelCounters(true); + + foreach (array_values($counters) as $cv) { + + $unread = $cv["counter"]; + + if ($unread || !$unread_only) { + + $row = array( + "id" => (int) $cv["id"], + "title" => $cv["description"], + "unread" => $cv["counter"], + "cat_id" => -2, + ); + + array_push($feeds, $row); + } + } + } + + /* Virtual feeds */ + + if ($cat_id == -4 || $cat_id == -1) { + foreach (array(-1, -2, -3, -4, -6, 0) as $i) { + $unread = getFeedUnread($i); + + if ($unread || !$unread_only) { + $title = getFeedTitle($i); + + $row = array( + "id" => $i, + "title" => $title, + "unread" => $unread, + "cat_id" => -1, + ); + array_push($feeds, $row); + } + + } + } + + /* Child cats */ + + if ($include_nested && $cat_id) { + $result = db_query("SELECT + id, title FROM ttrss_feed_categories + WHERE parent_cat = '$cat_id' AND owner_uid = " . $_SESSION["uid"] . + " ORDER BY id, title"); + + while ($line = db_fetch_assoc($result)) { + $unread = getFeedUnread($line["id"], true) + + getCategoryChildrenUnread($line["id"]); + + if ($unread || !$unread_only) { + $row = array( + "id" => (int) $line["id"], + "title" => $line["title"], + "unread" => $unread, + "is_cat" => true, + ); + array_push($feeds, $row); + } + } + } + + /* Real feeds */ + + if ($limit) { + $limit_qpart = "LIMIT $limit OFFSET $offset"; + } else { + $limit_qpart = ""; + } + + if ($cat_id == -4 || $cat_id == -3) { + $result = db_query("SELECT + id, feed_url, cat_id, title, order_id, ". + SUBSTRING_FOR_DATE."(last_updated,1,19) AS last_updated + FROM ttrss_feeds WHERE owner_uid = " . $_SESSION["uid"] . + " ORDER BY cat_id, title " . $limit_qpart); + } else { + + if ($cat_id) + $cat_qpart = "cat_id = '$cat_id'"; + else + $cat_qpart = "cat_id IS NULL"; + + $result = db_query("SELECT + id, feed_url, cat_id, title, order_id, ". + SUBSTRING_FOR_DATE."(last_updated,1,19) AS last_updated + FROM ttrss_feeds WHERE + $cat_qpart AND owner_uid = " . $_SESSION["uid"] . + " ORDER BY cat_id, title " . $limit_qpart); + } + + while ($line = db_fetch_assoc($result)) { + + $unread = getFeedUnread($line["id"]); + + $has_icon = feed_has_icon($line['id']); + + if ($unread || !$unread_only) { + + $row = array( + "feed_url" => $line["feed_url"], + "title" => $line["title"], + "id" => (int)$line["id"], + "unread" => (int)$unread, + "has_icon" => $has_icon, + "cat_id" => (int)$line["cat_id"], + "last_updated" => (int) strtotime($line["last_updated"]), + "order_id" => (int) $line["order_id"], + ); + + array_push($feeds, $row); + } + } + + return $feeds; + } + + static function api_get_headlines($feed_id, $limit, $offset, + $filter, $is_cat, $show_excerpt, $show_content, $view_mode, $order, + $include_attachments, $since_id, + $search = "", $include_nested = false, $sanitize_content = true, + $force_update = false, $excerpt_length = 100, $check_first_id = false, $skip_first_id_check = false) { + + if ($force_update && $feed_id > 0 && is_numeric($feed_id)) { + // Update the feed if required with some basic flood control + + $result = db_query( + "SELECT cache_images,".SUBSTRING_FOR_DATE."(last_updated,1,19) AS last_updated + FROM ttrss_feeds WHERE id = '$feed_id'"); + + if (db_num_rows($result) != 0) { + $last_updated = strtotime(db_fetch_result($result, 0, "last_updated")); + $cache_images = sql_bool_to_bool(db_fetch_result($result, 0, "cache_images")); + + if (!$cache_images && time() - $last_updated > 120) { + include "rssfuncs.php"; + update_rss_feed($feed_id, true, true); + } else { + db_query("UPDATE ttrss_feeds SET last_updated = '1970-01-01', last_update_started = '1970-01-01' + WHERE id = '$feed_id'"); + } + } + } + + /*$qfh_ret = queryFeedHeadlines($feed_id, $limit, + $view_mode, $is_cat, $search, false, + $order, $offset, 0, false, $since_id, $include_nested);*/ + + //function queryFeedHeadlines($feed, $limit, + // $view_mode, $cat_view, $search, $search_mode, + // $override_order = false, $offset = 0, $owner_uid = 0, $filter = false, $since_id = 0, $include_children = false, + // $ignore_vfeed_group = false, $override_strategy = false, $override_vfeed = false, $start_ts = false, $check_top_id = false) { + + $params = array( + "feed" => $feed_id, + "limit" => $limit, + "view_mode" => $view_mode, + "cat_view" => $is_cat, + "search" => $search, + "override_order" => $order, + "offset" => $offset, + "since_id" => $since_id, + "include_children" => $include_nested, + "check_first_id" => $check_first_id, + "skip_first_id_check" => $skip_first_id_check + ); + + $qfh_ret = queryFeedHeadlines($params); + + $result = $qfh_ret[0]; + $feed_title = $qfh_ret[1]; + $first_id = $qfh_ret[6]; + + $headlines = array(); + + $headlines_header = array( + 'id' => $feed_id, + 'first_id' => $first_id, + 'is_cat' => $is_cat); + + if (!is_numeric($result)) { + while ($line = db_fetch_assoc($result)) { + $line["content_preview"] = truncate_string(strip_tags($line["content"]), $excerpt_length); + foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_QUERY_HEADLINES) as $p) { + $line = $p->hook_query_headlines($line, $excerpt_length, true); + } + + $is_updated = ($line["last_read"] == "" && + ($line["unread"] != "t" && $line["unread"] != "1")); + + $tags = explode(",", $line["tag_cache"]); + + $label_cache = $line["label_cache"]; + $labels = false; + + if ($label_cache) { + $label_cache = json_decode($label_cache, true); + + if ($label_cache) { + if ($label_cache["no-labels"] == 1) + $labels = array(); + else + $labels = $label_cache; + } + } + + if (!is_array($labels)) $labels = get_article_labels($line["id"]); + + //if (!$tags) $tags = get_article_tags($line["id"]); + //if (!$labels) $labels = get_article_labels($line["id"]); + + $headline_row = array( + "id" => (int)$line["id"], + "unread" => sql_bool_to_bool($line["unread"]), + "marked" => sql_bool_to_bool($line["marked"]), + "published" => sql_bool_to_bool($line["published"]), + "updated" => (int)strtotime($line["updated"]), + "is_updated" => $is_updated, + "title" => $line["title"], + "link" => $line["link"], + "feed_id" => $line["feed_id"], + "tags" => $tags, + ); + + if ($include_attachments) + $headline_row['attachments'] = get_article_enclosures( + $line['id']); + + if ($show_excerpt) + $headline_row["excerpt"] = $line["content_preview"]; + + if ($show_content) { + + if ($sanitize_content) { + $headline_row["content"] = sanitize( + $line["content"], + sql_bool_to_bool($line['hide_images']), + false, $line["site_url"], false, $line["id"]); + } else { + $headline_row["content"] = $line["content"]; + } + } + + // unify label output to ease parsing + if ($labels["no-labels"] == 1) $labels = array(); + + $headline_row["labels"] = $labels; + + $headline_row["feed_title"] = $line["feed_title"] ? $line["feed_title"] : + $feed_title; + + $headline_row["comments_count"] = (int)$line["num_comments"]; + $headline_row["comments_link"] = $line["comments"]; + + $headline_row["always_display_attachments"] = sql_bool_to_bool($line["always_display_enclosures"]); + + $headline_row["author"] = $line["author"]; + + $headline_row["score"] = (int)$line["score"]; + $headline_row["note"] = $line["note"]; + $headline_row["lang"] = $line["lang"]; + + foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_RENDER_ARTICLE_API) as $p) { + $headline_row = $p->hook_render_article_api(array("headline" => $headline_row)); + } + + array_push($headlines, $headline_row); + } + } else if (is_numeric($result) && $result == -1) { + $headlines_header['first_id_changed'] = true; + } + + return array($headlines, $headlines_header); + } + + function unsubscribeFeed() { + $feed_id = (int) $this->dbh->escape_string($_REQUEST["feed_id"]); + + $result = $this->dbh->query("SELECT id FROM ttrss_feeds WHERE + id = '$feed_id' AND owner_uid = ".$_SESSION["uid"]); + + if ($this->dbh->num_rows($result) != 0) { + Pref_Feeds::remove_feed($feed_id, $_SESSION["uid"]); + $this->wrap(self::STATUS_OK, array("status" => "OK")); + } else { + $this->wrap(self::STATUS_ERR, array("error" => "FEED_NOT_FOUND")); + } + } + + function subscribeToFeed() { + $feed_url = $this->dbh->escape_string($_REQUEST["feed_url"]); + $category_id = (int) $this->dbh->escape_string($_REQUEST["category_id"]); + $login = $this->dbh->escape_string($_REQUEST["login"]); + $password = $this->dbh->escape_string($_REQUEST["password"]); + + if ($feed_url) { + $rc = subscribe_to_feed($feed_url, $category_id, $login, $password); + + $this->wrap(self::STATUS_OK, array("status" => $rc)); + } else { + $this->wrap(self::STATUS_ERR, array("error" => 'INCORRECT_USAGE')); + } + } + + function getFeedTree() { + $include_empty = sql_bool_to_bool($_REQUEST['include_empty']); + + $pf = new Pref_Feeds($_REQUEST); + + $_REQUEST['mode'] = 2; + $_REQUEST['force_show_empty'] = $include_empty; + + if ($pf){ + $data = $pf->makefeedtree(); + $this->wrap(self::STATUS_OK, array("categories" => $data)); + } else { + $this->wrap(self::STATUS_ERR, array("error" => + 'UNABLE_TO_INSTANTIATE_OBJECT')); + } + + } + + // only works for labels or uncategorized for the time being + private function isCategoryEmpty($id) { + + if ($id == -2) { + $result = $this->dbh->query("SELECT COUNT(*) AS count FROM ttrss_labels2 + WHERE owner_uid = " . $_SESSION["uid"]); + + return $this->dbh->fetch_result($result, 0, "count") == 0; + + } else if ($id == 0) { + $result = $this->dbh->query("SELECT COUNT(*) AS count FROM ttrss_feeds + WHERE cat_id IS NULL AND owner_uid = " . $_SESSION["uid"]); + + return $this->dbh->fetch_result($result, 0, "count") == 0; + + } + + return false; + } + + +} + +?> diff --git a/locale/de_DE/LC_MESSAGES/messages.mo b/locale/de_DE/LC_MESSAGES/messages.mo index 726c68a6c..b632e6678 100644 Binary files a/locale/de_DE/LC_MESSAGES/messages.mo and b/locale/de_DE/LC_MESSAGES/messages.mo differ diff --git a/locale/de_DE/LC_MESSAGES/messages.po b/locale/de_DE/LC_MESSAGES/messages.po index ebc7c59d7..45e3ad886 100644 --- a/locale/de_DE/LC_MESSAGES/messages.po +++ b/locale/de_DE/LC_MESSAGES/messages.po @@ -12,7 +12,7 @@ msgstr "" "Project-Id-Version: tt-rss git\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-08-19 18:16+0300\n" -"PO-Revision-Date: 2016-03-24 08:10+0100\n" +"PO-Revision-Date: 2016-08-19 17:29+0200\n" "Last-Translator: Heiko Adams \n" "Language-Team: \n" "Language: de_DE\n" @@ -21,7 +21,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-Bookmarks: -1,557,558,-1,-1,-1,-1,-1,-1,-1\n" -"X-Generator: Poedit 1.8.7.1\n" +"X-Generator: Poedit 1.8.8\n" #: backend.php:73 msgid "Use default" @@ -55,49 +55,39 @@ msgstr "Nach 3 Monaten" msgid "Default interval" msgstr "Standard-Intervall" -#: backend.php:83 -#: backend.php:93 +#: backend.php:83 backend.php:93 msgid "Disable updates" msgstr "Nie" -#: backend.php:84 -#: backend.php:94 +#: backend.php:84 backend.php:94 msgid "15 minutes" msgstr "15 Minuten" -#: backend.php:85 -#: backend.php:95 +#: backend.php:85 backend.php:95 msgid "30 minutes" msgstr "30 Minuten" -#: backend.php:86 -#: backend.php:96 +#: backend.php:86 backend.php:96 msgid "Hourly" msgstr "Stündlich" -#: backend.php:87 -#: backend.php:97 +#: backend.php:87 backend.php:97 msgid "4 hours" msgstr "4 Stunden" -#: backend.php:88 -#: backend.php:98 +#: backend.php:88 backend.php:98 msgid "12 hours" msgstr "12 Stunden" -#: backend.php:89 -#: backend.php:99 +#: backend.php:89 backend.php:99 msgid "Daily" msgstr "Täglich" -#: backend.php:90 -#: backend.php:100 +#: backend.php:90 backend.php:100 msgid "Weekly" msgstr "Wöchentlich" -#: backend.php:103 -#: classes/pref/users.php:42 -#: classes/pref/system.php:51 +#: backend.php:103 classes/pref/users.php:42 classes/pref/system.php:51 msgid "User" msgstr "Benutzer" @@ -165,39 +155,16 @@ msgstr "Methode nicht gefunden." msgid "Plugin not found" msgstr "Plugin nicht gefunden" -#: index.php:148 -#: index.php:164 -#: index.php:282 -#: prefs.php:117 -#: classes/backend.php:5 -#: classes/pref/labels.php:282 -#: classes/pref/feeds.php:1409 -#: classes/pref/filters.php:779 -#: js/feedlist.js:159 -#: js/functions.js:1293 -#: js/functions.js:1427 -#: js/functions.js:1739 -#: js/prefs.js:658 -#: js/prefs.js:859 -#: js/prefs.js:1765 -#: js/prefs.js:1781 -#: js/prefs.js:1799 -#: js/tt-rss.js:55 -#: js/tt-rss.js:553 -#: js/viewfeed.js:1298 -#: plugins/import_export/import_export.js:17 -#: js/feedlist.js:484 -#: js/feedlist.js:534 -#: js/functions.js:449 -#: js/functions.js:772 -#: js/prefs.js:1446 -#: js/prefs.js:1499 -#: js/prefs.js:1539 -#: js/prefs.js:1556 -#: js/prefs.js:1572 -#: js/prefs.js:1592 -#: js/tt-rss.js:570 -#: js/viewfeed.js:830 +#: index.php:148 index.php:164 index.php:282 prefs.php:117 +#: classes/backend.php:5 classes/pref/labels.php:282 +#: classes/pref/feeds.php:1409 classes/pref/filters.php:779 js/feedlist.js:159 +#: js/functions.js:1293 js/functions.js:1427 js/functions.js:1739 +#: js/prefs.js:658 js/prefs.js:859 js/prefs.js:1765 js/prefs.js:1781 +#: js/prefs.js:1799 js/tt-rss.js:55 js/tt-rss.js:553 js/viewfeed.js:1298 +#: plugins/import_export/import_export.js:17 js/feedlist.js:484 +#: js/feedlist.js:534 js/functions.js:449 js/functions.js:772 js/prefs.js:1446 +#: js/prefs.js:1499 js/prefs.js:1539 js/prefs.js:1556 js/prefs.js:1572 +#: js/prefs.js:1592 js/tt-rss.js:570 js/viewfeed.js:830 msgid "Loading, please wait..." msgstr "Ladevorgang, bitte warten..." @@ -217,21 +184,15 @@ msgstr "Adaptiv" msgid "All Articles" msgstr "Alle Artikel" -#: index.php:190 -#: include/functions2.php:102 -#: classes/feeds.php:104 +#: index.php:190 include/functions2.php:102 classes/feeds.php:104 msgid "Starred" msgstr "Markiert" -#: index.php:191 -#: include/functions2.php:103 -#: classes/feeds.php:105 +#: index.php:191 include/functions2.php:103 classes/feeds.php:105 msgid "Published" msgstr "Veröffentlicht" -#: index.php:192 -#: classes/feeds.php:91 -#: classes/feeds.php:103 +#: index.php:192 classes/feeds.php:91 classes/feeds.php:103 msgid "Unread" msgstr "Ungelesen" @@ -263,12 +224,8 @@ msgstr "älteste zuerst" msgid "Title" msgstr "Titel" -#: index.php:207 -#: index.php:248 -#: include/functions2.php:90 -#: classes/feeds.php:109 -#: js/FeedTree.js:132 -#: js/FeedTree.js:160 +#: index.php:207 index.php:248 include/functions2.php:90 classes/feeds.php:109 +#: js/FeedTree.js:132 js/FeedTree.js:160 msgid "Mark as read" msgstr "Als gelesen markieren" @@ -304,8 +261,7 @@ msgstr "Suchen..." msgid "Feed actions:" msgstr "Feed-Aktionen:" -#: index.php:243 -#: classes/handler/public.php:672 +#: index.php:243 classes/handler/public.php:672 msgid "Subscribe to feed..." msgstr "Feed abonnieren..." @@ -317,9 +273,7 @@ msgstr "Feed bearbeiten..." msgid "Rescore feed" msgstr "Feed neu bewerten" -#: index.php:246 -#: classes/pref/feeds.php:785 -#: classes/pref/feeds.php:1364 +#: index.php:246 classes/pref/feeds.php:785 classes/pref/feeds.php:1364 #: js/PrefFeedTree.js:74 msgid "Unsubscribe" msgstr "Feed abbestellen" @@ -336,8 +290,7 @@ msgstr "Gelesene zeigen/verstecken" msgid "Other actions:" msgstr "Andere Aktionen:" -#: index.php:251 -#: include/functions2.php:76 +#: index.php:251 include/functions2.php:76 msgid "Toggle widescreen mode" msgstr "Breitbild-Modus umschalten" @@ -361,9 +314,7 @@ msgstr "Abmelden" msgid "Updates are available from Git." msgstr "Git-Updates sind verfügbar" -#: prefs.php:33 -#: prefs.php:135 -#: include/functions2.php:105 +#: prefs.php:33 prefs.php:135 include/functions2.php:105 #: classes/pref/prefs.php:435 msgid "Preferences" msgstr "Einstellungen" @@ -376,21 +327,16 @@ msgstr "Tastaturkürzel" msgid "Exit preferences" msgstr "Einstellungen verlassen" -#: prefs.php:138 -#: classes/pref/feeds.php:112 -#: classes/pref/feeds.php:1304 +#: prefs.php:138 classes/pref/feeds.php:112 classes/pref/feeds.php:1304 #: classes/pref/feeds.php:1353 msgid "Feeds" msgstr "Feeds" -#: prefs.php:141 -#: classes/pref/filters.php:248 +#: prefs.php:141 classes/pref/filters.php:248 msgid "Filters" msgstr "Filter" -#: prefs.php:144 -#: include/functions.php:1287 -#: include/functions.php:1940 +#: prefs.php:144 include/functions.php:1287 include/functions.php:1940 #: classes/pref/labels.php:90 msgid "Labels" msgstr "Label" @@ -403,8 +349,7 @@ msgstr "Benutzer" msgid "System" msgstr "System" -#: register.php:187 -#: include/login_form.php:252 +#: register.php:187 include/login_form.php:252 msgid "Create new account" msgstr "Neues Konto erstellen" @@ -412,20 +357,11 @@ msgstr "Neues Konto erstellen" msgid "New user registrations are administratively disabled." msgstr "Die Registrierung für neue Benutzer wurde administrativ deaktiviert." -#: register.php:197 -#: register.php:242 -#: register.php:255 -#: register.php:270 -#: register.php:289 -#: register.php:337 -#: register.php:347 -#: register.php:359 -#: classes/handler/public.php:742 -#: classes/handler/public.php:813 -#: classes/handler/public.php:911 -#: classes/handler/public.php:990 -#: classes/handler/public.php:1004 -#: classes/handler/public.php:1011 +#: register.php:197 register.php:242 register.php:255 register.php:270 +#: register.php:289 register.php:337 register.php:347 register.php:359 +#: classes/handler/public.php:742 classes/handler/public.php:813 +#: classes/handler/public.php:911 classes/handler/public.php:990 +#: classes/handler/public.php:1004 classes/handler/public.php:1011 #: classes/handler/public.php:1036 msgid "Return to Tiny Tiny RSS" msgstr "Zu Tiny Tiny RSS zurückkehren" @@ -442,13 +378,11 @@ msgstr "Gewünschter Benutzername:" msgid "Check availability" msgstr "Verfügbarkeit prüfen" -#: register.php:229 -#: classes/handler/public.php:829 +#: register.php:229 classes/handler/public.php:829 msgid "Email:" msgstr "E-Mail:" -#: register.php:232 -#: classes/handler/public.php:834 +#: register.php:232 classes/handler/public.php:834 msgid "How much is two plus two:" msgstr "Wieviel ist zwei plus zwei:" @@ -480,12 +414,8 @@ msgstr "Registrierung für neue Benutzer ist momentan geschlossen." msgid "Tiny Tiny RSS data update script." msgstr "Skript zum Updaten von Tiny Tiny RSS." -#: include/digest.php:109 -#: include/functions.php:1296 -#: include/functions.php:1841 -#: include/functions.php:1926 -#: include/functions.php:1948 -#: classes/opml.php:421 +#: include/digest.php:109 include/functions.php:1296 include/functions.php:1841 +#: include/functions.php:1926 include/functions.php:1948 classes/opml.php:421 #: classes/pref/feeds.php:228 msgid "Uncategorized" msgstr "Unkategorisiert" @@ -506,13 +436,11 @@ msgstr "Keine Feeds gefunden." msgid "%d min" msgstr "%d min" -#: include/functions.php:1285 -#: include/functions.php:1938 +#: include/functions.php:1285 include/functions.php:1938 msgid "Special" msgstr "Sonderfeeds" -#: include/functions.php:1789 -#: classes/pref/filters.php:229 +#: include/functions.php:1789 classes/pref/filters.php:229 #: classes/pref/filters.php:507 msgid "All feeds" msgstr "Alle Feeds" @@ -529,8 +457,7 @@ msgstr "Veröffentlichte Artikel" msgid "Fresh articles" msgstr "Neue Artikel" -#: include/functions.php:1999 -#: include/functions2.php:100 +#: include/functions.php:1999 include/functions2.php:100 msgid "All articles" msgstr "Alle Artikel" @@ -586,18 +513,15 @@ msgstr "Suchdialog anzeigen" msgid "Article" msgstr "Artikel" -#: include/functions2.php:63 -#: js/viewfeed.js:1883 +#: include/functions2.php:63 js/viewfeed.js:1883 msgid "Toggle starred" msgstr "Markierung ein-/ausschalten" -#: include/functions2.php:64 -#: js/viewfeed.js:1894 +#: include/functions2.php:64 js/viewfeed.js:1894 msgid "Toggle published" msgstr "Veröffentlichung ein-/ausschalten" -#: include/functions2.php:65 -#: js/viewfeed.js:1872 +#: include/functions2.php:65 js/viewfeed.js:1872 msgid "Toggle unread" msgstr "Gelesen-Status umschalten" @@ -609,13 +533,11 @@ msgstr "Tags bearbeiten" msgid "Open in new window" msgstr "In neuem Fenster öffnen" -#: include/functions2.php:68 -#: js/viewfeed.js:1913 +#: include/functions2.php:68 js/viewfeed.js:1913 msgid "Mark below as read" msgstr "Untere als gelesen markieren" -#: include/functions2.php:69 -#: js/viewfeed.js:1907 +#: include/functions2.php:69 js/viewfeed.js:1907 msgid "Mark above as read" msgstr "Obige als gelesen markieren" @@ -643,8 +565,7 @@ msgstr "Artikel schließen/verbergen" msgid "Toggle article expansion (combined mode)" msgstr "Kombinierte Feed-Anzeige umschalten" -#: include/functions2.php:77 -#: plugins/embed_original/init.php:31 +#: include/functions2.php:77 plugins/embed_original/init.php:31 msgid "Toggle embed original" msgstr "\"Original einbetten\" umschalten" @@ -676,8 +597,7 @@ msgstr "Auswahl umkehren" msgid "Deselect everything" msgstr "Auswahl aufheben" -#: include/functions2.php:85 -#: classes/pref/feeds.php:555 +#: include/functions2.php:85 classes/pref/feeds.php:555 #: classes/pref/feeds.php:823 msgid "Feed" msgstr "Feed" @@ -690,14 +610,11 @@ msgstr "Aktuellen Feed aktualisieren" msgid "Un/hide read feeds" msgstr "Gelesene Feeds zeigen/verstecken" -#: include/functions2.php:88 -#: classes/pref/feeds.php:1356 +#: include/functions2.php:88 classes/pref/feeds.php:1356 msgid "Subscribe to feed" msgstr "Feed abonnieren" -#: include/functions2.php:89 -#: js/FeedTree.js:139 -#: js/PrefFeedTree.js:68 +#: include/functions2.php:89 js/FeedTree.js:139 js/PrefFeedTree.js:68 #: js/viewfeed.js:2080 msgid "Edit feed" msgstr "Feed bearbeiten" @@ -708,7 +625,7 @@ msgstr "Schlagzeilensortierung umkehren" #: include/functions2.php:92 msgid "Toggle headline grouping" -msgstr "" +msgstr "Gruppierung der Kopfzeilen umschalten" #: include/functions2.php:93 msgid "Debug feed update" @@ -718,8 +635,7 @@ msgstr "Aktualisierung im Diagnose-Modus durchführen" msgid "Debug viewfeed()" msgstr "viewfeed() debuggen" -#: include/functions2.php:95 -#: js/FeedTree.js:182 +#: include/functions2.php:95 js/FeedTree.js:182 msgid "Mark all feeds as read" msgstr "Alle Feeds als gelesen markieren" @@ -743,9 +659,7 @@ msgstr "Gehe zu" msgid "Fresh" msgstr "Neu" -#: include/functions2.php:104 -#: js/tt-rss.js:497 -#: js/tt-rss.js:673 +#: include/functions2.php:104 js/tt-rss.js:497 js/tt-rss.js:673 msgid "Tag cloud" msgstr "Tagwolke" @@ -753,13 +667,11 @@ msgstr "Tagwolke" msgid "Other" msgstr "Sonstiges" -#: include/functions2.php:107 -#: classes/pref/labels.php:267 +#: include/functions2.php:107 classes/pref/labels.php:267 msgid "Create label" msgstr "Label erstellen" -#: include/functions2.php:108 -#: classes/pref/filters.php:753 +#: include/functions2.php:108 classes/pref/filters.php:753 msgid "Create filter" msgstr "Filter erstellen" @@ -776,15 +688,13 @@ msgstr "Hilfe anzeigen" msgid "Search results: %s" msgstr "Suchergebnisse: %s" -#: include/functions2.php:1330 -#: classes/feeds.php:749 +#: include/functions2.php:1330 classes/feeds.php:749 msgid "comment" msgid_plural "comments" msgstr[0] "Kommentar" msgstr[1] "Kommentare" -#: include/functions2.php:1334 -#: classes/feeds.php:753 +#: include/functions2.php:1334 classes/feeds.php:753 msgid "comments" msgstr "Kommentare" @@ -792,43 +702,29 @@ msgstr "Kommentare" msgid " - " msgstr " - " -#: include/functions2.php:1393 -#: include/functions2.php:1644 +#: include/functions2.php:1393 include/functions2.php:1644 #: classes/article.php:311 msgid "no tags" msgstr "Keine Tags" -#: include/functions2.php:1403 -#: classes/feeds.php:735 +#: include/functions2.php:1403 classes/feeds.php:735 msgid "Edit tags for this article" msgstr "Tags für diesen Artikel bearbeiten" -#: include/functions2.php:1435 -#: classes/feeds.php:682 +#: include/functions2.php:1435 classes/feeds.php:682 msgid "Originally from:" msgstr "Original von:" -#: include/functions2.php:1448 -#: classes/pref/feeds.php:574 -#: classes/feeds.php:695 +#: include/functions2.php:1448 classes/pref/feeds.php:574 classes/feeds.php:695 msgid "Feed URL" msgstr "Feed URL" -#: include/functions2.php:1485 -#: classes/backend.php:105 -#: classes/dlg.php:37 -#: classes/dlg.php:60 -#: classes/dlg.php:93 -#: classes/dlg.php:159 -#: classes/dlg.php:186 -#: classes/pref/feeds.php:1658 -#: classes/pref/feeds.php:1724 -#: classes/pref/filters.php:204 -#: classes/pref/prefs.php:1105 -#: plugins/af_psql_trgm/init.php:102 -#: plugins/import_export/init.php:415 -#: plugins/import_export/init.php:461 -#: plugins/share/init.php:121 +#: include/functions2.php:1485 classes/backend.php:105 classes/dlg.php:37 +#: classes/dlg.php:60 classes/dlg.php:93 classes/dlg.php:159 +#: classes/dlg.php:186 classes/pref/feeds.php:1658 classes/pref/feeds.php:1724 +#: classes/pref/filters.php:204 classes/pref/prefs.php:1105 +#: plugins/af_psql_trgm/init.php:102 plugins/import_export/init.php:415 +#: plugins/import_export/init.php:461 plugins/share/init.php:121 msgid "Close this window" msgstr "Fenster schließen" @@ -846,45 +742,42 @@ msgstr "Anhänge" #: include/functions2.php:2456 msgid "There is no error, the file uploaded with success" -msgstr "" +msgstr "Kein Fehler. Datei erfolgreich hochgeladen" #: include/functions2.php:2457 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "" +msgstr "Die hochgeladene Datei überschreitet die upload_max_filesize Direktive in der php.ini" #: include/functions2.php:2458 msgid "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" -msgstr "" +msgstr "Die hochgeladene Datei überschreitet die MAX_FILE_SIZE Direktive des HTML-Formulars" #: include/functions2.php:2459 msgid "The uploaded file was only partially uploaded" -msgstr "" +msgstr "Die Datei wurde nur teilweise hochgeladen" #: include/functions2.php:2460 -#, fuzzy msgid "No file was uploaded" msgstr "Es wurde keine Datei hochgeladen." #: include/functions2.php:2461 msgid "Missing a temporary folder" -msgstr "" +msgstr "Fehlender temporärer Ordner" #: include/functions2.php:2462 msgid "Failed to write file to disk." -msgstr "" +msgstr "Konnte Datei nicht speichern." #: include/functions2.php:2463 msgid "A PHP extension stopped the file upload." -msgstr "" +msgstr "Eine PHP-Erweiterung hat den Upload unterbrochen." -#: include/login_form.php:197 -#: classes/handler/public.php:569 +#: include/login_form.php:197 classes/handler/public.php:569 #: classes/handler/public.php:824 msgid "Login:" msgstr "Benutzername:" -#: include/login_form.php:207 -#: classes/handler/public.php:572 +#: include/login_form.php:207 classes/handler/public.php:572 msgid "Password:" msgstr "Passwort:" @@ -896,10 +789,8 @@ msgstr "Ich habe mein Passwort vergessen" msgid "Profile:" msgstr "Profil:" -#: include/login_form.php:223 -#: classes/handler/public.php:311 -#: classes/pref/prefs.php:1043 -#: classes/rpc.php:63 +#: include/login_form.php:223 classes/handler/public.php:311 +#: classes/pref/prefs.php:1043 classes/rpc.php:63 msgid "Default profile" msgstr "Standardprofil" @@ -915,8 +806,7 @@ msgstr "Zeigt keine Bilder in Artikeln, reduziert die automatischen Aktualisieru msgid "Remember me" msgstr "Erinnere dich an mich" -#: include/login_form.php:249 -#: classes/handler/public.php:577 +#: include/login_form.php:249 classes/handler/public.php:577 msgid "Log in" msgstr "Anmelden" @@ -940,48 +830,30 @@ msgstr "Artikel nicht gefunden." msgid "Tags for this article (separated by commas):" msgstr "Tags für diesen Artikel (durch Komma getrennt):" -#: classes/article.php:222 -#: classes/pref/labels.php:79 -#: classes/pref/users.php:98 -#: classes/pref/feeds.php:801 -#: classes/pref/feeds.php:943 -#: classes/pref/filters.php:485 -#: classes/pref/prefs.php:989 -#: plugins/instances/init.php:245 -#: plugins/nsfw/init.php:85 -#: plugins/note/init.php:51 -#: plugins/af_readability/init.php:71 -#: plugins/af_redditimgur/init.php:68 -#: plugins/af_psql_trgm/init.php:184 +#: classes/article.php:222 classes/pref/labels.php:79 classes/pref/users.php:98 +#: classes/pref/feeds.php:801 classes/pref/feeds.php:943 +#: classes/pref/filters.php:485 classes/pref/prefs.php:989 +#: plugins/instances/init.php:245 plugins/nsfw/init.php:85 +#: plugins/note/init.php:51 plugins/af_readability/init.php:71 +#: plugins/af_redditimgur/init.php:68 plugins/af_psql_trgm/init.php:184 #: plugins/mail/init.php:64 msgid "Save" msgstr "Speichern" -#: classes/article.php:224 -#: classes/handler/public.php:546 -#: classes/handler/public.php:580 -#: classes/pref/labels.php:81 -#: classes/pref/users.php:100 -#: classes/pref/feeds.php:802 -#: classes/pref/feeds.php:946 -#: classes/pref/feeds.php:1865 -#: classes/pref/filters.php:488 -#: classes/pref/filters.php:902 -#: classes/pref/filters.php:983 -#: classes/pref/filters.php:1076 -#: classes/pref/prefs.php:991 -#: classes/feeds.php:1100 -#: classes/feeds.php:1150 -#: classes/feeds.php:1187 -#: plugins/instances/init.php:248 -#: plugins/instances/init.php:436 -#: plugins/note/init.php:53 +#: classes/article.php:224 classes/handler/public.php:546 +#: classes/handler/public.php:580 classes/pref/labels.php:81 +#: classes/pref/users.php:100 classes/pref/feeds.php:802 +#: classes/pref/feeds.php:946 classes/pref/feeds.php:1865 +#: classes/pref/filters.php:488 classes/pref/filters.php:902 +#: classes/pref/filters.php:983 classes/pref/filters.php:1076 +#: classes/pref/prefs.php:991 classes/feeds.php:1100 classes/feeds.php:1150 +#: classes/feeds.php:1187 plugins/instances/init.php:248 +#: plugins/instances/init.php:436 plugins/note/init.php:53 #: plugins/mail/init.php:172 msgid "Cancel" msgstr "Abbrechen" -#: classes/opml.php:28 -#: classes/opml.php:33 +#: classes/opml.php:28 classes/opml.php:33 msgid "OPML Utility" msgstr "OPML Werkzeug" @@ -1032,13 +904,11 @@ msgstr "Verarbeite Kategorie: %s" msgid "Upload failed with error code %d" msgstr "Upload schlug fehl. Fehlercode: %d" -#: classes/opml.php:484 -#: plugins/import_export/init.php:442 +#: classes/opml.php:484 plugins/import_export/init.php:442 msgid "Unable to move uploaded file." msgstr "Fehler: konnte die hochgeladene Datei nicht verschieben." -#: classes/opml.php:488 -#: plugins/import_export/init.php:446 +#: classes/opml.php:488 plugins/import_export/init.php:446 msgid "Error: please upload OPML file." msgstr "Fehler: bitte eine OPML-Datei hochladen." @@ -1078,9 +948,7 @@ msgstr "Wenn Label und/oder Filter importiert wurden, müssen die Einstellungen msgid "Your Public OPML URL is:" msgstr "Ihre öffentliche OPML-URL lautet:" -#: classes/dlg.php:57 -#: classes/dlg.php:183 -#: plugins/share/init.php:118 +#: classes/dlg.php:57 classes/dlg.php:183 plugins/share/init.php:118 msgid "Generate new URL" msgstr "Erzeuge neue URL" @@ -1088,8 +956,7 @@ msgstr "Erzeuge neue URL" msgid "Update daemon is enabled in configuration, but daemon process is not running, which prevents all feeds from updating. Please start the daemon process or contact instance owner." msgstr "Der Aktualisierungs-Daemon ist in den Einstellungen aktiviert, aber der Daemon Prozess läuft nicht, weshalb keine Feeds aktualisiert werden können. Bitte starten Sie den Prozess des Daemons oder benachrichtigen Sie den Besitzer der Instanz." -#: classes/dlg.php:75 -#: classes/dlg.php:84 +#: classes/dlg.php:75 classes/dlg.php:84 msgid "Last update:" msgstr "Letzte Aktualisierung:" @@ -1101,8 +968,7 @@ msgstr "Der Aktualisierungs Daemon braucht zu lange, um eine Aktualisierung durc msgid "You can view this feed as RSS using the following URL:" msgstr "Sie finden diesen Feed als RSS unter der folgenden URL:" -#: classes/handler/public.php:510 -#: plugins/bookmarklets/init.php:40 +#: classes/handler/public.php:510 plugins/bookmarklets/init.php:40 msgid "Share with Tiny Tiny RSS" msgstr "Teilen mit Tiny Tiny RSS" @@ -1110,10 +976,8 @@ msgstr "Teilen mit Tiny Tiny RSS" msgid "Title:" msgstr "Titel:" -#: classes/handler/public.php:520 -#: classes/pref/feeds.php:572 -#: plugins/instances/init.php:212 -#: plugins/instances/init.php:401 +#: classes/handler/public.php:520 classes/pref/feeds.php:572 +#: plugins/instances/init.php:212 plugins/instances/init.php:401 msgid "URL:" msgstr "URL:" @@ -1186,8 +1050,7 @@ msgstr "Passwort-Wiederherstellung" msgid "You will need to provide valid account name and email. A password reset link will be sent to your email address." msgstr "Sie müssen einen gültigen Benutzernamen und EMail angeben. Das neue Passwort wird an Ihre EMail gesendet." -#: classes/handler/public.php:839 -#: classes/pref/users.php:350 +#: classes/handler/public.php:839 classes/pref/users.php:350 msgid "Reset password" msgstr "Passwort zurücksetzen" @@ -1195,8 +1058,7 @@ msgstr "Passwort zurücksetzen" msgid "Some of the required form parameters are missing or incorrect." msgstr "Einige der benötigten Eingaben fehlen oder sind falsch." -#: classes/handler/public.php:853 -#: classes/handler/public.php:919 +#: classes/handler/public.php:853 classes/handler/public.php:919 msgid "Go back" msgstr "Zurück" @@ -1220,8 +1082,7 @@ msgstr "Datenbank-Updater" msgid "Perform updates" msgstr "Aktualisierungen durchführen" -#: classes/pref/labels.php:22 -#: classes/pref/filters.php:348 +#: classes/pref/labels.php:22 classes/pref/filters.php:348 #: classes/pref/filters.php:823 msgid "Caption" msgstr "Titel" @@ -1243,59 +1104,38 @@ msgstr "Hintergrund" msgid "Created label %s" msgstr "Label %s erstellt" -#: classes/pref/labels.php:258 -#: classes/pref/users.php:334 -#: classes/pref/feeds.php:1344 -#: classes/pref/feeds.php:1606 -#: classes/pref/feeds.php:1670 -#: classes/pref/filters.php:359 -#: classes/pref/filters.php:407 -#: classes/pref/filters.php:744 -#: classes/pref/filters.php:832 -#: classes/pref/filters.php:859 -#: classes/pref/prefs.php:1000 -#: plugins/instances/init.php:284 +#: classes/pref/labels.php:258 classes/pref/users.php:334 +#: classes/pref/feeds.php:1344 classes/pref/feeds.php:1606 +#: classes/pref/feeds.php:1670 classes/pref/filters.php:359 +#: classes/pref/filters.php:407 classes/pref/filters.php:744 +#: classes/pref/filters.php:832 classes/pref/filters.php:859 +#: classes/pref/prefs.php:1000 plugins/instances/init.php:284 msgid "Select" msgstr "Auswahl" -#: classes/pref/labels.php:261 -#: classes/pref/users.php:337 -#: classes/pref/feeds.php:1347 -#: classes/pref/feeds.php:1609 -#: classes/pref/feeds.php:1673 -#: classes/pref/filters.php:362 -#: classes/pref/filters.php:410 -#: classes/pref/filters.php:747 -#: classes/pref/filters.php:835 -#: classes/pref/filters.php:862 -#: classes/pref/prefs.php:1003 -#: classes/feeds.php:90 +#: classes/pref/labels.php:261 classes/pref/users.php:337 +#: classes/pref/feeds.php:1347 classes/pref/feeds.php:1609 +#: classes/pref/feeds.php:1673 classes/pref/filters.php:362 +#: classes/pref/filters.php:410 classes/pref/filters.php:747 +#: classes/pref/filters.php:835 classes/pref/filters.php:862 +#: classes/pref/prefs.php:1003 classes/feeds.php:90 #: plugins/instances/init.php:287 msgid "All" msgstr "Alle" -#: classes/pref/labels.php:263 -#: classes/pref/users.php:339 -#: classes/pref/feeds.php:1349 -#: classes/pref/feeds.php:1611 -#: classes/pref/feeds.php:1675 -#: classes/pref/filters.php:364 -#: classes/pref/filters.php:412 -#: classes/pref/filters.php:749 -#: classes/pref/filters.php:837 -#: classes/pref/filters.php:864 -#: classes/pref/prefs.php:1005 -#: classes/feeds.php:93 +#: classes/pref/labels.php:263 classes/pref/users.php:339 +#: classes/pref/feeds.php:1349 classes/pref/feeds.php:1611 +#: classes/pref/feeds.php:1675 classes/pref/filters.php:364 +#: classes/pref/filters.php:412 classes/pref/filters.php:749 +#: classes/pref/filters.php:837 classes/pref/filters.php:864 +#: classes/pref/prefs.php:1005 classes/feeds.php:93 #: plugins/instances/init.php:289 msgid "None" msgstr "Keine" -#: classes/pref/labels.php:270 -#: classes/pref/users.php:348 -#: classes/pref/feeds.php:767 -#: classes/pref/filters.php:478 -#: classes/pref/filters.php:766 -#: classes/feeds.php:1149 +#: classes/pref/labels.php:270 classes/pref/users.php:348 +#: classes/pref/feeds.php:767 classes/pref/filters.php:478 +#: classes/pref/filters.php:766 classes/feeds.php:1149 #: plugins/instances/init.php:294 msgid "Remove" msgstr "Entfernen" @@ -1304,8 +1144,7 @@ msgstr "Entfernen" msgid "Clear colors" msgstr "Farben löschen" -#: classes/pref/users.php:6 -#: classes/pref/system.php:8 +#: classes/pref/users.php:6 classes/pref/system.php:8 #: plugins/instances/init.php:154 msgid "Your access level is insufficient to open this tab." msgstr "Sie haben nicht die benötigten Rechte, um diese Registerkarte zu öffnen." @@ -1314,10 +1153,8 @@ msgstr "Sie haben nicht die benötigten Rechte, um diese Registerkarte zu öffne msgid "Edit user" msgstr "Benutzer bearbeiten" -#: classes/pref/users.php:56 -#: classes/pref/feeds.php:637 -#: classes/pref/feeds.php:878 -#: classes/feeds.php:1070 +#: classes/pref/users.php:56 classes/pref/feeds.php:637 +#: classes/pref/feeds.php:878 classes/feeds.php:1070 msgid "Authentication" msgstr "Authentifizierung" @@ -1325,14 +1162,12 @@ msgstr "Authentifizierung" msgid "Access level: " msgstr "Zugriffsberechtigung: " -#: classes/pref/users.php:77 -#: classes/pref/feeds.php:667 +#: classes/pref/users.php:77 classes/pref/feeds.php:667 #: classes/pref/feeds.php:896 msgid "Options" msgstr "Optionen" -#: classes/pref/users.php:91 -#: js/prefs.js:570 +#: classes/pref/users.php:91 js/prefs.js:570 msgid "User details" msgstr "Benutzerdetails" @@ -1340,8 +1175,7 @@ msgstr "Benutzerdetails" msgid "User not found" msgstr "Benutzer nicht gefunden" -#: classes/pref/users.php:132 -#: classes/pref/users.php:400 +#: classes/pref/users.php:132 classes/pref/users.php:400 msgid "Registered" msgstr "Registriert" @@ -1357,8 +1191,7 @@ msgstr "Anzahl abonnierter Feeds" msgid "Stored articles" msgstr "gespeicherte Artikel" -#: classes/pref/users.php:145 -#: classes/pref/users.php:399 +#: classes/pref/users.php:145 classes/pref/users.php:399 msgid "Subscribed feeds" msgstr "Abonnierte Feeds" @@ -1391,11 +1224,8 @@ msgstr "Sende das neue Passwort von Benutzer %s an %s" msgid "[tt-rss] Password change notification" msgstr "[tt-rss] Benachrichtigung: Passwort geändert" -#: classes/pref/users.php:324 -#: classes/pref/feeds.php:1340 -#: classes/pref/filters.php:740 -#: classes/feeds.php:1120 -#: classes/feeds.php:1186 +#: classes/pref/users.php:324 classes/pref/feeds.php:1340 +#: classes/pref/filters.php:740 classes/feeds.php:1120 classes/feeds.php:1186 #: js/tt-rss.js:174 msgid "Search" msgstr "Suchen" @@ -1404,16 +1234,13 @@ msgstr "Suchen" msgid "Create user" msgstr "Benutzer anlegen" -#: classes/pref/users.php:346 -#: classes/pref/filters.php:759 +#: classes/pref/users.php:346 classes/pref/filters.php:759 #: plugins/instances/init.php:293 msgid "Edit" msgstr "Bearbeiten" -#: classes/pref/users.php:397 -#: classes/pref/feeds.php:643 -#: classes/pref/feeds.php:882 -#: classes/pref/feeds.php:1842 +#: classes/pref/users.php:397 classes/pref/feeds.php:643 +#: classes/pref/feeds.php:882 classes/pref/feeds.php:1842 #: classes/feeds.php:1074 msgid "Login" msgstr "Benutzername" @@ -1426,8 +1253,7 @@ msgstr "Zugriffsberechtigung" msgid "Last login" msgstr "Zuletzt angemeldet" -#: classes/pref/users.php:420 -#: plugins/instances/init.php:334 +#: classes/pref/users.php:420 plugins/instances/init.php:334 msgid "Click to edit" msgstr "Zum Bearbeiten klicken" @@ -1471,10 +1297,8 @@ msgstr "Datum" msgid "Check to enable field" msgstr "Ankreuzen, um das Feld zu aktivieren" -#: classes/pref/feeds.php:65 -#: classes/pref/feeds.php:214 -#: classes/pref/feeds.php:258 -#: classes/pref/feeds.php:264 +#: classes/pref/feeds.php:65 classes/pref/feeds.php:214 +#: classes/pref/feeds.php:258 classes/pref/feeds.php:264 #: classes/pref/feeds.php:290 #, php-format msgid "(%d feed)" @@ -1482,8 +1306,7 @@ msgid_plural "(%d feeds)" msgstr[0] "(%d Feed)" msgstr[1] "(%d Feeds)" -#: classes/pref/feeds.php:537 -#: classes/pref/prefs.php:18 +#: classes/pref/feeds.php:537 classes/pref/prefs.php:18 msgid "General" msgstr "Allgemein" @@ -1491,32 +1314,25 @@ msgstr "Allgemein" msgid "Feed Title" msgstr "Feed-Titel" -#: classes/pref/feeds.php:595 -#: classes/pref/feeds.php:830 -#: classes/pref/feeds.php:1828 -#: classes/feeds.php:1050 +#: classes/pref/feeds.php:595 classes/pref/feeds.php:830 +#: classes/pref/feeds.php:1828 classes/feeds.php:1050 msgid "Place in category:" msgstr "In Kategorie einordnen:" -#: classes/pref/feeds.php:608 -#: classes/pref/feeds.php:844 +#: classes/pref/feeds.php:608 classes/pref/feeds.php:844 msgid "Language:" msgstr "Sprache:" -#: classes/pref/feeds.php:615 -#: classes/pref/feeds.php:853 +#: classes/pref/feeds.php:615 classes/pref/feeds.php:853 msgid "Update" msgstr "Aktualisieren" -#: classes/pref/feeds.php:630 -#: classes/pref/feeds.php:869 +#: classes/pref/feeds.php:630 classes/pref/feeds.php:869 msgid "Article purging:" msgstr "Artikel löschen:" -#: classes/pref/feeds.php:658 -#: classes/pref/feeds.php:890 -#: classes/pref/feeds.php:1845 -#: classes/pref/prefs.php:245 +#: classes/pref/feeds.php:658 classes/pref/feeds.php:890 +#: classes/pref/feeds.php:1845 classes/pref/prefs.php:245 #: classes/feeds.php:1078 msgid "Password" msgstr "Passwort" @@ -1525,33 +1341,27 @@ msgstr "Passwort" msgid "Hint: you need to fill in your login information if your feed requires authentication, except for Twitter feeds." msgstr "Hinweis: Sie müssen Ihre Login-Informationen eingeben, wenn Ihr Feed eine Authentifizierung erfordert (außer Twitter-Feeds)." -#: classes/pref/feeds.php:681 -#: classes/pref/feeds.php:900 +#: classes/pref/feeds.php:681 classes/pref/feeds.php:900 msgid "Hide from Popular feeds" msgstr "Nicht unter beliebten Feeds aufführen" -#: classes/pref/feeds.php:693 -#: classes/pref/feeds.php:906 +#: classes/pref/feeds.php:693 classes/pref/feeds.php:906 msgid "Include in e-mail digest" msgstr "In E-Mail-Zusammenfassung aufnehmen" -#: classes/pref/feeds.php:706 -#: classes/pref/feeds.php:912 +#: classes/pref/feeds.php:706 classes/pref/feeds.php:912 msgid "Always display image attachments" msgstr "Angehängte Bilder immer anzeigen" -#: classes/pref/feeds.php:719 -#: classes/pref/feeds.php:920 +#: classes/pref/feeds.php:719 classes/pref/feeds.php:920 msgid "Do not embed images" msgstr "Bilder nicht einbetten" -#: classes/pref/feeds.php:732 -#: classes/pref/feeds.php:928 +#: classes/pref/feeds.php:732 classes/pref/feeds.php:928 msgid "Cache images locally" msgstr "Bilder lokal zwischenspeichern" -#: classes/pref/feeds.php:744 -#: classes/pref/feeds.php:934 +#: classes/pref/feeds.php:744 classes/pref/feeds.php:934 msgid "Mark updated articles as unread" msgstr "Aktualisierte Artikel als ungelesen markieren" @@ -1563,8 +1373,7 @@ msgstr "Symbol" msgid "Replace" msgstr "Ersetzen" -#: classes/pref/feeds.php:772 -#: classes/pref/prefs.php:706 +#: classes/pref/feeds.php:772 classes/pref/prefs.php:706 msgid "Plugins" msgstr "Plugins" @@ -1576,8 +1385,7 @@ msgstr "Abonnierte Feeds:" msgid "Resets PubSubHubbub subscription status for push-enabled feeds." msgstr "PubSubHubbub-Abonnementstatus für Push-fähige Feeds zurücksetzen." -#: classes/pref/feeds.php:1207 -#: classes/pref/feeds.php:1260 +#: classes/pref/feeds.php:1207 classes/pref/feeds.php:1260 msgid "All done." msgstr "Fertig." @@ -1593,14 +1401,12 @@ msgstr "Inaktive Feeds" msgid "Edit selected feeds" msgstr "Bearbeite ausgewählte Feeds" -#: classes/pref/feeds.php:1360 -#: classes/pref/feeds.php:1374 +#: classes/pref/feeds.php:1360 classes/pref/feeds.php:1374 #: classes/pref/filters.php:762 msgid "Reset sort order" msgstr "Sortierreihenfolge zurücksetzen" -#: classes/pref/feeds.php:1362 -#: js/prefs.js:1737 +#: classes/pref/feeds.php:1362 js/prefs.js:1737 msgid "Batch subscribe" msgstr "Mehrere Feeds abonnieren" @@ -1628,8 +1434,7 @@ msgstr "Manuelles Löschen" msgid "Clear feed data" msgstr "Feed-Daten löschen" -#: classes/pref/feeds.php:1396 -#: classes/pref/filters.php:770 +#: classes/pref/feeds.php:1396 classes/pref/filters.php:770 msgid "Rescore articles" msgstr "Artikel neu bewerten" @@ -1693,9 +1498,7 @@ msgstr "Veröffentlichte & geteilte Artikel / erzeugte Feeds" msgid "Published articles are exported as a public RSS feed and can be subscribed by anyone who knows the URL specified below." msgstr "Veröffentlichte Artikel werden als öffentlicher RSS-Feed exportiert und können von jedem abonniert werden, der die nachstehende URL kennt." -#: classes/pref/feeds.php:1520 -#: classes/feeds.php:54 -#: classes/feeds.php:134 +#: classes/pref/feeds.php:1520 classes/feeds.php:54 classes/feeds.php:134 msgid "View as RSS" msgstr "Als RSS anzeigen" @@ -1711,13 +1514,11 @@ msgstr "Alle generierten URLs löschen" msgid "These feeds have not been updated with new content for 3 months (oldest first):" msgstr "Folgende Feeds konnten seit 3 Monaten nicht aktualisiert werden (älteste zuerst):" -#: classes/pref/feeds.php:1636 -#: classes/pref/feeds.php:1700 +#: classes/pref/feeds.php:1636 classes/pref/feeds.php:1700 msgid "Click to edit feed" msgstr "Zum Bearbeiten klicken" -#: classes/pref/feeds.php:1654 -#: classes/pref/feeds.php:1720 +#: classes/pref/feeds.php:1654 classes/pref/feeds.php:1720 msgid "Unsubscribe from selected feeds" msgstr "Ausgewählte Feeds abbestellen" @@ -1733,9 +1534,7 @@ msgstr "Zu abonnierende Feeds, Einen pro Zeile" msgid "Feeds require authentication." msgstr "Feeds benötigen Authentifizierung." -#: classes/pref/feeds.php:1864 -#: classes/feeds.php:1094 -#: classes/feeds.php:1148 +#: classes/pref/feeds.php:1864 classes/feeds.php:1094 classes/feeds.php:1148 msgid "Subscribe" msgstr "Abonnieren" @@ -1743,60 +1542,48 @@ msgstr "Abonnieren" msgid "Preview article" msgstr "Artikel-Vorschau" -#: classes/pref/filters.php:239 -#: classes/pref/filters.php:518 +#: classes/pref/filters.php:239 classes/pref/filters.php:518 msgid "(inverse)" msgstr "Invertiert" -#: classes/pref/filters.php:235 -#: classes/pref/filters.php:517 +#: classes/pref/filters.php:235 classes/pref/filters.php:517 #, php-format msgid "%s on %s in %s %s" msgstr "%s innerhalb %s von %s %s" -#: classes/pref/filters.php:354 -#: classes/pref/filters.php:827 +#: classes/pref/filters.php:354 classes/pref/filters.php:827 #: classes/pref/filters.php:942 msgid "Match" msgstr "Kriterien" -#: classes/pref/filters.php:368 -#: classes/pref/filters.php:416 -#: classes/pref/filters.php:841 -#: classes/pref/filters.php:868 +#: classes/pref/filters.php:368 classes/pref/filters.php:416 +#: classes/pref/filters.php:841 classes/pref/filters.php:868 msgid "Add" msgstr "Hinzufügen" -#: classes/pref/filters.php:371 -#: classes/pref/filters.php:419 -#: classes/pref/filters.php:844 -#: classes/pref/filters.php:871 +#: classes/pref/filters.php:371 classes/pref/filters.php:419 +#: classes/pref/filters.php:844 classes/pref/filters.php:871 #: classes/feeds.php:116 msgid "Delete" msgstr "Löschen" -#: classes/pref/filters.php:402 -#: classes/pref/filters.php:854 +#: classes/pref/filters.php:402 classes/pref/filters.php:854 msgid "Apply actions" msgstr "Aktionen anwenden" -#: classes/pref/filters.php:452 -#: classes/pref/filters.php:883 +#: classes/pref/filters.php:452 classes/pref/filters.php:883 msgid "Enabled" msgstr "Aktiviert" -#: classes/pref/filters.php:461 -#: classes/pref/filters.php:886 +#: classes/pref/filters.php:461 classes/pref/filters.php:886 msgid "Match any rule" msgstr "Ein erfülltes Kriterium ist ausreichend" -#: classes/pref/filters.php:470 -#: classes/pref/filters.php:889 +#: classes/pref/filters.php:470 classes/pref/filters.php:889 msgid "Inverse matching" msgstr "Invertierte Übereinstimmung" -#: classes/pref/filters.php:482 -#: classes/pref/filters.php:896 +#: classes/pref/filters.php:482 classes/pref/filters.php:896 msgid "Test" msgstr "Test" @@ -1816,8 +1603,7 @@ msgstr "Invertiere reguläre Ausdrücke" msgid "on field" msgstr "in Feld" -#: classes/pref/filters.php:962 -#: js/PrefFilterTree.js:64 +#: classes/pref/filters.php:962 js/PrefFilterTree.js:64 msgid "in" msgstr "in" @@ -1829,8 +1615,7 @@ msgstr "Wiki:Filter" msgid "Save rule" msgstr "Regel speichern" -#: classes/pref/filters.php:980 -#: js/functions.js:1012 +#: classes/pref/filters.php:980 js/functions.js:1012 msgid "Add rule" msgstr "Regel hinzufügen" @@ -1846,8 +1631,7 @@ msgstr "keine Aktionen verfügbar" msgid "Save action" msgstr "Aktion speichern" -#: classes/pref/filters.php:1073 -#: js/functions.js:1038 +#: classes/pref/filters.php:1073 js/functions.js:1038 msgid "Add action" msgstr "Aktion hinzufügen" @@ -2045,8 +1829,7 @@ msgstr "Unsichere Tags aus Artikeln entfernen" msgid "Strip all but most common HTML tags when reading articles." msgstr "Alle außer den meist verwendeten HTML Tags beim Lesen entfernen." -#: classes/pref/prefs.php:53 -#: js/prefs.js:1692 +#: classes/pref/prefs.php:53 js/prefs.js:1692 msgid "Customize stylesheet" msgstr "Benutzerdefiniertes Stylesheet" @@ -2146,8 +1929,7 @@ msgstr "Einmalpasswörter (OTP) / Authentifikator" msgid "One time passwords are currently enabled. Enter your current password below to disable." msgstr "Einmalpasswörter sind aktiviert. Gib dein aktuelles Passwort ein, um diese zu deaktivieren." -#: classes/pref/prefs.php:347 -#: classes/pref/prefs.php:398 +#: classes/pref/prefs.php:347 classes/pref/prefs.php:398 msgid "Enter your password" msgstr "Geben Sie Ihr Passwort ein" @@ -2224,33 +2006,27 @@ msgstr "Mehr Plugins im tt-rss.org