Răsfoiți Sursa

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
Alexandre Alapetite 5 luni în urmă
părinte
comite
b6c63d2239
71 a modificat fișierele cu 549 adăugiri și 255 ștergeri
  1. 13 13
      README.fr.md
  2. 13 13
      README.md
  3. 42 3
      app/Controllers/indexController.php
  4. 2 1
      app/Models/CategoryDAO.php
  5. 6 6
      app/Models/Context.php
  6. 0 8
      app/Models/Days.php
  7. 0 17
      app/Models/Entry.php
  8. 12 1
      app/i18n/cs/index.php
  9. 12 1
      app/i18n/de/index.php
  10. 12 1
      app/i18n/el/index.php
  11. 12 1
      app/i18n/en-US/index.php
  12. 12 1
      app/i18n/en/index.php
  13. 12 1
      app/i18n/es/index.php
  14. 12 1
      app/i18n/fa/index.php
  15. 12 1
      app/i18n/fi/index.php
  16. 12 1
      app/i18n/fr/index.php
  17. 12 1
      app/i18n/he/index.php
  18. 12 1
      app/i18n/hu/index.php
  19. 12 1
      app/i18n/id/index.php
  20. 12 1
      app/i18n/it/index.php
  21. 12 1
      app/i18n/ja/index.php
  22. 12 1
      app/i18n/ko/index.php
  23. 12 1
      app/i18n/lv/index.php
  24. 12 1
      app/i18n/nl/index.php
  25. 12 1
      app/i18n/oc/index.php
  26. 12 1
      app/i18n/pl/index.php
  27. 12 1
      app/i18n/pt-BR/index.php
  28. 12 1
      app/i18n/pt-PT/index.php
  29. 12 1
      app/i18n/ru/index.php
  30. 12 1
      app/i18n/sk/index.php
  31. 12 1
      app/i18n/tr/index.php
  32. 12 1
      app/i18n/uk/index.php
  33. 12 1
      app/i18n/zh-CN/index.php
  34. 12 1
      app/i18n/zh-TW/index.php
  35. 11 20
      app/views/index/normal.phtml
  36. 1 0
      app/views/index/reader.phtml
  37. 1 1
      app/views/stats/idle.phtml
  38. 1 0
      config-user.default.php
  39. 1 1
      p/api/greader.php
  40. 8 9
      p/scripts/main.js
  41. 6 6
      p/themes/Alternative-Dark/adark.css
  42. 6 6
      p/themes/Alternative-Dark/adark.rtl.css
  43. 2 2
      p/themes/Ansum/_layout.scss
  44. 1 1
      p/themes/Ansum/_mobile.scss
  45. 5 5
      p/themes/Ansum/ansum.css
  46. 5 5
      p/themes/Ansum/ansum.rtl.css
  47. 2 2
      p/themes/Dark-pink/pinkdark.css
  48. 2 2
      p/themes/Dark-pink/pinkdark.rtl.css
  49. 2 2
      p/themes/Dark/dark.css
  50. 2 2
      p/themes/Dark/dark.rtl.css
  51. 4 4
      p/themes/Flat/flat.css
  52. 4 4
      p/themes/Flat/flat.rtl.css
  53. 2 2
      p/themes/Mapco/_layout.scss
  54. 1 1
      p/themes/Mapco/_mobile.scss
  55. 5 5
      p/themes/Mapco/mapco.css
  56. 5 5
      p/themes/Mapco/mapco.rtl.css
  57. 5 10
      p/themes/Nord/nord.css
  58. 5 10
      p/themes/Nord/nord.rtl.css
  59. 3 3
      p/themes/Origine-compact/origine-compact.css
  60. 3 3
      p/themes/Origine-compact/origine-compact.rtl.css
  61. 6 6
      p/themes/Origine/origine.css
  62. 6 6
      p/themes/Origine/origine.rtl.css
  63. 6 6
      p/themes/Pafat/pafat.css
  64. 6 6
      p/themes/Pafat/pafat.rtl.css
  65. 4 4
      p/themes/Swage/swage.css
  66. 4 4
      p/themes/Swage/swage.rtl.css
  67. 2 2
      p/themes/Swage/swage.scss
  68. 6 6
      p/themes/base-theme/base.css
  69. 6 6
      p/themes/base-theme/base.rtl.css
  70. 5 5
      p/themes/base-theme/frss.css
  71. 5 5
      p/themes/base-theme/frss.rtl.css

+ 13 - 13
README.fr.md

@@ -227,31 +227,31 @@ Voir le [dépôt dédié à ces extensions](https://github.com/FreshRSS/Extensio
 | Langage | Progression | |
 | - | - | - |
 | Čeština (cs) | ■■■■■■■■・・ 85% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fcs+%2F%28TODO%7CDIRTY%29%24%2F) |
-| Deutsch (de) | ■■■■■■■■■・ 96% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fde+%2F%28TODO%7CDIRTY%29%24%2F) |
+| Deutsch (de) | ■■■■■■■■■・ 95% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fde+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Ελληνικά (el) | ■■■■・・・・・・ 40% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fel+%2F%28TODO%7CDIRTY%29%24%2F) |
 | English (en) | ■■■■■■■■■■ 100% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fen+%2F%28TODO%7CDIRTY%29%24%2F) |
 | English (United States) (en-US) | ■■■■■■■■■■ 100% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fen-US+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Español (es) | ■■■■■■■■・・ 88% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fes+%2F%28TODO%7CDIRTY%29%24%2F) |
