Selaa lähdekoodia

New feature important feeds (#5782)

* New feature important feeds

* Fix PHPStan

* Initial style for important feeds + keep unread

* Change UI order

* Count important unread

* Never mark as read important feeds during scroll

* Fix i18n conf.iew.normal regression

* Fix reader view

* More fix reader view

* Create important.svg

* Fix title

* Fix counter

* Account for important during  mark-all-as-read

* Fix underline colour

* 📌

* Changelog

---------

Co-authored-by: math-gh <>
Co-authored-by: maTh <1645099+math-GH@users.noreply.github.com>
Alexandre Alapetite 2 vuotta sitten
vanhempi
commit
348028a290
89 muutettua tiedostoa jossa 228 lisäystä ja 96 poistoa
  1. 5 3
      CHANGELOG.md
  2. 9 3
      app/Controllers/entryController.php
  3. 2 2
      app/Models/CategoryDAO.php
  4. 23 5
      app/Models/Context.php
  5. 28 15
      app/Models/EntryDAO.php
  6. 2 1
      app/Models/Feed.php
  7. 1 0
      app/Models/Themes.php
  8. 1 1
      app/i18n/cz/conf.php
  9. 1 0
      app/i18n/cz/index.php
  10. 2 1
      app/i18n/cz/sub.php
  11. 1 1
      app/i18n/de/conf.php
  12. 1 0
      app/i18n/de/index.php
  13. 2 1
      app/i18n/de/sub.php
  14. 1 1
      app/i18n/el/conf.php
  15. 1 0
      app/i18n/el/index.php
  16. 2 1
      app/i18n/el/sub.php
  17. 1 1
      app/i18n/en-us/conf.php
  18. 1 0
      app/i18n/en-us/index.php
  19. 2 1
      app/i18n/en-us/sub.php
  20. 1 1
      app/i18n/en/conf.php
  21. 1 0
      app/i18n/en/index.php
  22. 2 1
      app/i18n/en/sub.php
  23. 1 1
      app/i18n/es/conf.php
  24. 1 0
      app/i18n/es/index.php
  25. 2 1
      app/i18n/es/sub.php
  26. 1 1
      app/i18n/fa/conf.php
  27. 1 0
      app/i18n/fa/index.php
  28. 2 1
      app/i18n/fa/sub.php
  29. 1 1
      app/i18n/fr/conf.php
  30. 3 2
      app/i18n/fr/index.php
  31. 3 2
      app/i18n/fr/sub.php
  32. 1 1
      app/i18n/he/conf.php
  33. 1 0
      app/i18n/he/index.php
  34. 2 1
      app/i18n/he/sub.php
  35. 1 1
      app/i18n/hu/conf.php
  36. 1 0
      app/i18n/hu/index.php
  37. 2 1
      app/i18n/hu/sub.php
  38. 1 1
      app/i18n/id/conf.php
  39. 1 0
      app/i18n/id/index.php
  40. 2 1
      app/i18n/id/sub.php
  41. 1 1
      app/i18n/it/conf.php
  42. 1 0
      app/i18n/it/index.php
  43. 2 1
      app/i18n/it/sub.php
  44. 1 1
      app/i18n/ja/conf.php
  45. 1 0
      app/i18n/ja/index.php
  46. 2 1
      app/i18n/ja/sub.php
  47. 1 1
      app/i18n/ko/conf.php
  48. 1 0
      app/i18n/ko/index.php
  49. 2 1
      app/i18n/ko/sub.php
  50. 1 1
      app/i18n/lv/conf.php
  51. 1 0
      app/i18n/lv/index.php
  52. 2 1
      app/i18n/lv/sub.php
  53. 1 1
      app/i18n/nl/conf.php
  54. 1 0
      app/i18n/nl/index.php
  55. 2 1
      app/i18n/nl/sub.php
  56. 1 1
      app/i18n/oc/conf.php
  57. 1 0
      app/i18n/oc/index.php
  58. 2 1
      app/i18n/oc/sub.php
  59. 1 1
      app/i18n/pl/conf.php
  60. 1 0
      app/i18n/pl/index.php
  61. 2 1
      app/i18n/pl/sub.php
  62. 1 1
      app/i18n/pt-br/conf.php
  63. 1 0
      app/i18n/pt-br/index.php
  64. 2 1
      app/i18n/pt-br/sub.php
  65. 1 1
      app/i18n/ru/conf.php
  66. 1 0
      app/i18n/ru/index.php
  67. 2 1
      app/i18n/ru/sub.php
  68. 1 1
      app/i18n/sk/conf.php
  69. 1 0
      app/i18n/sk/index.php
  70. 2 1
      app/i18n/sk/sub.php
  71. 1 1
      app/i18n/tr/conf.php
  72. 1 0
      app/i18n/tr/index.php
  73. 2 1
      app/i18n/tr/sub.php
  74. 1 1
      app/i18n/zh-cn/conf.php
  75. 1 0
      app/i18n/zh-cn/index.php
  76. 2 1
      app/i18n/zh-cn/sub.php
  77. 1 1
      app/i18n/zh-tw/conf.php
  78. 1 0
      app/i18n/zh-tw/index.php
  79. 2 1
      app/i18n/zh-tw/sub.php
  80. 8 0
      app/layout/aside_feed.phtml
  81. 5 2
      app/views/helpers/feed/update.phtml
  82. 5 8
      app/views/index/normal.phtml
  83. 4 4
      app/views/index/reader.phtml
  84. 1 1
      app/views/subscription/index.phtml
  85. 1 1
      p/api/greader.php
  86. 9 0
      p/scripts/main.js
  87. 5 0
      p/themes/base-theme/frss.css
  88. 5 0
      p/themes/base-theme/frss.rtl.css
  89. 16 0
      p/themes/icons/important.svg

+ 5 - 3
CHANGELOG.md

@@ -2,13 +2,15 @@
 
 ## 202X-XX-XX FreshRSS 1.22.2-dev
 
-* Compatibility
-	* Require PHP 7.4+, and implement *typed properties* [#5720](https://github.com/FreshRSS/FreshRSS/pull/5720)
-	* Require Apache 2.4+ (but repair minimal compatibility with Apache 2.2) [#5791](https://github.com/FreshRSS/FreshRSS/pull/5791), [#5804](https://github.com/FreshRSS/FreshRSS/pull/5804)
 * Features
+	* New *Important feeds* group in the main view, with corresponding new priority level for feeds [#5782](https://github.com/FreshRSS/FreshRSS/pull/5782)
+		* Entries from important feeds are not marked as read during scroll, nor during *Mark all as read*
 	* Add support for more thumbnail types [#5806](https://github.com/FreshRSS/FreshRSS/pull/5806)
 	* Increase SQL (`VARCHAR`) text fields length to maximum possible [#5788](https://github.com/FreshRSS/FreshRSS/pull/5788)
 	* Increase SQL date fields to 64-bit to be ready for year 2038+ [#5570](https://github.com/FreshRSS/FreshRSS/pull/5570)
+* Compatibility
+	* Require PHP 7.4+, and implement *typed properties* [#5720](https://github.com/FreshRSS/FreshRSS/pull/5720)
+	* Require Apache 2.4+ (but repair minimal compatibility with Apache 2.2) [#5791](https://github.com/FreshRSS/FreshRSS/pull/5791), [#5804](https://github.com/FreshRSS/FreshRSS/pull/5804)
 * Bug fixing
 	* Fix regression in Docker `CRON_MIN` if any environment variable contains a single quote [#5795](https://github.com/FreshRSS/FreshRSS/pull/5795)
 	* Fix JavaScript regression in label dropdown [#5785](https://github.com/FreshRSS/FreshRSS/pull/5785)

+ 9 - 3
app/Controllers/entryController.php

@@ -71,7 +71,7 @@ class FreshRSS_entry_Controller extends FreshRSS_ActionController {
 
 			if (!$get) {
 				// No get? Mark all entries as read (from $id_max)
-				$entryDAO->markReadEntries($id_max, false, 0, null, 0, $is_read);
+				$entryDAO->markReadEntries($id_max, false, FreshRSS_Feed::PRIORITY_MAIN_STREAM, FreshRSS_Feed::PRIORITY_IMPORTANT, null, 0, $is_read);
 			} else {
 				$type_get = $get[0];
 				$get = (int)substr($get, 2);
@@ -83,10 +83,16 @@ class FreshRSS_entry_Controller extends FreshRSS_ActionController {
 					$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, FreshRSS_Context::$state, $is_read);
+					$entryDAO->markReadEntries($id_max, true, null, FreshRSS_Feed::PRIORITY_IMPORTANT,
+						FreshRSS_Context::$search, FreshRSS_Context::$state, $is_read);
 					break;
 				case 'a':
-					$entryDAO->markReadEntries($id_max, false, 0, FreshRSS_Context::$search, FreshRSS_Context::$state, $is_read);
+					$entryDAO->markReadEntries($id_max, false, FreshRSS_Feed::PRIORITY_MAIN_STREAM, FreshRSS_Feed::PRIORITY_IMPORTANT,
+						FreshRSS_Context::$search, FreshRSS_Context::$state, $is_read);
+					break;
+				case 'i':
+					$entryDAO->markReadEntries($id_max, false, FreshRSS_Feed::PRIORITY_IMPORTANT, null,
+						FreshRSS_Context::$search, FreshRSS_Context::$state, $is_read);
 					break;
 				case 't':
 					$entryDAO->markReadTag($get, $id_max, FreshRSS_Context::$search, FreshRSS_Context::$state, $is_read);

+ 2 - 2
app/Models/CategoryDAO.php

@@ -284,11 +284,11 @@ SQL;
 				. ($details ? 'f.* ' : 'f.id, f.name, f.url, f.kind, f.website, f.priority, f.error, f.`cache_nbEntries`, f.`cache_nbUnreads`, f.ttl ')
 				. 'FROM `_category` c '
 				. 'LEFT OUTER JOIN `_feed` f ON f.category=c.id '
-				. 'WHERE f.priority >= :priority_normal '
+				. 'WHERE f.priority >= :priority '
 				. 'GROUP BY f.id, c_id '
 				. 'ORDER BY c.name, f.name';
 			$stm = $this->pdo->prepare($sql);
-			$values = [ ':priority_normal' => FreshRSS_Feed::PRIORITY_NORMAL ];
+			$values = [ ':priority' => FreshRSS_Feed::PRIORITY_CATEGORY ];
 			if ($stm !== false && $stm->execute($values)) {
 				$res = $stm->fetchAll(PDO::FETCH_ASSOC) ?: [];
 				/** @var array<array{'c_name':string,'c_id':int,'c_kind':int,'c_last_update':int,'c_error':int|bool,'c_attributes'?:string,

+ 23 - 5
app/Models/Context.php

@@ -19,6 +19,7 @@ final class FreshRSS_Context {
 	public static string $name = '';
 	public static string $description = '';
 	public static int $total_unread = 0;
+	public static int $total_important_unread = 0;
 
 	/** @var array{'all':int,'read':int,'unread':int} */
 	public static array $total_starred = [
@@ -29,10 +30,11 @@ final class FreshRSS_Context {
 
 	public static int $get_unread = 0;
 
-	/** @var array{'all':bool,'starred':bool,'feed':int|false,'category':int|false,'tag':int|false,'tags':bool} */
+	/** @var array{'all':bool,'starred':bool,'important':bool,'feed':int|false,'category':int|false,'tag':int|false,'tags':bool} */
 	public static array $current_get = [
 		'all' => false,
 		'starred' => false,
+		'important' => false,
 		'feed' => false,
 		'category' => false,
 		'tag' => false,
@@ -154,9 +156,8 @@ final class FreshRSS_Context {
 		// Update number of read / unread variables.
 		$entryDAO = FreshRSS_Factory::createEntryDao();
 		self::$total_starred = $entryDAO->countUnreadReadFavorites();
-		self::$total_unread = FreshRSS_CategoryDAO::countUnread(
-			self::$categories, 1
-		);
+		self::$total_unread = FreshRSS_CategoryDAO::countUnread(self::$categories, FreshRSS_Feed::PRIORITY_MAIN_STREAM);
+		self::$total_important_unread = FreshRSS_CategoryDAO::countUnread(self::$categories, FreshRSS_Feed::PRIORITY_IMPORTANT);
 
 		self::_get(Minz_Request::paramString('get') ?: 'a');
 
@@ -208,12 +209,14 @@ final class FreshRSS_Context {
 	 * Return the current get as a string or an array.
 	 *
 	 * If $array is true, the first item of the returned value is 'f' or 'c' or 't' and the second is the id.
-	 * @phpstan-return ($asArray is true ? array{'a'|'c'|'f'|'s'|'t'|'T',bool|int} : string)
+	 * @phpstan-return ($asArray is true ? array{'a'|'c'|'f'|'i'|'s'|'t'|'T',bool|int} : string)
 	 * @return string|array{string,bool|int}
 	 */
 	public static function currentGet(bool $asArray = false) {
 		if (self::$current_get['all']) {
 			return $asArray ? ['a', true] : 'a';
+		} elseif (self::$current_get['important']) {
+			return $asArray ? ['i', true] : 'i';
 		} elseif (self::$current_get['starred']) {
 			return $asArray ? ['s', true] : 's';
 		} elseif (self::$current_get['feed']) {
@@ -247,6 +250,13 @@ final class FreshRSS_Context {
 		return self::$current_get['all'] != false;
 	}
 
+	/**
+	 * @return bool true if the current request targets important feeds, false otherwise.
+	 */
+	public static function isImportant(): bool {
+		return self::$current_get['important'] != false;
+	}
+
 	/**
 	 * @return bool true if the current request targets a category, false otherwise.
 	 */
@@ -278,6 +288,8 @@ final class FreshRSS_Context {
 		switch($type) {
 		case 'a':
 			return self::$current_get['all'];
+		case 'i':
+			return self::$current_get['important'];
 		case 's':
 			return self::$current_get['starred'];
 		case 'f':
@@ -325,6 +337,12 @@ final class FreshRSS_Context {
 			self::$description = self::$system_conf->meta_description;
 			self::$get_unread = self::$total_unread;
 			break;
+		case 'i':
+			self::$current_get['important'] = true;
+			self::$name = _t('index.menu.important');
+			self::$description = self::$system_conf->meta_description;
+			self::$get_unread = self::$total_unread;
+			break;
 		case 's':
 			self::$current_get['starred'] = true;
 			self::$name = _t('index.feed.title_fav');

+ 28 - 15
app/Models/EntryDAO.php

@@ -425,7 +425,7 @@ SQL;
 	 * @param string $idMax fail safe article ID
 	 * @return int|false affected rows
 	 */
-	public function markReadEntries(string $idMax = '0', bool $onlyFavorites = false, int $priorityMin = 0,
+	public function markReadEntries(string $idMax = '0', bool $onlyFavorites = false, ?int $priorityMin = null, ?int $prioritMax = null,
 		?FreshRSS_BooleanSearch $filters = null, int $state = 0, bool $is_read = true) {
 		FreshRSS_UserDAO::touch();
 		if ($idMax == '0') {
@@ -434,12 +434,22 @@ SQL;
 		}
 
 		$sql = 'UPDATE `_entry` SET is_read = ? WHERE is_read <> ? AND id <= ?';
+		$values = [$is_read ? 1 : 0, $is_read ? 1 : 0, $idMax];
 		if ($onlyFavorites) {
 			$sql .= ' AND is_favorite=1';
-		} elseif ($priorityMin >= 0) {
-			$sql .= ' AND id_feed IN (SELECT f.id FROM `_feed` f WHERE f.priority > ' . intval($priorityMin) . ')';
 		}
-		$values = [$is_read ? 1 : 0, $is_read ? 1 : 0, $idMax];
+		if ($priorityMin !== null || $prioritMax !== null) {
+			$sql .= ' AND id_feed IN (SELECT f.id FROM `_feed` f WHERE 1=1';
+			if ($priorityMin !== null) {
+				$sql .= ' AND f.priority >= ?';
+				$values[] = $priorityMin;
+			}
+			if ($prioritMax !== null) {
+				$sql .= ' AND f.priority < ?';
+				$values[] = $prioritMax;
+			}
+			$sql .= ')';
+		}
 
 		[$searchValues, $search] = $this->sqlListEntriesWhere('', $filters, $state);
 
@@ -1019,7 +1029,7 @@ SQL;
 	}
 
 	/**
-	 * @phpstan-param 'a'|'A'|'s'|'S'|'c'|'f'|'t'|'T'|'ST' $type
+	 * @phpstan-param 'a'|'A'|'i'|'s'|'S'|'c'|'f'|'t'|'T'|'ST' $type
 	 * @param int $id category/feed/tag ID
 	 * @param 'ASC'|'DESC' $order
 	 * @return array{0:array<int|string>,1:string}
@@ -1034,20 +1044,23 @@ SQL;
 		$values = [];
 		switch ($type) {
 		case 'a':	//All PRIORITY_MAIN_STREAM
-			$where .= 'f.priority > ' . FreshRSS_Feed::PRIORITY_NORMAL . ' ';
+			$where .= 'f.priority >= ' . FreshRSS_Feed::PRIORITY_MAIN_STREAM . ' ';
 			break;
 		case 'A':	//All except PRIORITY_ARCHIVED
-			$where .= 'f.priority >= ' . FreshRSS_Feed::PRIORITY_NORMAL . ' ';
+			$where .= 'f.priority > ' . FreshRSS_Feed::PRIORITY_ARCHIVED . ' ';
+			break;
+		case 'i':	//Priority important feeds
+			$where .= 'f.priority >= ' . FreshRSS_Feed::PRIORITY_IMPORTANT . ' ';
 			break;
 		case 's':	//Starred. Deprecated: use $state instead
-			$where .= 'f.priority >= ' . FreshRSS_Feed::PRIORITY_NORMAL . ' ';
+			$where .= 'f.priority > ' . FreshRSS_Feed::PRIORITY_ARCHIVED . ' ';
 			$where .= 'AND e.is_favorite=1 ';
 			break;
 		case 'S':	//Starred
 			$where .= 'e.is_favorite=1 ';
 			break;
 		case 'c':	//Category
-			$where .= 'f.priority >= ' . FreshRSS_Feed::PRIORITY_NORMAL . ' ';
+			$where .= 'f.priority >= ' . FreshRSS_Feed::PRIORITY_CATEGORY . ' ';
 			$where .= 'AND f.category=? ';
 			$values[] = $id;
 			break;
@@ -1083,7 +1096,7 @@ SQL;
 	}
 
 	/**
-	 * @phpstan-param 'a'|'A'|'s'|'S'|'c'|'f'|'t'|'T'|'ST' $type
+	 * @phpstan-param 'a'|'A'|'s'|'S'|'i'|'c'|'f'|'t'|'T'|'ST' $type
 	 * @param 'ASC'|'DESC' $order
 	 * @param int $id category/feed/tag ID
 	 * @return PDOStatement|false
@@ -1118,7 +1131,7 @@ SQL;
 	}
 
 	/**
-	 * @phpstan-param 'a'|'A'|'s'|'S'|'c'|'f'|'t'|'T'|'ST' $type
+	 * @phpstan-param 'a'|'A'|'s'|'S'|'i'|'c'|'f'|'t'|'T'|'ST' $type
 	 * @param int $id category/feed/tag ID
 	 * @param 'ASC'|'DESC' $order
 	 * @return Traversable<FreshRSS_Entry>
@@ -1360,20 +1373,20 @@ SELECT c FROM (
 		FROM `_entry` AS e1
 		JOIN `_feed` AS f1 ON e1.id_feed = f1.id
 		WHERE e1.is_favorite = 1
-		AND f1.priority >= :priority_normal1
+		AND f1.priority >= :priority1
 	UNION
 	SELECT COUNT(e2.id) AS c, 2 AS o
 		FROM `_entry` AS e2
 		JOIN `_feed` AS f2 ON e2.id_feed = f2.id
 		WHERE e2.is_favorite = 1
-		AND e2.is_read = 0 AND f2.priority >= :priority_normal2
+		AND e2.is_read = 0 AND f2.priority >= :priority2
 	) u
 ORDER BY o
 SQL;
 		//Binding a value more than once is not standard and does not work with native prepared statements (e.g. MySQL) https://bugs.php.net/bug.php?id=40417
 		$res = $this->fetchColumn($sql, 0, [
-			':priority_normal1' => FreshRSS_Feed::PRIORITY_NORMAL,
-			':priority_normal2' => FreshRSS_Feed::PRIORITY_NORMAL,
+			':priority1' => FreshRSS_Feed::PRIORITY_CATEGORY,
+			':priority2' => FreshRSS_Feed::PRIORITY_CATEGORY,
 		]);
 		if ($res === null) {
 			return ['all' => -1, 'unread' => -1, 'read' => -1];

+ 2 - 1
app/Models/Feed.php

@@ -28,8 +28,9 @@ class FreshRSS_Feed extends Minz_Model {
 	 */
 	public const KIND_JSON_XPATH = 20;
 
+	public const PRIORITY_IMPORTANT = 20;
 	public const PRIORITY_MAIN_STREAM = 10;
-	public const PRIORITY_NORMAL = 0;
+	public const PRIORITY_CATEGORY = 0;
 	public const PRIORITY_ARCHIVED = -10;
 
 	public const TTL_DEFAULT = 0;

+ 1 - 0
app/Models/Themes.php

@@ -101,6 +101,7 @@ class FreshRSS_Themes extends Minz_Model {
 			'FreshRSS-logo' => '⊚',
 			'help' => 'ℹ️',	//ⓘ
 			'icon' => '⊚',
+			'important' => '📌',
 			'key' => '🔑',	//⚿
 			'label' => '🏷️',
 			'link' => '↗️',	//↗

+ 1 - 1
app/i18n/cz/conf.php

@@ -205,7 +205,7 @@ return array(
 			'article_open_on_website' => 'když je článek otevřen na své původní webové stránce',
 			'article_viewed' => 'když je článek zobrazen',
 			'keep_max_n_unread' => 'Maximální počet článků, které ponechat jako nepřečtené',
-			'scroll' => 'během posouvání',
+			'scroll' => 'během posouvání (except for important feeds)',	// DIRTY
 			'upon_gone' => 'když se již nenachází v upstreamu zpráv.',
 			'upon_reception' => 'po obdržení článku',
 			'when' => 'Označit článek jako přečtený…',

+ 1 - 0
app/i18n/cz/index.php

@@ -45,6 +45,7 @@ return array(
 		'bookmark_query' => 'Uložit aktuální dotaz do záložek',
 		'favorites' => 'Oblíbené (%s)',
 		'global_view' => 'Zobrazení přehledu',
+		'important' => 'Important feeds',	// TODO
 		'main_stream' => 'Hlavní kanál',
 		'mark_all_read' => 'Označit vše jako přečtené',
 		'mark_cat_read' => 'Označit kategorii jako přečtenou',

+ 2 - 1
app/i18n/cz/sub.php

@@ -140,8 +140,9 @@ return array(
 		'priority' => array(
 			'_' => 'Viditelnost',
 			'archived' => 'Nezobrazovat (archivováno)',
+			'category' => 'Zobrazit v jeho kategorii',
+			'important' => 'Show in important feeds',	// TODO
 			'main_stream' => 'Zobrazit ve hlavním kanálu',
-			'normal' => 'Zobrazit v jeho kategorii',
 		),
 		'proxy' => 'Nastavete proxy pro načítání tohoto kanálu',
 		'proxy_help' => 'Vyberte protokol (např.: SOCKS5) a zadejte adresu proxy (např.: <kbd>127.0.0.1:1080</kbd> or <kbd>username:password@127.0.0.1:1080</kbd>)',	// DIRTY

+ 1 - 1
app/i18n/de/conf.php

@@ -205,7 +205,7 @@ return array(
 			'article_open_on_website' => 'wenn der Artikel auf der Original-Webseite geöffnet wird',
 			'article_viewed' => 'wenn der Artikel angesehen wird',
 			'keep_max_n_unread' => 'Max. Anzahl von ungelesenen Artikeln',
-			'scroll' => 'beim Scrollen bzw. Überspringen',
+			'scroll' => 'beim Scrollen bzw. Überspringen (except for important feeds)',	// DIRTY
 			'upon_gone' => 'wenn der Artikel nicht mehr im Feed enthalten ist',
 			'upon_reception' => 'beim Empfang des Artikels',
 			'when' => 'Artikel als gelesen markieren…',

+ 1 - 0
app/i18n/de/index.php

@@ -45,6 +45,7 @@ return array(
 		'bookmark_query' => 'Aktuelle Abfrage speichern',
 		'favorites' => 'Favoriten (%s)',
 		'global_view' => 'Globale Ansicht',
+		'important' => 'Important feeds',	// TODO
 		'main_stream' => 'Haupt-Feeds',
 		'mark_all_read' => 'Alle als gelesen markieren',
 		'mark_cat_read' => 'Kategorie als gelesen markieren',

+ 2 - 1
app/i18n/de/sub.php

@@ -140,8 +140,9 @@ return array(
 		'priority' => array(
 			'_' => 'Sichtbarkeit',
 			'archived' => 'Nicht anzeigen (archiviert)',
+			'category' => 'Zeige in eigener Kategorie',
+			'important' => 'Show in important feeds',	// TODO
 			'main_stream' => 'In Haupt-Feeds zeigen',
-			'normal' => 'Zeige in eigener Kategorie',
 		),
 		'proxy' => 'Verwende einen Proxy, um den Feed abzuholen',
 		'proxy_help' => 'Wähle ein Protokoll (z.B. SOCKS5) und einen Proxy mit Port (z.B. <kbd>127.0.0.1:1080</kbd> or <kbd>username:password@127.0.0.1:1080</kbd>)',	// DIRTY

+ 1 - 1
app/i18n/el/conf.php

@@ -205,7 +205,7 @@ return array(
 			'article_open_on_website' => 'when the article is opened on its original website',	// TODO
 			'article_viewed' => 'when the article is viewed',	// TODO
 			'keep_max_n_unread' => 'Max number of articles to keep unread',	// TODO
-			'scroll' => 'while scrolling',	// TODO
+			'scroll' => 'while scrolling (except for important feeds)',	// TODO
 			'upon_gone' => 'when it is no longer in the upstream news feed',	// TODO
 			'upon_reception' => 'upon receiving the article',	// TODO
 			'when' => 'Mark an article as read…',	// TODO

+ 1 - 0
app/i18n/el/index.php

@@ -45,6 +45,7 @@ return array(
 		'bookmark_query' => 'Bookmark current query',	// TODO
 		'favorites' => 'Favourites (%s)',	// TODO
 		'global_view' => 'Global view',	// TODO
+		'important' => 'Important feeds',	// TODO
 		'main_stream' => 'Main stream',	// TODO
 		'mark_all_read' => 'Mark all as read',	// TODO
 		'mark_cat_read' => 'Mark category as read',	// TODO

+ 2 - 1
app/i18n/el/sub.php

@@ -140,8 +140,9 @@ return array(
 		'priority' => array(
 			'_' => 'Visibility',	// TODO
 			'archived' => 'Do not show (archived)',	// TODO
+			'category' => 'Show in its category',	// TODO
+			'important' => 'Show in important feeds',	// TODO
 			'main_stream' => 'Show in main stream',	// TODO
-			'normal' => 'Show in its category',	// TODO
 		),
 		'proxy' => 'Set a proxy for fetching this feed',	// TODO
 		'proxy_help' => 'Select a protocol (e.g: SOCKS5) and enter the proxy address (e.g: <kbd>127.0.0.1:1080</kbd> or <kbd>username:password@127.0.0.1:1080</kbd>)',	// TODO

+ 1 - 1
app/i18n/en-us/conf.php

@@ -205,7 +205,7 @@ return array(
 			'article_open_on_website' => 'when the article is opened on its original website',	// IGNORE
 			'article_viewed' => 'when the article is viewed',	// IGNORE
 			'keep_max_n_unread' => 'Max number of articles to keep unread',	// IGNORE
-			'scroll' => 'while scrolling',	// IGNORE
+			'scroll' => 'while scrolling (except for important feeds)',	// IGNORE
 			'upon_gone' => 'when it is no longer in the upstream news feed',	// IGNORE
 			'upon_reception' => 'upon receiving the article',	// IGNORE
 			'when' => 'Mark an article as read…',	// IGNORE

+ 1 - 0
app/i18n/en-us/index.php

@@ -45,6 +45,7 @@ return array(
 		'bookmark_query' => 'Bookmark current query',	// IGNORE
 		'favorites' => 'Favorites (%s)',
 		'global_view' => 'Global view',	// IGNORE
+		'important' => 'Important feeds',	// IGNORE
 		'main_stream' => 'Main stream',	// IGNORE
 		'mark_all_read' => 'Mark all as read',	// IGNORE
 		'mark_cat_read' => 'Mark category as read',	// IGNORE

+ 2 - 1
app/i18n/en-us/sub.php

@@ -140,8 +140,9 @@ return array(
 		'priority' => array(
 			'_' => 'Visibility',	// IGNORE
 			'archived' => 'Do not show (archived)',	// IGNORE
+			'category' => 'Show in its category',	// IGNORE
+			'important' => 'Show in important feeds',	// IGNORE
 			'main_stream' => 'Show in main stream',	// IGNORE
-			'normal' => 'Show in its category',	// IGNORE
 		),
 		'proxy' => 'Set a proxy for fetching this feed',	// IGNORE
 		'proxy_help' => 'Select a protocol (e.g: SOCKS5) and enter the proxy address (e.g: <kbd>127.0.0.1:1080</kbd> or <kbd>username:password@127.0.0.1:1080</kbd>)',	// IGNORE

+ 1 - 1
app/i18n/en/conf.php

@@ -205,7 +205,7 @@ return array(
 			'article_open_on_website' => 'when the article is opened on its original website',
 			'article_viewed' => 'when the article is viewed',
 			'keep_max_n_unread' => 'Max number of articles to keep unread',
-			'scroll' => 'while scrolling',
+			'scroll' => 'while scrolling (except for important feeds)',
 			'upon_gone' => 'when it is no longer in the upstream news feed',
 			'upon_reception' => 'upon receiving the article',
 			'when' => 'Mark an article as read…',

+ 1 - 0
app/i18n/en/index.php

@@ -45,6 +45,7 @@ return array(
 		'bookmark_query' => 'Bookmark current query',
 		'favorites' => 'Favourites (%s)',
 		'global_view' => 'Global view',
+		'important' => 'Important feeds',
 		'main_stream' => 'Main stream',
 		'mark_all_read' => 'Mark all as read',
 		'mark_cat_read' => 'Mark category as read',

+ 2 - 1
app/i18n/en/sub.php

@@ -140,8 +140,9 @@ return array(
 		'priority' => array(
 			'_' => 'Visibility',
 			'archived' => 'Do not show (archived)',
+			'category' => 'Show in its category',
+			'important' => 'Show in important feeds',
 			'main_stream' => 'Show in main stream',
-			'normal' => 'Show in its category',
 		),
 		'proxy' => 'Set a proxy for fetching this feed',
 		'proxy_help' => 'Select a protocol (e.g: SOCKS5) and enter the proxy address (e.g: <kbd>127.0.0.1:1080</kbd> or <kbd>username:password@127.0.0.1:1080</kbd>)',

+ 1 - 1
app/i18n/es/conf.php

@@ -205,7 +205,7 @@ return array(
 			'article_open_on_website' => 'cuando el artículo se abra en su web original',
 			'article_viewed' => 'cuando se muestre el artículo',
 			'keep_max_n_unread' => 'Número máximo de artículos para mantener sin leer',
-			'scroll' => 'durante el desplazamiento',
+			'scroll' => 'durante el desplazamiento (except for important feeds)',	// DIRTY
 			'upon_gone' => 'cuando ya no está disponible en el feed de noticias previo',
 			'upon_reception' => 'al recibir el artículo',
 			'when' => 'Marcar el artículo como leído…',

+ 1 - 0
app/i18n/es/index.php

@@ -45,6 +45,7 @@ return array(
 		'bookmark_query' => 'Marcar consulta actual',
 		'favorites' => 'Favoritos (%s)',
 		'global_view' => 'Vista Global',
+		'important' => 'Important feeds',	// TODO
 		'main_stream' => 'Salida Principal',
 		'mark_all_read' => 'Marcar todo como leído',
 		'mark_cat_read' => 'Marcar categoría como leída',

+ 2 - 1
app/i18n/es/sub.php

@@ -140,8 +140,9 @@ return array(
 		'priority' => array(
 			'_' => 'Visibilidad',
 			'archived' => 'No mostrar (archivado)',
+			'category' => 'Mostrar en su categoría',
+			'important' => 'Show in important feeds',	// TODO
 			'main_stream' => 'Mostrar en salida principal',
-			'normal' => 'Mostrar en su categoría',
 		),
 		'proxy' => 'Establecer un proxy para obtener esta fuente',
 		'proxy_help' => 'Seleccione un protocolo (e.g: SOCKS5) e introduzca la dirección del proxy (e.g: <kbd>127.0.0.1:1080</kbd> or <kbd>username:password@127.0.0.1:1080</kbd>)',	// DIRTY

+ 1 - 1
app/i18n/fa/conf.php

@@ -205,7 +205,7 @@ return array(
 			'article_open_on_website' => ' هنگامی که مقاله در وب سایت اصلی خود باز می شود',
 			'article_viewed' => ' هنگام مشاهده مقاله',
 			'keep_max_n_unread' => ' حداکثر تعداد مقالات خوانده نشده',
-			'scroll' => ' در حین پیمایش',
+			'scroll' => '(except for important feeds) در حین پیمایش',	// DIRTY
 			'upon_gone' => ' زمانی که دیگر در فید اخبار بالادستی نیست',
 			'upon_reception' => ' پس از دریافت مقاله',
 			'when' => ' علامت گذاری یک مقاله به عنوان خوانده شده…',

+ 1 - 0
app/i18n/fa/index.php

@@ -45,6 +45,7 @@ return array(
 		'bookmark_query' => ' درخواست فعلی را نشانک‌گذاری کنید',
 		'favorites' => ' موارد دلخواه (%s)',
 		'global_view' => ' نمای جهانی',
+		'important' => 'Important feeds',	// TODO
 		'main_stream' => ' جریان اصلی',
 		'mark_all_read' => ' همه را به عنوان خوانده شده علامت گذاری کنید',
 		'mark_cat_read' => ' دسته را به عنوان خوانده شده علامت گذاری کنید',

+ 2 - 1
app/i18n/fa/sub.php

@@ -140,8 +140,9 @@ return array(
 		'priority' => array(
 			'_' => ' دید',
 			'archived' => ' نشان داده نشود (بایگانی شده)',
+			'category' => ' نمایش در دسته بندی خود',
+			'important' => 'Show in important feeds',	// TODO
 			'main_stream' => ' نمایش در جریان اصلی',
-			'normal' => ' نمایش در دسته بندی خود',
 		),
 		'proxy' => ' یک پروکسی برای واکشی این فید تنظیم کنید',
 		'proxy_help' => ' یک پروتکل (به عنوان مثال: SOCKS5) انتخاب کنید و آدرس پراکسی را وارد کنید (به عنوان مثال: <kbd>127.0.0.1:1080</kbd> or <kbd>username:password@127.0.0.1:1080</kbd>)',	// DIRTY

+ 1 - 1
app/i18n/fr/conf.php

@@ -205,7 +205,7 @@ return array(
 			'article_open_on_website' => 'lorsque l’article est ouvert sur le site d’origine',
 			'article_viewed' => 'lorsque l’article est affiché',
 			'keep_max_n_unread' => 'Nombre maximum d’articles conservés non lus',
-			'scroll' => 'au défilement de la page',
+			'scroll' => 'au défilement de la page (sauf pour les flux importants)',
 			'upon_gone' => 'lorsqu’il n’est plus dans le flux d’actualités en amont',
 			'upon_reception' => 'dès la réception du nouvel article',
 			'when' => 'Marquer un article comme lu…',

+ 3 - 2
app/i18n/fr/index.php

@@ -43,9 +43,10 @@ return array(
 		'before_one_day' => 'Antérieurs à 1 jour',
 		'before_one_week' => 'Antérieurs à 1 semaine',
 		'bookmark_query' => 'Enregistrer la recherche courante',
-		'favorites' => 'Favoris (%s)',
+		'favorites' => 'Articles favoris (%s)',
 		'global_view' => 'Vue globale',
-		'main_stream' => 'Flux principal',
+		'important' => 'Flux importants',	// DIRTY
+		'main_stream' => 'Flux principaux',
 		'mark_all_read' => 'Tout marquer comme lu',
 		'mark_cat_read' => 'Marquer la catégorie comme lue',
 		'mark_feed_read' => 'Marquer le flux comme lu',

+ 3 - 2
app/i18n/fr/sub.php

@@ -140,8 +140,9 @@ return array(
 		'priority' => array(
 			'_' => 'Visibilité',
 			'archived' => 'Ne pas afficher (archivé)',
-			'main_stream' => 'Afficher dans le flux principal',
-			'normal' => 'Afficher dans sa catégorie',
+			'category' => 'Afficher dans sa catégorie',
+			'important' => 'Afficher dans les flux importants',
+			'main_stream' => 'Afficher dans les flux principaux',
 		),
 		'proxy' => 'Utiliser un proxy pour télécharger ce flux',
 		'proxy_help' => 'Sélectionner un protocole (ex : SOCKS5) et entrer l’adresse du proxy (ex. : <kbd>127.0.0.1:1080</kbd> ou <kbd>utilisateur:mot-de-passe@127.0.0.1:1080</kbd>)',

+ 1 - 1
app/i18n/he/conf.php

@@ -205,7 +205,7 @@ return array(
 			'article_open_on_website' => 'כאשר מאמר נפתח באתר המקורי',
 			'article_viewed' => 'כאשר מאמר נצפה',
 			'keep_max_n_unread' => 'Max number of articles to keep unread',	// TODO
-			'scroll' => 'כאשר גוללים',
+			'scroll' => '(except for important feeds) כאשר גוללים',	// DIRTY
 			'upon_gone' => 'when it is no longer in the upstream news feed',	// TODO
 			'upon_reception' => 'כאשר המאמר מתקבל',
 			'when' => 'סימון מאמרים כנקראו…',

+ 1 - 0
app/i18n/he/index.php

@@ -45,6 +45,7 @@ return array(
 		'bookmark_query' => 'Bookmark current query',	// TODO
 		'favorites' => 'מועדפים (%s)',
 		'global_view' => 'תצוגה גלובלית',
+		'important' => 'Important feeds',	// TODO
 		'main_stream' => 'הזנה ראשית',
 		'mark_all_read' => 'סימון הכל כנקרא',
 		'mark_cat_read' => 'סימון קטגוריה כנקראה',

+ 2 - 1
app/i18n/he/sub.php

@@ -140,8 +140,9 @@ return array(
 		'priority' => array(
 			'_' => 'Visibility',	// TODO
 			'archived' => 'Do not show (archived)',	// TODO
+			'category' => 'Show in its category',	// TODO
+			'important' => 'Show in important feeds',	// TODO
 			'main_stream' => 'הצגה בזרם המרכזי',
-			'normal' => 'Show in its category',	// TODO
 		),
 		'proxy' => 'Set a proxy for fetching this feed',	// TODO
 		'proxy_help' => 'Select a protocol (e.g: SOCKS5) and enter the proxy address (e.g: <kbd>127.0.0.1:1080</kbd> or <kbd>username:password@127.0.0.1:1080</kbd>)',	// TODO

+ 1 - 1
app/i18n/hu/conf.php

@@ -205,7 +205,7 @@ return array(
 			'article_open_on_website' => 'ha a cikk megnyitásra került az eredeti weblapon',
 			'article_viewed' => 'ha a cikk megtekintésre került',
 			'keep_max_n_unread' => 'Cikkek maximális száma olvasatlanként tartva',
-			'scroll' => 'görgetés közben',
+			'scroll' => 'görgetés közben (except for important feeds)',	// DIRTY
 			'upon_gone' => 'ha már nincs benne a hírforrásban',
 			'upon_reception' => 'a cikk beérkezésekor',
 			'when' => 'Jelölje a cikket olvasottként…',

+ 1 - 0
app/i18n/hu/index.php

@@ -45,6 +45,7 @@ return array(
 		'bookmark_query' => 'Jelenlegi lekérdezés könyvjelzőzése',
 		'favorites' => 'Kedvencek (%s)',
 		'global_view' => 'Globális nézet',
+		'important' => 'Important feeds',	// TODO
 		'main_stream' => 'Minden cikk',
 		'mark_all_read' => 'Legyen mind olvasott',
 		'mark_cat_read' => 'Kategória megjelölése olvasottként',

+ 2 - 1
app/i18n/hu/sub.php

@@ -140,8 +140,9 @@ return array(
 		'priority' => array(
 			'_' => 'Láthatóság',
 			'archived' => 'Ne jelenjen meg (archivált)',
+			'category' => 'Jelenjen meg a saját kategóriájában',
+			'important' => 'Show in important feeds',	// TODO
 			'main_stream' => 'Megjelenítés a Minden cikk között',
-			'normal' => 'Jelenjen meg a saját kategóriájában',
 		),
 		'proxy' => 'Állíts be egy proxy-t a hírforráshoz ',
 		'proxy_help' => 'Válassz egy protokolt (pl: SOCKS5) és add meg a proxy címét (pl: <kbd>127.0.0.1:1080</kbd> or <kbd>username:password@127.0.0.1:1080</kbd>)',	// DIRTY

+ 1 - 1
app/i18n/id/conf.php

@@ -205,7 +205,7 @@ return array(
 			'article_open_on_website' => 'when the article is opened on its original website',	// TODO
 			'article_viewed' => 'when the article is viewed',	// TODO
 			'keep_max_n_unread' => 'Max number of articles to keep unread',	// TODO
-			'scroll' => 'while scrolling',	// TODO
+			'scroll' => 'while scrolling (except for important feeds)',	// TODO
 			'upon_gone' => 'when it is no longer in the upstream news feed',	// TODO
 			'upon_reception' => 'upon receiving the article',	// TODO
 			'when' => 'Mark an article as read…',	// TODO

+ 1 - 0
app/i18n/id/index.php

@@ -45,6 +45,7 @@ return array(
 		'bookmark_query' => 'Bookmark current query',	// TODO
 		'favorites' => 'Favorites (%s)',
 		'global_view' => 'Global view',	// TODO
+		'important' => 'Important feeds',	// TODO
 		'main_stream' => 'Main stream',	// TODO
 		'mark_all_read' => 'Mark all as read',	// TODO
 		'mark_cat_read' => 'Mark category as read',	// TODO

+ 2 - 1
app/i18n/id/sub.php

@@ -140,8 +140,9 @@ return array(
 		'priority' => array(
 			'_' => 'Visibility',	// TODO
 			'archived' => 'Do not show (archived)',	// TODO
+			'category' => 'Show in its category',	// TODO
+			'important' => 'Show in important feeds',	// TODO
 			'main_stream' => 'Show in main stream',	// TODO
-			'normal' => 'Show in its category',	// TODO
 		),
 		'proxy' => 'Set a proxy for fetching this feed',	// TODO
 		'proxy_help' => 'Select a protocol (e.g: SOCKS5) and enter the proxy address (e.g: <kbd>127.0.0.1:1080</kbd> or <kbd>username:password@127.0.0.1:1080</kbd>)',	// TODO

+ 1 - 1
app/i18n/it/conf.php

@@ -205,7 +205,7 @@ return array(
 			'article_open_on_website' => 'Quando un articolo è aperto nel suo sito di origine',
 			'article_viewed' => 'Quando un articolo viene letto',
 			'keep_max_n_unread' => 'Massimo numero di articoli da mantenere come non letti',
-			'scroll' => 'Scorrendo la pagina',
+			'scroll' => 'Scorrendo la pagina (except for important feeds)',	// DIRTY
 			'upon_gone' => 'quando non si trova più nel feed di notizie in alto',
 			'upon_reception' => 'Alla ricezione del contenuto',
 			'when' => 'Segna articoli come letti…',

+ 1 - 0
app/i18n/it/index.php

@@ -45,6 +45,7 @@ return array(
 		'bookmark_query' => 'Inserisci la ricerca corrente nei segnalibri',
 		'favorites' => 'Preferiti (%s)',
 		'global_view' => 'Vista globale per categorie',
+		'important' => 'Important feeds',	// TODO
 		'main_stream' => 'Flusso principale',
 		'mark_all_read' => 'Segna tutto come letto',
 		'mark_cat_read' => 'Segna la categoria come letta',

+ 2 - 1
app/i18n/it/sub.php

@@ -140,8 +140,9 @@ return array(
 		'priority' => array(
 			'_' => 'Visibilità',
 			'archived' => 'Non mostrare (archiviato)',
+			'category' => 'Mostra nella sua categoria',
+			'important' => 'Show in important feeds',	// TODO
 			'main_stream' => 'Mostra in homepage',
-			'normal' => 'Mostra nella sua categoria',
 		),
 		'proxy' => 'Imposta un proxy per recuperare questo feed',
 		'proxy_help' => 'Seleziona un protocollo (e.g: SOCKS5) ed inserisci l’indirizzo del proxy (e.g: <kbd>127.0.0.1:1080</kbd> or <kbd>username:password@127.0.0.1:1080</kbd>)',	// DIRTY

+ 1 - 1
app/i18n/ja/conf.php

@@ -205,7 +205,7 @@ return array(
 			'article_open_on_website' => '記事を元のwebサイトで開いたとき',
 			'article_viewed' => '記事を読んだとき',
 			'keep_max_n_unread' => '未読の記事として残す最大数',
-			'scroll' => 'スクロールしているとき',
+			'scroll' => 'スクロールしているとき (except for important feeds)',	// DIRTY
 			'upon_gone' => 'ニュースフィードの提供元がなくなったとき',
 			'upon_reception' => '記事を受け取ったとき',
 			'when' => '記事を既読にする…',

+ 1 - 0
app/i18n/ja/index.php

@@ -45,6 +45,7 @@ return array(
 		'bookmark_query' => '現在のブックマーククエリ',
 		'favorites' => 'お気に入り (%s)',
 		'global_view' => 'グローバルビュー',
+		'important' => 'Important feeds',	// TODO
 		'main_stream' => 'メイン',
 		'mark_all_read' => 'すべての記事に既読をつける',
 		'mark_cat_read' => 'カテゴリーに既読をつける',

+ 2 - 1
app/i18n/ja/sub.php

@@ -140,8 +140,9 @@ return array(
 		'priority' => array(
 			'_' => '表示する場所',
 			'archived' => '非表示にする(アーカイブ)',
+			'category' => 'カテゴリで表示する',
+			'important' => 'Show in important feeds',	// TODO
 			'main_stream' => 'メインストリームで表示する',
-			'normal' => 'カテゴリで表示する',
 		),
 		'proxy' => 'フィードを読み込み時にproxyを設定してください',
 		'proxy_help' => 'プロトコルを選択し (例: SOCKS5) proxyアドレスを入力してください (例: <kbd>127.0.0.1:1080</kbd> or <kbd>username:password@127.0.0.1:1080</kbd>)',	// DIRTY

+ 1 - 1
app/i18n/ko/conf.php

@@ -205,7 +205,7 @@ return array(
 			'article_open_on_website' => '글이 게재된 웹사이트를 방문했을 때',
 			'article_viewed' => '글을 읽었을 때',
 			'keep_max_n_unread' => '읽지 않은 상태로 유지할 최대 글 개수',
-			'scroll' => '스크롤을 하며 지나갈 때',
+			'scroll' => '스크롤을 하며 지나갈 때 (except for important feeds)',	// DIRTY
 			'upon_gone' => '원본 뉴스 피드에서 글 삭제 되었을 때',
 			'upon_reception' => '글을 가져오자마자',
 			'when' => '읽음으로 표시…',

+ 1 - 0
app/i18n/ko/index.php

@@ -45,6 +45,7 @@ return array(
 		'bookmark_query' => '현재 쿼리 북마크',
 		'favorites' => '즐겨찾기 (%s)',
 		'global_view' => '전체 모드',
+		'important' => 'Important feeds',	// TODO
 		'main_stream' => '메인 스트림',
 		'mark_all_read' => '모두 읽음으로 표시',
 		'mark_cat_read' => '카테고리를 읽음으로 표시',

+ 2 - 1
app/i18n/ko/sub.php

@@ -140,8 +140,9 @@ return array(
 		'priority' => array(
 			'_' => '표시',
 			'archived' => '표시하지 않음 (보관됨)',
+			'category' => '피드가 속한 카테고리에만 표시하기',
+			'important' => 'Show in important feeds',	// TODO
 			'main_stream' => '메인 스트림에 표시하기',
-			'normal' => '피드가 속한 카테고리에만 표시하기',
 		),
 		'proxy' => '이 피드를 가져올 때 사용할 프록시 설정',
 		'proxy_help' => '프로토콜 선택 (예: SOCKS5) 그리고 프록시 주소 입력 (예: <kbd>127.0.0.1:1080</kbd> or <kbd>username:password@127.0.0.1:1080</kbd>)',	// DIRTY

+ 1 - 1
app/i18n/lv/conf.php

@@ -205,7 +205,7 @@ return array(
 			'article_open_on_website' => 'kad raksts tiek atvērts tā sākotnējā mājaslapā',
 			'article_viewed' => 'kad raksts tiek skatīts',
 			'keep_max_n_unread' => 'Maksimālais nelasīto rakstu skaits',
-			'scroll' => 'ritināšanas laikā',
+			'scroll' => 'ritināšanas laikā (except for important feeds)',	// DIRTY
 			'upon_gone' => 'kad tas vairs nav augšupējā ziņu barotnē',
 			'upon_reception' => 'pēc raksta saņemšanas',
 			'when' => 'Atzīmēt rakstu kā izlasītu…',

+ 1 - 0
app/i18n/lv/index.php

@@ -45,6 +45,7 @@ return array(
 		'bookmark_query' => 'Pievienot grāmatzīmi pašreizējam pieprasījumam',
 		'favorites' => 'Mīļākie (%s)',
 		'global_view' => 'Globālais skats',
+		'important' => 'Important feeds',	// TODO
 		'main_stream' => 'Galvenā plūsma',
 		'mark_all_read' => 'Atzīmēt visus kā izlasītus',
 		'mark_cat_read' => 'Atzīmēt kategoriju kā izlasītu',

+ 2 - 1
app/i18n/lv/sub.php

@@ -140,8 +140,9 @@ return array(
 		'priority' => array(
 			'_' => 'Prioritāte',
 			'archived' => 'Nerādīt (arhivēts)',
+			'category' => 'Rādīt kategorijā',
+			'important' => 'Show in important feeds',	// TODO
 			'main_stream' => 'Rādīt galvenajā plūsmā',
-			'normal' => 'Rādīt kategorijā',
 		),
 		'proxy' => 'Iestatīt starpniekserveri šīs plūsmas iegūšanai',
 		'proxy_help' => 'Izvēlieties protokolu (piemēram, SOCKS5) un ievadiet starpniekservera adresi (piemēram, <kbd>127.0.0.0.1:1080</kbd>).',

+ 1 - 1
app/i18n/nl/conf.php

@@ -205,7 +205,7 @@ return array(
 			'article_open_on_website' => 'als het artikel wordt geopend op de originele website',
 			'article_viewed' => 'als het artikel wordt bekeken',
 			'keep_max_n_unread' => 'Max aantal artikelen ongelezen houden',
-			'scroll' => 'tijdens het scrollen',
+			'scroll' => 'tijdens het scrollen (except for important feeds)',	// DIRTY
 			'upon_gone' => 'als het niet langer in de nieuwsfeed staat',
 			'upon_reception' => 'bij ontvangst van het artikel',
 			'when' => 'Markeer artikel als gelezen…',

+ 1 - 0
app/i18n/nl/index.php

@@ -45,6 +45,7 @@ return array(
 		'bookmark_query' => 'Huidige query opslaan',
 		'favorites' => 'Favorieten (%s)',
 		'global_view' => 'Globale weergave',
+		'important' => 'Important feeds',	// TODO
 		'main_stream' => 'Overzicht',
 		'mark_all_read' => 'Markeer alles als gelezen',
 		'mark_cat_read' => 'Markeer categorie als gelezen',

+ 2 - 1
app/i18n/nl/sub.php

@@ -140,8 +140,9 @@ return array(
 		'priority' => array(
 			'_' => 'Zichtbaarheid',
 			'archived' => 'Niet weergeven (gearchiveerd)',
+			'category' => 'Toon in categorie',
+			'important' => 'Show in important feeds',	// TODO
 			'main_stream' => 'Zichtbaar in het overzicht',
-			'normal' => 'Toon in categorie',
 		),
 		'proxy' => 'Proxy instellen om deze feed op te halen',
 		'proxy_help' => 'Selecteer een protocol (bv. SOCKS5) en voer een proxy-adres in (b.v. <kbd>127.0.0.1:1080</kbd> or <kbd>username:password@127.0.0.1:1080</kbd>)',	// DIRTY

+ 1 - 1
app/i18n/oc/conf.php

@@ -205,7 +205,7 @@ return array(
 			'article_open_on_website' => 'quand l’article es dobèrt sul site d’origina',
 			'article_viewed' => 'quand l’article es mostrat',
 			'keep_max_n_unread' => 'Nombre max d’articles a gardar pas legits',
-			'scroll' => 'en davalant la pagina',
+			'scroll' => 'en davalant la pagina (except for important feeds)',	// DIRTY
 			'upon_gone' => 'quand es pas mai dins lo flux de novèla font',
 			'upon_reception' => 'en recebre un article novèl',
 			'when' => 'Marcar un article coma legit…',

+ 1 - 0
app/i18n/oc/index.php

@@ -45,6 +45,7 @@ return array(
 		'bookmark_query' => 'Marcar aquesta requèsta',
 		'favorites' => 'Favorits (%s)',
 		'global_view' => 'Vista generala',
+		'important' => 'Important feeds',	// TODO
 		'main_stream' => 'Flux màger',
 		'mark_all_read' => 'O marcar tot coma legit',
 		'mark_cat_read' => 'Marcar la categoria coma legida',

+ 2 - 1
app/i18n/oc/sub.php

@@ -140,8 +140,9 @@ return array(
 		'priority' => array(
 			'_' => 'Visibilitat',
 			'archived' => 'Mostrar pas (archivat)',
+			'category' => 'Mostar dins sa categoria',
+			'important' => 'Show in important feeds',	// TODO
 			'main_stream' => 'Mostar al flux màger',
-			'normal' => 'Mostar dins sa categoria',
 		),
 		'proxy' => 'Definir un servidor proxy per trapar aqueste flux',
 		'proxy_help' => 'Seleccionatz un protocòl (ex : SOCKS5) e picatz l’adreça del proxy (ex : <kbd>127.0.0.1:1080</kbd> or <kbd>username:password@127.0.0.1:1080</kbd>)',	// DIRTY

+ 1 - 1
app/i18n/pl/conf.php

@@ -205,7 +205,7 @@ return array(
 			'article_open_on_website' => 'gdy wiadomość jest otworzona na pierwotnej stronie',
 			'article_viewed' => 'gdy wiadomość jest otworzona',
 			'keep_max_n_unread' => 'Maksymalna liczba nieprzeczytanych wiadomości',
-			'scroll' => 'podczas przewijania',
+			'scroll' => 'podczas przewijania (except for important feeds)',	// DIRTY
 			'upon_gone' => 'gdy nie jest już listowana w źródle kanału',
 			'upon_reception' => 'po otrzymaniu wiadomości',
 			'when' => 'Oznacz wiadomość jako przeczytaną…',

+ 1 - 0
app/i18n/pl/index.php

@@ -45,6 +45,7 @@ return array(
 		'bookmark_query' => 'Zapisz bieżące zapytanie',
 		'favorites' => 'Ulubione (%s)',
 		'global_view' => 'Widok globalny',
+		'important' => 'Important feeds',	// TODO
 		'main_stream' => 'Kanał główny',
 		'mark_all_read' => 'Oznacz wszystkie jako przeczytane',
 		'mark_cat_read' => 'Oznacz kategorię jako przeczytaną',

+ 2 - 1
app/i18n/pl/sub.php

@@ -140,8 +140,9 @@ return array(
 		'priority' => array(
 			'_' => 'Widoczność',
 			'archived' => 'Nie pokazuj (zarchiwizowany)',
+			'category' => 'Pokaż w kategorii kanału',
+			'important' => 'Show in important feeds',	// TODO
 			'main_stream' => 'Pokaż w kanale głównym',
-			'normal' => 'Pokaż w kategorii kanału',
 		),
 		'proxy' => 'Użyj mechanizmu proxy podczas pobierania kanału',
 		'proxy_help' => 'Wybierz protokół (np. SOCKS5) i podaj adres serwera proxy (np. <kbd>127.0.0.1:1080</kbd> or <kbd>username:password@127.0.0.1:1080</kbd>)',	// DIRTY

+ 1 - 1
app/i18n/pt-br/conf.php

@@ -205,7 +205,7 @@ return array(
 			'article_open_on_website' => 'quando o artigo é aberto no site original',
 			'article_viewed' => 'Quando o artigo é visualizado',
 			'keep_max_n_unread' => 'Número máximo de artigos para manter como não lido',
-			'scroll' => 'enquanto scrolling',
+			'scroll' => 'enquanto scrolling (except for important feeds)',	// DIRTY
 			'upon_gone' => 'QUuando não estiver mais no feed de noticiais principais',
 			'upon_reception' => 'ao receber um artigo',
 			'when' => 'Marcar artigo como lido…',

+ 1 - 0
app/i18n/pt-br/index.php

@@ -45,6 +45,7 @@ return array(
 		'bookmark_query' => 'Salvar pesquisa atual',
 		'favorites' => 'Favoritos (%s)',
 		'global_view' => 'Visualização global',
+		'important' => 'Important feeds',	// TODO
 		'main_stream' => 'Stream principal',
 		'mark_all_read' => 'Marcar todos como lidos',
 		'mark_cat_read' => 'Marcar categoria como lida',

+ 2 - 1
app/i18n/pt-br/sub.php

@@ -140,8 +140,9 @@ return array(
 		'priority' => array(
 			'_' => 'Visibilidade',
 			'archived' => 'Não exibir (arquivado)',
+			'category' => 'Mostrar na sua categoria',
+			'important' => 'Show in important feeds',	// TODO
 			'main_stream' => 'Mostrar na tela principal',
-			'normal' => 'Mostrar na sua categoria',
 		),
 		'proxy' => 'Defina um proxy para buscar esse feed',
 		'proxy_help' => 'Selecione um protocolo (e.g: SOCKS5) e digite o endereço do proxy (e.g: <kbd>127.0.0.1:1080</kbd> or <kbd>username:password@127.0.0.1:1080</kbd>)',	// DIRTY

+ 1 - 1
app/i18n/ru/conf.php

@@ -205,7 +205,7 @@ return array(
 			'article_open_on_website' => 'когда статья открывается на её сайте',
 			'article_viewed' => 'когда статья просматривается',
 			'keep_max_n_unread' => 'Максимальное количество непрочитанных статей',
-			'scroll' => 'во время прокрутки',
+			'scroll' => 'во время прокрутки (except for important feeds)',	// DIRTY
 			'upon_gone' => 'когда это больше не в новостной ленте',
 			'upon_reception' => 'по получении статьи',
 			'when' => 'Отмечать статью прочитанной…',

+ 1 - 0
app/i18n/ru/index.php

@@ -45,6 +45,7 @@ return array(
 		'bookmark_query' => 'Сохранить текущий запрос',
 		'favorites' => 'Избранное (%s)',
 		'global_view' => 'Глобальный вид',
+		'important' => 'Important feeds',	// TODO
 		'main_stream' => 'Основной поток',
 		'mark_all_read' => 'Отметить всё прочитанным',
 		'mark_cat_read' => 'Отметить категорию прочитанной',

+ 2 - 1
app/i18n/ru/sub.php

@@ -140,8 +140,9 @@ return array(
 		'priority' => array(
 			'_' => 'Видимость',
 			'archived' => 'Не показывать (архивировано)',
+			'category' => 'Показывать в категории ленты',
+			'important' => 'Show in important feeds',	// TODO
 			'main_stream' => 'Показывать в основном потоке',
-			'normal' => 'Показывать в категории ленты',
 		),
 		'proxy' => 'Указать прокси для извлечения этой ленты',
 		'proxy_help' => 'Выберите протокол (например, SOCKS5) и введите адрес прокси (например, <kbd>127.0.0.1:1080</kbd> or <kbd>username:password@127.0.0.1:1080</kbd>)',	// DIRTY

+ 1 - 1
app/i18n/sk/conf.php

@@ -205,7 +205,7 @@ return array(
 			'article_open_on_website' => 'keď je článok otvorený na svojej webovej stránke',
 			'article_viewed' => 'keď je článok zobrazený',
 			'keep_max_n_unread' => 'Maximálny počet článkov ponechať ako neprečítané',
-			'scroll' => 'počas skrolovania',
+			'scroll' => 'počas skrolovania (except for important feeds)',	// DIRTY
 			'upon_gone' => 'keď už nie je v hlavnom kanály noviniek',
 			'upon_reception' => 'po načítaní článku',
 			'when' => 'Označiť článok ako prečítaný…',

+ 1 - 0
app/i18n/sk/index.php

@@ -45,6 +45,7 @@ return array(
 		'bookmark_query' => 'Pridať aktuálny dopyt do obľúbených',
 		'favorites' => 'Obľúbené (%s)',
 		'global_view' => 'Prehľad',
+		'important' => 'Important feeds',	// TODO
 		'main_stream' => 'Všetky kanály',
 		'mark_all_read' => 'Označiť všetko ako prečítané',
 		'mark_cat_read' => 'Označiť kategóriu ako prečítanú',

+ 2 - 1
app/i18n/sk/sub.php

@@ -140,8 +140,9 @@ return array(
 		'priority' => array(
 			'_' => 'Viditeľnosť',
 			'archived' => 'Nezobrazovať (archivované)',
+			'category' => 'Zobraziť vo svojej kategórii',
+			'important' => 'Show in important feeds',	// TODO
 			'main_stream' => 'Zobraziť v prehľade kanálov',
-			'normal' => 'Zobraziť vo svojej kategórii',
 		),
 		'proxy' => 'Na sťahovanie tohto kanálu nastaviť proxy',
 		'proxy_help' => 'Vyberte protokol (napr.: SOCKS5) a zadajte adresu proxy servera (napr.: <kbd>127.0.0.1:1080</kbd> or <kbd>username:password@127.0.0.1:1080</kbd>)',	// DIRTY

+ 1 - 1
app/i18n/tr/conf.php

@@ -205,7 +205,7 @@ return array(
 			'article_open_on_website' => 'orijinal makale sitesi açıldığında',
 			'article_viewed' => 'makale görüntülendiğinde',
 			'keep_max_n_unread' => 'Okunmadı tutulacak maksimum metin sayısı',
-			'scroll' => 'kaydırma yapılırken',
+			'scroll' => 'kaydırma yapılırken (except for important feeds)',	// DIRTY
 			'upon_gone' => 'Yeni akışta üst sıralarda değilken',
 			'upon_reception' => 'makale üzerinde gelince',
 			'when' => 'Makaleyi okundu olarak işaretle…',

+ 1 - 0
app/i18n/tr/index.php

@@ -45,6 +45,7 @@ return array(
 		'bookmark_query' => 'Şuana ait yer imi sorgusu',
 		'favorites' => 'Favoriler (%s)',
 		'global_view' => 'Evrensel görünüm',
+		'important' => 'Important feeds',	// TODO
 		'main_stream' => 'Ana akış',
 		'mark_all_read' => 'Hepsini okundu olarak işaretle',
 		'mark_cat_read' => 'Kategoriyi okundu olarak işaretle',

+ 2 - 1
app/i18n/tr/sub.php

@@ -140,8 +140,9 @@ return array(
 		'priority' => array(
 			'_' => 'Görünürlük',
 			'archived' => 'Gösterme (arşivlenmiş)',
+			'category' => 'Kendi kategorisinde göster',
+			'important' => 'Show in important feeds',	// TODO
 			'main_stream' => 'Ana akışda göster',
-			'normal' => 'Kendi kategorisinde göster',
 		),
 		'proxy' => 'Bu akışı güncellemek için vekil sunucu kullan',
 		'proxy_help' => 'Bir protokol seçin (ör: SOCKS5) vekil sunucu adresini girin (e.g: <kbd>127.0.0.1:1080</kbd> or <kbd>username:password@127.0.0.1:1080</kbd>)',	// DIRTY

+ 1 - 1
app/i18n/zh-cn/conf.php

@@ -205,7 +205,7 @@ return array(
 			'article_open_on_website' => '在打开原文章后',
 			'article_viewed' => '在文章被浏览后',
 			'keep_max_n_unread' => '未读最多保留 n 条',
-			'scroll' => '在滚动浏览后',
+			'scroll' => '在滚动浏览后 (except for important feeds)',	// DIRTY
 			'upon_gone' => '在被原订阅源被移除后',
 			'upon_reception' => '在接收文章后',
 			'when' => '何时将文章标记为已读',

+ 1 - 0
app/i18n/zh-cn/index.php

@@ -45,6 +45,7 @@ return array(
 		'bookmark_query' => '收藏当前查询',
 		'favorites' => '收藏(%s)',
 		'global_view' => '全局视图',
+		'important' => 'Important feeds',	// TODO
 		'main_stream' => '首页',
 		'mark_all_read' => '全部设为已读',
 		'mark_cat_read' => '此分类设为已读',

+ 2 - 1
app/i18n/zh-cn/sub.php

@@ -140,8 +140,9 @@ return array(
 		'priority' => array(
 			'_' => '可见性',
 			'archived' => '不显示(归档)',
+			'category' => '在分类中显示',
+			'important' => 'Show in important feeds',	// TODO
 			'main_stream' => '在首页中显示',
-			'normal' => '在分类中显示',
 		),
 		'proxy' => '获取订阅源时的代理',
 		'proxy_help' => '选择协议(例:SOCKS5)和代理地址(例:<kbd>127.0.0.1:1080</kbd> or <kbd>username:password@127.0.0.1:1080</kbd>)',	// DIRTY

+ 1 - 1
app/i18n/zh-tw/conf.php

@@ -205,7 +205,7 @@ return array(
 			'article_open_on_website' => '在打開原文章後',
 			'article_viewed' => '在文章被瀏覽後',
 			'keep_max_n_unread' => '未讀最多保留 n 條',
-			'scroll' => '在滾動瀏覽後',
+			'scroll' => '在滾動瀏覽後 (except for important feeds)',	// DIRTY
 			'upon_gone' => '在被原訂閱源移除後',
 			'upon_reception' => '在接收文章後',
 			'when' => '何時將文章標記為已讀',

+ 1 - 0
app/i18n/zh-tw/index.php

@@ -45,6 +45,7 @@ return array(
 		'bookmark_query' => '收藏當前查詢',
 		'favorites' => '收藏(%s)',
 		'global_view' => '全局視圖',
+		'important' => 'Important feeds',	// TODO
 		'main_stream' => '首頁',
 		'mark_all_read' => '全部設為已讀',
 		'mark_cat_read' => '此分類設為已讀',

+ 2 - 1
app/i18n/zh-tw/sub.php

@@ -140,8 +140,9 @@ return array(
 		'priority' => array(
 			'_' => '可見性',
 			'archived' => '不顯示(歸檔)',
+			'category' => '在分類中顯示',
+			'important' => 'Show in important feeds',	// TODO
 			'main_stream' => '在首頁中顯示',
-			'normal' => '在分類中顯示',
 		),
 		'proxy' => '獲取訂閱源時的代理',
 		'proxy_help' => '選擇協議(例:SOCKS5)和代理地址(例:<kbd>127.0.0.1:1080</kbd> or <kbd>username:password@127.0.0.1:1080</kbd>)',	// DIRTY

+ 8 - 0
app/layout/aside_feed.phtml

@@ -35,6 +35,14 @@
 			</div>
 		</li>
 
+		<li class="tree-folder category important<?= FreshRSS_Context::isCurrentGet('i') ? ' active' : '' ?>">
+			<div class="tree-folder-title">
+				<?= _i('important') ?><a class="title" data-unread="<?= format_number(FreshRSS_Context::$total_important_unread) ?>" href="<?= _url('index', $actual_view, 'get', 'i') . $state_filter_manual ?>">
+					<?= _t('index.menu.important') ?>
+				</a>
+			</div>
+		</li>
+
 		<li class="tree-folder category favorites<?= FreshRSS_Context::isCurrentGet('s') ? ' active' : '' ?>">
 			<div class="tree-folder-title">
 				<?= _i('starred') ?><a class="title" data-unread="<?= format_number(FreshRSS_Context::$total_starred['unread']) ?>" href="<?= _url('index', $actual_view, 'get', 's') . $state_filter_manual ?>">

+ 5 - 2
app/views/helpers/feed/update.phtml

@@ -80,13 +80,16 @@
 			<label class="group-name" for="priority"><?= _t('sub.feed.priority') ?></label>
 			<div class="group-controls">
 				<select name="priority" id="priority" class="w50">
+					<option value='<?= FreshRSS_Feed::PRIORITY_IMPORTANT ?>' <?php
+						if (FreshRSS_Feed::PRIORITY_IMPORTANT === $this->feed->priority()) {echo 'selected="selected"';}?>><?= _t('sub.feed.priority.important') ?></option>
 					<option value='<?= FreshRSS_Feed::PRIORITY_MAIN_STREAM ?>' <?php
 						if (FreshRSS_Feed::PRIORITY_MAIN_STREAM === $this->feed->priority()) {echo 'selected="selected"';}?>><?= _t('sub.feed.priority.main_stream') ?></option>
-					<option value='<?= FreshRSS_Feed::PRIORITY_NORMAL ?>' <?php
-						if (FreshRSS_Feed::PRIORITY_NORMAL === $this->feed->priority()) {echo 'selected="selected"';}?>><?= _t('sub.feed.priority.normal') ?></option>
+					<option value='<?= FreshRSS_Feed::PRIORITY_CATEGORY ?>' <?php
+						if (FreshRSS_Feed::PRIORITY_CATEGORY === $this->feed->priority()) {echo 'selected="selected"';}?>><?= _t('sub.feed.priority.category') ?></option>
 					<option value='<?= FreshRSS_Feed::PRIORITY_ARCHIVED ?>' <?php
 						if (FreshRSS_Feed::PRIORITY_ARCHIVED === $this->feed->priority()) {echo 'selected="selected"';}?>><?= _t('sub.feed.priority.archived') ?></option>
 				</select>
+				<?= _i('important') ?>
 			</div>
 		</div>
 

+ 5 - 8
app/views/index/normal.phtml

@@ -37,14 +37,9 @@ $today = @strtotime('today');
 		}
 		$this->entry = $item;
 
-		// We most likely already have the feed object in cache
-		$this->feed = FreshRSS_CategoryDAO::findFeed($this->categories, $this->entry->feedId());
-		if ($this->feed == null) {
-			$this->feed = $this->entry->feed() ?: null;
-			if ($this->feed == null) {
-				$this->feed = FreshRSS_Feed::example();
-			}
-		}
+		// We most likely already have the feed object in cache, otherwise make a request
+		$this->feed = FreshRSS_CategoryDAO::findFeed($this->categories, $this->entry->feedId()) ??
+			$this->entry->feed() ?? FreshRSS_Feed::example();
 
 		if ($display_today && $this->entry->isDay(FreshRSS_Days::TODAY, $today)) {
 			?><div class="day" id="day_today"><?php
@@ -71,8 +66,10 @@ $today = @strtotime('today');
 		}
 	?><div class="flux<?= !$this->entry->isRead() ? ' not_read' : ''
 		?><?= $this->entry->isFavorite() ? ' favorite' : ''
+		?><?= $this->feed->priority() >= FreshRSS_Feed::PRIORITY_IMPORTANT ? ' keep_unread ' : ''
 		?>" id="flux_<?= $this->entry->id()
 		?>" data-feed="<?= $this->feed->id()
+		?>" data-priority="<?= $this->feed->priority()
 		?>"><?php
 			$this->renderHelper('index/normal/entry_header');
 

+ 4 - 4
app/views/index/reader.phtml

@@ -45,15 +45,15 @@ $MAX_TAGS_DISPLAYED = FreshRSS_Context::$user_conf->show_tags_max;
 				}
 			}
 		}
-	?><div class="flux<?= !$item->isRead() ? ' not_read' : '' ?><?= $item->isFavorite() ? ' favorite' : '' ?>" id="flux_<?= $item->id() ?>">
+
+		//We most likely already have the feed object in cache, otherwise make a request
+		$feed = FreshRSS_CategoryDAO::findFeed($this->categories, $item->feedId()) ?? $item->feed() ?? FreshRSS_Feed::example();
+	?><div class="flux<?= !$item->isRead() ? ' not_read' : '' ?><?= $item->isFavorite() ? ' favorite' : '' ?>" id="flux_<?= $item->id() ?>" data-priority="<?= $feed->priority() ?>">
 		<article class="flux_content" dir="auto">
 
 			<div class="content <?= $content_width ?>">
 				<header>
 					<?php
-						$feed = FreshRSS_CategoryDAO::findFeed($this->categories, $item->feedId());	//We most likely already have the feed object in cache
-						if ($feed == null) $feed = $item->feed();
-						if ($feed == null) continue;
 						$favoriteUrl = array('c' => 'entry', 'a' => 'bookmark', 'params' => array('id' => $item->id()));
 						if ($item->isFavorite()) {
 							$favoriteUrl['params']['is_favorite'] = 0;

+ 1 - 1
app/views/subscription/index.phtml

@@ -61,7 +61,7 @@
 						$mute_class = $feed->mute() ? ' mute' : '';
 				?>
 				<li class="item feed<?= $error_class, $empty_class, $mute_class ?>" title="<?= $error_title, $empty_title ?>"
-					draggable="true" data-feed-id="<?= $feed->id() ?>">
+					draggable="true" data-feed-id="<?= $feed->id() ?>" data-priority="<?= $feed->priority() ?>">
 					<a class="configure open-slider" href="<?= _url('subscription', 'feed', 'id', $feed->id()) ?>" title="<?= _t('gen.action.manage') ?>"><?= _i('configure') ?></a>
 					<?php if (FreshRSS_Context::$user_conf->show_favicons): ?><img class="favicon" src="<?= $feed->favicon() ?>" alt="✇" loading="lazy" /><?php endif; ?>
 					<span class="item-title"><?= $feed->name() ?></span>

+ 1 - 1
p/api/greader.php

@@ -963,7 +963,7 @@ final class GReaderAPI {
 				}
 			}
 		} elseif ($streamId === 'user/-/state/com.google/reading-list') {
-			$entryDAO->markReadEntries($olderThanId, false, -1);
+			$entryDAO->markReadEntries($olderThanId, false);
 		} else {
 			self::badRequest();
 		}

+ 9 - 0
p/scripts/main.js

@@ -135,6 +135,15 @@ function incUnreadsFeed(article, feed_id, nb) {
 		}
 	}
 
+	// Update unread: important
+	if (feed_priority >= 20) {
+		elem = document.querySelector('#aside_feed .important .title');
+		if (elem) {
+			feed_unreads = elem ? str2int(elem.getAttribute('data-unread')) : 0;
+			elem.setAttribute('data-unread', numberFormat(feed_unreads + nb));
+		}
+	}
+
 	// Update unread: favourites
 	if (article && article.closest('div').classList.contains('favorite')) {
 		elem = document.querySelector('#aside_feed .favorites .title');

+ 5 - 0
p/themes/base-theme/frss.css

@@ -1978,6 +1978,11 @@ html.slider-active {
 	color: var(--frss-font-color-light);
 }
 
+.feed[data-priority="20"] .item-title,
+.flux[data-priority="20"] .website > a {
+	text-decoration: underline double;
+}
+
 .aside .category .title:not([data-unread="0"])::after,
 .aside .feed .item-title:not([data-unread="0"])::after {
 	margin: calc(0.125rem + var(--frss-padding-top-bottom)) 0 0 0;

+ 5 - 0
p/themes/base-theme/frss.rtl.css

@@ -1978,6 +1978,11 @@ html.slider-active {
 	color: var(--frss-font-color-light);
 }
 
+.feed[data-priority="20"] .item-title,
+.flux[data-priority="20"] .website > a {
+	text-decoration: underline double;
+}
+
 .aside .category .title:not([data-unread="0"])::after,
 .aside .feed .item-title:not([data-unread="0"])::after {
 	margin: calc(0.125rem + var(--frss-padding-top-bottom)) 0 0 0;

+ 16 - 0
p/themes/icons/important.svg

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   width="72mm"
+   height="72mm"
+   viewBox="0 0 71.999999 72"
+   version="1.1"
+   id="svg5"
+   xml:space="preserve"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg"><defs
+     id="defs2" /><g
+     id="layer1"
+     transform="translate(-122.44279,-77.410739)"><path
+       style="fill:#666666;fill-opacity:1;stroke-width:0.264583"
+       d="m 155.36278,125.51274 -23.40677,-0.267 c 0.37363,-6.79753 6.08526,-15.40892 10.29516,-18.966 l 0.18842,-14.416001 c -2.08469,-2.992382 -3.17159,-9.454502 -2.90518,-13.134 h 37.73107 c 0.55646,4.844593 -2.38864,11.922429 -3.21412,13.134 l 0.66741,14.416001 c 6.09605,4.12103 10.68435,11.5874 10.1717,18.966 l -23.13629,0.267 c 0,0 0.53578,23.15291 -2.689,23.21131 -3.22478,0.0584 -3.7024,-23.21131 -3.7024,-23.21131 z m 20.94348,-7.48921 c -0.87839,-5.10027 -7.7188,-8.00726 -9.06022,-9.36379 l -0.46497,-18.060001 c 0.93662,-1.542882 2.08799,-2.833625 2.83719,-5.066 H 147.4665 c 0.2891,2.515209 2.13895,3.39548 2.77999,5.066 l -0.11232,18.060001 c -1.28385,1.35457 -8.57876,5.82732 -9.32679,9.83151 10.08085,0.18667 26.33338,-0.71732 35.49866,-0.46768 z"
+       id="path248" /></g></svg>