aboutsummaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2025-11-04 12:49:21 +0100
committerGravatar GitHub <noreply@github.com> 2025-11-04 12:49:21 +0100
commitb6c63d223931382aae84dc6d394cdd1bb58121bc (patch)
treef512ea0f11873f89740cb7692442d11b26d59ee3 /app
parent7d4854a0a4f5665db599f18c34035786465639f3 (diff)
Better transitions between groups of articles (#8174)
fix https://github.com/FreshRSS/FreshRSS/issues/7520 fix https://github.com/FreshRSS/FreshRSS/issues/8168 fix https://github.com/FreshRSS/FreshRSS/discussions/8172
Diffstat (limited to 'app')
-rw-r--r--app/Controllers/indexController.php45
-rw-r--r--app/Models/CategoryDAO.php3
-rw-r--r--app/Models/Context.php12
-rw-r--r--app/Models/Days.php8
-rw-r--r--app/Models/Entry.php17
-rw-r--r--app/i18n/cs/index.php13
-rw-r--r--app/i18n/de/index.php13
-rw-r--r--app/i18n/el/index.php13
-rw-r--r--app/i18n/en-US/index.php13
-rw-r--r--app/i18n/en/index.php13
-rw-r--r--app/i18n/es/index.php13
-rw-r--r--app/i18n/fa/index.php13
-rw-r--r--app/i18n/fi/index.php13
-rw-r--r--app/i18n/fr/index.php13
-rw-r--r--app/i18n/he/index.php13
-rw-r--r--app/i18n/hu/index.php13
-rw-r--r--app/i18n/id/index.php13
-rw-r--r--app/i18n/it/index.php13
-rw-r--r--app/i18n/ja/index.php13
-rw-r--r--app/i18n/ko/index.php13
-rw-r--r--app/i18n/lv/index.php13
-rw-r--r--app/i18n/nl/index.php13
-rw-r--r--app/i18n/oc/index.php13
-rw-r--r--app/i18n/pl/index.php13
-rw-r--r--app/i18n/pt-BR/index.php13
-rw-r--r--app/i18n/pt-PT/index.php13
-rw-r--r--app/i18n/ru/index.php13
-rw-r--r--app/i18n/sk/index.php13
-rw-r--r--app/i18n/tr/index.php13
-rw-r--r--app/i18n/uk/index.php13
-rw-r--r--app/i18n/zh-CN/index.php13
-rw-r--r--app/i18n/zh-TW/index.php13
-rw-r--r--app/views/index/normal.phtml31
-rw-r--r--app/views/index/reader.phtml1
-rw-r--r--app/views/stats/idle.phtml2
35 files changed, 387 insertions, 83 deletions
diff --git a/app/Controllers/indexController.php b/app/Controllers/indexController.php
index 8043e8f79..9005dff93 100644
--- a/app/Controllers/indexController.php
+++ b/app/Controllers/indexController.php
@@ -31,6 +31,44 @@ class FreshRSS_index_Controller extends FreshRSS_ActionController {
}
/**
+ * @return '.future'|'.today'|'.yesterday'|''
+ */
+ private static function dayRelative(int $timestamp, bool $mayBeFuture): string {
+ static $today = null;
+ if (!is_int($today)) {
+ $today = strtotime('today') ?: 0;
+ }
+ if ($today <= 0) {
+ return '';
+ } elseif ($mayBeFuture && ($timestamp >= $today + 86400)) {
+ return '.future';
+ } elseif ($timestamp >= $today) {
+ return '.today';
+ } elseif ($timestamp >= $today - 86400) {
+ return '.yesterday';
+ }
+ return '';
+ }
+
+ /**
+ * Content for displaying a transition between entries when sorting by specific criteria.
+ * @param 'id'|'c.name'|'date'|'f.name'|'link'|'title'|'rand'|'lastUserModified'|'length' $sort
+ */
+ public static function transition(FreshRSS_Entry $entry, string $sort): string {
+ return match ($sort) {
+ 'id' => _t('index.feed.received' . self::dayRelative($entry->dateAdded(raw: true), mayBeFuture: false)) .
+ ' — ' . timestamptodate($entry->dateAdded(raw: true), hour: false),
+ 'date' => _t('index.feed.published' . self::dayRelative($entry->date(raw: true), mayBeFuture: true)) .
+ ' — ' . timestamptodate($entry->date(raw: true), hour: false),
+ 'lastUserModified' => _t('index.feed.userModified' . self::dayRelative($entry->lastUserModified(), mayBeFuture: false)) .
+ ' — ' . timestamptodate($entry->lastUserModified(), hour: false),
+ 'c.name' => $entry->feed()?->category()?->name() ?? '',
+ 'f.name' => $entry->feed()?->name() ?? '',
+ default => '',
+ };
+ }
+
+ /**
* This action displays the normal view of FreshRSS.
*/
public function normalAction(): void {
@@ -297,10 +335,11 @@ class FreshRSS_index_Controller extends FreshRSS_ActionController {
}
$continuation_values[] = $pagingEntry === null ? 0 : match (FreshRSS_Context::$sort) {
- 'c.name' => $pagingEntry->feed()?->category()?->name() ?? '',
- 'date' => $pagingEntry->date(true),
+ 'c.name' => $pagingEntry->feed()?->categoryId() === FreshRSS_CategoryDAO::DEFAULTCATEGORYID ?
+ FreshRSS_CategoryDAO::DEFAULT_CATEGORY_NAME : $pagingEntry->feed()?->category()?->name() ?? '',
+ 'date' => $pagingEntry->date(raw: true),
'f.name' => $pagingEntry->feed()?->name() ?? '',
- 'link' => $pagingEntry->link(true),
+ 'link' => $pagingEntry->link(raw: true),
'title' => $pagingEntry->title(),
'lastUserModified' => $pagingEntry->lastUserModified(),
'length' => $pagingEntry->sqlContentLength() ?? 0,
diff --git a/app/Models/CategoryDAO.php b/app/Models/CategoryDAO.php
index e2fc825ac..e03f69016 100644
--- a/app/Models/CategoryDAO.php
+++ b/app/Models/CategoryDAO.php
@@ -4,6 +4,7 @@ declare(strict_types=1);
class FreshRSS_CategoryDAO extends Minz_ModelPdo {
public const DEFAULTCATEGORYID = 1;
+ public const DEFAULT_CATEGORY_NAME = 'Uncategorized';
public function sqlResetSequence(): bool {
return true; // Nothing to do for MySQL
@@ -14,7 +15,7 @@ class FreshRSS_CategoryDAO extends Minz_ModelPdo {
$stm = $this->pdo->prepare('UPDATE `_category` SET name = :name WHERE id = :id');
if ($stm !== false) {
$stm->bindValue(':id', self::DEFAULTCATEGORYID, PDO::PARAM_INT);
- $stm->bindValue(':name', 'Uncategorized');
+ $stm->bindValue(':name', self::DEFAULT_CATEGORY_NAME);
}
return $stm !== false && $stm->execute();
}
diff --git a/app/Models/Context.php b/app/Models/Context.php
index 8cd78c779..be4a06cc8 100644
--- a/app/Models/Context.php
+++ b/app/Models/Context.php
@@ -232,10 +232,10 @@ final class FreshRSS_Context {
self::$total_important_unread = FreshRSS_Category::countUnread(self::categories(), FreshRSS_Feed::PRIORITY_IMPORTANT);
}
- self::_get(Minz_Request::paramString('get') ?: 'a');
+ self::_get(Minz_Request::paramString('get', plaintext: true) ?: 'a');
self::$state = Minz_Request::paramInt('state') ?: FreshRSS_Context::userConf()->default_state;
- $state_forced_by_user = Minz_Request::paramString('state', true) !== '';
+ $state_forced_by_user = Minz_Request::paramString('state', plaintext: true) !== '';
if (!$state_forced_by_user) {
if (FreshRSS_Context::userConf()->show_fav_unread && (self::isCurrentGet('s') || self::isCurrentGet('T') || self::isTag())) {
self::$state = FreshRSS_Entry::STATE_NOT_READ | FreshRSS_Entry::STATE_READ;
@@ -249,9 +249,9 @@ final class FreshRSS_Context {
}
self::$search = new FreshRSS_BooleanSearch(Minz_Request::paramString('search'));
- $order = Minz_Request::paramString('order', true) ?: FreshRSS_Context::userConf()->sort_order;
+ $order = Minz_Request::paramString('order', plaintext: true) ?: FreshRSS_Context::userConf()->sort_order;
self::$order = in_array($order, ['ASC', 'DESC'], true) ? $order : 'DESC';
- $sort = Minz_Request::paramString('sort', true) ?: FreshRSS_Context::userConf()->sort;
+ $sort = Minz_Request::paramString('sort', plaintext: true) ?: FreshRSS_Context::userConf()->sort;
self::$sort = in_array($sort, ['id', 'c.name', 'date', 'f.name', 'link', 'title', 'rand', 'lastUserModified', 'length'], true) ? $sort : 'id';
self::$number = Minz_Request::paramInt('nb') ?: FreshRSS_Context::userConf()->posts_per_page;
if (self::$number > FreshRSS_Context::userConf()->max_posts_per_rss) {
@@ -260,9 +260,9 @@ final class FreshRSS_Context {
FreshRSS_Context::userConf()->posts_per_page);
}
self::$offset = Minz_Request::paramInt('offset');
- $id_max = Minz_Request::paramString('idMax', true);
+ $id_max = Minz_Request::paramString('idMax', plaintext: true);
self::$id_max = ctype_digit($id_max) ? $id_max : '0';
- $continuation_id = Minz_Request::paramString('cid', true);
+ $continuation_id = Minz_Request::paramString('cid', plaintext: true);
self::$continuation_id = ctype_digit($continuation_id) ? $continuation_id : '0';
self::$sinceHours = Minz_Request::paramInt('hours');
}
diff --git a/app/Models/Days.php b/app/Models/Days.php
deleted file mode 100644
index c445c6355..000000000
--- a/app/Models/Days.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-declare(strict_types=1);
-
-class FreshRSS_Days {
- public const TODAY = 0;
- public const YESTERDAY = 1;
- public const BEFORE_YESTERDAY = 2;
-}
diff --git a/app/Models/Entry.php b/app/Models/Entry.php
index 62d4019d8..3cf6382dd 100644
--- a/app/Models/Entry.php
+++ b/app/Models/Entry.php
@@ -873,23 +873,6 @@ HTML;
$feed->applyFilterActions($this);
}
- public function isDay(int $day, int $today): bool {
- $date = $this->dateAdded(true);
- switch ($day) {
- case FreshRSS_Days::TODAY:
- $tomorrow = $today + 86400;
- return $date >= $today && $date < $tomorrow;
- case FreshRSS_Days::YESTERDAY:
- $yesterday = $today - 86400;
- return $date >= $yesterday && $date < $today;
- case FreshRSS_Days::BEFORE_YESTERDAY:
- $yesterday = $today - 86400;
- return $date < $yesterday;
- default:
- return false;
- }
- }
-
/**
* @param string $url Overridden URL. Will default to the entry URL.
* @throws Minz_Exception
diff --git a/app/i18n/cs/index.php b/app/i18n/cs/index.php
index 18b7fd655..0a5689157 100644
--- a/app/i18n/cs/index.php
+++ b/app/i18n/cs/index.php
@@ -36,8 +36,14 @@ return array(
),
'feed' => array(
'empty' => 'Nejsou žádné články k zobrazení.',
+ 'published' => array(
+ '_' => 'Published', // TODO
+ 'future' => 'Published in the future', // TODO
+ 'today' => 'Published today', // TODO
+ 'yesterday' => 'Published yesterday', // TODO
+ ),
'received' => array(
- 'before_yesterday' => 'Received before yesterday', // TODO
+ '_' => 'Received', // TODO
'today' => 'Received today', // TODO
'yesterday' => 'Received yesterday', // TODO
),
@@ -45,6 +51,11 @@ return array(
'title' => 'Hlavní kanál',
'title_fav' => 'Oblíbené',
'title_global' => 'Zobrazení přehledu',
+ 'userModified' => array(
+ '_' => 'Modified by user', // TODO
+ 'today' => 'Modified by user today', // TODO
+ 'yesterday' => 'Modified by user yesterday', // TODO
+ ),
),
'log' => array(
'_' => 'Protokoly',
diff --git a/app/i18n/de/index.php b/app/i18n/de/index.php
index 41c192f71..4ce5f864e 100644
--- a/app/i18n/de/index.php
+++ b/app/i18n/de/index.php
@@ -36,8 +36,14 @@ return array(
),
'feed' => array(
'empty' => 'Es gibt keinen Artikel zum Anzeigen.',
+ 'published' => array(
+ '_' => 'Published', // TODO
+ 'future' => 'Published in the future', // TODO
+ 'today' => 'Published today', // TODO
+ 'yesterday' => 'Published yesterday', // TODO
+ ),
'received' => array(
- 'before_yesterday' => 'Vor gestern empfangen',
+ '_' => 'Received', // TODO
'today' => 'Heute empfangen',
'yesterday' => 'Gestern empfangen',
),
@@ -45,6 +51,11 @@ return array(
'title' => 'Haupt-Feeds',
'title_fav' => 'Favoriten',
'title_global' => 'Globale Ansicht',
+ 'userModified' => array(
+ '_' => 'Modified by user', // TODO
+ 'today' => 'Modified by user today', // TODO
+ 'yesterday' => 'Modified by user yesterday', // TODO
+ ),
),
'log' => array(
'_' => 'Protokolle',
diff --git a/app/i18n/el/index.php b/app/i18n/el/index.php
index 251eb9353..0134d40ea 100644
--- a/app/i18n/el/index.php
+++ b/app/i18n/el/index.php
@@ -36,8 +36,14 @@ return array(
),
'feed' => array(
'empty' => 'There are no articles to show.', // TODO
+ 'published' => array(
+ '_' => 'Published', // TODO
+ 'future' => 'Published in the future', // TODO
+ 'today' => 'Published today', // TODO
+ 'yesterday' => 'Published yesterday', // TODO
+ ),
'received' => array(
- 'before_yesterday' => 'Received before yesterday', // TODO
+ '_' => 'Received', // TODO
'today' => 'Received today', // TODO
'yesterday' => 'Received yesterday', // TODO
),
@@ -45,6 +51,11 @@ return array(
'title' => 'Main stream', // TODO
'title_fav' => 'Favourites', // TODO
'title_global' => 'Global view', // TODO
+ 'userModified' => array(
+ '_' => 'Modified by user', // TODO
+ 'today' => 'Modified by user today', // TODO
+ 'yesterday' => 'Modified by user yesterday', // TODO
+ ),
),
'log' => array(
'_' => 'Logs', // TODO
diff --git a/app/i18n/en-US/index.php b/app/i18n/en-US/index.php
index d112d143e..7d05d4f21 100644
--- a/app/i18n/en-US/index.php
+++ b/app/i18n/en-US/index.php
@@ -36,8 +36,14 @@ return array(
),
'feed' => array(
'empty' => 'There are no articles to show.', // IGNORE
+ 'published' => array(
+ '_' => 'Published', // IGNORE
+ 'future' => 'Published in the future', // IGNORE
+ 'today' => 'Published today', // IGNORE
+ 'yesterday' => 'Published yesterday', // IGNORE
+ ),
'received' => array(
- 'before_yesterday' => 'Received before yesterday', // IGNORE
+ '_' => 'Received', // IGNORE
'today' => 'Received today', // IGNORE
'yesterday' => 'Received yesterday', // IGNORE
),
@@ -45,6 +51,11 @@ return array(
'title' => 'Main stream', // IGNORE
'title_fav' => 'Favorites',
'title_global' => 'Global view', // IGNORE
+ 'userModified' => array(
+ '_' => 'Modified by user', // IGNORE
+ 'today' => 'Modified by user today', // IGNORE
+ 'yesterday' => 'Modified by user yesterday', // IGNORE
+ ),
),
'log' => array(
'_' => 'Logs', // IGNORE
diff --git a/app/i18n/en/index.php b/app/i18n/en/index.php
index d0a39a7a5..fed6491f7 100644
--- a/app/i18n/en/index.php
+++ b/app/i18n/en/index.php
@@ -36,8 +36,14 @@ return array(
),
'feed' => array(
'empty' => 'There are no articles to show.',
+ 'published' => array(
+ '_' => 'Published',
+ 'future' => 'Published in the future',
+ 'today' => 'Published today',
+ 'yesterday' => 'Published yesterday',
+ ),
'received' => array(
- 'before_yesterday' => 'Received before yesterday',
+ '_' => 'Received',
'today' => 'Received today',
'yesterday' => 'Received yesterday',
),
@@ -45,6 +51,11 @@ return array(
'title' => 'Main stream',
'title_fav' => 'Favourites',
'title_global' => 'Global view',
+ 'userModified' => array(
+ '_' => 'Modified by user',
+ 'today' => 'Modified by user today',
+ 'yesterday' => 'Modified by user yesterday',
+ ),
),
'log' => array(
'_' => 'Logs',
diff --git a/app/i18n/es/index.php b/app/i18n/es/index.php
index 73a5e3e39..1a0c04cd1 100644
--- a/app/i18n/es/index.php
+++ b/app/i18n/es/index.php
@@ -36,8 +36,14 @@ return array(
),
'feed' => array(
'empty' => 'No hay artículos a mostrar.',
+ 'published' => array(
+ '_' => 'Published', // TODO
+ 'future' => 'Published in the future', // TODO
+ 'today' => 'Published today', // TODO
+ 'yesterday' => 'Published yesterday', // TODO
+ ),
'received' => array(
- 'before_yesterday' => 'Received before yesterday', // TODO
+ '_' => 'Received', // TODO
'today' => 'Received today', // TODO
'yesterday' => 'Received yesterday', // TODO
),
@@ -45,6 +51,11 @@ return array(
'title' => 'Salida Principal',
'title_fav' => 'Favoritos',
'title_global' => 'Vista global',
+ 'userModified' => array(
+ '_' => 'Modified by user', // TODO
+ 'today' => 'Modified by user today', // TODO
+ 'yesterday' => 'Modified by user yesterday', // TODO
+ ),
),
'log' => array(
'_' => 'Registros',
diff --git a/app/i18n/fa/index.php b/app/i18n/fa/index.php
index 65f331a5f..1ad29523b 100644
--- a/app/i18n/fa/index.php
+++ b/app/i18n/fa/index.php
@@ -36,8 +36,14 @@ return array(
),
'feed' => array(
'empty' => ' هیچ مقاله ای برای نمایش وجود ندارد.',
+ 'published' => array(
+ '_' => 'Published', // TODO
+ 'future' => 'Published in the future', // TODO
+ 'today' => 'Published today', // TODO
+ 'yesterday' => 'Published yesterday', // TODO
+ ),
'received' => array(
- 'before_yesterday' => 'پیش از دیروز دریافت شد',
+ '_' => 'Received', // TODO
'today' => 'امروز دریافت شد',
'yesterday' => 'دیروز دریافت شد',
),
@@ -45,6 +51,11 @@ return array(
'title' => ' جریان اصلی',
'title_fav' => ' موارد دلخواه',
'title_global' => ' نمای جهانی',
+ 'userModified' => array(
+ '_' => 'Modified by user', // TODO
+ 'today' => 'Modified by user today', // TODO
+ 'yesterday' => 'Modified by user yesterday', // TODO
+ ),
),
'log' => array(
'_' => ' سیاهههای مربوط',
diff --git a/app/i18n/fi/index.php b/app/i18n/fi/index.php
index 311d13077..f09b5ffc5 100644
--- a/app/i18n/fi/index.php
+++ b/app/i18n/fi/index.php
@@ -36,8 +36,14 @@ return array(
),
'feed' => array(
'empty' => 'Näytettäviä artikkeleita ei ole.',
+ 'published' => array(
+ '_' => 'Published', // TODO
+ 'future' => 'Published in the future', // TODO
+ 'today' => 'Published today', // TODO
+ 'yesterday' => 'Published yesterday', // TODO
+ ),
'received' => array(
- 'before_yesterday' => 'Saapuneet aikaisemmin kuin eilen',
+ '_' => 'Received', // TODO
'today' => 'Saapuneet tänään',
'yesterday' => 'Saapuneet eilen',
),
@@ -45,6 +51,11 @@ return array(
'title' => 'Pääsyötevirta',
'title_fav' => 'Suosikit',
'title_global' => 'Yleisnäkymä',
+ 'userModified' => array(
+ '_' => 'Modified by user', // TODO
+ 'today' => 'Modified by user today', // TODO
+ 'yesterday' => 'Modified by user yesterday', // TODO
+ ),
),
'log' => array(
'_' => 'Lokit',
diff --git a/app/i18n/fr/index.php b/app/i18n/fr/index.php
index f51a09ba6..83faedddb 100644
--- a/app/i18n/fr/index.php
+++ b/app/i18n/fr/index.php
@@ -36,8 +36,14 @@ return array(
),
'feed' => array(
'empty' => 'Il n’y a aucun article à afficher.',
+ 'published' => array(
+ '_' => 'Publié',
+ 'future' => 'Publié dans le futur',
+ 'today' => 'Publié aujourd’hui',
+ 'yesterday' => 'Publié hier',
+ ),
'received' => array(
- 'before_yesterday' => 'Reçu avant avant-hier',
+ '_' => 'Reçu',
'today' => 'Reçu aujourd’hui',
'yesterday' => 'Reçu hier',
),
@@ -45,6 +51,11 @@ return array(
'title' => 'Flux principal',
'title_fav' => 'Favoris',
'title_global' => 'Vue globale',
+ 'userModified' => array(
+ '_' => 'Modifié par l’utilisateur',
+ 'today' => 'Modifié par l’utilisateur aujourd’hui',
+ 'yesterday' => 'Modifié par l’utilisateur hier',
+ ),
),
'log' => array(
'_' => 'Logs', // IGNORE
diff --git a/app/i18n/he/index.php b/app/i18n/he/index.php
index d52319cba..ed7aa038d 100644
--- a/app/i18n/he/index.php
+++ b/app/i18n/he/index.php
@@ -36,8 +36,14 @@ return array(
),
'feed' => array(
'empty' => 'אין מאמר להצגה.',
+ 'published' => array(
+ '_' => 'Published', // TODO
+ 'future' => 'Published in the future', // TODO
+ 'today' => 'Published today', // TODO
+ 'yesterday' => 'Published yesterday', // TODO
+ ),
'received' => array(
- 'before_yesterday' => 'Received before yesterday', // TODO
+ '_' => 'Received', // TODO
'today' => 'Received today', // TODO
'yesterday' => 'Received yesterday', // TODO
),
@@ -45,6 +51,11 @@ return array(
'title' => 'הזנה ראשית',
'title_fav' => 'מועדפים',
'title_global' => 'תצוגה גלובלית',
+ 'userModified' => array(
+ '_' => 'Modified by user', // TODO
+ 'today' => 'Modified by user today', // TODO
+ 'yesterday' => 'Modified by user yesterday', // TODO
+ ),
),
'log' => array(
'_' => 'לוגים',
diff --git a/app/i18n/hu/index.php b/app/i18n/hu/index.php
index 2345f1249..3e4e1c71f 100644
--- a/app/i18n/hu/index.php
+++ b/app/i18n/hu/index.php
@@ -36,8 +36,14 @@ return array(
),
'feed' => array(
'empty' => 'Nincs megjeleníthető cikk.',
+ 'published' => array(
+ '_' => 'Published', // TODO
+ 'future' => 'Published in the future', // TODO
+ 'today' => 'Published today', // TODO
+ 'yesterday' => 'Published yesterday', // TODO
+ ),
'received' => array(
- 'before_yesterday' => 'Tegnapelőtt fogadva',
+ '_' => 'Received', // TODO
'today' => 'Ma fogadva',
'yesterday' => 'Tegnap fogadva',
),
@@ -45,6 +51,11 @@ return array(
'title' => 'Minden cikk',
'title_fav' => 'Kedvencek',
'title_global' => 'Globális nézet',
+ 'userModified' => array(
+ '_' => 'Modified by user', // TODO
+ 'today' => 'Modified by user today', // TODO
+ 'yesterday' => 'Modified by user yesterday', // TODO
+ ),
),
'log' => array(
'_' => 'Log-ok',
diff --git a/app/i18n/id/index.php b/app/i18n/id/index.php
index c06292759..bcca45c0c 100644
--- a/app/i18n/id/index.php
+++ b/app/i18n/id/index.php
@@ -36,8 +36,14 @@ return array(
),
'feed' => array(
'empty' => 'Tidak ada artikel untuk diperlihatkan.',
+ 'published' => array(
+ '_' => 'Published', // TODO
+ 'future' => 'Published in the future', // TODO
+ 'today' => 'Published today', // TODO
+ 'yesterday' => 'Published yesterday', // TODO
+ ),
'received' => array(
- 'before_yesterday' => 'Diterima sebelum kemarin',
+ '_' => 'Received', // TODO
'today' => 'Diterima hari ini',
'yesterday' => 'Diterima kemarin',
),
@@ -45,6 +51,11 @@ return array(
'title' => 'Bagian Utama',
'title_fav' => 'Favorit',
'title_global' => 'Tampilan Global',
+ 'userModified' => array(
+ '_' => 'Modified by user', // TODO
+ 'today' => 'Modified by user today', // TODO
+ 'yesterday' => 'Modified by user yesterday', // TODO
+ ),
),
'log' => array(
'_' => 'Log',
diff --git a/app/i18n/it/index.php b/app/i18n/it/index.php
index 1c9a3b2f1..e12baec60 100644
--- a/app/i18n/it/index.php
+++ b/app/i18n/it/index.php
@@ -36,8 +36,14 @@ return array(
),
'feed' => array(
'empty' => 'Non ci sono articoli da mostrare.',
+ 'published' => array(
+ '_' => 'Published', // TODO
+ 'future' => 'Published in the future', // TODO
+ 'today' => 'Published today', // TODO
+ 'yesterday' => 'Published yesterday', // TODO
+ ),
'received' => array(
- 'before_yesterday' => 'Ricevuto prima di ieri',
+ '_' => 'Received', // TODO
'today' => 'Ricevuto oggi',
'yesterday' => 'Ricevuto ieri',
),
@@ -45,6 +51,11 @@ return array(
'title' => 'Flusso principale',
'title_fav' => 'Preferiti',
'title_global' => 'Vista globale per categorie',
+ 'userModified' => array(
+ '_' => 'Modified by user', // TODO
+ 'today' => 'Modified by user today', // TODO
+ 'yesterday' => 'Modified by user yesterday', // TODO
+ ),
),
'log' => array(
'_' => 'Log',
diff --git a/app/i18n/ja/index.php b/app/i18n/ja/index.php
index a0879d7b8..a44283c72 100644
--- a/app/i18n/ja/index.php
+++ b/app/i18n/ja/index.php
@@ -36,8 +36,14 @@ return array(
),
'feed' => array(
'empty' => '表示できる記事がありません',
+ 'published' => array(
+ '_' => 'Published', // TODO
+ 'future' => 'Published in the future', // TODO
+ 'today' => 'Published today', // TODO
+ 'yesterday' => 'Published yesterday', // TODO
+ ),
'received' => array(
- 'before_yesterday' => '一昨日以前',
+ '_' => 'Received', // TODO
'today' => '今日',
'yesterday' => '昨日',
),
@@ -45,6 +51,11 @@ return array(
'title' => 'メイン',
'title_fav' => 'お気に入り',
'title_global' => 'グローバルビュー',
+ 'userModified' => array(
+ '_' => 'Modified by user', // TODO
+ 'today' => 'Modified by user today', // TODO
+ 'yesterday' => 'Modified by user yesterday', // TODO
+ ),
),
'log' => array(
'_' => 'ログ',
diff --git a/app/i18n/ko/index.php b/app/i18n/ko/index.php
index bce49f545..f9b272b58 100644
--- a/app/i18n/ko/index.php
+++ b/app/i18n/ko/index.php
@@ -36,8 +36,14 @@ return array(
),
'feed' => array(
'empty' => '글이 없습니다.',
+ 'published' => array(
+ '_' => 'Published', // TODO
+ 'future' => 'Published in the future', // TODO
+ 'today' => 'Published today', // TODO
+ 'yesterday' => 'Published yesterday', // TODO
+ ),
'received' => array(
- 'before_yesterday' => 'Received before yesterday', // TODO
+ '_' => 'Received', // TODO
'today' => 'Received today', // TODO
'yesterday' => 'Received yesterday', // TODO
),
@@ -45,6 +51,11 @@ return array(
'title' => '메인 스트림',
'title_fav' => '즐겨찾기',
'title_global' => '전체 모드',
+ 'userModified' => array(
+ '_' => 'Modified by user', // TODO
+ 'today' => 'Modified by user today', // TODO
+ 'yesterday' => 'Modified by user yesterday', // TODO
+ ),
),
'log' => array(
'_' => '로그',
diff --git a/app/i18n/lv/index.php b/app/i18n/lv/index.php
index db22eda5b..fcc506ecb 100644
--- a/app/i18n/lv/index.php
+++ b/app/i18n/lv/index.php
@@ -36,8 +36,14 @@ return array(
),
'feed' => array(
'empty' => 'Nav neviena raksta, ko parādīt.',
+ 'published' => array(
+ '_' => 'Published', // TODO
+ 'future' => 'Published in the future', // TODO
+ 'today' => 'Published today', // TODO
+ 'yesterday' => 'Published yesterday', // TODO
+ ),
'received' => array(
- 'before_yesterday' => 'Received before yesterday', // TODO
+ '_' => 'Received', // TODO
'today' => 'Received today', // TODO
'yesterday' => 'Received yesterday', // TODO
),
@@ -45,6 +51,11 @@ return array(
'title' => 'Galvenā plūsma',
'title_fav' => 'Mīļākie',
'title_global' => 'Globālais skats',
+ 'userModified' => array(
+ '_' => 'Modified by user', // TODO
+ 'today' => 'Modified by user today', // TODO
+ 'yesterday' => 'Modified by user yesterday', // TODO
+ ),
),
'log' => array(
'_' => 'Žurnāli',
diff --git a/app/i18n/nl/index.php b/app/i18n/nl/index.php
index 2993a43b6..8c6561c7b 100644
--- a/app/i18n/nl/index.php
+++ b/app/i18n/nl/index.php
@@ -36,8 +36,14 @@ return array(
),
'feed' => array(
'empty' => 'Er is geen artikel om te laten zien.',
+ 'published' => array(
+ '_' => 'Published', // TODO
+ 'future' => 'Published in the future', // TODO
+ 'today' => 'Published today', // TODO
+ 'yesterday' => 'Published yesterday', // TODO
+ ),
'received' => array(
- 'before_yesterday' => 'Ontvangen vóór gisteren',
+ '_' => 'Received', // TODO
'today' => 'Vandaag ontvangen',
'yesterday' => 'Gisteren ontvangen',
),
@@ -45,6 +51,11 @@ return array(
'title' => 'Overzicht',
'title_fav' => 'Favorieten',
'title_global' => 'Globale weergave',
+ 'userModified' => array(
+ '_' => 'Modified by user', // TODO
+ 'today' => 'Modified by user today', // TODO
+ 'yesterday' => 'Modified by user yesterday', // TODO
+ ),
),
'log' => array(
'_' => 'Log bestanden',
diff --git a/app/i18n/oc/index.php b/app/i18n/oc/index.php
index 8f28b6ca6..56d71543e 100644
--- a/app/i18n/oc/index.php
+++ b/app/i18n/oc/index.php
@@ -36,8 +36,14 @@ return array(
),
'feed' => array(
'empty' => 'I a pas cap de flux de mostrar.',
+ 'published' => array(
+ '_' => 'Published', // TODO
+ 'future' => 'Published in the future', // TODO
+ 'today' => 'Published today', // TODO
+ 'yesterday' => 'Published yesterday', // TODO
+ ),
'received' => array(
- 'before_yesterday' => 'Received before yesterday', // TODO
+ '_' => 'Received', // TODO
'today' => 'Received today', // TODO
'yesterday' => 'Received yesterday', // TODO
),
@@ -45,6 +51,11 @@ return array(
'title' => 'Flux màger',
'title_fav' => 'Favorits',
'title_global' => 'Vista generala',
+ 'userModified' => array(
+ '_' => 'Modified by user', // TODO
+ 'today' => 'Modified by user today', // TODO
+ 'yesterday' => 'Modified by user yesterday', // TODO
+ ),
),
'log' => array(
'_' => 'Jornals d’audit', // IGNORE
diff --git a/app/i18n/pl/index.php b/app/i18n/pl/index.php
index 869edb00b..ddf9cb3c8 100644
--- a/app/i18n/pl/index.php
+++ b/app/i18n/pl/index.php
@@ -36,8 +36,14 @@ return array(
),
'feed' => array(
'empty' => 'Brak wiadomości do wyświetlenia.',
+ 'published' => array(
+ '_' => 'Published', // TODO
+ 'future' => 'Published in the future', // TODO
+ 'today' => 'Published today', // TODO
+ 'yesterday' => 'Published yesterday', // TODO
+ ),
'received' => array(
- 'before_yesterday' => 'Otrzymane przedwczoraj',
+ '_' => 'Received', // TODO
'today' => 'Otrzymane dzisiaj',
'yesterday' => 'Otrzymane wczoraj',
),
@@ -45,6 +51,11 @@ return array(
'title' => 'Kanał główny',
'title_fav' => 'Ulubione',
'title_global' => 'Widok globalny',
+ 'userModified' => array(
+ '_' => 'Modified by user', // TODO
+ 'today' => 'Modified by user today', // TODO
+ 'yesterday' => 'Modified by user yesterday', // TODO
+ ),
),
'log' => array(
'_' => 'Dziennik',
diff --git a/app/i18n/pt-BR/index.php b/app/i18n/pt-BR/index.php
index 787dea15d..e8d3e6b11 100644
--- a/app/i18n/pt-BR/index.php
+++ b/app/i18n/pt-BR/index.php
@@ -36,8 +36,14 @@ return array(
),
'feed' => array(
'empty' => 'Não há nenhum artigo para mostrar.',
+ 'published' => array(
+ '_' => 'Published', // TODO
+ 'future' => 'Published in the future', // TODO
+ 'today' => 'Published today', // TODO
+ 'yesterday' => 'Published yesterday', // TODO
+ ),
'received' => array(
- 'before_yesterday' => 'Received before yesterday', // TODO
+ '_' => 'Received', // TODO
'today' => 'Received today', // TODO
'yesterday' => 'Received yesterday', // TODO
),
@@ -45,6 +51,11 @@ return array(
'title' => 'Stream principal',
'title_fav' => 'Favoritos',
'title_global' => 'Visualização Global',
+ 'userModified' => array(
+ '_' => 'Modified by user', // TODO
+ 'today' => 'Modified by user today', // TODO
+ 'yesterday' => 'Modified by user yesterday', // TODO
+ ),
),
'log' => array(
'_' => 'Logs', // IGNORE
diff --git a/app/i18n/pt-PT/index.php b/app/i18n/pt-PT/index.php
index 127bef26f..e2746eebe 100644
--- a/app/i18n/pt-PT/index.php
+++ b/app/i18n/pt-PT/index.php
@@ -36,8 +36,14 @@ return array(
),
'feed' => array(
'empty' => 'Não há nenhum artigo para mostrar.',
+ 'published' => array(
+ '_' => 'Published', // TODO
+ 'future' => 'Published in the future', // TODO
+ 'today' => 'Published today', // TODO
+ 'yesterday' => 'Published yesterday', // TODO
+ ),
'received' => array(
- 'before_yesterday' => 'Received before yesterday', // TODO
+ '_' => 'Received', // TODO
'today' => 'Received today', // TODO
'yesterday' => 'Received yesterday', // TODO
),
@@ -45,6 +51,11 @@ return array(
'title' => 'Stream principal',
'title_fav' => 'Favoritos',
'title_global' => 'Visualização Global',
+ 'userModified' => array(
+ '_' => 'Modified by user', // TODO
+ 'today' => 'Modified by user today', // TODO
+ 'yesterday' => 'Modified by user yesterday', // TODO
+ ),
),
'log' => array(
'_' => 'Logs', // IGNORE
diff --git a/app/i18n/ru/index.php b/app/i18n/ru/index.php
index c60c9820a..3da44b000 100644
--- a/app/i18n/ru/index.php
+++ b/app/i18n/ru/index.php
@@ -36,8 +36,14 @@ return array(
),
'feed' => array(
'empty' => 'Нет статей для отображения.',
+ 'published' => array(
+ '_' => 'Published', // TODO
+ 'future' => 'Published in the future', // TODO
+ 'today' => 'Published today', // TODO
+ 'yesterday' => 'Published yesterday', // TODO
+ ),
'received' => array(
- 'before_yesterday' => 'Получено раньше, чем вчера',
+ '_' => 'Received', // TODO
'today' => 'Получено сегодня',
'yesterday' => 'Получено вчера',
),
@@ -45,6 +51,11 @@ return array(
'title' => 'Основной поток',
'title_fav' => 'Избранное',
'title_global' => 'Глобальный вид',
+ 'userModified' => array(
+ '_' => 'Modified by user', // TODO
+ 'today' => 'Modified by user today', // TODO
+ 'yesterday' => 'Modified by user yesterday', // TODO
+ ),
),
'log' => array(
'_' => 'Журнал',
diff --git a/app/i18n/sk/index.php b/app/i18n/sk/index.php
index d4aa174b1..da3236938 100644
--- a/app/i18n/sk/index.php
+++ b/app/i18n/sk/index.php
@@ -36,8 +36,14 @@ return array(
),
'feed' => array(
'empty' => 'Žiadne články.',
+ 'published' => array(
+ '_' => 'Published', // TODO
+ 'future' => 'Published in the future', // TODO
+ 'today' => 'Published today', // TODO
+ 'yesterday' => 'Published yesterday', // TODO
+ ),
'received' => array(
- 'before_yesterday' => 'Received before yesterday', // TODO
+ '_' => 'Received', // TODO
'today' => 'Received today', // TODO
'yesterday' => 'Received yesterday', // TODO
),
@@ -45,6 +51,11 @@ return array(
'title' => 'Všetky kanály',
'title_fav' => 'Obľúbené',
'title_global' => 'Prehľad',
+ 'userModified' => array(
+ '_' => 'Modified by user', // TODO
+ 'today' => 'Modified by user today', // TODO
+ 'yesterday' => 'Modified by user yesterday', // TODO
+ ),
),
'log' => array(
'_' => 'Záznamy',
diff --git a/app/i18n/tr/index.php b/app/i18n/tr/index.php
index 50b81b517..ea1ba9e15 100644
--- a/app/i18n/tr/index.php
+++ b/app/i18n/tr/index.php
@@ -36,8 +36,14 @@ return array(
),
'feed' => array(
'empty' => 'Gösterilecek makale yok.',
+ 'published' => array(
+ '_' => 'Published', // TODO
+ 'future' => 'Published in the future', // TODO
+ 'today' => 'Published today', // TODO
+ 'yesterday' => 'Published yesterday', // TODO
+ ),
'received' => array(
- 'before_yesterday' => 'Dünden önceki gün alınanlar',
+ '_' => 'Received', // TODO
'today' => 'Bugün alınanlar',
'yesterday' => 'Dün alınanlar',
),
@@ -45,6 +51,11 @@ return array(
'title' => 'Ana akış',
'title_fav' => 'Favoriler',
'title_global' => 'Genel görünüm',
+ 'userModified' => array(
+ '_' => 'Modified by user', // TODO
+ 'today' => 'Modified by user today', // TODO
+ 'yesterday' => 'Modified by user yesterday', // TODO
+ ),
),
'log' => array(
'_' => 'Günlükler',
diff --git a/app/i18n/uk/index.php b/app/i18n/uk/index.php
index 0922444a6..03f5fc459 100644
--- a/app/i18n/uk/index.php
+++ b/app/i18n/uk/index.php
@@ -36,8 +36,14 @@ return array(
),
'feed' => array(
'empty' => 'Нема статей для показу.',
+ 'published' => array(
+ '_' => 'Published', // TODO
+ 'future' => 'Published in the future', // TODO
+ 'today' => 'Published today', // TODO
+ 'yesterday' => 'Published yesterday', // TODO
+ ),
'received' => array(
- 'before_yesterday' => 'Отримано раніше за вчора',
+ '_' => 'Received', // TODO
'today' => 'Отримано сьогодні',
'yesterday' => 'Отримано вчора',
),
@@ -45,6 +51,11 @@ return array(
'title' => 'Головний потік',
'title_fav' => 'Вподобані',
'title_global' => 'Глобальний показ',
+ 'userModified' => array(
+ '_' => 'Modified by user', // TODO
+ 'today' => 'Modified by user today', // TODO
+ 'yesterday' => 'Modified by user yesterday', // TODO
+ ),
),
'log' => array(
'_' => 'Журнали',
diff --git a/app/i18n/zh-CN/index.php b/app/i18n/zh-CN/index.php
index ae134e954..ec48038fa 100644
--- a/app/i18n/zh-CN/index.php
+++ b/app/i18n/zh-CN/index.php
@@ -36,8 +36,14 @@ return array(
),
'feed' => array(
'empty' => '没有文章可以显示。',
+ 'published' => array(
+ '_' => 'Published', // TODO
+ 'future' => 'Published in the future', // TODO
+ 'today' => 'Published today', // TODO
+ 'yesterday' => 'Published yesterday', // TODO
+ ),
'received' => array(
- 'before_yesterday' => 'Received before yesterday', // TODO
+ '_' => 'Received', // TODO
'today' => 'Received today', // TODO
'yesterday' => 'Received yesterday', // TODO
),
@@ -45,6 +51,11 @@ return array(
'title' => '首页',
'title_fav' => '收藏',
'title_global' => '全局视图',
+ 'userModified' => array(
+ '_' => 'Modified by user', // TODO
+ 'today' => 'Modified by user today', // TODO
+ 'yesterday' => 'Modified by user yesterday', // TODO
+ ),
),
'log' => array(
'_' => '日志',
diff --git a/app/i18n/zh-TW/index.php b/app/i18n/zh-TW/index.php
index 45bf17c1b..f62519ec3 100644
--- a/app/i18n/zh-TW/index.php
+++ b/app/i18n/zh-TW/index.php
@@ -36,8 +36,14 @@ return array(
),
'feed' => array(
'empty' => '暫時沒有文章可顯示。',
+ 'published' => array(
+ '_' => 'Published', // TODO
+ 'future' => 'Published in the future', // TODO
+ 'today' => 'Published today', // TODO
+ 'yesterday' => 'Published yesterday', // TODO
+ ),
'received' => array(
- 'before_yesterday' => 'Received before yesterday', // TODO
+ '_' => 'Received', // TODO
'today' => 'Received today', // TODO
'yesterday' => 'Received yesterday', // TODO
),
@@ -45,6 +51,11 @@ return array(
'title' => '首頁',
'title_fav' => '收藏',
'title_global' => '全局視圖',
+ 'userModified' => array(
+ '_' => 'Modified by user', // TODO
+ 'today' => 'Modified by user today', // TODO
+ 'yesterday' => 'Modified by user yesterday', // TODO
+ ),
),
'log' => array(
'_' => '日誌',
diff --git a/app/views/index/normal.phtml b/app/views/index/normal.phtml
index cc54d10fd..9f2bbdbcc 100644
--- a/app/views/index/normal.phtml
+++ b/app/views/index/normal.phtml
@@ -8,9 +8,7 @@ if (!Minz_Request::paramBoolean('ajax')) {
call_user_func($this->callbackBeforeEntries, $this);
-$display_today = FreshRSS_Context::$sort === 'id';
-$display_yesterday = $display_today;
-$display_others = $display_today;
+$last_transition = '';
$useKeepUnreadImportant = !FreshRSS_Context::isImportant() && !FreshRSS_Context::isFeed();
$today = @strtotime('today');
@@ -59,26 +57,19 @@ $today = @strtotime('today');
// We most likely already have the feed object in cache, otherwise make a request
$this->feed = FreshRSS_Category::findFeed($this->categories, $this->entry->feedId()) ??
$this->entry->feed() ?? FreshRSS_Feed::default();
+ $this->entry->_feed($this->feed);
- if ($display_today && $this->entry->isDay(FreshRSS_Days::TODAY, $today)) {
- ?><div class="day" id="day_today"><?= _t('index.feed.received.today') ?>
- <span class="date"> — <?= timestamptodate(time(), false) ?></span>
+ if ($last_transition !== ($transition = FreshRSS_index_Controller::transition($this->entry, FreshRSS_Context::$sort))) {
+ $last_transition = $transition;
+ ?><div class="transition">
+ <span class="transition-value">
+ <?php if (FreshRSS_Context::$sort === 'f.name' && FreshRSS_Context::userConf()->show_favicons): ?>
+ <img class="favicon" src="<?= $this->feed->favicon() ?>" alt="✇" loading="lazy" />
+ <?php endif;?>
+ <?= $transition ?>
+ </span>
<span class="name"><?= FreshRSS_Context::$name ?></span>
</div><?php
- $display_today = false;
- }
- if ($display_yesterday && $this->entry->isDay(FreshRSS_Days::YESTERDAY, $today)) {
- ?><div class="day" id="day_yesterday"><?= _t('index.feed.received.yesterday') ?>
- <span class="date"> — <?= timestamptodate(time() - 86400, false) ?></span>
- <span class="name"><?= FreshRSS_Context::$name ?></span>
- </div><?php
- $display_yesterday = false;
- }
- if ($display_others && $this->entry->isDay(FreshRSS_Days::BEFORE_YESTERDAY, $today)) {
- ?><div class="day" id="day_before_yesterday"><?= _t('index.feed.received.before_yesterday') ?>
- <span class="name"><?= FreshRSS_Context::$name ?></span>
- </div><?php
- $display_others = false;
}
?><div class="flux<?= !$this->entry->isRead() ? ' not_read' : ''
?><?= $this->entry->isFavorite() ? ' favorite' : ''
diff --git a/app/views/index/reader.phtml b/app/views/index/reader.phtml
index 49321f9f5..d76af2dc7 100644
--- a/app/views/index/reader.phtml
+++ b/app/views/index/reader.phtml
@@ -31,6 +31,7 @@ $useKeepUnreadImportant = !FreshRSS_Context::isImportant() && !FreshRSS_Context:
//We most likely already have the feed object in cache, otherwise make a request
$this->feed = FreshRSS_Category::findFeed($this->categories, $this->entry->feedId()) ?? $this->entry->feed() ?? FreshRSS_Feed::default();
+ $this->entry->_feed($this->feed);
?><div class="flux<?= !$this->entry->isRead() ? ' not_read' : ''
?><?= $this->entry->isFavorite() ? ' favorite' : ''
?><?= $useKeepUnreadImportant && ($this->feed->priority() >= FreshRSS_Feed::PRIORITY_IMPORTANT) ? ' keep_unread ' : ''
diff --git a/app/views/stats/idle.phtml b/app/views/stats/idle.phtml
index b01e246fd..4e2a4eed7 100644
--- a/app/views/stats/idle.phtml
+++ b/app/views/stats/idle.phtml
@@ -41,7 +41,7 @@
<li class="item feed<?= $error_class, $empty_class, $mute_class ?>" title="<?= $error_title, $empty_title ?>">
<a class="configure open-slider" href="<?= _url('stats', 'feed', 'id', $feedInPeriod['id'], 'sub', 'idle') ?>" title="<?= _t('gen.action.manage') ?>"><?= _i('configure') ?></a><?php
if (FreshRSS_Context::userConf()->show_favicons): ?><img class="favicon" src="<?= $feedInPeriod['favicon'] ?>" alt="✇" loading="lazy" /><?php
- endif; ?><span title="<?= timestamptodate((int)($feedInPeriod['last_date']), false) ?>"><?= $feedInPeriod['name'] ?>
+ endif; ?><span title="<?= timestamptodate((int)($feedInPeriod['last_date']), hour: false) ?>"><?= $feedInPeriod['name'] ?>
(<?= _t('admin.stats.number_entries', $feedInPeriod['nb_articles']) ?>)</span>
</li>
<?php } ?>