-| فارسی (fa) | ■■■■■■■■■・ 94% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ffa+%2F%28TODO%7CDIRTY%29%24%2F) |
+| فارسی (fa) | ■■■■■■■■■・ 93% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ffa+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Suomi (fi) | ■■■■■■■■■・ 96% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ffi+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Français (fr) | ■■■■■■■■■■ 100% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ffr+%2F%28TODO%7CDIRTY%29%24%2F) |
-| עברית (he) | ■■■■・・・・・・ 44% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fhe+%2F%28TODO%7CDIRTY%29%24%2F) |
-| Magyar (hu) | ■■■■■■■■■・ 96% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fhu+%2F%28TODO%7CDIRTY%29%24%2F) |
+| עברית (he) | ■■■■・・・・・・ 43% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fhe+%2F%28TODO%7CDIRTY%29%24%2F) |
+| Magyar (hu) | ■■■■■■■■■・ 95% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fhu+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Bahasa Indonesia (id) | ■■■■■■■■■・ 93% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fid+%2F%28TODO%7CDIRTY%29%24%2F) |
-| Italiano (it) | ■■■■■■■■■・ 97% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fit+%2F%28TODO%7CDIRTY%29%24%2F) |
-| 日本語 (ja) | ■■■■■■■■■・ 92% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fja+%2F%28TODO%7CDIRTY%29%24%2F) |
+| Italiano (it) | ■■■■■■■■■・ 96% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fit+%2F%28TODO%7CDIRTY%29%24%2F) |
+| 日本語 (ja) | ■■■■■■■■■・ 91% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fja+%2F%28TODO%7CDIRTY%29%24%2F) |
 | 한국어 (ko) | ■■■■■■■■・・ 85% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fko+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Latviešu (lv) | ■■■■■■■・・・ 79% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Flv+%2F%28TODO%7CDIRTY%29%24%2F) |
-| Nederlands (nl) | ■■■■■■■■■・ 96% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fnl+%2F%28TODO%7CDIRTY%29%24%2F) |
+| Nederlands (nl) | ■■■■■■■■■・ 95% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fnl+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Occitan (oc) | ■■■■■■■・・・ 78% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Foc+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Polski (pl) | ■■■■■■■■■・ 99% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpl+%2F%28TODO%7CDIRTY%29%24%2F) |
-| Português (Brasil) (pt-BR) | ■■■■■■■■・・ 85% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpt-BR+%2F%28TODO%7CDIRTY%29%24%2F) |
-| Português (Portugal) (pt-PT) | ■■■■■■■■・・ 85% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpt-PT+%2F%28TODO%7CDIRTY%29%24%2F) |
-| Русский (ru) | ■■■■■■■■■■ 100% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fru+%2F%28TODO%7CDIRTY%29%24%2F) |
+| Português (Brasil) (pt-BR) | ■■■■■■■■・・ 84% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpt-BR+%2F%28TODO%7CDIRTY%29%24%2F) |
+| Português (Portugal) (pt-PT) | ■■■■■■■■・・ 84% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpt-PT+%2F%28TODO%7CDIRTY%29%24%2F) |
+| Русский (ru) | ■■■■■■■■■・ 99% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fru+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Slovenčina (sk) | ■■■■■■■■・・ 85% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fsk+%2F%28TODO%7CDIRTY%29%24%2F) |
-| Türkçe (tr) | ■■■■■■■■■・ 93% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ftr+%2F%28TODO%7CDIRTY%29%24%2F) |
-| Українська (uk) | ■■■■■■■■■・ 96% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fuk+%2F%28TODO%7CDIRTY%29%24%2F) |
-| 简体中文 (zh-CN) | ■■■■■■■■・・ 87% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fzh-CN+%2F%28TODO%7CDIRTY%29%24%2F) |
+| Türkçe (tr) | ■■■■■■■■■・ 92% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ftr+%2F%28TODO%7CDIRTY%29%24%2F) |
+| Українська (uk) | ■■■■■■■■■・ 95% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fuk+%2F%28TODO%7CDIRTY%29%24%2F) |
+| 简体中文 (zh-CN) | ■■■■■■■■・・ 86% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fzh-CN+%2F%28TODO%7CDIRTY%29%24%2F) |
 | 正體中文 (zh-TW) | ■■■■■■■■・・ 85% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fzh-TW+%2F%28TODO%7CDIRTY%29%24%2F) |
 
 </translations>

+ 13 - 13
README.md

@@ -123,31 +123,31 @@ See the [repository dedicated to those extensions](https://github.com/FreshRSS/E
 | Language | Progress | |
 | - | - | - |
 | Čeština (cs) | ■■■■■■■■・・ 85% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fcs+%2F%28TODO%7CDIRTY%29%24%2F) |
-| Deutsch (de) | ■■■■■■■■■・ 96% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fde+%2F%28TODO%7CDIRTY%29%24%2F) |
+| Deutsch (de) | ■■■■■■■■■・ 95% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fde+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Ελληνικά (el) | ■■■■・・・・・・ 40% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fel+%2F%28TODO%7CDIRTY%29%24%2F) |
 | English (en) | ■■■■■■■■■■ 100% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fen+%2F%28TODO%7CDIRTY%29%24%2F) |
 | English (United States) (en-US) | ■■■■■■■■■■ 100% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fen-US+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Español (es) | ■■■■■■■■・・ 88% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fes+%2F%28TODO%7CDIRTY%29%24%2F) |
