diff options
| author | 2018-09-09 13:03:51 +0200 | |
|---|---|---|
| committer | 2018-09-09 13:03:51 +0200 | |
| commit | 44bd07e506ade204151c276fdc05994d51efdd7a (patch) | |
| tree | 2efe48133d2c874c65a99ae3a6cd92bb0dff4fe8 /app | |
| parent | 3306a1679c2570c30d4b662c887b4a71ce147398 (diff) | |
| parent | 1802c1e9ae7d3d55a0e37e1cc2e7c0acc25f70ba (diff) | |
Merge pull request #2001 from FreshRSS/dev1.11.2
FreshRSS 1.11.2
Diffstat (limited to 'app')
90 files changed, 350 insertions, 127 deletions
diff --git a/app/Controllers/entryController.php b/app/Controllers/entryController.php index 73e181b07..16a15c447 100755 --- a/app/Controllers/entryController.php +++ b/app/Controllers/entryController.php @@ -40,6 +40,7 @@ class FreshRSS_entry_Controller extends Minz_ActionController { $get = Minz_Request::param('get'); $next_get = Minz_Request::param('nextGet', $get); $id_max = Minz_Request::param('idMax', 0); + $is_read = (bool)(Minz_Request::param('is_read', true)); FreshRSS_Context::$search = new FreshRSS_BooleanSearch(Minz_Request::param('search', '')); FreshRSS_Context::$state = Minz_Request::param('state', 0); @@ -63,39 +64,38 @@ class FreshRSS_entry_Controller extends Minz_ActionController { if (!$get) { // No get? Mark all entries as read (from $id_max) - $entryDAO->markReadEntries($id_max); + $entryDAO->markReadEntries($id_max, $is_read); } else { $type_get = $get[0]; $get = substr($get, 2); switch($type_get) { case 'c': - $entryDAO->markReadCat($get, $id_max, FreshRSS_Context::$search, FreshRSS_Context::$state); + $entryDAO->markReadCat($get, $id_max, FreshRSS_Context::$search, FreshRSS_Context::$state, $is_read); break; case 'f': - $entryDAO->markReadFeed($get, $id_max, FreshRSS_Context::$search, FreshRSS_Context::$state); + $entryDAO->markReadFeed($get, $id_max, FreshRSS_Context::$search, FreshRSS_Context::$state, $is_read); break; case 's': - $entryDAO->markReadEntries($id_max, true, 0, FreshRSS_Context::$search); + $entryDAO->markReadEntries($id_max, true, 0, FreshRSS_Context::$search, FreshRSS_Context::$state, $is_read); break; case 'a': - $entryDAO->markReadEntries($id_max, false, 0, FreshRSS_Context::$search, FreshRSS_Context::$state); + $entryDAO->markReadEntries($id_max, false, 0, FreshRSS_Context::$search, FreshRSS_Context::$state, $is_read); break; } if ($next_get !== 'a') { // Redirect to the correct page (category, feed or starred) - // Not "a" because it is the default value if nothing is - // given. + // Not "a" because it is the default value if nothing is given. $params['get'] = $next_get; } } } else { - $is_read = (bool)(Minz_Request::param('is_read', true)); $entryDAO->markRead($id, $is_read); } if (!$this->ajax) { - Minz_Request::good(_t('feedback.sub.feed.marked_read'), array( + Minz_Request::good(_t($is_read ? 'feedback.sub.articles.marked_read' : 'feedback.sub.articles.marked_unread'), + array( 'c' => 'index', 'a' => 'index', 'params' => $params, @@ -186,7 +186,7 @@ class FreshRSS_entry_Controller extends Minz_ActionController { $nb = $entryDAO->cleanOldEntries($feed->id(), $date_min, $feed_history); if ($nb > 0) { $nb_total += $nb; - Minz_Log::debug($nb . ' old entries cleaned in feed [' . $feed->url() . ']'); + Minz_Log::debug($nb . ' old entries cleaned in feed [' . $feed->url(false) . ']'); } } } diff --git a/app/Controllers/feedController.php b/app/Controllers/feedController.php index ec88156f9..2f7495884 100755 --- a/app/Controllers/feedController.php +++ b/app/Controllers/feedController.php @@ -295,12 +295,12 @@ class FreshRSS_feed_Controller extends Minz_ActionController { if ($feed->lastUpdate() + 10 >= $mtime) { continue; //Nothing newer from other users } - //Minz_Log::debug($feed->url() . ' was updated at ' . date('c', $mtime) . ' by another user'); + //Minz_Log::debug($feed->url(false) . ' was updated at ' . date('c', $mtime) . ' by another user'); //Will take advantage of the newer cache } if (!$feed->lock()) { - Minz_Log::notice('Feed already being actualized: ' . $feed->url()); + Minz_Log::notice('Feed already being actualized: ' . $feed->url(false)); continue; } @@ -351,7 +351,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController { //This entry already exists and is unchanged. TODO: Remove the test with the zero'ed hash in FreshRSS v1.3 $oldGuids[] = $entry->guid(); } else { //This entry already exists but has been updated - //Minz_Log::debug('Entry with GUID `' . $entry->guid() . '` updated in feed ' . $feed->url() . + //Minz_Log::debug('Entry with GUID `' . $entry->guid() . '` updated in feed ' . $feed->url(false) . //', old hash ' . $existingHash . ', new hash ' . $entry->hash()); $mark_updated_article_unread = $feed->attributes('mark_updated_article_unread') !== null ? ( $feed->attributes('mark_updated_article_unread') @@ -413,7 +413,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController { $entryDAO->updateLastSeen($feed->id(), $oldGuids, $mtime); } - if ($feed_history >= 0 && rand(0, 30) === 1) { + if ($feed_history >= 0 && mt_rand(0, 30) === 1) { // TODO: move this function in web cron when available (see entry::purge) // Remove old entries once in 30. if (!$entryDAO->inTransaction()) { @@ -425,8 +425,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController { max($feed_history, count($entries) + 10)); if ($nb > 0) { $needFeedCacheRefresh = true; - Minz_Log::debug($nb . ' old entries cleaned in feed [' . - $feed->url() . ']'); + Minz_Log::debug($nb . ' old entries cleaned in feed [' . $feed->url(false) . ']'); } } @@ -442,25 +441,25 @@ class FreshRSS_feed_Controller extends Minz_ActionController { if ($feed->selfUrl() !== $url) { //https://code.google.com/p/pubsubhubbub/wiki/MovingFeedsOrChangingHubs $selfUrl = checkUrl($feed->selfUrl()); if ($selfUrl) { - Minz_Log::debug('PubSubHubbub unsubscribe ' . $feed->url()); + Minz_Log::debug('PubSubHubbub unsubscribe ' . $feed->url(false)); if (!$feed->pubSubHubbubSubscribe(false)) { //Unsubscribe - Minz_Log::warning('Error while PubSubHubbub unsubscribing from ' . $feed->url()); + Minz_Log::warning('Error while PubSubHubbub unsubscribing from ' . $feed->url(false)); } $feed->_url($selfUrl, false); - Minz_Log::notice('Feed ' . $url . ' canonical address moved to ' . $feed->url()); + Minz_Log::notice('Feed ' . $url . ' canonical address moved to ' . $feed->url(false)); $feedDAO->updateFeed($feed->id(), array('url' => $feed->url())); } } } elseif ($feed->url() !== $url) { // HTTP 301 Moved Permanently - Minz_Log::notice('Feed ' . $url . ' moved permanently to ' . $feed->url()); + Minz_Log::notice('Feed ' . $url . ' moved permanently to ' . $feed->url(false)); $feedDAO->updateFeed($feed->id(), array('url' => $feed->url())); } $feed->faviconPrepare(); if ($pubsubhubbubEnabledGeneral && $feed->pubSubHubbubPrepare()) { - Minz_Log::notice('PubSubHubbub subscribe ' . $feed->url()); + Minz_Log::notice('PubSubHubbub subscribe ' . $feed->url(false)); if (!$feed->pubSubHubbubSubscribe(true)) { //Subscribe - Minz_Log::warning('Error while PubSubHubbub subscribing to ' . $feed->url()); + Minz_Log::warning('Error while PubSubHubbub subscribing to ' . $feed->url(false)); } } $feed->unlock(); diff --git a/app/Controllers/indexController.php b/app/Controllers/indexController.php index 8567b4657..ddffdba73 100755 --- a/app/Controllers/indexController.php +++ b/app/Controllers/indexController.php @@ -139,7 +139,7 @@ class FreshRSS_index_Controller extends Minz_ActionController { } // No layout for RSS output. - $this->view->url = empty($_SERVER['QUERY_STRING']) ? '' : '?' . $_SERVER['QUERY_STRING']; + $this->view->url = PUBLIC_TO_INDEX_PATH . '/' . (empty($_SERVER['QUERY_STRING']) ? '' : '?' . $_SERVER['QUERY_STRING']); $this->view->rss_title = FreshRSS_Context::$name . ' | ' . Minz_View::title(); $this->view->_useLayout(false); header('Content-Type: application/rss+xml; charset=utf-8'); diff --git a/app/Controllers/javascriptController.php b/app/Controllers/javascriptController.php index 6336106a9..9d7acf647 100755 --- a/app/Controllers/javascriptController.php +++ b/app/Controllers/javascriptController.php @@ -47,8 +47,8 @@ class FreshRSS_javascript_Controller extends Minz_ActionController { $this->view->salt1 = sprintf('$2a$%02d$', FreshRSS_user_Controller::BCRYPT_COST); $alphabet = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; for ($i = 22; $i > 0; $i--) { - $this->view->salt1 .= $alphabet[rand(0, 63)]; + $this->view->salt1 .= $alphabet[mt_rand(0, 63)]; } - $this->view->nonce = sha1(rand()); + $this->view->nonce = sha1(mt_rand()); } } diff --git a/app/Controllers/userController.php b/app/Controllers/userController.php index 47f0ecc62..75a4303d6 100644 --- a/app/Controllers/userController.php +++ b/app/Controllers/userController.php @@ -230,6 +230,17 @@ class FreshRSS_user_Controller extends Minz_ActionController { $_POST['new_user_passwordPlain'] = ''; invalidateHttpCache(); + // If the user has admin access, it means he's already logged in + // and we don't want to login with the new account. Otherwise, the + // user just created its account himself so he probably wants to + // get started immediately. + if ($ok && !FreshRSS_Auth::hasAccess('admin')) { + $user_conf = get_user_configuration($new_user_name); + Minz_Session::_param('currentUser', $new_user_name); + Minz_Session::_param('passwordHash', $user_conf->passwordHash); + FreshRSS_Auth::giveAccess(); + } + $notif = array( 'type' => $ok ? 'good' : 'bad', 'content' => _t('feedback.user.created' . (!$ok ? '.error' : ''), $new_user_name) diff --git a/app/FreshRSS.php b/app/FreshRSS.php index 25fd429a2..2bd5135a9 100644 --- a/app/FreshRSS.php +++ b/app/FreshRSS.php @@ -66,7 +66,7 @@ class FreshRSS extends Minz_FrontController { 403, array('error' => array( _t('feedback.access.denied'), - ' [HTTP_REFERER=' . htmlspecialchars($http_referer) . ']' + ' [HTTP_REFERER=' . htmlspecialchars($http_referer, ENT_NOQUOTES, 'UTF-8') . ']' )) ); } diff --git a/app/Models/Category.php b/app/Models/Category.php index 9a44a2d09..197faf942 100644 --- a/app/Models/Category.php +++ b/app/Models/Category.php @@ -68,7 +68,7 @@ class FreshRSS_Category extends Minz_Model { $this->id = $value; } public function _name($value) { - $this->name = substr(trim($value), 0, 255); + $this->name = mb_strcut(trim($value), 0, 255, 'UTF-8'); } public function _feeds($values) { if (!is_array($values)) { diff --git a/app/Models/CategoryDAO.php b/app/Models/CategoryDAO.php index ef2c402a0..cf6b3bae3 100644 --- a/app/Models/CategoryDAO.php +++ b/app/Models/CategoryDAO.php @@ -9,7 +9,7 @@ class FreshRSS_CategoryDAO extends Minz_ModelPdo implements FreshRSS_Searchable $stm = $this->bd->prepare($sql); $values = array( - substr($valuesTmp['name'], 0, 255), + mb_strcut($valuesTmp['name'], 0, 255, 'UTF-8'), ); if ($stm && $stm->execute($values)) { diff --git a/app/Models/Entry.php b/app/Models/Entry.php index 2b6059638..ccbad5724 100644 --- a/app/Models/Entry.php +++ b/app/Models/Entry.php @@ -31,6 +31,7 @@ class FreshRSS_Entry extends Minz_Model { $this->_isRead($is_read); $this->_isFavorite($is_favorite); $this->_feedId($feedId); + $tags = mb_strcut($tags, 0, 1023, 'UTF-8'); $this->_tags(preg_split('/[\s#]/', $tags)); $this->_guid($guid); } @@ -123,11 +124,11 @@ class FreshRSS_Entry extends Minz_Model { } public function _title($value) { $this->hash = null; - $this->title = $value; + $this->title = mb_strcut($value, 0, 255, 'UTF-8'); } public function _author($value) { $this->hash = null; - $this->author = $value; + $this->author = mb_strcut($value, 0, 255, 'UTF-8'); } public function _content($value) { $this->hash = null; diff --git a/app/Models/EntryDAO.php b/app/Models/EntryDAO.php index 59f826c3e..f0e164995 100644 --- a/app/Models/EntryDAO.php +++ b/app/Models/EntryDAO.php @@ -160,9 +160,9 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable { $valuesTmp['guid'] = substr($valuesTmp['guid'], 0, 760); $valuesTmp['guid'] = safe_ascii($valuesTmp['guid']); $this->addEntryPrepared->bindParam(':guid', $valuesTmp['guid']); - $valuesTmp['title'] = substr($valuesTmp['title'], 0, 255); + $valuesTmp['title'] = mb_strcut($valuesTmp['title'], 0, 255, 'UTF-8'); $this->addEntryPrepared->bindParam(':title', $valuesTmp['title']); - $valuesTmp['author'] = substr($valuesTmp['author'], 0, 255); + $valuesTmp['author'] = mb_strcut($valuesTmp['author'], 0, 255, 'UTF-8'); $this->addEntryPrepared->bindParam(':author', $valuesTmp['author']); $this->addEntryPrepared->bindParam(':content', $valuesTmp['content']); $valuesTmp['link'] = substr($valuesTmp['link'], 0, 1023); @@ -176,7 +176,7 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable { $valuesTmp['is_favorite'] = $valuesTmp['is_favorite'] ? 1 : 0; $this->addEntryPrepared->bindParam(':is_favorite', $valuesTmp['is_favorite'], PDO::PARAM_INT); $this->addEntryPrepared->bindParam(':id_feed', $valuesTmp['id_feed'], PDO::PARAM_INT); - $valuesTmp['tags'] = substr($valuesTmp['tags'], 0, 1023); + $valuesTmp['tags'] = mb_strcut($valuesTmp['tags'], 0, 1023, 'UTF-8'); $this->addEntryPrepared->bindParam(':tags', $valuesTmp['tags']); if ($this->hasNativeHex()) { @@ -243,9 +243,9 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable { $valuesTmp['guid'] = substr($valuesTmp['guid'], 0, 760); $this->updateEntryPrepared->bindParam(':guid', $valuesTmp['guid']); - $valuesTmp['title'] = substr($valuesTmp['title'], 0, 255); + $valuesTmp['title'] = mb_strcut($valuesTmp['title'], 0, 255, 'UTF-8'); $this->updateEntryPrepared->bindParam(':title', $valuesTmp['title']); - $valuesTmp['author'] = substr($valuesTmp['author'], 0, 255); + $valuesTmp['author'] = mb_strcut($valuesTmp['author'], 0, 255, 'UTF-8'); $this->updateEntryPrepared->bindParam(':author', $valuesTmp['author']); $this->updateEntryPrepared->bindParam(':content', $valuesTmp['content']); $valuesTmp['link'] = substr($valuesTmp['link'], 0, 1023); @@ -258,7 +258,7 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable { $this->updateEntryPrepared->bindValue(':is_read', $valuesTmp['is_read'] ? 1 : 0, PDO::PARAM_INT); } $this->updateEntryPrepared->bindParam(':id_feed', $valuesTmp['id_feed'], PDO::PARAM_INT); - $valuesTmp['tags'] = substr($valuesTmp['tags'], 0, 1023); + $valuesTmp['tags'] = mb_strcut($valuesTmp['tags'], 0, 1023, 'UTF-8'); $this->updateEntryPrepared->bindParam(':tags', $valuesTmp['tags']); if ($this->hasNativeHex()) { @@ -437,7 +437,7 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable { * @param integer $priorityMin * @return integer affected rows */ - public function markReadEntries($idMax = 0, $onlyFavorites = false, $priorityMin = 0, $filters = null, $state = 0) { + public function markReadEntries($idMax = 0, $onlyFavorites = false, $priorityMin = 0, $filters = null, $state = 0, $is_read = true) { FreshRSS_UserDAO::touch(); if ($idMax == 0) { $idMax = time() . '000000'; @@ -445,14 +445,14 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable { } $sql = 'UPDATE `' . $this->prefix . 'entry` e INNER JOIN `' . $this->prefix . 'feed` f ON e.id_feed=f.id ' - . 'SET e.is_read=1 ' - . 'WHERE e.is_read=0 AND e.id <= ?'; + . 'SET e.is_read=? ' + . 'WHERE e.is_read <> ? AND e.id <= ?'; if ($onlyFavorites) { $sql .= ' AND e.is_favorite=1'; } elseif ($priorityMin >= 0) { $sql .= ' AND f.priority > ' . intval($priorityMin); } - $values = array($idMax); + $values = array($is_read ? 1 : 0, $is_read ? 1 : 0, $idMax); list($searchValues, $search) = $this->sqlListEntriesWhere('e.', $filters, $state); @@ -480,7 +480,7 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable { * @param integer $idMax fail safe article ID * @return integer affected rows */ - public function markReadCat($id, $idMax = 0, $filters = null, $state = 0) { + public function markReadCat($id, $idMax = 0, $filters = null, $state = 0, $is_read = true) { FreshRSS_UserDAO::touch(); if ($idMax == 0) { $idMax = time() . '000000'; @@ -488,9 +488,9 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable { } $sql = 'UPDATE `' . $this->prefix . 'entry` e INNER JOIN `' . $this->prefix . 'feed` f ON e.id_feed=f.id ' - . 'SET e.is_read=1 ' - . 'WHERE f.category=? AND e.is_read=0 AND e.id <= ?'; - $values = array($id, $idMax); + . 'SET e.is_read=? ' + . 'WHERE f.category=? AND e.is_read <> ? AND e.id <= ?'; + $values = array($is_read ? 1 : 0, $id, $is_read ? 1 : 0, $idMax); list($searchValues, $search) = $this->sqlListEntriesWhere('e.', $filters, $state); @@ -518,7 +518,7 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable { * @param integer $idMax fail safe article ID * @return integer affected rows */ - public function markReadFeed($id_feed, $idMax = 0, $filters = null, $state = 0) { + public function markReadFeed($id_feed, $idMax = 0, $filters = null, $state = 0, $is_read = true) { FreshRSS_UserDAO::touch(); if ($idMax == 0) { $idMax = time() . '000000'; @@ -527,9 +527,9 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable { $this->bd->beginTransaction(); $sql = 'UPDATE `' . $this->prefix . 'entry` ' - . 'SET is_read=1 ' - . 'WHERE id_feed=? AND is_read=0 AND id <= ?'; - $values = array($id_feed, $idMax); + . 'SET is_read=? ' + . 'WHERE id_feed=? AND is_read <> ? AND id <= ?'; + $values = array($is_read ? 1 : 0, $id_feed, $is_read ? 1 : 0, $idMax); list($searchValues, $search) = $this->sqlListEntriesWhere('', $filters, $state); @@ -909,6 +909,7 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable { $stm = $this->bd->prepare($sql); $stm->execute(); $res = $stm->fetchAll(PDO::FETCH_COLUMN, 0); + rsort($res); $all = empty($res[0]) ? 0 : $res[0]; $unread = empty($res[1]) ? 0 : $res[1]; return array('all' => $all, 'unread' => $unread, 'read' => $all - $unread); @@ -963,6 +964,7 @@ SQL; $stm = $this->bd->prepare($sql); $stm->execute(array(':priority_normal' => FreshRSS_Feed::PRIORITY_NORMAL)); $res = $stm->fetchAll(PDO::FETCH_COLUMN, 0); + rsort($res); $all = empty($res[0]) ? 0 : $res[0]; $unread = empty($res[1]) ? 0 : $res[1]; return array('all' => $all, 'unread' => $unread, 'read' => $all - $unread); diff --git a/app/Models/EntryDAOSQLite.php b/app/Models/EntryDAOSQLite.php index cca970e36..944de8470 100644 --- a/app/Models/EntryDAOSQLite.php +++ b/app/Models/EntryDAOSQLite.php @@ -101,6 +101,7 @@ DROP TABLE IF EXISTS `tmp`; * @return integer affected rows */ public function markRead($ids, $is_read = true) { + FreshRSS_UserDAO::touch(); if (is_array($ids)) { //Many IDs at once (used by API) if (true) { //Speed heuristics //TODO: Not implemented yet for SQLite (so always call IDs one by one) $affected = 0; @@ -159,19 +160,20 @@ DROP TABLE IF EXISTS `tmp`; * @param integer $priorityMin * @return integer affected rows */ - public function markReadEntries($idMax = 0, $onlyFavorites = false, $priorityMin = 0, $filters = null, $state = 0) { + public function markReadEntries($idMax = 0, $onlyFavorites = false, $priorityMin = 0, $filters = null, $state = 0, $is_read = true) { + FreshRSS_UserDAO::touch(); if ($idMax == 0) { $idMax = time() . '000000'; Minz_Log::debug('Calling markReadEntries(0) is deprecated!'); } - $sql = 'UPDATE `' . $this->prefix . 'entry` SET is_read=1 WHERE is_read=0 AND id <= ?'; + $sql = 'UPDATE `' . $this->prefix . 'entry` SET is_read = ? WHERE is_read <> ? AND id <= ?'; if ($onlyFavorites) { $sql .= ' AND is_favorite=1'; } elseif ($priorityMin >= 0) { $sql .= ' AND id_feed IN (SELECT f.id FROM `' . $this->prefix . 'feed` f WHERE f.priority > ' . intval($priorityMin) . ')'; } - $values = array($idMax); + $values = array($is_read ? 1 : 0, $is_read ? 1 : 0, $idMax); list($searchValues, $search) = $this->sqlListEntriesWhere('', $filters, $state); @@ -199,17 +201,18 @@ DROP TABLE IF EXISTS `tmp`; * @param integer $idMax fail safe article ID * @return integer affected rows */ - public function markReadCat($id, $idMax = 0, $filters = null, $state = 0) { + public function markReadCat($id, $idMax = 0, $filters = null, $state = 0, $is_read = true) { + FreshRSS_UserDAO::touch(); if ($idMax == 0) { $idMax = time() . '000000'; Minz_Log::debug('Calling markReadCat(0) is deprecated!'); } $sql = 'UPDATE `' . $this->prefix . 'entry` ' - . 'SET is_read=1 ' - . 'WHERE is_read=0 AND id <= ? AND ' + . 'SET is_read = ? ' + . 'WHERE is_read <> ? AND id <= ? AND ' . 'id_feed IN (SELECT f.id FROM `' . $this->prefix . 'feed` f WHERE f.category=?)'; - $values = array($idMax, $id); + $values = array($is_read ? 1 : 0, $is_read ? 1 : 0, $idMax, $id); list($searchValues, $search) = $this->sqlListEntriesWhere('', $filters, $state); diff --git a/app/Models/Feed.php b/app/Models/Feed.php index 89eb0a53c..ed381a867 100644 --- a/app/Models/Feed.php +++ b/app/Models/Feed.php @@ -59,8 +59,8 @@ class FreshRSS_Feed extends Minz_Model { return $this->hash; } - public function url() { - return $this->url; + public function url($includeCredentials = true) { + return $includeCredentials ? $this->url : SimplePie_Misc::url_remove_credentials($this->url); } public function selfUrl() { return $this->selfUrl; @@ -341,7 +341,7 @@ class FreshRSS_Feed extends Minz_Model { foreach ($feed->get_items() as $item) { $title = html_only_entity_decode(strip_tags($item->get_title())); - $author = $item->get_author(); + $authors = $item->get_authors(); $link = $item->get_permalink(); $date = @strtotime($item->get_date()); @@ -409,12 +409,19 @@ class FreshRSS_Feed extends Minz_Model { $guid = $item->get_id(false, false); $hasUniqueGuids &= empty($guids['_' . $guid]); $guids['_' . $guid] = true; + $author_names = ''; + if (is_array($authors)) { + foreach ($authors as $author) { + $author_names .= html_only_entity_decode(strip_tags($author->name == '' ? $author->email : $author->name)) . ', '; + } + } + $author_names = substr($author_names, 0, -2); $entry = new FreshRSS_Entry( $this->id(), $guid, $title === null ? '' : $title, - $author === null ? '' : html_only_entity_decode(strip_tags($author->name == null ? $author->email : $author->name)), + $author_names, $content === null ? '' : $content, $link === null ? '' : $link, $date ? $date : time() diff --git a/app/Models/FeedDAO.php b/app/Models/FeedDAO.php index 9d980c139..285f17193 100644 --- a/app/Models/FeedDAO.php +++ b/app/Models/FeedDAO.php @@ -55,9 +55,9 @@ class FreshRSS_FeedDAO extends Minz_ModelPdo implements FreshRSS_Searchable { $values = array( substr($valuesTmp['url'], 0, 511), $valuesTmp['category'], - substr($valuesTmp['name'], 0, 255), + mb_strcut($valuesTmp['name'], 0, 255, 'UTF-8'), substr($valuesTmp['website'], 0, 255), - substr($valuesTmp['description'], 0, 1023), + mb_strcut($valuesTmp['description'], 0, 1023, 'UTF-8'), $valuesTmp['lastUpdate'], base64_encode($valuesTmp['httpAuth']), FreshRSS_Feed::KEEP_HISTORY_DEFAULT, diff --git a/app/i18n/cz/admin.php b/app/i18n/cz/admin.php index d414ffd07..78a4a52e4 100644 --- a/app/i18n/cz/admin.php +++ b/app/i18n/cz/admin.php @@ -63,9 +63,13 @@ return array( ), 'files' => 'Instalace souborů', 'json' => array( - 'nok' => 'Nemáte JSON (balíček php5-json).', + 'nok' => 'Nemáte JSON (balíček php-json).', 'ok' => 'Máte rozšíření JSON.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'Nemáte framework Minz.', 'ok' => 'Máte framework Minz.', diff --git a/app/i18n/cz/feedback.php b/app/i18n/cz/feedback.php index ff9c87d12..fe85a3599 100644 --- a/app/i18n/cz/feedback.php +++ b/app/i18n/cz/feedback.php @@ -52,6 +52,10 @@ return array( ), 'sub' => array( 'actualize' => 'Aktualizovat', + 'articles' => array( + 'marked_read' => 'The selected articles have been marked as read.', //TODO + 'marked_unread' => 'The articles have been marked as unread.', //TODO + ), 'category' => array( 'created' => 'Kategorie %s byla vytvořena.', 'deleted' => 'Kategorie byla smazána.', @@ -74,7 +78,6 @@ return array( 'error' => 'Kanál nelze aktualizovat', 'internal_problem' => 'RSS kanál nelze přidat. Pro detaily <a href="%s">zkontrolujte logy FreshRSS</a>.', // @todo 'invalid_url' => 'URL <em>%s</em> není platné', - 'marked_read' => 'Kanály byly označeny jako přečtené', 'n_actualized' => '%d kanálů bylo aktualizováno', 'n_entries_deleted' => '%d článků bylo smazáno', 'no_refresh' => 'Nelze obnovit žádné kanály…', diff --git a/app/i18n/cz/gen.php b/app/i18n/cz/gen.php index 09a8307ff..66c011da3 100644 --- a/app/i18n/cz/gen.php +++ b/app/i18n/cz/gen.php @@ -168,6 +168,7 @@ return array( 'g+' => 'Google+', 'gnusocial' => 'GNU social', 'jdh' => 'Journal du hacker', + 'linkedin' => 'LinkedIn', 'mastodon' => 'Mastodon', 'movim' => 'Movim', 'pocket' => 'Pocket', diff --git a/app/i18n/cz/index.php b/app/i18n/cz/index.php index cb0e5955d..48a28d4da 100644 --- a/app/i18n/cz/index.php +++ b/app/i18n/cz/index.php @@ -40,6 +40,7 @@ return array( 'mark_all_read' => 'Označit vše jako přečtené', 'mark_cat_read' => 'Označit kategorii jako přečtenou', 'mark_feed_read' => 'Označit kanál jako přečtený', + 'mark_selection_unread' => 'Mark selection as unread', //TODO 'newer_first' => 'Nové nejdříve', 'non-starred' => 'Zobrazit vše vyjma oblíbených', 'normal_view' => 'Normální', diff --git a/app/i18n/cz/install.php b/app/i18n/cz/install.php index ea4812ea5..acdb48ab6 100644 --- a/app/i18n/cz/install.php +++ b/app/i18n/cz/install.php @@ -68,6 +68,10 @@ return array( 'nok' => 'Pro parsování JSON chybí doporučená knihovna.', 'ok' => 'Máte doporučenou knihovnu pro parsování JSON.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'Nemáte framework Minz.', 'ok' => 'Máte framework Minz.', diff --git a/app/i18n/de/admin.php b/app/i18n/de/admin.php index f03e6cdaf..fbeb80296 100644 --- a/app/i18n/de/admin.php +++ b/app/i18n/de/admin.php @@ -63,9 +63,13 @@ return array( ), 'files' => 'Datei-Installation', 'json' => array( - 'nok' => 'Ihnen fehlt die JSON-Erweiterung (Paket php5-json).', + 'nok' => 'Ihnen fehlt die JSON-Erweiterung (Paket php-json).', 'ok' => 'Sie haben die JSON-Erweiterung.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'Ihnen fehlt das Minz-Framework.', 'ok' => 'Sie haben das Minz-Framework.', diff --git a/app/i18n/de/feedback.php b/app/i18n/de/feedback.php index 2c46bbe56..c20f58487 100644 --- a/app/i18n/de/feedback.php +++ b/app/i18n/de/feedback.php @@ -52,6 +52,10 @@ return array( ), 'sub' => array( 'actualize' => 'Aktualisieren', + 'articles' => array( + 'marked_read' => 'The selected articles have been marked as read.', //TODO + 'marked_unread' => 'The articles have been marked as unread.', //TODO + ), 'category' => array( 'created' => 'Die Kategorie %s ist erstellt worden.', 'deleted' => 'Die Kategorie ist gelöscht worden.', @@ -74,7 +78,6 @@ return array( 'error' => 'Der Feed kann nicht aktualisiert werden', 'internal_problem' => 'Der RSS-Feed konnte nicht hinzugefügt werden. Für Details <a href="%s">prüfen Sie die FreshRSS-Protokolle</a>.', // @todo 'invalid_url' => 'Die URL <em>%s</em> ist ungültig', - 'marked_read' => 'Die Feeds sind als gelesen markiert worden', 'n_actualized' => 'Die %d Feeds sind aktualisiert worden', 'n_entries_deleted' => 'Die %d Artikel sind gelöscht worden', 'no_refresh' => 'Es gibt keinen Feed zum Aktualisieren…', diff --git a/app/i18n/de/gen.php b/app/i18n/de/gen.php index 7dbaac384..eb1e74ed6 100644 --- a/app/i18n/de/gen.php +++ b/app/i18n/de/gen.php @@ -59,7 +59,7 @@ return array( 'april' => 'April', 'aug' => 'Aug', 'august' => 'August', - 'before_yesterday' => 'Vor vorgestern', + 'before_yesterday' => 'Ältere Beiträge', 'dec' => 'Dez', 'december' => 'Dezember', 'feb' => 'Feb', @@ -167,6 +167,7 @@ return array( 'g+' => 'Google+', 'gnusocial' => 'GNU social', 'jdh' => 'Journal du hacker', + 'linkedin' => 'LinkedIn', 'mastodon' => 'Mastodon', 'movim' => 'Movim', 'pocket' => 'Pocket', diff --git a/app/i18n/de/index.php b/app/i18n/de/index.php index df92d8085..1fa3e3933 100644 --- a/app/i18n/de/index.php +++ b/app/i18n/de/index.php @@ -40,6 +40,7 @@ return array( 'mark_all_read' => 'Alle als gelesen markieren', 'mark_cat_read' => 'Kategorie als gelesen markieren', 'mark_feed_read' => 'Feed als gelesen markieren', + 'mark_selection_unread' => 'Mark selection as unread', //TODO 'newer_first' => 'Neuere zuerst', 'non-starred' => 'Alle außer Favoriten zeigen', 'normal_view' => 'Normale Ansicht', diff --git a/app/i18n/de/install.php b/app/i18n/de/install.php index b747d1551..d28b22840 100644 --- a/app/i18n/de/install.php +++ b/app/i18n/de/install.php @@ -68,6 +68,10 @@ return array( 'nok' => 'Ihnen fehlt eine empfohlene Bibliothek um JSON zu parsen.', 'ok' => 'Sie haben eine empfohlene Bibliothek um JSON zu parsen.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'Ihnen fehlt das Minz-Framework.', 'ok' => 'Sie haben das Minz-Framework.', diff --git a/app/i18n/en/admin.php b/app/i18n/en/admin.php index 1f857dbab..9db14978f 100644 --- a/app/i18n/en/admin.php +++ b/app/i18n/en/admin.php @@ -63,9 +63,13 @@ return array( ), 'files' => 'File installation', 'json' => array( - 'nok' => 'Cannot find JSON (php5-json package).', + 'nok' => 'Cannot find JSON (php-json package).', 'ok' => 'You have JSON extension.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', + 'ok' => 'You have the recommended library mbstring for Unicode.', + ), 'minz' => array( 'nok' => 'Cannot find the Minz framework.', 'ok' => 'You have the Minz framework.', diff --git a/app/i18n/en/feedback.php b/app/i18n/en/feedback.php index a7fbda3a0..634b547f7 100644 --- a/app/i18n/en/feedback.php +++ b/app/i18n/en/feedback.php @@ -52,6 +52,10 @@ return array( ), 'sub' => array( 'actualize' => 'Updating', + 'articles' => array( + 'marked_read' => 'The selected articles have been marked as read.', + 'marked_unread' => 'The articles have been marked as unread.', + ), 'category' => array( 'created' => 'Category %s has been created.', 'deleted' => 'Category has been deleted.', @@ -74,7 +78,6 @@ return array( 'error' => 'Feed cannot be updated', 'internal_problem' => 'The newsfeed could not be added. <a href="%s">Check FreshRSS logs</a> for details. You can try force adding by appending <code>#force_feed</code> to the URL.', 'invalid_url' => 'URL <em>%s</em> is invalid', - 'marked_read' => 'Feeds have been marked as read', 'n_actualized' => '%d feeds have been updated', 'n_entries_deleted' => '%d articles have been deleted', 'no_refresh' => 'There is no feed to refresh…', diff --git a/app/i18n/en/gen.php b/app/i18n/en/gen.php index ceee25105..34e81af2e 100644 --- a/app/i18n/en/gen.php +++ b/app/i18n/en/gen.php @@ -168,6 +168,7 @@ return array( 'gnusocial' => 'GNU social', 'jdh' => 'Journal du hacker', 'Known' => 'Known based sites', + 'linkedin' => 'LinkedIn', 'mastodon' => 'Mastodon', 'movim' => 'Movim', 'pocket' => 'Pocket', diff --git a/app/i18n/en/index.php b/app/i18n/en/index.php index 29dccc9ed..1c13abdb7 100644 --- a/app/i18n/en/index.php +++ b/app/i18n/en/index.php @@ -40,6 +40,7 @@ return array( 'mark_all_read' => 'Mark all as read', 'mark_cat_read' => 'Mark category as read', 'mark_feed_read' => 'Mark feed as read', + 'mark_selection_unread' => 'Mark selection as unread', 'newer_first' => 'Newer first', 'non-starred' => 'Show non-favourites', 'normal_view' => 'Normal view', diff --git a/app/i18n/en/install.php b/app/i18n/en/install.php index 40fff37dd..53d2f9be0 100644 --- a/app/i18n/en/install.php +++ b/app/i18n/en/install.php @@ -68,6 +68,10 @@ return array( 'nok' => 'Cannot find a recommended library to parse JSON.', 'ok' => 'You have a recommended library to parse JSON.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'Cannot find the Minz framework.', 'ok' => 'You have the Minz framework.', diff --git a/app/i18n/es/admin.php b/app/i18n/es/admin.php index 2884721c7..db41057bf 100755 --- a/app/i18n/es/admin.php +++ b/app/i18n/es/admin.php @@ -63,9 +63,13 @@ return array( ), 'files' => 'Instalación de Archivos', 'json' => array( - 'nok' => 'No se ha podido localizar JSON (paquete php5-json).', + 'nok' => 'No se ha podido localizar JSON (paquete php-json).', 'ok' => 'Dispones de la extensión JSON.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'No se ha podido localizar el entorno Minz.', 'ok' => 'Dispones del entorno Minz.', diff --git a/app/i18n/es/feedback.php b/app/i18n/es/feedback.php index 627c86afc..38548e901 100755 --- a/app/i18n/es/feedback.php +++ b/app/i18n/es/feedback.php @@ -52,6 +52,10 @@ return array( ), 'sub' => array( 'actualize' => 'Actualización', + 'articles' => array( + 'marked_read' => 'The selected articles have been marked as read.', //TODO + 'marked_unread' => 'The articles have been marked as unread.', //TODO + ), 'category' => array( 'created' => 'Se ha creado la categoría %s.', 'deleted' => 'Se ha eliminado la categoría.', @@ -74,7 +78,6 @@ return array( 'error' => 'No es posible actualizar la fuente', 'internal_problem' => 'No ha sido posible agregar la fuente RSS. <a href="%s">Revisa el registro de FreshRSS </a> para más información.', // @todo 'invalid_url' => 'La URL <em>%s</em> es inválida', - 'marked_read' => 'Fuentes marcadas como leídas', 'n_actualized' => 'Se han actualiado %d fuentes', 'n_entries_deleted' => 'Se han eliminado %d artículos', 'no_refresh' => 'No hay fuente a actualizar…', diff --git a/app/i18n/es/gen.php b/app/i18n/es/gen.php index a5957e12f..4dc1145b2 100755 --- a/app/i18n/es/gen.php +++ b/app/i18n/es/gen.php @@ -168,6 +168,7 @@ return array( 'g+' => 'Google+', 'gnusocial' => 'GNU social', 'jdh' => 'Journal du hacker', + 'linkedin' => 'LinkedIn', 'mastodon' => 'Mastodon', 'movim' => 'Movim', 'pocket' => 'Pocket', diff --git a/app/i18n/es/index.php b/app/i18n/es/index.php index 03054e23a..c88152459 100755 --- a/app/i18n/es/index.php +++ b/app/i18n/es/index.php @@ -40,6 +40,7 @@ return array( 'mark_all_read' => 'Marcar todo como leído', 'mark_cat_read' => 'Marcar categoría como leída', 'mark_feed_read' => 'Marcar fuente como leída', + 'mark_selection_unread' => 'Mark selection as unread', //TODO 'newer_first' => 'Nuevos primero', 'non-starred' => 'Mostrar todos menos los favoritos', 'normal_view' => 'Vista normal', diff --git a/app/i18n/es/install.php b/app/i18n/es/install.php index cd6f63432..a9be807c7 100755 --- a/app/i18n/es/install.php +++ b/app/i18n/es/install.php @@ -68,6 +68,10 @@ return array( 'nok' => 'No se ha podido localizar la librería para procesar JSON.', 'ok' => 'Dispones de la librería recomendada para procesar JSON.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'No se ha podido localizar el entorno Minz.', 'ok' => 'Dispones del entorno Minz.', diff --git a/app/i18n/fr/admin.php b/app/i18n/fr/admin.php index 6c582d719..1874f2c77 100644 --- a/app/i18n/fr/admin.php +++ b/app/i18n/fr/admin.php @@ -63,8 +63,12 @@ return array( ), 'files' => 'Installation des fichiers', 'json' => array( - 'nok' => 'Vous ne disposez pas de JSON (paquet php5-json).', - 'ok' => 'Vous disposez de l’extension JSON.', + 'nok' => 'Vous ne disposez pas de l’extension recommendée JSON (paquet php-json).', + 'ok' => 'Vous disposez de l’extension recommendée JSON.', + ), + 'mbstring' => array( + 'nok' => 'Impossible de trouver la librairie recommandée mbstring pour Unicode.', + 'ok' => 'Vouz disposez de la librairie recommandée mbstring pour Unicode.', ), 'minz' => array( 'nok' => 'Vous ne disposez pas de la librairie Minz.', diff --git a/app/i18n/fr/feedback.php b/app/i18n/fr/feedback.php index 2443ad30a..dafdd353d 100644 --- a/app/i18n/fr/feedback.php +++ b/app/i18n/fr/feedback.php @@ -52,6 +52,10 @@ return array( ), 'sub' => array( 'actualize' => 'Actualiser', + 'articles' => array( + 'marked_read' => 'Les articles sélectionnés ont été marqués comme lus.', + 'marked_unread' => 'Les articles sélectionnés ont été marqués comme non-lus.', + ), 'category' => array( 'created' => 'La catégorie %s a été créée.', 'deleted' => 'La catégorie a été supprimée.', @@ -74,7 +78,6 @@ return array( 'error' => 'Une erreur est survenue', 'internal_problem' => 'Le flux ne peut pas être ajouté. <a href="%s">Consulter les logs de FreshRSS</a> pour plus de détails. Vous pouvez essayer de forcer l’ajout par addition de <code>#force_feed</code> à l’URL.', 'invalid_url' => 'L’url <em>%s</em> est invalide.', - 'marked_read' => 'Les flux ont été marqués comme lus.', 'n_actualized' => '%d flux ont été mis à jour.', 'n_entries_deleted' => '%d articles ont été supprimés.', 'no_refresh' => 'Il n’y a aucun flux à actualiser…', diff --git a/app/i18n/fr/gen.php b/app/i18n/fr/gen.php index 24c4b82fb..13e19283f 100644 --- a/app/i18n/fr/gen.php +++ b/app/i18n/fr/gen.php @@ -168,6 +168,7 @@ return array( 'g+' => 'Google+', 'gnusocial' => 'GNU social', 'jdh' => 'Journal du hacker', + 'linkedin' => 'LinkedIn', 'mastodon' => 'Mastodon', 'movim' => 'Movim', 'pocket' => 'Pocket', diff --git a/app/i18n/fr/index.php b/app/i18n/fr/index.php index 0a3a4abb3..bb0d14faf 100644 --- a/app/i18n/fr/index.php +++ b/app/i18n/fr/index.php @@ -40,6 +40,7 @@ return array( 'mark_all_read' => 'Tout marquer comme lu', 'mark_cat_read' => 'Marquer la catégorie comme lue', 'mark_feed_read' => 'Marquer le flux comme lu', + 'mark_selection_unread' => 'Marquer la sélection comme non-lue', 'newer_first' => 'Plus récents en premier', 'non-starred' => 'Afficher les non-favoris', 'normal_view' => 'Vue normale', @@ -52,7 +53,7 @@ return array( 'starred' => 'Afficher les favoris', 'stats' => 'Statistiques', 'subscription' => 'Gestion des abonnements', - 'unread' => 'Afficher les non lus', + 'unread' => 'Afficher les non-lus', ), 'share' => 'Partager', 'tag' => array( diff --git a/app/i18n/fr/install.php b/app/i18n/fr/install.php index 09625de78..9f2d90195 100644 --- a/app/i18n/fr/install.php +++ b/app/i18n/fr/install.php @@ -65,8 +65,12 @@ return array( 'ok' => 'Le HTTP REFERER est connu et semble correspondre à votre serveur.', ), 'json' => array( - 'nok' => 'Impossible de trouver une librairie recommandée pour JSON.', - 'ok' => 'Vouz disposez de la librairie recommandée pour JSON.', + 'nok' => 'Vous ne disposez pas de l’extension recommendée JSON (paquet php-json).', + 'ok' => 'Vous disposez de l’extension recommendée JSON.', + ), + 'mbstring' => array( + 'nok' => 'Impossible de trouver la librairie recommandée mbstring pour Unicode.', + 'ok' => 'Vouz disposez de la librairie recommandée mbstring pour Unicode.', ), 'minz' => array( 'nok' => 'Vous ne disposez pas de la librairie Minz.', diff --git a/app/i18n/he/admin.php b/app/i18n/he/admin.php index 2840213c9..71f86357e 100644 --- a/app/i18n/he/admin.php +++ b/app/i18n/he/admin.php @@ -33,7 +33,7 @@ return array( 'ok' => 'הספרייה הנדרשת ל character type checking (ctype) מותקנת', ), 'curl' => array( - 'nok' => 'בURL לא מותקן (php5-curl package)', + 'nok' => 'בURL לא מותקן (php-curl package)', 'ok' => 'You have cURL extension.', // @todo ), 'data' => array( @@ -63,9 +63,13 @@ return array( ), 'files' => 'File installation', // @todo 'json' => array( - 'nok' => 'You lack JSON (php5-json package).', // @todo + 'nok' => 'You lack JSON (php-json package).', // @todo 'ok' => 'You have JSON extension.', // @todo ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'You lack the Minz framework.', // @todo 'ok' => 'יש לכם את תשתית Minz', @@ -97,7 +101,7 @@ return array( 'ok' => 'Permissions on users directory are good.', // @todo ), 'zip' => array( - 'nok' => 'You lack ZIP extension (php5-zip package).', // @todo + 'nok' => 'You lack ZIP extension (php-zip package).', // @todo 'ok' => 'You have ZIP extension.', // @todo ), ), diff --git a/app/i18n/he/feedback.php b/app/i18n/he/feedback.php index 4b79b0d45..369714795 100644 --- a/app/i18n/he/feedback.php +++ b/app/i18n/he/feedback.php @@ -53,6 +53,10 @@ return array( ), 'sub' => array( 'actualize' => 'מימוש', + 'articles' => array( + 'marked_read' => 'The selected articles have been marked as read.', //TODO + 'marked_unread' => 'The articles have been marked as unread.', //TODO + ), 'category' => array( 'created' => 'Category %s has been created.', // @todo 'deleted' => 'Category has been deleted.', // @todo @@ -75,7 +79,6 @@ return array( 'error' => 'Feed cannot be updated', // @todo 'internal_problem' => 'אין אפשרות להוסיף את ההזנה. <a href="%s">בדקו את הלוגים</a> לפרטים.', // @todo 'invalid_url' => 'URL <em>%s</em> אינו תקין', - 'marked_read' => 'הזנות סומנו כנקראו', 'n_actualized' => '%d הזנות עודכנו', 'n_entries_deleted' => '%d המאמרים נמחקו', 'no_refresh' => 'אין הזנה שניתן לרענן…', diff --git a/app/i18n/he/gen.php b/app/i18n/he/gen.php index 401e13620..a59f6b178 100644 --- a/app/i18n/he/gen.php +++ b/app/i18n/he/gen.php @@ -168,6 +168,7 @@ return array( 'gnusocial' => 'GNU social', 'jdh' => 'Journal du hacker', 'Known' => 'Known based sites', + 'linkedin' => 'LinkedIn', 'mastodon' => 'Mastodon', 'movim' => 'Movim', 'pocket' => 'Pocket', diff --git a/app/i18n/he/index.php b/app/i18n/he/index.php index cef07eaf8..8ca6e76f7 100644 --- a/app/i18n/he/index.php +++ b/app/i18n/he/index.php @@ -40,6 +40,7 @@ return array( 'mark_all_read' => 'סימון הכל כנקרא', 'mark_cat_read' => 'סימון קטגוריה כנקראה', 'mark_feed_read' => 'סימון הזנה כנקראה', + 'mark_selection_unread' => 'Mark selection as unread', //TODO 'newer_first' => 'חדשים בראש', 'non-starred' => 'הצגת הכל פרט למועדפים', 'normal_view' => 'תצוגה רגילה', diff --git a/app/i18n/he/install.php b/app/i18n/he/install.php index 6d7cee661..93b8063b3 100644 --- a/app/i18n/he/install.php +++ b/app/i18n/he/install.php @@ -40,7 +40,7 @@ return array( 'ok' => 'הספרייה הנדרשת ל character type checking (ctype) מותקנת', ), 'curl' => array( - 'nok' => 'בURL לא מותקן (php5-curl package)', + 'nok' => 'בURL לא מותקן (php-curl package)', 'ok' => 'יש לכם את גירסת %s של cURL', ), 'data' => array( @@ -59,6 +59,14 @@ return array( 'nok' => 'נא לדבוק שאינך פוגעת ב HTTP REFERER שלך.', 'ok' => 'הHTTP REFERER ידוע ותאם לשרת שלך.', ), + 'json' => array( + 'nok' => 'Cannot find a recommended library to parse JSON.', //TODO + 'ok' => 'You have a recommended library to parse JSON.', //TODO + ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'You lack the Minz framework.', // @todo 'ok' => 'יש לכם את תשתית Minz', diff --git a/app/i18n/it/admin.php b/app/i18n/it/admin.php index a3034777f..5696ed571 100644 --- a/app/i18n/it/admin.php +++ b/app/i18n/it/admin.php @@ -63,9 +63,13 @@ return array( ), 'files' => 'Installazione files', 'json' => array( - 'nok' => 'Manca il supoorto a JSON (pacchetto php5-json).', + 'nok' => 'Manca il supoorto a JSON (pacchetto php-json).', 'ok' => 'Estensione JSON presente.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'Manca il framework Minz.', 'ok' => 'Framework Minz presente.', diff --git a/app/i18n/it/feedback.php b/app/i18n/it/feedback.php index 934666aa5..b0f3a814a 100644 --- a/app/i18n/it/feedback.php +++ b/app/i18n/it/feedback.php @@ -52,6 +52,10 @@ return array( ), 'sub' => array( 'actualize' => 'Aggiorna', + 'articles' => array( + 'marked_read' => 'The selected articles have been marked as read.', //TODO + 'marked_unread' => 'The articles have been marked as unread.', //TODO + ), 'category' => array( 'created' => 'Categoria %s creata.', 'deleted' => 'Categoria cancellata', @@ -74,7 +78,6 @@ return array( 'error' => 'Feed non aggiornato', 'internal_problem' => 'RSS feed non aggiunto. <a href="%s">Verifica i logs</a> per dettagli.', // @todo 'invalid_url' => 'URL <em>%s</em> non valido', - 'marked_read' => 'Feeds segnati come letti', 'n_actualized' => '%d feeds aggiornati', 'n_entries_deleted' => '%d articoli cancellati', 'no_refresh' => 'Nessun aggiornamento disponibile…', diff --git a/app/i18n/it/gen.php b/app/i18n/it/gen.php index b2e007bce..2a90693f9 100644 --- a/app/i18n/it/gen.php +++ b/app/i18n/it/gen.php @@ -168,6 +168,7 @@ return array( 'g+' => 'Google+', 'gnusocial' => 'GNU social', 'jdh' => 'Journal du hacker', + 'linkedin' => 'LinkedIn', 'mastodon' => 'Mastodon', 'movim' => 'Movim', 'pocket' => 'Pocket', diff --git a/app/i18n/it/index.php b/app/i18n/it/index.php index d79502c79..718093327 100644 --- a/app/i18n/it/index.php +++ b/app/i18n/it/index.php @@ -40,6 +40,7 @@ return array( 'mark_all_read' => 'Segna tutto come letto', 'mark_cat_read' => 'Segna la categoria come letta', 'mark_feed_read' => 'Segna il feed come letto', + 'mark_selection_unread' => 'Mark selection as unread', //TODO 'newer_first' => 'Mostra prima i recenti', 'non-starred' => 'Escludi preferiti', 'normal_view' => 'Vista elenco', diff --git a/app/i18n/it/install.php b/app/i18n/it/install.php index 18f8cc337..2d0a34885 100644 --- a/app/i18n/it/install.php +++ b/app/i18n/it/install.php @@ -68,6 +68,10 @@ return array( 'nok' => 'You lack a recommended library to parse JSON.', 'ok' => 'You have a recommended library to parse JSON.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'Manca il framework Minz.', 'ok' => 'Framework Minz presente.', diff --git a/app/i18n/kr/admin.php b/app/i18n/kr/admin.php index f9e9c9a8e..bc65b3fa2 100644 --- a/app/i18n/kr/admin.php +++ b/app/i18n/kr/admin.php @@ -63,9 +63,13 @@ return array( ), 'files' => '파일 시스템 설치 요구사항', 'json' => array( - 'nok' => 'JSON 확장 기능을 찾을 수 없습니다 (php5-json 패키지).', + 'nok' => 'JSON 확장 기능을 찾을 수 없습니다 (php-json 패키지).', 'ok' => 'JSON 확장 기능이 설치되어 있습니다.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'Minz 프레임워크를 찾을 수 없습니다.', 'ok' => 'Minz 프레임워크가 설치되어 있습니다.', @@ -175,15 +179,15 @@ return array( 'user' => array( 'articles_and_size' => '%s 개의 글 (%s)', 'create' => '새 사용자 생성', - 'delete_users' => 'Delete user', // TODO + 'delete_users' => '사용자 삭제', 'language' => '언어', 'number' => '%d 개의 계정이 생성되었습니다', 'numbers' => '%d 개의 계정이 생성되었습니다', 'password_form' => '암호<br /><small>(웹폼 로그인 방식 사용시)</small>', 'password_format' => '7 글자 이상이어야 합니다', - 'selected' => 'Selected user', // TODO + 'selected' => '선택된 사용자', 'title' => '사용자 관리', - 'update_users' => 'Update user', // TODO + 'update_users' => '사용자 정보 변경', 'user_list' => '사용자 목록', 'username' => '사용자 이름', 'users' => '전체 사용자', diff --git a/app/i18n/kr/conf.php b/app/i18n/kr/conf.php index 558505973..f618d6c96 100644 --- a/app/i18n/kr/conf.php +++ b/app/i18n/kr/conf.php @@ -37,12 +37,12 @@ return array( 'no_limit' => '제한 없음', 'thin' => '얇음', ), - 'show_nav_buttons' => 'Show the navigation buttons', //TODO + 'show_nav_buttons' => '내비게이션 버튼 보이기', ), 'query' => array( '_' => '사용자 쿼리', 'deprecated' => '이 쿼리는 더 이상 유효하지 않습니다. 해당하는 카테고리나 피드가 삭제되었습니다.', - 'display' => 'Display user query results', // TODO + 'display' => '사용자 쿼리 결과 표시', 'filter' => '적용된 필터:', 'get_all' => '모든 글 표시', 'get_category' => '"%s" 카테고리 표시', @@ -53,7 +53,7 @@ return array( 'number' => '쿼리 #%d', 'order_asc' => '오래된 글 먼저 표시', 'order_desc' => '최근 글 먼저 표시', - 'remove' => 'Remove user query', // TODO + 'remove' => '사용자 쿼리 삭제', 'search' => '"%s"의 검색 결과', 'state_0' => '모든 글 표시', 'state_1' => '읽은 글 표시', @@ -128,7 +128,7 @@ return array( ), 'sharing' => array( '_' => '공유', - 'add' => 'Add a sharing method', // TODO + 'add' => '공유 방법 추가', 'blogotext' => 'Blogotext', 'diaspora' => 'Diaspora*', 'email' => '메일', @@ -136,7 +136,7 @@ return array( 'g+' => 'Google+', 'more_information' => '자세한 정보', 'print' => '인쇄', - 'remove' => 'Remove sharing method', // TODO + 'remove' => '공유 방법 삭제', 'shaarli' => 'Shaarli', 'share_name' => '표시할 이름', 'share_url' => '사용할 공유 URL', diff --git a/app/i18n/kr/feedback.php b/app/i18n/kr/feedback.php index f13675778..12cd673ff 100644 --- a/app/i18n/kr/feedback.php +++ b/app/i18n/kr/feedback.php @@ -52,6 +52,10 @@ return array( ), 'sub' => array( 'actualize' => '피드를 가져오는 중입니다', + 'articles' => array( + 'marked_read' => 'The selected articles have been marked as read.', //TODO + 'marked_unread' => 'The articles have been marked as unread.', //TODO + ), 'category' => array( 'created' => '%s 카테고리가 생성되었습니다.', 'deleted' => '카테고리가 삭제되었습니다.', @@ -72,9 +76,8 @@ return array( 'already_subscribed' => '이미 <em>%s</em> 피드를 구독 중입니다', 'deleted' => '피드가 삭제되었습니다', 'error' => '피드를 변경할 수 없습니다', - 'internal_problem' => 'RSS 피드를 추가할 수 없습니다. 자세한 내용은 <a href="%s">FreshRSS 로그</a>를 참고하세요.', // @todo + 'internal_problem' => 'RSS 피드를 추가할 수 없습니다. 자세한 내용은 <a href="%s">FreshRSS 로그</a>를 참고하세요.', 'invalid_url' => 'URL (<em>%s</em>)이 유효하지 않습니다', - 'marked_read' => '피드가 읽음으로 표시되었습니다', 'n_actualized' => '%d 개의 피드에서 새 글을 가져왔습니다', 'n_entries_deleted' => '%d 개의 글을 삭제했습니다', 'no_refresh' => '새 글을 가져올 피드가 없습니다…', @@ -102,8 +105,8 @@ return array( 'error' => '%s 사용자를 삭제할 수 없습니다', ), 'updated' => array( - '_' => 'User %s has been updated', // TODO - 'error' => 'User %s has not been updated', // TODO + '_' => '사용자 %s의 정보가 변경되었습니다', + 'error' => '사용자 %s의 정보가 변경되지 않았습니다', ), ), 'profile' => array( diff --git a/app/i18n/kr/gen.php b/app/i18n/kr/gen.php index b40ab14c4..e664eaa42 100644 --- a/app/i18n/kr/gen.php +++ b/app/i18n/kr/gen.php @@ -19,7 +19,7 @@ return array( 'see_website' => '웹사이트 열기', 'submit' => '설정 저장', 'truncate' => '모든 글 삭제', - 'update' => 'Update', // TODO + 'update' => '변경', ), 'auth' => array( 'email' => '메일 주소', @@ -168,6 +168,7 @@ return array( 'g+' => 'Google+', 'gnusocial' => 'GNU social', 'jdh' => 'Journal du hacker', + 'linkedin' => 'LinkedIn', 'mastodon' => 'Mastodon', 'movim' => 'Movim', 'pocket' => 'Pocket', diff --git a/app/i18n/kr/index.php b/app/i18n/kr/index.php index cc03f91c2..cb9684dff 100644 --- a/app/i18n/kr/index.php +++ b/app/i18n/kr/index.php @@ -40,6 +40,7 @@ return array( 'mark_all_read' => '모두 읽음으로 표시', 'mark_cat_read' => '카테고리를 읽음으로 표시', 'mark_feed_read' => '피드를 읽음으로 표시', + 'mark_selection_unread' => 'Mark selection as unread', //TODO 'newer_first' => '최근 글 먼저', 'non-starred' => '즐겨찾기를 제외하고 표시', 'normal_view' => '일반 모드', diff --git a/app/i18n/kr/install.php b/app/i18n/kr/install.php index 2eea71ff9..03a8ccdbe 100644 --- a/app/i18n/kr/install.php +++ b/app/i18n/kr/install.php @@ -65,9 +65,13 @@ return array( 'ok' => 'HTTP REFERER가 서버와 일치하는 것을 확인했습니다.', ), 'json' => array( - 'nok' => 'JSON 확장 기능을 찾을 수 없습니다 (php5-json 패키지).', + 'nok' => 'JSON 확장 기능을 찾을 수 없습니다 (php-json 패키지).', 'ok' => 'JSON 확장 기능이 설치되어 있습니다.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'Minz 프레임워크를 찾을 수 없습니다.', 'ok' => 'Minz 프레임워크가 설치되어 있습니다.', diff --git a/app/i18n/kr/sub.php b/app/i18n/kr/sub.php index 464b64f70..de200c330 100644 --- a/app/i18n/kr/sub.php +++ b/app/i18n/kr/sub.php @@ -44,10 +44,10 @@ return array( 'main_stream' => '메인 스트림에 표시하기', 'normal' => '피드가 속한 카테고리에만 표시하기', ), - 'ssl_verify' => 'Verify SSL security', //TODO + 'ssl_verify' => 'SSL 유효성 검사', 'stats' => '통계', 'think_to_add' => '피드를 추가할 수 있습니다.', - 'timeout' => 'Timeout in seconds', //TODO + 'timeout' => '타임아웃 (초)', 'title' => '제목', 'title_add' => 'RSS 피드 추가', 'ttl' => '다음 시간이 지나기 전에 새로고침 금지', diff --git a/app/i18n/nl/admin.php b/app/i18n/nl/admin.php index a1d975305..f40db7bcb 100644 --- a/app/i18n/nl/admin.php +++ b/app/i18n/nl/admin.php @@ -63,9 +63,13 @@ return array( ), 'files' => 'Bestanden installatie', 'json' => array( - 'nok' => 'U mist JSON (php5-json package).', + 'nok' => 'U mist JSON (php-json package).', 'ok' => 'U hebt JSON uitbreiding.', ), + 'mbstring' => array( + 'nok' => 'De voor Unicode aanbevolen bibliotheek mbstring kan niet worden gevonden.', + 'ok' => 'De voor Unicode aanbevolen bibliotheek mbstring is gevonden.', + ), 'minz' => array( 'nok' => 'U mist Minz framework.', 'ok' => 'U hebt Minz framework.', diff --git a/app/i18n/nl/feedback.php b/app/i18n/nl/feedback.php index e73f2f7bd..b16232b84 100644 --- a/app/i18n/nl/feedback.php +++ b/app/i18n/nl/feedback.php @@ -52,6 +52,10 @@ return array( ), 'sub' => array( 'actualize' => 'Actualiseren', + 'articles' => array( + 'marked_read' => 'De geselecteerde artikelen zijn als gelezen gemarkeerd.', + 'marked_unread' => 'De geselecteerde artikelen zijn als ongelezen gemarkeerd.', + ), 'category' => array( 'created' => 'Categorie %s is gemaakt.', 'deleted' => 'Categorie is verwijderd.', @@ -74,7 +78,6 @@ return array( 'error' => 'Feed kan niet worden vernieuwd', 'internal_problem' => 'De feed kon niet worden toegevoegd. <a href="%s">Controleer de FreshRSS-logbestanden</a> voor details. Toevoegen forceren kan worden geprobeerd door <code>#force_feed</code> aan de URL toe te voegen.', 'invalid_url' => 'URL <em>%s</em> is ongeldig', - 'marked_read' => 'Feeds zijn gemarkeerd als gelezen', 'n_actualized' => '%d feeds zijn vernieuwd', 'n_entries_deleted' => '%d artikelen zijn verwijderd', 'no_refresh' => 'Er is geen feed om te vernieuwen…', diff --git a/app/i18n/nl/gen.php b/app/i18n/nl/gen.php index 683209cb9..ccbd86579 100644 --- a/app/i18n/nl/gen.php +++ b/app/i18n/nl/gen.php @@ -168,6 +168,7 @@ return array( 'g+' => 'Google+', 'gnusocial' => 'GNU social', 'jdh' => 'Journal du hacker', + 'linkedin' => 'LinkedIn', 'mastodon' => 'Mastodon', 'movim' => 'Movim', 'pocket' => 'Pocket', diff --git a/app/i18n/nl/index.php b/app/i18n/nl/index.php index e0184a0d0..67b3886ea 100644 --- a/app/i18n/nl/index.php +++ b/app/i18n/nl/index.php @@ -40,6 +40,7 @@ return array( 'mark_all_read' => 'Markeer alles als gelezen', 'mark_cat_read' => 'Markeer categorie als gelezen', 'mark_feed_read' => 'Markeer feed als gelezen', + 'mark_selection_unread' => 'Markeer selectie als ongelezen', 'newer_first' => 'Nieuwste eerst', 'non-starred' => 'Laat alles zien behalve favorieten', 'normal_view' => 'Normale weergave', diff --git a/app/i18n/nl/install.php b/app/i18n/nl/install.php index 419ee4c9b..2d2f38913 100644 --- a/app/i18n/nl/install.php +++ b/app/i18n/nl/install.php @@ -68,6 +68,10 @@ return array( 'nok' => 'U mist een benodigede bibliotheek om JSON te gebruiken.', 'ok' => 'U hebt de benodigde bibliotheek om JSON te gebruiken.', ), + 'mbstring' => array( + 'nok' => 'De voor Unicode aanbevolen bibliotheek mbstring kan niet worden gevonden.', + 'ok' => 'De voor Unicode aanbevolen bibliotheek mbstring is gevonden.', + ), 'minz' => array( 'nok' => 'U mist het Minz framework.', 'ok' => 'U hebt het Minz framework.', diff --git a/app/i18n/pt-br/admin.php b/app/i18n/pt-br/admin.php index 16aa027a8..51c5d381f 100644 --- a/app/i18n/pt-br/admin.php +++ b/app/i18n/pt-br/admin.php @@ -63,9 +63,13 @@ return array( ), 'files' => 'Instalação de arquivos', 'json' => array( - 'nok' => 'Não foi possível encontrar JSON (php5-json).', + 'nok' => 'Não foi possível encontrar JSON (php-json).', 'ok' => 'Você tem a extensão JSON.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'Não foi possível encontrar o framework Minz.', 'ok' => 'Você tem o framework Minz.', diff --git a/app/i18n/pt-br/feedback.php b/app/i18n/pt-br/feedback.php index 2057cf985..a2d66384e 100644 --- a/app/i18n/pt-br/feedback.php +++ b/app/i18n/pt-br/feedback.php @@ -52,6 +52,10 @@ return array( ), 'sub' => array( 'actualize' => 'Atualizando', + 'articles' => array( + 'marked_read' => 'The selected articles have been marked as read.', //TODO + 'marked_unread' => 'The articles have been marked as unread.', //TODO + ), 'category' => array( 'created' => 'Categoria %s foi criada.', 'deleted' => 'Categoria foi deletada.', @@ -74,7 +78,6 @@ return array( 'error' => 'O feed não pode ser atualizado', 'internal_problem' => 'O RSS feed não pôde ser adicionado. <a href="%s">Verifique os FreshRSS logs</a> para detalhes.', // @todo 'invalid_url' => 'URL <em>%s</em> é inválida', - 'marked_read' => 'Feeds foram marcados como lidos', 'n_actualized' => '%d feeds foram atualizados', 'n_entries_deleted' => '%d artigos foram deletados', 'no_refresh' => 'Não há feed para atualizar…', diff --git a/app/i18n/pt-br/gen.php b/app/i18n/pt-br/gen.php index 932b6066d..558482f07 100644 --- a/app/i18n/pt-br/gen.php +++ b/app/i18n/pt-br/gen.php @@ -167,6 +167,7 @@ return array( 'g+' => 'Google+', 'gnusocial' => 'GNU social', 'jdh' => 'Journal du hacker', + 'linkedin' => 'LinkedIn', 'mastodon' => 'Mastodon', 'movim' => 'Movim', 'pocket' => 'Pocket', diff --git a/app/i18n/pt-br/index.php b/app/i18n/pt-br/index.php index 610f00840..2eff8d948 100644 --- a/app/i18n/pt-br/index.php +++ b/app/i18n/pt-br/index.php @@ -40,6 +40,7 @@ return array( 'mark_all_read' => 'Marcar todos como lidos', 'mark_cat_read' => 'Marcar categoria como lida', 'mark_feed_read' => 'Marcar feed com lido', + 'mark_selection_unread' => 'Mark selection as unread', //TODO 'newer_first' => 'Novos primeiro', 'non-starred' => 'Mostrar todos, exceto favoritos', 'normal_view' => 'visualização normal', diff --git a/app/i18n/pt-br/install.php b/app/i18n/pt-br/install.php index 3ca5fb854..65bddf62c 100644 --- a/app/i18n/pt-br/install.php +++ b/app/i18n/pt-br/install.php @@ -65,9 +65,13 @@ return array( 'ok' => 'Seu HTTP REFERER é conhecido e corresponde ao seu servidor.', ), 'json' => array( - 'nok' => 'Não foi possível encontrar JSON (php5-json).', + 'nok' => 'Não foi possível encontrar JSON (php-json).', 'ok' => 'Você tem a extensão JSON.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'Não foi possível encontrar o framework Minz.', 'ok' => 'Você tem o framework Minz.', diff --git a/app/i18n/ru/admin.php b/app/i18n/ru/admin.php index 4f5e937d7..91da8adcf 100644 --- a/app/i18n/ru/admin.php +++ b/app/i18n/ru/admin.php @@ -63,9 +63,13 @@ return array( ), 'files' => 'Установка файлов', 'json' => array( - 'nok' => 'У вас не установлена библиотека для работы с JSON (пакет php5-json).', + 'nok' => 'У вас не установлена библиотека для работы с JSON (пакет php-json).', 'ok' => 'У вас установлена библиотека для работы с JSON.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'У вас не установлен фрейворк Minz.', 'ok' => 'У вас установлен фрейворк Minz.', diff --git a/app/i18n/ru/feedback.php b/app/i18n/ru/feedback.php index 6d4e5e3fe..693a40b34 100644 --- a/app/i18n/ru/feedback.php +++ b/app/i18n/ru/feedback.php @@ -52,6 +52,10 @@ return array( ), 'sub' => array( 'actualize' => 'Actualise', //TODO + 'articles' => array( + 'marked_read' => 'The selected articles have been marked as read.', //TODO + 'marked_unread' => 'The articles have been marked as unread.', //TODO + ), 'category' => array( 'created' => 'Category %s has been created.', //TODO 'deleted' => 'Category has been deleted.', //TODO @@ -74,7 +78,6 @@ return array( 'error' => 'Feed cannot be updated', //TODO 'internal_problem' => 'The newsfeed could not be added. <a href="%s">Check FreshRSS logs</a> for details. You can try force adding by appending <code>#force_feed</code> to the URL.', //TODO 'invalid_url' => 'URL <em>%s</em> is invalid', //TODO - 'marked_read' => 'Feeds have been marked as read', //TODO 'n_actualized' => '%d feeds have been updated', //TODO 'n_entries_deleted' => '%d articles have been deleted', //TODO 'no_refresh' => 'There is no feed to refresh…', //TODO diff --git a/app/i18n/ru/gen.php b/app/i18n/ru/gen.php index ef9217d73..911410a1c 100644 --- a/app/i18n/ru/gen.php +++ b/app/i18n/ru/gen.php @@ -168,6 +168,7 @@ return array( 'g+' => 'Google+', 'gnusocial' => 'GNU social', 'jdh' => 'Journal du hacker', + 'linkedin' => 'LinkedIn', 'mastodon' => 'Mastodon', 'movim' => 'Movim', 'pocket' => 'Pocket', diff --git a/app/i18n/ru/index.php b/app/i18n/ru/index.php index eb6413e3c..9bb327786 100644 --- a/app/i18n/ru/index.php +++ b/app/i18n/ru/index.php @@ -40,6 +40,7 @@ return array( 'mark_all_read' => 'Mark all as read', 'mark_cat_read' => 'Mark category as read', 'mark_feed_read' => 'Mark feed as read', + 'mark_selection_unread' => 'Mark selection as unread', //TODO 'newer_first' => 'Newer first', 'non-starred' => 'Show all but favorites', 'normal_view' => 'Normal view', diff --git a/app/i18n/ru/install.php b/app/i18n/ru/install.php index 1dea2cd66..c1d0e81e8 100644 --- a/app/i18n/ru/install.php +++ b/app/i18n/ru/install.php @@ -64,6 +64,10 @@ return array( 'nok' => 'Убедитесь, что вы не изменяете ваш HTTP REFERER.', 'ok' => 'Ваш HTTP REFERER известен и соотвествует вашему серверу.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'У вас не установлен фрейворк Minz.', 'ok' => 'У вас установлен фрейворк Minz.', diff --git a/app/i18n/tr/admin.php b/app/i18n/tr/admin.php index f982bf644..f481bb294 100644 --- a/app/i18n/tr/admin.php +++ b/app/i18n/tr/admin.php @@ -63,9 +63,13 @@ return array( ), 'files' => 'Dosya kurulumu', 'json' => array( - 'nok' => 'JSON eklentisi eksik (php5-json package).', + 'nok' => 'JSON eklentisi eksik (php-json package).', 'ok' => 'JSON eklentisi sorunsuz.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'Minz framework eksik.', 'ok' => 'Minz framework sorunsuz.', diff --git a/app/i18n/tr/feedback.php b/app/i18n/tr/feedback.php index df7d1b264..278abe978 100644 --- a/app/i18n/tr/feedback.php +++ b/app/i18n/tr/feedback.php @@ -52,6 +52,10 @@ return array( ), 'sub' => array( 'actualize' => 'Güncelleme', + 'articles' => array( + 'marked_read' => 'The selected articles have been marked as read.', //TODO + 'marked_unread' => 'The articles have been marked as unread.', //TODO + ), 'category' => array( 'created' => 'Kategori %s oluşturuldu.', 'deleted' => 'Kategori silindi.', @@ -74,7 +78,6 @@ return array( 'error' => 'Akış güncellenemiyor', 'internal_problem' => 'RSS akışı eklenemiyor. Detaylar için <a href="%s">FreshRSS log kayıtlarını</a> kontrol edin.', // @todo 'invalid_url' => 'URL <em>%s</em> geçersiz', - 'marked_read' => 'Akışlar okundu olarak işaretlendi', 'n_actualized' => '%d akışları güncellendi', 'n_entries_deleted' => '%d makaleleri silindi', 'no_refresh' => 'Yenilenecek akış yok…', diff --git a/app/i18n/tr/gen.php b/app/i18n/tr/gen.php index d99081396..2e1761517 100644 --- a/app/i18n/tr/gen.php +++ b/app/i18n/tr/gen.php @@ -168,6 +168,7 @@ return array( 'g+' => 'Google+', 'gnusocial' => 'GNU social', 'jdh' => 'Journal du hacker', + 'linkedin' => 'LinkedIn', 'mastodon' => 'Mastodon', 'movim' => 'Movim', 'pocket' => 'Pocket', diff --git a/app/i18n/tr/index.php b/app/i18n/tr/index.php index cb36d6717..1357c05e7 100644 --- a/app/i18n/tr/index.php +++ b/app/i18n/tr/index.php @@ -40,6 +40,7 @@ return array( 'mark_all_read' => 'Hepsini okundu olarak işaretle', 'mark_cat_read' => 'Kategoriyi okundu olarak işaretle', 'mark_feed_read' => 'Akışı okundu olarak işaretle', + 'mark_selection_unread' => 'Mark selection as unread', //TODO 'newer_first' => 'Önce yeniler', 'non-starred' => 'Favori dışındakileri göster', 'normal_view' => 'Normal görünüm', diff --git a/app/i18n/tr/install.php b/app/i18n/tr/install.php index 4ae0ad7e3..f90e43f1d 100644 --- a/app/i18n/tr/install.php +++ b/app/i18n/tr/install.php @@ -68,6 +68,10 @@ return array( 'nok' => 'Tavsiye edilen JSON çözümleme kütüphanesi eksik.', 'ok' => 'Tavsiye edilen JSON çözümleme kütüphanesi sorunsuz.', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => 'Minz framework eksik.', 'ok' => 'Minz framework sorunsuz.', diff --git a/app/i18n/zh-cn/admin.php b/app/i18n/zh-cn/admin.php index 1072dc972..1f007f964 100644 --- a/app/i18n/zh-cn/admin.php +++ b/app/i18n/zh-cn/admin.php @@ -63,9 +63,13 @@ return array( ), 'files' => '文件相关', 'json' => array( - 'nok' => '找不到 JSON 扩展 (php5-json ) 。', + 'nok' => '找不到 JSON 扩展 (php-json ) 。', 'ok' => '已找到 JSON 扩展', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => '找不到 Minz 框架。', 'ok' => '已找到 Minz 框架。', diff --git a/app/i18n/zh-cn/feedback.php b/app/i18n/zh-cn/feedback.php index 1db879891..e9f7b4aac 100644 --- a/app/i18n/zh-cn/feedback.php +++ b/app/i18n/zh-cn/feedback.php @@ -52,6 +52,10 @@ return array( ), 'sub' => array( 'actualize' => '获取', + 'articles' => array( + 'marked_read' => 'The selected articles have been marked as read.', //TODO + 'marked_unread' => 'The articles have been marked as unread.', //TODO + ), 'category' => array( 'created' => '分类 %s 已创建。', 'deleted' => '分类已删除。', @@ -74,7 +78,6 @@ return array( 'error' => 'RSS 源更新失败', 'internal_problem' => 'RSS 源添加失败。<a href="%s">检查 FreshRSS 日志</a> 查看详情。', // @todo 'invalid_url' => 'URL <em>%s</em> 无效', - 'marked_read' => 'RSS 源已被设为已读', 'n_actualized' => '%d 个 RSS 源已更新', 'n_entries_deleted' => '%d 篇文章已删除', 'no_refresh' => '没有可刷新的 RSS 源…', diff --git a/app/i18n/zh-cn/gen.php b/app/i18n/zh-cn/gen.php index 9289d8571..4ea2d73ab 100644 --- a/app/i18n/zh-cn/gen.php +++ b/app/i18n/zh-cn/gen.php @@ -168,6 +168,7 @@ return array( 'g+' => 'Google+', 'gnusocial' => 'GNU social', 'jdh' => 'Journal du hacker', + 'linkedin' => 'LinkedIn', 'mastodon' => 'Mastodon', 'movim' => 'Movim', 'pocket' => 'Pocket', diff --git a/app/i18n/zh-cn/index.php b/app/i18n/zh-cn/index.php index 6729524f5..2b76961ef 100644 --- a/app/i18n/zh-cn/index.php +++ b/app/i18n/zh-cn/index.php @@ -40,6 +40,7 @@ return array( 'mark_all_read' => '全部设为已读', 'mark_cat_read' => '此分类设为已读', 'mark_feed_read' => '此源设为已读', + 'mark_selection_unread' => 'Mark selection as unread', //TODO 'newer_first' => '由新到旧', 'non-starred' => '显示未收藏', 'normal_view' => '普通视图', diff --git a/app/i18n/zh-cn/install.php b/app/i18n/zh-cn/install.php index 1e172f0d5..fe34a44c0 100644 --- a/app/i18n/zh-cn/install.php +++ b/app/i18n/zh-cn/install.php @@ -68,6 +68,10 @@ return array( 'nok' => '找不到推荐的 JSON 解析库。', 'ok' => '已找到推荐的 JSON 解析库。', ), + 'mbstring' => array( + 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO + 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO + ), 'minz' => array( 'nok' => '找不到 Minz 框架。', 'ok' => '已找到 Minz 框架。', diff --git a/app/install.php b/app/install.php index c30f8d583..eec65be9c 100644 --- a/app/install.php +++ b/app/install.php @@ -462,6 +462,12 @@ function printStep1() { <p class="alert alert-error"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('install.check.xml.nok'); ?></p> <?php } ?> + <?php if ($res['mbstring'] == 'ok') { ?> + <p class="alert alert-success"><span class="alert-head"><?php echo _t('gen.short.ok'); ?></span> <?php echo _t('install.check.mbstring.ok'); ?></p> + <?php } else { ?> + <p class="alert alert-warn"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('install.check.mbstring.nok'); ?></p> + <?php } ?> + <?php if ($res['fileinfo'] == 'ok') { ?> <p class="alert alert-success"><span class="alert-head"><?php echo _t('gen.short.ok'); ?></span> <?php echo _t('install.check.fileinfo.ok'); ?></p> <?php } else { ?> @@ -645,7 +651,7 @@ function printStep3() { <div class="form-group"> <label class="group-name" for="base"><?php echo _t('install.bdd'); ?></label> <div class="group-controls"> - <input type="text" id="base" name="base" maxlength="64" pattern="[0-9A-Za-z_]{1,64}" value="<?php echo isset($_SESSION['bd_base']) ? $_SESSION['bd_base'] : ''; ?>" tabindex="5" /> + <input type="text" id="base" name="base" maxlength="64" pattern="[0-9A-Za-z_-]{1,64}" value="<?php echo isset($_SESSION['bd_base']) ? $_SESSION['bd_base'] : ''; ?>" tabindex="5" /> </div> </div> diff --git a/app/layout/header.phtml b/app/layout/header.phtml index e589ed7ef..e75a25efa 100644 --- a/app/layout/header.phtml +++ b/app/layout/header.phtml @@ -25,7 +25,8 @@ if (FreshRSS_Auth::accessNeedsAction()) { <?php if (FreshRSS_Auth::hasAccess() || FreshRSS_Context::$system_conf->allow_anonymous) { ?> <form action="<?php echo _url('index', 'index'); ?>" method="get"> <div class="stick"> - <input type="search" name="search" id="search" class="extend" value="<?php echo FreshRSS_Context::$search; ?>" placeholder="<?php echo _t('gen.menu.search'); ?>" /> + <input type="search" name="search" id="search" class="extend" value="<?php + echo htmlspecialchars(htmlspecialchars_decode(FreshRSS_Context::$search, ENT_QUOTES), ENT_COMPAT, 'UTF-8'); ?>" placeholder="<?php echo _t('gen.menu.search'); ?>" /> <?php $get = Minz_Request::param('get', ''); ?> <?php if ($get != '') { ?> diff --git a/app/layout/nav_menu.phtml b/app/layout/nav_menu.phtml index ab82c723f..88f882db9 100644 --- a/app/layout/nav_menu.phtml +++ b/app/layout/nav_menu.phtml @@ -62,9 +62,10 @@ <?php $get = FreshRSS_Context::currentGet(); $string_mark = _t('index.menu.mark_all_read'); - if ($get[0] == 'f') { + $string_unmark = _t('index.menu.mark_selection_unread'); + if ($get[0] === 'f') { $string_mark = _t('index.menu.mark_feed_read'); - } elseif ($get[0] == 'c') { + } elseif ($get[0] === 'c') { $string_mark = _t('index.menu.mark_cat_read'); } @@ -75,10 +76,14 @@ 'get' => $get, 'nextGet' => FreshRSS_Context::$next_get, 'idMax' => FreshRSS_Context::$id_max, - 'search' => FreshRSS_Context::$search, + 'search' => htmlspecialchars_decode(FreshRSS_Context::$search, ENT_QUOTES), 'state' => FreshRSS_Context::$state, - ) + ), ); + + $mark_unread_url = $mark_read_url; + $mark_unread_url['params']['is_read'] = false; + $mark_unread_url['params']['nextGet'] = $get; ?> <div class="stick" id="nav_menu_read_all"> @@ -110,6 +115,7 @@ $mark_before_today['params']['idMax'] = $today . '000000'; $mark_before_one_week = $mark_read_url; $mark_before_one_week['params']['idMax'] = ($today - 604800) . '000000'; + $mark_unread_enabled = FreshRSS_Context::isStateEnabled(FreshRSS_Entry::STATE_READ) or !FreshRSS_Context::isStateEnabled(FreshRSS_Entry::STATE_NOT_READ); ?> <li class="item"> <button class="as-link <?php echo $confirm; ?>" @@ -123,6 +129,13 @@ formaction="<?php echo Minz_Url::display($mark_before_one_week); ?>" type="submit"><?php echo _t('index.menu.before_one_week'); ?></button> </li> + <li class="separator"></li> + <li class="item"> + <button class="as-link <?php echo $mark_unread_enabled ? $confirm : '" disabled="disabled'; ?>" + form="mark-read-menu" + formaction="<?php echo Minz_Url::display($mark_unread_url); ?>" + type="submit"><?php echo $string_unmark; ?></button> + </li> </ul> </div> </form> @@ -162,7 +175,8 @@ <div class="item search"> <form action="<?php echo _url('index', 'index'); ?>" method="get"> - <input type="search" name="search" class="extend" value="<?php echo FreshRSS_Context::$search; ?>" placeholder="<?php echo _t('index.menu.search_short'); ?>" /> + <input type="search" name="search" class="extend" value="<?php + echo htmlspecialchars(htmlspecialchars_decode(FreshRSS_Context::$search, ENT_QUOTES), ENT_COMPAT, 'UTF-8'); ?>" placeholder="<?php echo _t('index.menu.search_short'); ?>" /> <?php $get = Minz_Request::param('get', ''); ?> <?php if($get != '') { ?> diff --git a/app/shares.php b/app/shares.php index 8c6b4eac6..55deed785 100644 --- a/app/shares.php +++ b/app/shares.php @@ -131,4 +131,10 @@ return array( 'form' => 'simple', 'method' => 'GET', ), + 'linkedin' => array( + 'url' => 'https://www.linkedin.com/shareArticle?url=~LINK~&title=~TITLE~&source=FreshRSS', + 'transform' => array('rawurlencode'), + 'form' => 'simple', + 'method' => 'GET', + ), ); diff --git a/app/views/helpers/export/opml.phtml b/app/views/helpers/export/opml.phtml index 236cca303..edb4d4eda 100644 --- a/app/views/helpers/export/opml.phtml +++ b/app/views/helpers/export/opml.phtml @@ -16,11 +16,11 @@ foreach ($this->categories as $key => $cat) { foreach ($cat['feeds'] as $feed) { $opml_array['body'][$key]['@outlines'][] = array( - 'text' => htmlspecialchars_decode($feed->name()), + 'text' => htmlspecialchars_decode($feed->name(), ENT_QUOTES), 'type' => 'rss', - 'xmlUrl' => htmlspecialchars_decode($feed->url()), - 'htmlUrl' => htmlspecialchars_decode($feed->website()), - 'description' => htmlspecialchars_decode($feed->description()), + 'xmlUrl' => htmlspecialchars_decode($feed->url(), ENT_QUOTES), + 'htmlUrl' => htmlspecialchars_decode($feed->website(), ENT_QUOTES), + 'description' => htmlspecialchars_decode($feed->description(), ENT_QUOTES), ); } } diff --git a/app/views/helpers/index/normal/entry_bottom.phtml b/app/views/helpers/index/normal/entry_bottom.phtml index 793c644f9..6417da4cb 100644 --- a/app/views/helpers/index/normal/entry_bottom.phtml +++ b/app/views/helpers/index/normal/entry_bottom.phtml @@ -81,7 +81,7 @@ <ul class="dropdown-menu"> <li class="dropdown-close"><a href="#close">❌</a></li><?php foreach($tags as $tag) { - ?><li class="item"><a href="<?php echo _url('index', 'index', 'search', '#' . htmlspecialchars_decode($tag)); ?>"><?php echo $tag; ?></a></li><?php + ?><li class="item"><a href="<?php echo _url('index', 'index', 'search', '#' . htmlspecialchars_decode($tag, ENT_QUOTES)); ?>"><?php echo $tag; ?></a></li><?php } ?> </ul> </div> diff --git a/app/views/helpers/javascript_vars.phtml b/app/views/helpers/javascript_vars.phtml index 1b9b614d2..d7b3e4360 100644 --- a/app/views/helpers/javascript_vars.phtml +++ b/app/views/helpers/javascript_vars.phtml @@ -56,4 +56,4 @@ echo htmlspecialchars(json_encode(array( 'icons' => array( 'close' => _i('close'), ), -), JSON_UNESCAPED_UNICODE), ENT_NOQUOTES); +), JSON_UNESCAPED_UNICODE), ENT_NOQUOTES, 'UTF-8'); diff --git a/app/views/helpers/pagination.phtml b/app/views/helpers/pagination.phtml index 893451af9..fc37ce3f5 100755 --- a/app/views/helpers/pagination.phtml +++ b/app/views/helpers/pagination.phtml @@ -11,7 +11,7 @@ 'get' => FreshRSS_Context::currentGet(), 'nextGet' => FreshRSS_Context::$next_get, 'idMax' => FreshRSS_Context::$id_max, - 'search' => FreshRSS_Context::$search, + 'search' => htmlspecialchars_decode(FreshRSS_Context::$search, ENT_QUOTES), 'state' => FreshRSS_Context::$state, ) ); diff --git a/app/views/stats/index.phtml b/app/views/stats/index.phtml index a36f812a8..2ff3e6c52 100644 --- a/app/views/stats/index.phtml +++ b/app/views/stats/index.phtml @@ -88,6 +88,6 @@ echo htmlspecialchars(json_encode(array( 'dataCount' => $this->count, 'feedByCategory' => $this->feedByCategory, 'entryByCategory' => $this->entryByCategory, -), JSON_UNESCAPED_UNICODE), ENT_NOQUOTES); +), JSON_UNESCAPED_UNICODE), ENT_NOQUOTES, 'UTF-8'); ?></script> <script src="../scripts/stats.js?<?php echo @filemtime(PUBLIC_PATH . '/scripts/stats.js'); ?>"></script> diff --git a/app/views/stats/repartition.phtml b/app/views/stats/repartition.phtml index 5ebcdce5a..4bce418c9 100644 --- a/app/views/stats/repartition.phtml +++ b/app/views/stats/repartition.phtml @@ -69,6 +69,6 @@ echo htmlspecialchars(json_encode(array( 'days' => $this->days, 'repartitionMonth' => $this->repartitionMonth, 'months' => $this->months, -), JSON_UNESCAPED_UNICODE), ENT_NOQUOTES); +), JSON_UNESCAPED_UNICODE), ENT_NOQUOTES, 'UTF-8'); ?></script> <script src="../scripts/repartition.js?<?php echo @filemtime(PUBLIC_PATH . '/scripts/repartition.js'); ?>"></script> |