-| فارسی (fa) | ■■■■■■■■■・ 94% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ffa+%2F%28TODO%7CDIRTY%29%24%2F) |
+| فارسی (fa) | ■■■■■■■■■・ 93% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ffa+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Suomi (fi) | ■■■■■■■■■・ 96% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ffi+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Français (fr) | ■■■■■■■■■■ 100% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ffr+%2F%28TODO%7CDIRTY%29%24%2F) |
-| עברית (he) | ■■■■・・・・・・ 44% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fhe+%2F%28TODO%7CDIRTY%29%24%2F) |
-| Magyar (hu) | ■■■■■■■■■・ 96% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fhu+%2F%28TODO%7CDIRTY%29%24%2F) |
+| עברית (he) | ■■■■・・・・・・ 43% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fhe+%2F%28TODO%7CDIRTY%29%24%2F) |
+| Magyar (hu) | ■■■■■■■■■・ 95% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fhu+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Bahasa Indonesia (id) | ■■■■■■■■■・ 93% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fid+%2F%28TODO%7CDIRTY%29%24%2F) |
-| Italiano (it) | ■■■■■■■■■・ 97% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fit+%2F%28TODO%7CDIRTY%29%24%2F) |
-| 日本語 (ja) | ■■■■■■■■■・ 92% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fja+%2F%28TODO%7CDIRTY%29%24%2F) |
+| Italiano (it) | ■■■■■■■■■・ 96% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fit+%2F%28TODO%7CDIRTY%29%24%2F) |
+| 日本語 (ja) | ■■■■■■■■■・ 91% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fja+%2F%28TODO%7CDIRTY%29%24%2F) |
 | 한국어 (ko) | ■■■■■■■■・・ 85% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fko+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Latviešu (lv) | ■■■■■■■・・・ 79% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Flv+%2F%28TODO%7CDIRTY%29%24%2F) |
-| Nederlands (nl) | ■■■■■■■■■・ 96% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fnl+%2F%28TODO%7CDIRTY%29%24%2F) |
+| Nederlands (nl) | ■■■■■■■■■・ 95% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fnl+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Occitan (oc) | ■■■■■■■・・・ 78% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Foc+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Polski (pl) | ■■■■■■■■■・ 99% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpl+%2F%28TODO%7CDIRTY%29%24%2F) |
-| Português (Brasil) (pt-BR) | ■■■■■■■■・・ 85% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpt-BR+%2F%28TODO%7CDIRTY%29%24%2F) |
-| Português (Portugal) (pt-PT) | ■■■■■■■■・・ 85% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpt-PT+%2F%28TODO%7CDIRTY%29%24%2F) |
-| Русский (ru) | ■■■■■■■■■■ 100% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fru+%2F%28TODO%7CDIRTY%29%24%2F) |
+| Português (Brasil) (pt-BR) | ■■■■■■■■・・ 84% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpt-BR+%2F%28TODO%7CDIRTY%29%24%2F) |
+| Português (Portugal) (pt-PT) | ■■■■■■■■・・ 84% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpt-PT+%2F%28TODO%7CDIRTY%29%24%2F) |
+| Русский (ru) | ■■■■■■■■■・ 99% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fru+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Slovenčina (sk) | ■■■■■■■■・・ 85% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fsk+%2F%28TODO%7CDIRTY%29%24%2F) |
-| Türkçe (tr) | ■■■■■■■■■・ 93% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ftr+%2F%28TODO%7CDIRTY%29%24%2F) |
-| Українська (uk) | ■■■■■■■■■・ 96% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fuk+%2F%28TODO%7CDIRTY%29%24%2F) |
-| 简体中文 (zh-CN) | ■■■■■■■■・・ 87% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fzh-CN+%2F%28TODO%7CDIRTY%29%24%2F) |
+| Türkçe (tr) | ■■■■■■■■■・ 92% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ftr+%2F%28TODO%7CDIRTY%29%24%2F) |
+| Українська (uk) | ■■■■■■■■■・ 95% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fuk+%2F%28TODO%7CDIRTY%29%24%2F) |
+| 简体中文 (zh-CN) | ■■■■■■■■・・ 86% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fzh-CN+%2F%28TODO%7CDIRTY%29%24%2F) |
 | 正體中文 (zh-TW) | ■■■■■■■■・・ 85% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fzh-TW+%2F%28TODO%7CDIRTY%29%24%2F) |
 
 </translations>

+ 42 - 3
app/Controllers/indexController.php

@@ -30,6 +30,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.
 	 */
@@ -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,

+ 2 - 1
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();
 	}

+ 6 - 6
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');
 	}

+ 0 - 8
app/Models/Days.php

@@ -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;
-}

+ 0 - 17
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

+ 12 - 1
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',

+ 12 - 1
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',

+ 12 - 1
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

+ 12 - 1
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

+ 12 - 1
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',

+ 12 - 1
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',

+ 12 - 1
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(
 		'_' => ' سیاهههای مربوط',

+ 12 - 1
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',

+ 12 - 1
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

+ 12 - 1
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(
 		'_' => 'לוגים',

+ 12 - 1
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',

+ 12 - 1
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',

+ 12 - 1
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',

+ 12 - 1
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(
 		'_' => 'ログ',

+ 12 - 1
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(
 		'_' => '로그',

+ 12 - 1
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',

+ 12 - 1
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',

+ 12 - 1
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

+ 12 - 1
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',

+ 12 - 1
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

+ 12 - 1
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

+ 12 - 1
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(
 		'_' => 'Журнал',

+ 12 - 1
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',

+ 12 - 1
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',

+ 12 - 1
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(
 		'_' => 'Журнали',

+ 12 - 1
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(
 		'_' => '日志',

+ 12 - 1
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(
 		'_' => '日誌',

+ 11 - 20
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' : ''

+ 1 - 0
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 ' : ''

+ 1 - 1
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 } ?>

+ 1 - 0
config-user.default.php

@@ -53,6 +53,7 @@ return array (
 	#	Set to `true` to mark it unread, or `false` to leave it as-is.
 	'mark_updated_article_unread' => false, //TODO: -1 => ignore, 0 => update, 1 => update and mark as unread
 
+	# 'id'|'c.name'|'date'|'f.name'|'link'|'title'|'rand'|'lastUserModified'|'length'
 	'sort' => 'id',
 	'mark_read_button' => 'big',
 	'sort_order' => 'DESC',

+ 1 - 1
p/api/greader.php

@@ -414,7 +414,7 @@ final class GReaderAPI {
 				}
 			}
 			$c_name = htmlspecialchars($c_name, ENT_COMPAT, 'UTF-8');
-			if (in_array($c_name, ['', 'Uncategorized', _t('gen.short.default_category')], true)) {
+			if (in_array($c_name, ['', FreshRSS_CategoryDAO::DEFAULT_CATEGORY_NAME, _t('gen.short.default_category')], true)) {
 				$addCatId = FreshRSS_CategoryDAO::DEFAULTCATEGORYID;
 			} else {
 				$categoryDAO = FreshRSS_Factory::createCategoryDao();

+ 8 - 9
p/scripts/main.js

@@ -2009,7 +2009,7 @@ let load_more = false;
 let box_load_more = null;
 
 function remove_existing_posts() {
-	document.querySelectorAll('.flux, .day').forEach(function (div) {
+	document.querySelectorAll('.flux, .transition').forEach(function (div) {
 		div.remove();
 	});
 }
@@ -2032,9 +2032,15 @@ function load_more_posts() {
 
 		const html = this.response;
 		const streamFooter = document.getElementById('stream-footer');
+		const transitions = document.querySelectorAll('#stream > .transition');
+		let lastTransition = transitions.length > 0 ? transitions[transitions.length - 1] : null;
 
 		const streamAdopted = document.adoptNode(html.getElementById('stream'));
-		streamAdopted.querySelectorAll('.flux, .day').forEach(function (div) {
+		streamAdopted.querySelectorAll('.flux, .transition').forEach(function (div) {
+			if (lastTransition !== null && div.classList.contains('transition') && div.textContent === lastTransition.textContent) {
+				lastTransition = null;
+				return;	// Skip duplicate transition
+			}
 			box_load_more.insertBefore(div, streamFooter);
 		});
 
@@ -2053,13 +2059,6 @@ function load_more_posts() {
 			toggle_bigMarkAsRead_button();
 		}
 
-		document.querySelectorAll('[id^=day_]').forEach(function (div) {
-			const ids = document.querySelectorAll('[id="' + div.id + '"]');
-			for (let i = ids.length - 1; i > 0; i--) {	// Keep only the first
-				ids[i].remove();
-			}
-		});
-
 		init_load_more(box_load_more);
 
 		const div_load_more = document.getElementById('load_more');

+ 6 - 6
p/themes/Alternative-Dark/adark.css

@@ -709,8 +709,8 @@ kbd {
 	background: var(--contrast-background-color-hover);
 }
 
-/*=== Day indication */
-.day {
+/*=== Transition indication, e.g. day */
+.transition {
 	padding: 0 10px;
 	font-weight: bold;
 	line-height: 3;
@@ -719,15 +719,15 @@ kbd {
 	border-top: 1px solid var(--border-color-dark);
 }
 
-.day span {
+.transition span {
 	line-height: 1.5;
 }
 
-#new-article + .day {
+#new-article + .transition {
 	border-top: none;
 }
 
-.day .name {
+.transition .name {
 	padding: 0 10px 0 0;
 	color: var(--font-color-light);
 	font-size: 1.8em;
@@ -1144,7 +1144,7 @@ kbd {
 		border-left: 2px solid var(--background-color-light);
 	}
 
-	.day .name {
+	.transition .name {
 		display: none!important;
 		font-size: 1.1rem;
 		text-shadow: none;

+ 6 - 6
p/themes/Alternative-Dark/adark.rtl.css

@@ -709,8 +709,8 @@ kbd {
 	background: var(--contrast-background-color-hover);
 }
 
-/*=== Day indication */
-.day {
+/*=== Transition indication, e.g. day */
+.transition {
 	padding: 0 10px;
 	font-weight: bold;
 	line-height: 3;
@@ -719,15 +719,15 @@ kbd {
 	border-top: 1px solid var(--border-color-dark);
 }
 
-.day span {
+.transition span {
 	line-height: 1.5;
 }
 
-#new-article + .day {
+#new-article + .transition {
 	border-top: none;
 }
 
-.day .name {
+.transition .name {
 	padding: 0 0 0 10px;
 	color: var(--font-color-light);
 	font-size: 1.8em;
@@ -1144,7 +1144,7 @@ kbd {
 		border-right: 2px solid var(--background-color-light);
 	}
 
-	.day .name {
+	.transition .name {
 		display: none!important;
 		font-size: 1.1rem;
 		text-shadow: none;

+ 2 - 2
p/themes/Ansum/_layout.scss

@@ -117,8 +117,8 @@ main.prompt {
 	background: variables.$main-first-alt;
 }
 
-/*=== Day indication */
-.day {
+/*=== Transition indication, e.g. day */
+.transition {
 	padding: 1rem 0 0 1.25rem;
 	color: variables.$light-font-color;
 	font-size: 0.875rem;

+ 1 - 1
p/themes/Ansum/_mobile.scss

@@ -126,7 +126,7 @@
 		}
 	}
 
-	.day {
+	.transition {
 		text-align: center;
 		padding: 1rem 0;
 

+ 5 - 5
p/themes/Ansum/ansum.css

@@ -778,8 +778,8 @@ main.prompt {
 	background: #b7641d;
 }
 
-/*=== Day indication */
-.day {
+/*=== Transition indication, e.g. day */
+.transition {
 	padding: 1rem 0 0 1.25rem;
 	color: #6d655f;
 	font-size: 0.875rem;
@@ -788,7 +788,7 @@ main.prompt {
 	letter-spacing: 1px;
 	text-transform: uppercase;
 }
-.day .name {
+.transition .name {
 	padding: 0 1rem 0 1rem;
 	color: #363330;
 	font-size: 0.875rem;
@@ -1289,11 +1289,11 @@ main.prompt {
 	.dropdown-target:target ~ a.dropdown-toggle:not(.btn)::after {
 		bottom: -17px;
 	}
-	.day {
+	.transition {
 		text-align: center;
 		padding: 1rem 0;
 	}
-	.day .name {
+	.transition .name {
 		padding: 0;
 		display: block;
 		width: 100%;

+ 5 - 5
p/themes/Ansum/ansum.rtl.css

@@ -778,8 +778,8 @@ main.prompt {
 	background: #b7641d;
 }
 
-/*=== Day indication */
-.day {
+/*=== Transition indication, e.g. day */
+.transition {
 	padding: 1rem 1.25rem 0 0;
 	color: #6d655f;
 	font-size: 0.875rem;
@@ -788,7 +788,7 @@ main.prompt {
 	letter-spacing: 1px;
 	text-transform: uppercase;
 }
-.day .name {
+.transition .name {
 	padding: 0 1rem 0 1rem;
 	color: #363330;
 	font-size: 0.875rem;
@@ -1289,11 +1289,11 @@ main.prompt {
 	.dropdown-target:target ~ a.dropdown-toggle:not(.btn)::after {
 		bottom: -17px;
 	}
-	.day {
+	.transition {
 		text-align: center;
 		padding: 1rem 0;
 	}
-	.day .name {
+	.transition .name {
 		padding: 0;
 		display: block;
 		width: 100%;

+ 2 - 2
p/themes/Dark-pink/pinkdark.css

@@ -52,11 +52,11 @@
 	background: #ff92a2;
 }
 
-.day {
+.transition {
 	color: #ffb6c1;
 }
 
-.day .name {
+.transition .name {
 	color: #ffb6c1;
 }
 

+ 2 - 2
p/themes/Dark-pink/pinkdark.rtl.css

@@ -52,11 +52,11 @@
 	background: #ff92a2;
 }
 
-.day {
+.transition {
 	color: #ffb6c1;
 }
 
-.day .name {
+.transition .name {
 	color: #ffb6c1;
 }
 

+ 2 - 2
p/themes/Dark/dark.css

@@ -443,8 +443,8 @@ button.as-link[disabled] {
 	background-color: var(--dark-background-color3);
 }
 
-/*=== Day indication */
-.day {
+/*=== Transition indication, e.g. day */
+.transition {
 	border-top: 1px solid var(--dark-border-color3);
 	border-bottom: 1px solid var(--dark-border-color3);
 }

+ 2 - 2
p/themes/Dark/dark.rtl.css

@@ -443,8 +443,8 @@ button.as-link[disabled] {
 	background-color: var(--dark-background-color3);
 }
 
-/*=== Day indication */
-.day {
+/*=== Transition indication, e.g. day */
+.transition {
 	border-top: 1px solid var(--dark-border-color3);
 	border-bottom: 1px solid var(--dark-border-color3);
 }

+ 4 - 4
p/themes/Flat/flat.css

@@ -655,15 +655,15 @@ th {
 	background: #2980b9;
 }
 
-/*=== Day indication */
-.day {
+/*=== Transition indication, e.g. day */
+.transition {
 	padding: 0 10px;
 	font-weight: bold;
 	line-height: 3em;
 	border-left: 2px solid #ecf0f1;
 }
 
-.day .name {
+.transition .name {
 	padding: 0 10px 0 0;
 	color: #aab;
 	font-size: 1.8em;
@@ -991,7 +991,7 @@ th {
 		bottom: -19px;
 	}
 
-	.day .name {
+	.transition .name {
 		font-size: 1.1rem;
 	}
 

+ 4 - 4
p/themes/Flat/flat.rtl.css

@@ -655,15 +655,15 @@ th {
 	background: #2980b9;
 }
 
-/*=== Day indication */
-.day {
+/*=== Transition indication, e.g. day */
+.transition {
 	padding: 0 10px;
 	font-weight: bold;
 	line-height: 3em;
 	border-right: 2px solid #ecf0f1;
 }
 
-.day .name {
+.transition .name {
 	padding: 0 0 0 10px;
 	color: #aab;
 	font-size: 1.8em;
@@ -991,7 +991,7 @@ th {
 		bottom: -19px;
 	}
 
-	.day .name {
+	.transition .name {
 		font-size: 1.1rem;
 	}
 

+ 2 - 2
p/themes/Mapco/_layout.scss

@@ -122,8 +122,8 @@ main.prompt {
 	background: variables.$main-first-alt;
 }
 
-/*=== Day indication */
-.day {
+/*=== Transition indication, e.g. day */
+.transition {
 	padding: 1rem 0 0 1.25rem;
 	color: variables.$light-font-color;
 	font-size: 0.875rem;

+ 1 - 1
p/themes/Mapco/_mobile.scss

@@ -133,7 +133,7 @@
 		}
 	}
 
-	.day {
+	.transition {
 		text-align: center;
 		padding: 1rem 0;
 

+ 5 - 5
p/themes/Mapco/mapco.css

@@ -793,8 +793,8 @@ main.prompt {
 	background: #25c;
 }
 
-/*=== Day indication */
-.day {
+/*=== Transition indication, e.g. day */
+.transition {
 	padding: 1rem 0 0 1.25rem;
 	color: #5b6871;
 	font-size: 0.875rem;
@@ -803,7 +803,7 @@ main.prompt {
 	letter-spacing: 1px;
 	text-transform: uppercase;
 }
-.day .name {
+.transition .name {
 	padding: 0 1rem 0 1rem;
 	color: #303136;
 	font-size: 0.875rem;
@@ -1306,11 +1306,11 @@ main.prompt {
 	.dropdown-target:target ~ a.dropdown-toggle:not(.btn)::after {
 		bottom: -17px;
 	}
-	.day {
+	.transition {
 		text-align: center;
 		padding: 1rem 0;
 	}
-	.day .name {
+	.transition .name {
 		padding: 0;
 		display: block;
 		width: 100%;

+ 5 - 5
p/themes/Mapco/mapco.rtl.css

@@ -793,8 +793,8 @@ main.prompt {
 	background: #25c;
 }
 
-/*=== Day indication */
-.day {
+/*=== Transition indication, e.g. day */
+.transition {
 	padding: 1rem 1.25rem 0 0;
 	color: #5b6871;
 	font-size: 0.875rem;
@@ -803,7 +803,7 @@ main.prompt {
 	letter-spacing: 1px;
 	text-transform: uppercase;
 }
-.day .name {
+.transition .name {
 	padding: 0 1rem 0 1rem;
 	color: #303136;
 	font-size: 0.875rem;
@@ -1306,11 +1306,11 @@ main.prompt {
 	.dropdown-target:target ~ a.dropdown-toggle:not(.btn)::after {
 		bottom: -17px;
 	}
-	.day {
+	.transition {
 		text-align: center;
 		padding: 1rem 0;
 	}
-	.day .name {
+	.transition .name {
 		padding: 0;
 		display: block;
 		width: 100%;

+ 5 - 10
p/themes/Nord/nord.css

@@ -763,14 +763,14 @@ li.item.active {
 	text-decoration: none;
 }
 
-/*=== Day indication */
-.day {
+/*=== Transition indication, e.g. day */
+.transition {
 	padding: 0 10px;
 	font-weight: bold;
 	line-height: 3em;
 }
 
-.day .name {
+.transition .name {
 	padding: 0 10px 0 0;
 	font-size: 1.8em;
 	opacity: 0.3;
@@ -778,11 +778,6 @@ li.item.active {
 	text-align: right;
 }
 
-.name {
-	display: none;
-}
-
-
 /*=== Feed article header and footer */
 .flux_header {
 	position: relative;
@@ -1018,7 +1013,7 @@ li.item.active {
 
 @media print {
 	.header, .aside,
-	.nav_menu, .day,
+	.nav_menu, .transition,
 	.flux_header,
 	.flux_content .bottom,
 	.pagination,
@@ -1303,7 +1298,7 @@ optgroup::before {
 		padding: 1rem;
 	}
 
-	.day .name {
+	.transition .name {
 		font-size: 1.1rem;
 	}
 

+ 5 - 10
p/themes/Nord/nord.rtl.css

@@ -763,14 +763,14 @@ li.item.active {
 	text-decoration: none;
 }
 
-/*=== Day indication */
-.day {
+/*=== Transition indication, e.g. day */
+.transition {
 	padding: 0 10px;
 	font-weight: bold;
 	line-height: 3em;
 }
 
-.day .name {
+.transition .name {
 	padding: 0 0 0 10px;
 	font-size: 1.8em;
 	opacity: 0.3;
@@ -778,11 +778,6 @@ li.item.active {
 	text-align: left;
 }
 
-.name {
-	display: none;
-}
-
-
 /*=== Feed article header and footer */
 .flux_header {
 	position: relative;
@@ -1018,7 +1013,7 @@ li.item.active {
 
 @media print {
 	.header, .aside,
-	.nav_menu, .day,
+	.nav_menu, .transition,
 	.flux_header,
 	.flux_content .bottom,
 	.pagination,
@@ -1303,7 +1298,7 @@ optgroup::before {
 		padding: 1rem;
 	}
 
-	.day .name {
+	.transition .name {
 		font-size: 1.1rem;
 	}
 

+ 3 - 3
p/themes/Origine-compact/origine-compact.css

@@ -74,13 +74,13 @@
 	font-size: 0.7rem;
 }
 
-/*=== Day indication */
-.day {
+/*=== Transition indication, e.g. day */
+.transition {
 	font-size: 0.9rem;
 	line-height: 2;
 }
 
-.day .name {
+.transition .name {
 	font-size: 1em;
 	opacity: 0.6;
 }

+ 3 - 3
p/themes/Origine-compact/origine-compact.rtl.css

@@ -74,13 +74,13 @@
 	font-size: 0.7rem;
 }
 
-/*=== Day indication */
-.day {
+/*=== Transition indication, e.g. day */
+.transition {
 	font-size: 0.9rem;
 	line-height: 2;
 }
 
-.day .name {
+.transition .name {
 	font-size: 1em;
 	opacity: 0.6;
 }

+ 6 - 6
p/themes/Origine/origine.css

@@ -804,8 +804,8 @@ button:hover .icon,
 	background-color: var(--contrast-background-color-hover);
 }
 
-/*=== Day indication */
-.day {
+/*=== Transition indication, e.g. day */
+.transition {
 	padding: 0 10px;
 	font-weight: bold;
 	line-height: 3;
@@ -813,15 +813,15 @@ button:hover .icon,
 	border-top: 1px solid var(--border-color);
 }
 
-.day span {
+.transition span {
 	line-height: 1.5;
 }
 
-#new-article + .day {
+#new-article + .transition {
 	border-top: none;
 }
 
-.day .name {
+.transition .name {
 	padding: 0 10px 0 0;
 	color: var(--font-color-light-shadowed);
 	font-size: 1.8em;
@@ -1193,7 +1193,7 @@ button:hover .icon,
 		padding-right: 15px;
 	}
 
-	.day .name {
+	.transition .name {
 		font-size: 1.1rem;
 		text-shadow: none;
 	}

+ 6 - 6
p/themes/Origine/origine.rtl.css

@@ -804,8 +804,8 @@ button:hover .icon,
 	background-color: var(--contrast-background-color-hover);
 }
 
-/*=== Day indication */
-.day {
+/*=== Transition indication, e.g. day */
+.transition {
 	padding: 0 10px;
 	font-weight: bold;
 	line-height: 3;
@@ -813,15 +813,15 @@ button:hover .icon,
 	border-top: 1px solid var(--border-color);
 }
 
-.day span {
+.transition span {
 	line-height: 1.5;
 }
 
-#new-article + .day {
+#new-article + .transition {
 	border-top: none;
 }
 
-.day .name {
+.transition .name {
 	padding: 0 0 0 10px;
 	color: var(--font-color-light-shadowed);
 	font-size: 1.8em;
@@ -1193,7 +1193,7 @@ button:hover .icon,
 		padding-left: 15px;
 	}
 
-	.day .name {
+	.transition .name {
 		font-size: 1.1rem;
 		text-shadow: none;
 	}

+ 6 - 6
p/themes/Pafat/pafat.css

@@ -754,8 +754,8 @@ a.signin {
 	background-color: var(--background-color-new-article-hover);
 }
 
-/*=== Day indication */
-.day {
+/*=== Transition indication, e.g. day */
+.transition {
 	padding: 0 10px;
 	background-color: var(--background-color-white);
 	color: var(--font-color-grey);
@@ -765,15 +765,15 @@ a.signin {
 	line-height: 3;
 }
 
-.day span {
+.transition span {
 	line-height: 1.5;
 }
 
-#new-article + .day {
+#new-article + .transition {
 	border-top: none;
 }
 
-.day .name {
+.transition .name {
 	padding: 0 10px 0 0;
 	color: var(--font-color-grey);
 	font-size: 1.8em;
@@ -1088,7 +1088,7 @@ a.signin {
 		border-left: 1px solid var(--border-color-grey-dark);
 	}
 
-	.day .name {
+	.transition .name {
 		font-size: 1.1rem;
 		text-shadow: none;
 	}

+ 6 - 6
p/themes/Pafat/pafat.rtl.css

@@ -754,8 +754,8 @@ a.signin {
 	background-color: var(--background-color-new-article-hover);
 }
 
-/*=== Day indication */
-.day {
+/*=== Transition indication, e.g. day */
+.transition {
 	padding: 0 10px;
 	background-color: var(--background-color-white);
 	color: var(--font-color-grey);
@@ -765,15 +765,15 @@ a.signin {
 	line-height: 3;
 }
 
-.day span {
+.transition span {
 	line-height: 1.5;
 }
 
-#new-article + .day {
+#new-article + .transition {
 	border-top: none;
 }
 
-.day .name {
+.transition .name {
 	padding: 0 0 0 10px;
 	color: var(--font-color-grey);
 	font-size: 1.8em;
@@ -1088,7 +1088,7 @@ a.signin {
 		border-right: 1px solid var(--border-color-grey-dark);
 	}
 
-	.day .name {
+	.transition .name {
 		font-size: 1.1rem;
 		text-shadow: none;
 	}

+ 4 - 4
p/themes/Swage/swage.css

@@ -745,13 +745,13 @@ main.post .drop-section li.item.feed a:hover .icon {
 	background-color: var(--color-background-nav-darker);
 }
 
-.day {
+.transition {
 	padding: 0 10px;
 	font-weight: bold;
 	line-height: 3;
 	text-align: center;
 }
-.day .name {
+.transition .name {
 	display: none;
 }
 
@@ -1171,7 +1171,7 @@ main.global {
 		right: 3%;
 		left: auto;
 	}
-	.day .name {
+	.transition .name {
 		font-size: 1.1rem;
 	}
 	.notification {
@@ -1305,4 +1305,4 @@ button.as-link {
 
 #slider label {
 	min-height: initial;
-}
+}

+ 4 - 4
p/themes/Swage/swage.rtl.css

@@ -745,13 +745,13 @@ main.post .drop-section li.item.feed a:hover .icon {
 	background-color: var(--color-background-nav-darker);
 }
 
-.day {
+.transition {
 	padding: 0 10px;
 	font-weight: bold;
 	line-height: 3;
 	text-align: center;
 }
-.day .name {
+.transition .name {
 	display: none;
 }
 
@@ -1171,7 +1171,7 @@ main.global {
 		left: 3%;
 		right: auto;
 	}
-	.day .name {
+	.transition .name {
 		font-size: 1.1rem;
 	}
 	.notification {
@@ -1305,4 +1305,4 @@ button.as-link {
 
 #slider label {
 	min-height: initial;
-}
+}

+ 2 - 2
p/themes/Swage/swage.scss

@@ -951,7 +951,7 @@ main.post .drop-section li.item.feed a:hover .icon {
 	}
 }
 
-.day {
+.transition {
 	padding: 0 10px;
 	font-weight: bold;
 	line-height: 3;
@@ -1501,7 +1501,7 @@ main.global {
 		left: auto;
 	}
 
-	.day .name {
+	.transition .name {
 		font-size: 1.1rem;
 	}
 

+ 6 - 6
p/themes/base-theme/base.css

@@ -478,21 +478,21 @@ th {
 	text-decoration: none;
 }
 
-/*=== Day indication */
-.day {
+/*=== Transition indication, e.g. day */
+.transition {
 	padding: 0 10px;
 	font-weight: bold;
 	line-height: 3;
 }
 
-.day span {
+.transition span {
 	line-height: 1.5;
 }
 
-#new-article + .day {
+#new-article + .transition {
 }
 
-.day .name {
+.transition .name {
 	padding: 0 10px 0 0;
 	font-size: 1.8em;
 	opacity: 0.3;
@@ -737,7 +737,7 @@ th {
 		width: 400px;
 	}
 
-	.day .name {
+	.transition .name {
 		font-size: 1.1rem;
 	}
 

+ 6 - 6
p/themes/base-theme/base.rtl.css

@@ -478,21 +478,21 @@ th {
 	text-decoration: none;
 }
 
-/*=== Day indication */
-.day {
+/*=== Transition indication, e.g. day */
+.transition {
 	padding: 0 10px;
 	font-weight: bold;
 	line-height: 3;
 }
 
-.day span {
+.transition span {
 	line-height: 1.5;
 }
 
-#new-article + .day {
+#new-article + .transition {
 }
 
-.day .name {
+.transition .name {
 	padding: 0 0 0 10px;
 	font-size: 1.8em;
 	opacity: 0.3;
@@ -737,7 +737,7 @@ th {
 		width: 400px;
 	}
 
-	.day .name {
+	.transition .name {
 		font-size: 1.1rem;
 	}
 

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

@@ -1413,12 +1413,12 @@ input[type="search"] {
 	display: block;
 }
 
-/*=== Day indication */
-.day {
+/*=== Transition indication, e.g. day */
+.transition {
 	background: inherit;
 }
 
-.day .name {
+.transition .name {
 	position: absolute;
 	right: 0;
 	width: 50%;
@@ -2485,7 +2485,7 @@ html.slider-active {
 	}
 
 	.flux_header .item.website span,
-	.item .date, .day .date,
+	.item .date,
 	.dropdown-menu > .no-mobile,
 	.no-mobile,
 	.aside_feed .tree-folder-items .item .no-dropdown-toggle {
@@ -2829,7 +2829,7 @@ html.slider-active {
 	}
 
 	.header, .aside,
-	.nav_menu, .day,
+	.nav_menu, .transition,
 	.flux_header,
 	.flux_content .bottom,
 	.pagination,

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

@@ -1413,12 +1413,12 @@ input[type="search"] {
 	display: block;
 }
 
-/*=== Day indication */
-.day {
+/*=== Transition indication, e.g. day */
+.transition {
 	background: inherit;
 }
 
-.day .name {
+.transition .name {
 	position: absolute;
 	left: 0;
 	width: 50%;
@@ -2485,7 +2485,7 @@ html.slider-active {
 	}
 
 	.flux_header .item.website span,
-	.item .date, .day .date,
+	.item .date,
 	.dropdown-menu > .no-mobile,
 	.no-mobile,
 	.aside_feed .tree-folder-items .item .no-dropdown-toggle {
@@ -2829,7 +2829,7 @@ html.slider-active {
 	}
 
 	.header, .aside,
-	.nav_menu, .day,
+	.nav_menu, .transition,
 	.flux_header,
 	.flux_content .bottom,
 	.pagination,