Ver Fonte

Improve aside feed bar (#6446)

* delete theme BlueLagoon

* delete theme Screwdriver

* phpstan level 7 for feedController.php (#5373)

* phpstan level 7 for feedController.php

* phpstan level 7 for feedController.php

* phpstan level 7 for feedController.php

* phpstan level 7 for feedController.php

* A few fixes

---------

Co-authored-by: Luc <sanchezluc+freshrss@gmail.com>
Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>

* phpstan level 7 for updateController.php (#5376)

* phpstan level 7 for updateController.php

* phpstan level 7 for updateController.php

* Minor array syntax

---------

Co-authored-by: Luc <sanchezluc+freshrss@gmail.com>
Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>

* docs: language table added (#5375)

* docs: language table added

* Update 05_Configuration.md

* Update 05_Configuration.md

* french docs

* Unicode quote and a few fixes
(Same search&replace aslo applied to a few other files)

---------

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>

* Share in anonymous mode (#5261)

#fix https://github.com/FreshRSS/FreshRSS/issues/5248

Co-authored-by: maTh <math-home@web.de>

* Minor development config fixes (#5379)

* Add compatibility with MacOS for `paste` command
* Addition to .editorconfig

* Fix markAsReadUponGone (#5382)

Fix regression from https://github.com/FreshRSS/FreshRSS/pull/5315
which indroduced a bug for cached feeds.
We now update the `lastSeen` property of entries to account for the fact that they are unchanged but still existing.

* phpstan level 7 for indexController.php (#5384)

Co-authored-by: Luc <sanchezluc+freshrss@gmail.com>

* Improved: "Mark an article as read…" text area. Added a link to the documentation (#5349)

* i18n

* Update sub.php

* Update app/i18n/fr/sub.php

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>

* fix target="_blank"

---------

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>

* Update Docker image Alpine 3.18 (#5383)

https://alpinelinux.org/posts/Alpine-3.18.0-released.html

Minor updates with Apache 2.4.57 and PHP 8.1.19

* Docs: delete 04_Changing_source_code.md (#5391)

* delete 04_Changing_source_code.md

* make pot

---------

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>

* Typed view model classes (#5380)

* Typed view model classes
* Add ability to provide a typed view model class to a controller
* Use `::class` instead of string for referring to classes
* Examplified with `stats` and `javascript` controllers / views (more to do)
* Also useful for extensions (my usecase today), which did not have the ability to define own view model attributes before.

* Typo

* A few additional PHPStan rules (#5388)

A subset of
https://github.com/phpstan/phpstan-strict-rules

* Improved: Install process: give more infos (#5350)

* comments added for each step

* infos about FreshRSS added in first step

* Remove reference to Kriss and Leed from install page
I do not find that informative, and quite confusing. Moved to readme instead.

---------

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>

* PHPMailer 6.8.0 (#5389)

* PHPMailer 6.8.0
https://github.com/PHPMailer/PHPMailer/releases/tag/v6.8.0
https://github.com/PHPMailer/PHPMailer/releases

* Exclude unused DSNConfigurator

* fix: docs: array syntax (#5392)

* Link configuration to proper parameter (#5394)

Before, the system configuration was linked to the user parameter while the
user configuration was linked to the system parameter. This was an issue when
trying to retrieve some kind of configuration value in an extension.
Now, the configurations are properly linked to their parameters.

* PHPStan Level 7 for Share userController logs_pagination (#5393)

* fix: "for" attribute in config display (#5398)

* move darkMode_auto from body to html root (#5397)

* CSS: refactor of a.btn (#5401)

* Fix logs pagination (#5403)

* Fix logs pagination
Regression from https://github.com/FreshRSS/FreshRSS/pull/5269

* Add better default

* PHPStan Level 7 for Minz_Request, FreshRSS_Feed, Minz_Error (#5400)

* PHPStan Level 7 for Minz_Request

* PHPStan Level 7 for FreshRSS_Feed

* PHPStan Level 7 for Minz_Error

* Fix again updateLastSeenUnchanged (#5404)

* Fix again updateLastSeenUnchanged
https://github.com/FreshRSS/FreshRSS/pull/5382 was not good enough to fix markAsReadUponGone and introduced a regression in `entry.lastSeen`.
New approach.
Follow-up of https://github.com/FreshRSS/FreshRSS/pull/5315

* Minor change of mind

* Fix handling of lastSeen
entry.lastSeen was not always correctly initialised, and sometimes overriden

* Remove debug line
Forgotten from https://github.com/FreshRSS/FreshRSS/pull/5404

* Avoid falsy guid (#5412)

Whitespace strings, empty strings, 0 are all problematic when working with GUIDs. so avoid them.

* PHPStan Level 7 complete (#5406)

* PHPStan Level 7 complete

* Start PHPStan Level 8

* Forgot exclude .phtml

* Fix favicon fetching while using proxies (#5421)

* Fix favicon fetching while using proxies

This ensures that if curl_options are defined in config.php, those
settings are respected while fetching favicons.

Fixes FreshRSS#4951

* Change options priority

* Credits keep alphabticorder

---------

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>

* Fixed: i18n extensions: 'en' as fallback (#5426)

* Update Translate.php

* Small improvements

---------

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>

* Improve Dev Container (#5423)

* Improve Dev Container
PHPStan was failing in Dev Container

* Update Docker to Alpine Linux 3.18
* New DATA_PATH environment variable

* README

* Update of Spanish translation (#5408)

* Update admin.php

Update Spanish

* Update conf.php

Spanish update

* Fix

---------

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>

* Linkding share now passes title #5432 (#5433)

* phpstan-8 typehinting (#5429)

Co-authored-by: Luc <sanchezluc+freshrss@gmail.com>

* Forgotten debug line
https://github.com/FreshRSS/FreshRSS/pull/5404

* phpstan-9 for Share.php (#5431)

* phpstan 9 for Search.php
phpstan 9 for Share.php

* phpstan-9 for Search.php

* Better consistency for search results

---------

Co-authored-by: Luc <sanchezluc+freshrss@gmail.com>
Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>

* Pull request of spanish translation (#5436)

* Update sub.php

Update spanish translation

* Update conf.php

Update Spanish translation

* Update gen.php

Update spanish translation

* Update index.php

Update spanish translation

* Update admin.php

update spanish translation

* Fix ignore

---------

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>

* improved background colors (#5437)

* phpstan-8 for category class (#5434)

* phpstan-8 for category class

* Another approach to nullable
https://github.com/FreshRSS/FreshRSS/pull/5434#discussion_r1210776699

---------

Co-authored-by: Luc <sanchezluc+freshrss@gmail.com>
Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>

* Docker example of PostgreSQL tuning (#5446)

Provide example of how to easily tune selected PostgreSQL settings
https://wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server

* Update SECURITY.md (#5448)

Link to GitHub security advisory process + PGP key

* fix: new article banner in Ansum/mapco theme (#5453)

* fix

* rtl

* Update dark theme css to lower brightness to all icons (#5439)

* Update dark.css to lower brightness to all icons

* Update dark.rtl.css to lower brightness to all icons

* re-add p.help .icon

* re-add p.help .icon

* Remove core extensions Google Groups and Tumblr (#5457)

* Remove core extensions Google Groups and Tumblr
* Google Groups seems to have remove support for RSS/ATOM https://github.com/FreshRSS/FreshRSS/pull/2838 (see e.g. https://www.theregister.com/2021/08/16/google_groups_rss/ )
* Tumblr seems to have fixed their RSS/ATOM post-GDPR https://github.com/FreshRSS/FreshRSS/pull/1924

So for both of thems, the extensions have become irrelevant.

* Cleaning

* Clarify that maximum number to keep is per feed (#5458)

* Clarify that maximum number to keep is per feed

Signed-off-by: Christian König <ckoenig@posteo.de>

* Append //DIRTY

Signed-off-by: Christian König <ckoenig@posteo.de>

* make fix-all

* Revert wrong whitespace

* Amend Credits.md

Signed-off-by: Christian König <ckoenig@posteo.de>

---------

Signed-off-by: Christian König <ckoenig@posteo.de>
Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>

* Add OpenID Connect (#5351)

* Add OIDC

* Update documentation.

* Update apache conf adding IfModule

* Use IfDefine for OIDC in apache conf

* Fix non-oidc support

* Fix typing

* Use IfDefine to enable OIDC

* Add OIDC support to all dockerfiles

* Re add apache Require option

* Fixes and documentation

* A few more fixes

* A bit more doc

* Change type of environment variable

* Update readme

* Correct apache config for OIDC support.

* Fix README formatting

* Update oidc control path

* Fix oidc endpoint being cached

* A bit more review

* Simplify ExpiresActive

* Add session refresh and improve caching

* Allow more different setups

* A bit more documentation

* A bit more readme

---------

Co-authored-by: Aaron Schif <aschif@netdevgroup.com>
Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
Co-authored-by: maTh <math-home@web.de>

* Fix OpenID Connect crash on ARM (#5463)

Only enable the Apache auth_openidc module when actually used
Fix https://github.com/FreshRSS/FreshRSS/issues/5460
Follow-up of https://github.com/FreshRSS/FreshRSS/pull/5351

* Readme minor typo

* Fix: conf.php (German i18n) (#5468)

* Improved: update page (#5420)

* prependTitle()

* do not need the "damn" in the alert

* update page layout improved

* release channel

* i18n labels

* add log messages while updating

* Delete updatee.php

* Update updateController.php

* Update updateController.php

* Update updateController.php

* Update updateController.php

* add getCurrentGitBranch()

* Update updateController.php

* state2 buttons

* i18n

* loading

* Update feedback.php

* Update feedback.php

* Update feedback.php

* Update extra.js

* Apply suggestions from code review

Co-authored-by: Luc SANCHEZ <4697568+ColonelMoutarde@users.noreply.github.com>

* Update updateController.php

* Update terminology

* update button is now armed

---------

Co-authored-by: Luc SANCHEZ <4697568+ColonelMoutarde@users.noreply.github.com>
Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>

* Allow deep link to extension configuration (#5449)

* Allow deep link to extension configuration
Full screen

* Support slider

* Add aside_configure
Fix https://github.com/FreshRSS/FreshRSS/pull/5449#issuecomment-1588089769

* category title improved

* Feed title: better HTML structure + have a correct semantic <a>

* feed title: CSS

* feed title special cases

* improved feed mouseover titles

* cog icon half transparent. Shining while hovering

* i18n labels

* improve hover of more menu

* Update gen.php

* fix

* i18n: fr

---------

Signed-off-by: Christian König <ckoenig@posteo.de>
Co-authored-by: Luc SANCHEZ <4697568+ColonelMoutarde@users.noreply.github.com>
Co-authored-by: Luc <sanchezluc+freshrss@gmail.com>
Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
Co-authored-by: Alexis Degrugillier <aledeg@users.noreply.github.com>
Co-authored-by: vrachnis <vrachnis@users.noreply.github.com>
Co-authored-by: LleanaRuv <133794633+LleanaRuv@users.noreply.github.com>
Co-authored-by: acbgbca <60839662+acbgbca@users.noreply.github.com>
Co-authored-by: Alwaysin <adrien@demma.fr>
Co-authored-by: yubiuser <ckoenig@posteo.de>
Co-authored-by: Aaron Schif <aaronschif@gmail.com>
Co-authored-by: Aaron Schif <aschif@netdevgroup.com>
Co-authored-by: math-gh <>
maTh há 1 ano atrás
pai
commit
5a5ccc94f3
54 ficheiros alterados com 402 adições e 81 exclusões
  1. 3 0
      app/i18n/cs/gen.php
  2. 7 1
      app/i18n/cs/sub.php
  3. 3 0
      app/i18n/de/gen.php
  4. 7 1
      app/i18n/de/sub.php
  5. 3 0
      app/i18n/el/gen.php
  6. 7 1
      app/i18n/el/sub.php
  7. 3 0
      app/i18n/en-us/gen.php
  8. 7 1
      app/i18n/en-us/sub.php
  9. 3 0
      app/i18n/en/gen.php
  10. 7 1
      app/i18n/en/sub.php
  11. 3 0
      app/i18n/es/gen.php
  12. 7 1
      app/i18n/es/sub.php
  13. 3 0
      app/i18n/fa/gen.php
  14. 7 1
      app/i18n/fa/sub.php
  15. 3 0
      app/i18n/fr/gen.php
  16. 7 1
      app/i18n/fr/sub.php
  17. 3 0
      app/i18n/he/gen.php
  18. 7 1
      app/i18n/he/sub.php
  19. 3 0
      app/i18n/hu/gen.php
  20. 7 1
      app/i18n/hu/sub.php
  21. 3 0
      app/i18n/id/gen.php
  22. 7 1
      app/i18n/id/sub.php
  23. 3 0
      app/i18n/it/gen.php
  24. 7 1
      app/i18n/it/sub.php
  25. 3 0
      app/i18n/ja/gen.php
  26. 7 1
      app/i18n/ja/sub.php
  27. 3 0
      app/i18n/ko/gen.php
  28. 7 1
      app/i18n/ko/sub.php
  29. 3 0
      app/i18n/lv/gen.php
  30. 7 1
      app/i18n/lv/sub.php
  31. 3 0
      app/i18n/nl/gen.php
  32. 7 1
      app/i18n/nl/sub.php
  33. 3 0
      app/i18n/oc/gen.php
  34. 7 1
      app/i18n/oc/sub.php
  35. 3 0
      app/i18n/pl/gen.php
  36. 7 1
      app/i18n/pl/sub.php
  37. 3 0
      app/i18n/pt-br/gen.php
  38. 7 1
      app/i18n/pt-br/sub.php
  39. 3 0
      app/i18n/ru/gen.php
  40. 7 1
      app/i18n/ru/sub.php
  41. 3 0
      app/i18n/sk/gen.php
  42. 7 1
      app/i18n/sk/sub.php
  43. 3 0
      app/i18n/tr/gen.php
  44. 7 1
      app/i18n/tr/sub.php
  45. 3 0
      app/i18n/zh-cn/gen.php
  46. 7 1
      app/i18n/zh-cn/sub.php
  47. 3 0
      app/i18n/zh-tw/gen.php
  48. 7 1
      app/i18n/zh-tw/sub.php
  49. 24 15
      app/layout/aside_feed.phtml
  50. 2 4
      p/scripts/main.js
  51. 14 1
      p/themes/Origine/origine.css
  52. 14 1
      p/themes/Origine/origine.rtl.css
  53. 54 18
      p/themes/base-theme/frss.css
  54. 54 18
      p/themes/base-theme/frss.rtl.css

+ 3 - 0
app/i18n/cs/gen.php

@@ -29,6 +29,9 @@ return array(
 		'load_default_shortcuts' => 'Načíst výchozí zkratky',
 		'load_default_shortcuts' => 'Načíst výchozí zkratky',
 		'manage' => 'Spravovat',
 		'manage' => 'Spravovat',
 		'mark_read' => 'Označit jako přečtené',
 		'mark_read' => 'Označit jako přečtené',
+		'menu' => array(
+			'open' => 'Open menu',	// TODO
+		),
 		'nav_buttons' => array(
 		'nav_buttons' => array(
 			'next' => 'Next article',	// TODO
 			'next' => 'Next article',	// TODO
 			'prev' => 'Previous article',	// TODO
 			'prev' => 'Previous article',	// TODO

+ 7 - 1
app/i18n/cs/sub.php

@@ -29,7 +29,9 @@ return array(
 			'help' => 'Zadejte adresu URL na <a href="http://opml.org/" target="_blank">OPML soubor</a> k dynamickému naplnění této kategorie RSS kanály',
 			'help' => 'Zadejte adresu URL na <a href="http://opml.org/" target="_blank">OPML soubor</a> k dynamickému naplnění této kategorie RSS kanály',
 		),
 		),
 		'empty' => 'Vyprázdit kategorii',
 		'empty' => 'Vyprázdit kategorii',
+		'expand' => 'Expand category',	// TODO
 		'information' => 'Informace',
 		'information' => 'Informace',
+		'open' => 'Open category',	// TODO
 		'opml_url' => 'ADRESA URL OPML',
 		'opml_url' => 'ADRESA URL OPML',
 		'position' => 'Zobrazit pozici',
 		'position' => 'Zobrazit pozici',
 		'position_help' => 'Pro ovládání pořadí řazení kategorií',
 		'position_help' => 'Pro ovládání pořadí řazení kategorií',
@@ -183,9 +185,13 @@ return array(
 		'method_help' => 'Payload metody POST má automatickou podporu pro <code>application/x-www-form-urlencoded</code> a <code>application/json</code>',
 		'method_help' => 'Payload metody POST má automatickou podporu pro <code>application/x-www-form-urlencoded</code> a <code>application/json</code>',
 		'method_postparams' => 'Payload pro metodu POST',
 		'method_postparams' => 'Payload pro metodu POST',
 		'moved_category_deleted' => 'Když odstraníte kategorii, její kanály jsou automaticky přesunuty do <em>%s</em>.',
 		'moved_category_deleted' => 'Když odstraníte kategorii, její kanály jsou automaticky přesunuty do <em>%s</em>.',
-		'mute' => 'ztlumit',
+		'mute' => array(
+			'_' => 'ztlumit',
+			'state_is_muted' => 'This feed is muted',	// TODO
+		),
 		'no_selected' => 'Nejsou vybrány žádné kanály.',
 		'no_selected' => 'Nejsou vybrány žádné kanály.',
 		'number_entries' => '%d článků',
 		'number_entries' => '%d článků',
+		'open_feed' => 'Open feed %s',	// TODO
 		'priority' => array(
 		'priority' => array(
 			'_' => 'Viditelnost',
 			'_' => 'Viditelnost',
 			'archived' => 'Nezobrazovat (archivováno)',
 			'archived' => 'Nezobrazovat (archivováno)',

+ 3 - 0
app/i18n/de/gen.php

@@ -29,6 +29,9 @@ return array(
 		'load_default_shortcuts' => 'Standard-Kürzel laden',
 		'load_default_shortcuts' => 'Standard-Kürzel laden',
 		'manage' => 'Verwalten',
 		'manage' => 'Verwalten',
 		'mark_read' => 'Als gelesen markieren',
 		'mark_read' => 'Als gelesen markieren',
+		'menu' => array(
+			'open' => 'Menü öffnen',
+		),
 		'nav_buttons' => array(
 		'nav_buttons' => array(
 			'next' => 'Nächster Artikel',
 			'next' => 'Nächster Artikel',
 			'prev' => 'Vorheriger Artikel',
 			'prev' => 'Vorheriger Artikel',

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

@@ -29,7 +29,9 @@ return array(
 			'help' => 'URL zu einer <a href="http://opml.org/" target="_blank">OPML Datei</a>, um die Kategorie dynamisch mit Feeds zu befüllen',
 			'help' => 'URL zu einer <a href="http://opml.org/" target="_blank">OPML Datei</a>, um die Kategorie dynamisch mit Feeds zu befüllen',
 		),
 		),
 		'empty' => 'Leere Kategorie',
 		'empty' => 'Leere Kategorie',
+		'expand' => 'Kategory aufklappen',
 		'information' => 'Information',	// IGNORE
 		'information' => 'Information',	// IGNORE
+		'open' => 'Kategory öffnen',
 		'opml_url' => 'OPML-Datei URL',
 		'opml_url' => 'OPML-Datei URL',
 		'position' => 'Reihenfolge',
 		'position' => 'Reihenfolge',
 		'position_help' => 'Steuert die Kategoriesortierung',
 		'position_help' => 'Steuert die Kategoriesortierung',
@@ -183,9 +185,13 @@ return array(
 		'method_help' => 'Der POST-Payload unterstützt automatisch <code>application/x-www-form-urlencoded</code> und <code>application/json</code>',
 		'method_help' => 'Der POST-Payload unterstützt automatisch <code>application/x-www-form-urlencoded</code> und <code>application/json</code>',
 		'method_postparams' => 'Payload für POST',
 		'method_postparams' => 'Payload für POST',
 		'moved_category_deleted' => 'Wenn Sie eine Kategorie entfernen, werden deren Feeds automatisch in die Kategorie <em>%s</em> eingefügt.',
 		'moved_category_deleted' => 'Wenn Sie eine Kategorie entfernen, werden deren Feeds automatisch in die Kategorie <em>%s</em> eingefügt.',
-		'mute' => 'Stumm schalten',
+		'mute' => array(
+			'_' => 'Stumm schalten',
+			'state_is_muted' => 'Dieser Feed ist stummgeschaltet',
+		),
 		'no_selected' => 'Kein Feed ausgewählt.',
 		'no_selected' => 'Kein Feed ausgewählt.',
 		'number_entries' => '%d Artikel',
 		'number_entries' => '%d Artikel',
+		'open_feed' => 'Feed %s öffnen',
 		'priority' => array(
 		'priority' => array(
 			'_' => 'Sichtbarkeit',
 			'_' => 'Sichtbarkeit',
 			'archived' => 'Nicht anzeigen (archiviert)',
 			'archived' => 'Nicht anzeigen (archiviert)',

+ 3 - 0
app/i18n/el/gen.php

@@ -29,6 +29,9 @@ return array(
 		'load_default_shortcuts' => 'Load default shortcuts',	// TODO
 		'load_default_shortcuts' => 'Load default shortcuts',	// TODO
 		'manage' => 'Manage',	// TODO
 		'manage' => 'Manage',	// TODO
 		'mark_read' => 'Mark as read',	// TODO
 		'mark_read' => 'Mark as read',	// TODO
+		'menu' => array(
+			'open' => 'Open menu',	// TODO
+		),
 		'nav_buttons' => array(
 		'nav_buttons' => array(
 			'next' => 'Next article',	// TODO
 			'next' => 'Next article',	// TODO
 			'prev' => 'Previous article',	// TODO
 			'prev' => 'Previous article',	// TODO

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

@@ -29,7 +29,9 @@ return array(
 			'help' => 'Provide the URL to an <a href="http://opml.org/" target="_blank">OPML file</a> to dynamically populate this category with feeds',	// TODO
 			'help' => 'Provide the URL to an <a href="http://opml.org/" target="_blank">OPML file</a> to dynamically populate this category with feeds',	// TODO
 		),
 		),
 		'empty' => 'Empty category',	// TODO
 		'empty' => 'Empty category',	// TODO
+		'expand' => 'Expand category',	// TODO
 		'information' => 'Information',	// TODO
 		'information' => 'Information',	// TODO
+		'open' => 'Open category',	// TODO
 		'opml_url' => 'OPML URL',	// TODO
 		'opml_url' => 'OPML URL',	// TODO
 		'position' => 'Display position',	// TODO
 		'position' => 'Display position',	// TODO
 		'position_help' => 'To control category sort order',	// TODO
 		'position_help' => 'To control category sort order',	// TODO
@@ -183,9 +185,13 @@ return array(
 		'method_help' => 'The POST payload has automatic support for <code>application/x-www-form-urlencoded</code> and <code>application/json</code>',	// TODO
 		'method_help' => 'The POST payload has automatic support for <code>application/x-www-form-urlencoded</code> and <code>application/json</code>',	// TODO
 		'method_postparams' => 'Payload for POST',	// TODO
 		'method_postparams' => 'Payload for POST',	// TODO
 		'moved_category_deleted' => 'When you delete a category, its feeds are automatically classified under <em>%s</em>.',	// TODO
 		'moved_category_deleted' => 'When you delete a category, its feeds are automatically classified under <em>%s</em>.',	// TODO
-		'mute' => 'mute',	// TODO
+		'mute' => array(
+			'_' => 'mute',	// TODO
+			'state_is_muted' => 'This feed is muted',	// TODO
+		),
 		'no_selected' => 'No feed selected.',	// TODO
 		'no_selected' => 'No feed selected.',	// TODO
 		'number_entries' => '%d articles',	// TODO
 		'number_entries' => '%d articles',	// TODO
+		'open_feed' => 'Open feed %s',	// TODO
 		'priority' => array(
 		'priority' => array(
 			'_' => 'Visibility',	// TODO
 			'_' => 'Visibility',	// TODO
 			'archived' => 'Do not show (archived)',	// TODO
 			'archived' => 'Do not show (archived)',	// TODO

+ 3 - 0
app/i18n/en-us/gen.php

@@ -29,6 +29,9 @@ return array(
 		'load_default_shortcuts' => 'Load default shortcuts',	// IGNORE
 		'load_default_shortcuts' => 'Load default shortcuts',	// IGNORE
 		'manage' => 'Manage',	// IGNORE
 		'manage' => 'Manage',	// IGNORE
 		'mark_read' => 'Mark as read',	// IGNORE
 		'mark_read' => 'Mark as read',	// IGNORE
+		'menu' => array(
+			'open' => 'Open menu',	// IGNORE
+		),
 		'nav_buttons' => array(
 		'nav_buttons' => array(
 			'next' => 'Next article',	// IGNORE
 			'next' => 'Next article',	// IGNORE
 			'prev' => 'Previous article',	// IGNORE
 			'prev' => 'Previous article',	// IGNORE

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

@@ -29,7 +29,9 @@ return array(
 			'help' => 'Provide the URL to an <a href="http://opml.org/" target="_blank">OPML file</a> to dynamically populate this category with feeds',	// IGNORE
 			'help' => 'Provide the URL to an <a href="http://opml.org/" target="_blank">OPML file</a> to dynamically populate this category with feeds',	// IGNORE
 		),
 		),
 		'empty' => 'Empty category',	// IGNORE
 		'empty' => 'Empty category',	// IGNORE
+		'expand' => 'Expand category',	// IGNORE
 		'information' => 'Information',	// IGNORE
 		'information' => 'Information',	// IGNORE
+		'open' => 'Open category',	// IGNORE
 		'opml_url' => 'OPML URL',	// IGNORE
 		'opml_url' => 'OPML URL',	// IGNORE
 		'position' => 'Display position',	// IGNORE
 		'position' => 'Display position',	// IGNORE
 		'position_help' => 'To control category sort order',	// IGNORE
 		'position_help' => 'To control category sort order',	// IGNORE
@@ -183,9 +185,13 @@ return array(
 		'method_help' => 'The POST payload has automatic support for <code>application/x-www-form-urlencoded</code> and <code>application/json</code>',	// IGNORE
 		'method_help' => 'The POST payload has automatic support for <code>application/x-www-form-urlencoded</code> and <code>application/json</code>',	// IGNORE
 		'method_postparams' => 'Payload for POST',	// IGNORE
 		'method_postparams' => 'Payload for POST',	// IGNORE
 		'moved_category_deleted' => 'When you delete a category, its feeds are automatically classified under <em>%s</em>.',	// IGNORE
 		'moved_category_deleted' => 'When you delete a category, its feeds are automatically classified under <em>%s</em>.',	// IGNORE
-		'mute' => 'mute',	// IGNORE
+		'mute' => array(
+			'_' => 'mute',	// IGNORE
+			'state_is_muted' => 'This feed is muted',	// IGNORE
+		),
 		'no_selected' => 'No feed selected.',	// IGNORE
 		'no_selected' => 'No feed selected.',	// IGNORE
 		'number_entries' => '%d articles',	// IGNORE
 		'number_entries' => '%d articles',	// IGNORE
+		'open_feed' => 'Open feed %s',	// IGNORE
 		'priority' => array(
 		'priority' => array(
 			'_' => 'Visibility',	// IGNORE
 			'_' => 'Visibility',	// IGNORE
 			'archived' => 'Do not show (archived)',	// IGNORE
 			'archived' => 'Do not show (archived)',	// IGNORE

+ 3 - 0
app/i18n/en/gen.php

@@ -29,6 +29,9 @@ return array(
 		'load_default_shortcuts' => 'Load default shortcuts',
 		'load_default_shortcuts' => 'Load default shortcuts',
 		'manage' => 'Manage',
 		'manage' => 'Manage',
 		'mark_read' => 'Mark as read',
 		'mark_read' => 'Mark as read',
+		'menu' => array(
+			'open' => 'Open menu',
+		),
 		'nav_buttons' => array(
 		'nav_buttons' => array(
 			'next' => 'Next article',	// TODO
 			'next' => 'Next article',	// TODO
 			'prev' => 'Previous article',	// TODO
 			'prev' => 'Previous article',	// TODO

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

@@ -29,7 +29,9 @@ return array(
 			'help' => 'Provide the URL to an <a href="http://opml.org/" target="_blank">OPML file</a> to dynamically populate this category with feeds',
 			'help' => 'Provide the URL to an <a href="http://opml.org/" target="_blank">OPML file</a> to dynamically populate this category with feeds',
 		),
 		),
 		'empty' => 'Empty category',
 		'empty' => 'Empty category',
+		'expand' => 'Expand category',
 		'information' => 'Information',
 		'information' => 'Information',
+		'open' => 'Open category',
 		'opml_url' => 'OPML URL',
 		'opml_url' => 'OPML URL',
 		'position' => 'Display position',
 		'position' => 'Display position',
 		'position_help' => 'To control category sort order',
 		'position_help' => 'To control category sort order',
@@ -183,9 +185,13 @@ return array(
 		'method_help' => 'The POST payload has automatic support for <code>application/x-www-form-urlencoded</code> and <code>application/json</code>',
 		'method_help' => 'The POST payload has automatic support for <code>application/x-www-form-urlencoded</code> and <code>application/json</code>',
 		'method_postparams' => 'Payload for POST',
 		'method_postparams' => 'Payload for POST',
 		'moved_category_deleted' => 'When you delete a category, its feeds are automatically classified under <em>%s</em>.',
 		'moved_category_deleted' => 'When you delete a category, its feeds are automatically classified under <em>%s</em>.',
-		'mute' => 'mute',
+		'mute' => array(
+			'_' => 'mute',
+			'state_is_muted' => 'This feed is muted',
+		),
 		'no_selected' => 'No feed selected.',
 		'no_selected' => 'No feed selected.',
 		'number_entries' => '%d articles',
 		'number_entries' => '%d articles',
+		'open_feed' => 'Open feed %s',
 		'priority' => array(
 		'priority' => array(
 			'_' => 'Visibility',
 			'_' => 'Visibility',
 			'archived' => 'Do not show (archived)',
 			'archived' => 'Do not show (archived)',

+ 3 - 0
app/i18n/es/gen.php

@@ -29,6 +29,9 @@ return array(
 		'load_default_shortcuts' => 'Cargar accesos directos predeterminados',
 		'load_default_shortcuts' => 'Cargar accesos directos predeterminados',
 		'manage' => 'Administrar',
 		'manage' => 'Administrar',
 		'mark_read' => 'Marcar como leído',
 		'mark_read' => 'Marcar como leído',
+		'menu' => array(
+			'open' => 'Open menu',	// TODO
+		),
 		'nav_buttons' => array(
 		'nav_buttons' => array(
 			'next' => 'Next article',	// TODO
 			'next' => 'Next article',	// TODO
 			'prev' => 'Previous article',	// TODO
 			'prev' => 'Previous article',	// TODO

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

@@ -29,7 +29,9 @@ return array(
 			'help' => 'Provee la URL a un <a href=http://opml.org/ target="_blank">archivo OPML</a> para llenar dinámicamente esta categoría con feeds',
 			'help' => 'Provee la URL a un <a href=http://opml.org/ target="_blank">archivo OPML</a> para llenar dinámicamente esta categoría con feeds',
 		),
 		),
 		'empty' => 'Vaciar categoría',
 		'empty' => 'Vaciar categoría',
+		'expand' => 'Expand category',	// TODO
 		'information' => 'Información',
 		'information' => 'Información',
+		'open' => 'Open category',	// TODO
 		'opml_url' => 'URL del OPML',
 		'opml_url' => 'URL del OPML',
 		'position' => 'Posición de visualización',
 		'position' => 'Posición de visualización',
 		'position_help' => 'Para controlar el orden de clasificación de categorías',
 		'position_help' => 'Para controlar el orden de clasificación de categorías',
@@ -183,9 +185,13 @@ return array(
 		'method_help' => 'La carga útil del POST tiene soporte automático para <code>application/x-www-form-urlencoded</code> y <code>application/json</code>',
 		'method_help' => 'La carga útil del POST tiene soporte automático para <code>application/x-www-form-urlencoded</code> y <code>application/json</code>',
 		'method_postparams' => 'Carga útil para POST',
 		'method_postparams' => 'Carga útil para POST',
 		'moved_category_deleted' => 'Al borrar una categoría todas sus fuentes pasan automáticamente a la categoría <em>%s</em>.',
 		'moved_category_deleted' => 'Al borrar una categoría todas sus fuentes pasan automáticamente a la categoría <em>%s</em>.',
-		'mute' => 'silenciar',
+		'mute' => array(
+			'_' => 'silenciar',
+			'state_is_muted' => 'This feed is muted',	// TODO
+		),
 		'no_selected' => 'No hay funentes seleccionadas.',
 		'no_selected' => 'No hay funentes seleccionadas.',
 		'number_entries' => '%d artículos',
 		'number_entries' => '%d artículos',
+		'open_feed' => 'Open feed %s',	// TODO
 		'priority' => array(
 		'priority' => array(
 			'_' => 'Visibilidad',
 			'_' => 'Visibilidad',
 			'archived' => 'No mostrar (archivado)',
 			'archived' => 'No mostrar (archivado)',

+ 3 - 0
app/i18n/fa/gen.php

@@ -29,6 +29,9 @@ return array(
 		'load_default_shortcuts' => ' میانبرهای پیش فرض را بارگیری کنید',
 		'load_default_shortcuts' => ' میانبرهای پیش فرض را بارگیری کنید',
 		'manage' => ' مدیریت',
 		'manage' => ' مدیریت',
 		'mark_read' => ' علامت گذاری به عنوان خوانده شده',
 		'mark_read' => ' علامت گذاری به عنوان خوانده شده',
+		'menu' => array(
+			'open' => 'Open menu',	// TODO
+		),
 		'nav_buttons' => array(
 		'nav_buttons' => array(
 			'next' => 'Next article',	// TODO
 			'next' => 'Next article',	// TODO
 			'prev' => 'Previous article',	// TODO
 			'prev' => 'Previous article',	// TODO

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

@@ -29,7 +29,9 @@ return array(
 			'help' => ' URL را به <a href="http://opml.org/" target="_blank">فایل OPML</a> ارائه دهید تا به صورت پویا این دسته با فیدها پر شود.',
 			'help' => ' URL را به <a href="http://opml.org/" target="_blank">فایل OPML</a> ارائه دهید تا به صورت پویا این دسته با فیدها پر شود.',
 		),
 		),
 		'empty' => ' دسته خالی',
 		'empty' => ' دسته خالی',
+		'expand' => 'Expand category',	// TODO
 		'information' => ' اطلاعات',
 		'information' => ' اطلاعات',
+		'open' => 'Open category',	// TODO
 		'opml_url' => ' URL OPML',
 		'opml_url' => ' URL OPML',
 		'position' => ' موقعیت نمایش',
 		'position' => ' موقعیت نمایش',
 		'position_help' => ' برای کنترل ترتیب مرتب سازی دسته بندی',
 		'position_help' => ' برای کنترل ترتیب مرتب سازی دسته بندی',
@@ -183,9 +185,13 @@ return array(
 		'method_help' => 'The POST payload has automatic support for <code>application/x-www-form-urlencoded</code> and <code>application/json</code>',	// TODO
 		'method_help' => 'The POST payload has automatic support for <code>application/x-www-form-urlencoded</code> and <code>application/json</code>',	// TODO
 		'method_postparams' => 'Payload for POST',	// TODO
 		'method_postparams' => 'Payload for POST',	// TODO
 		'moved_category_deleted' => ' هنگامی که یک دسته را حذف می کنید',
 		'moved_category_deleted' => ' هنگامی که یک دسته را حذف می کنید',
-		'mute' => ' بی صدا',
+		'mute' => array(
+			'_' => ' بی صدا',
+			'state_is_muted' => 'This feed is muted',	// TODO
+		),
 		'no_selected' => ' هیچ خوراکی انتخاب نشده است.',
 		'no_selected' => ' هیچ خوراکی انتخاب نشده است.',
 		'number_entries' => ' %d مقاله',
 		'number_entries' => ' %d مقاله',
+		'open_feed' => 'Open feed %s',	// TODO
 		'priority' => array(
 		'priority' => array(
 			'_' => ' دید',
 			'_' => ' دید',
 			'archived' => ' نشان داده نشود (بایگانی شده)',
 			'archived' => ' نشان داده نشود (بایگانی شده)',

+ 3 - 0
app/i18n/fr/gen.php

@@ -29,6 +29,9 @@ return array(
 		'load_default_shortcuts' => 'Utiliser les raccourcis par défaut',
 		'load_default_shortcuts' => 'Utiliser les raccourcis par défaut',
 		'manage' => 'Gérer',
 		'manage' => 'Gérer',
 		'mark_read' => 'Marquer comme lu',
 		'mark_read' => 'Marquer comme lu',
+		'menu' => array(
+			'open' => 'Ouvrir le menu',
+		),
 		'nav_buttons' => array(
 		'nav_buttons' => array(
 			'next' => 'Article suivant',
 			'next' => 'Article suivant',
 			'prev' => 'Article précédent',
 			'prev' => 'Article précédent',

+ 7 - 1
app/i18n/fr/sub.php

@@ -29,7 +29,9 @@ return array(
 			'help' => 'Fournir l’URL d’un <a href="http://opml.org/" target="_blank">fichier OPML</a> qui donnera dynamiquement la liste des flux de cette catégorie',
 			'help' => 'Fournir l’URL d’un <a href="http://opml.org/" target="_blank">fichier OPML</a> qui donnera dynamiquement la liste des flux de cette catégorie',
 		),
 		),
 		'empty' => 'Catégorie vide',
 		'empty' => 'Catégorie vide',
+		'expand' => 'Développer la catégorie',
 		'information' => 'Informations',
 		'information' => 'Informations',
+		'open' => 'Ouvrir la catégorie',
 		'opml_url' => 'URL de l’OPML',
 		'opml_url' => 'URL de l’OPML',
 		'position' => 'Position d’affichage',
 		'position' => 'Position d’affichage',
 		'position_help' => 'Pour contrôler l’ordre de tri des catégories',
 		'position_help' => 'Pour contrôler l’ordre de tri des catégories',
@@ -183,9 +185,13 @@ return array(
 		'method_help' => 'Les données POST supportent automatiquement <code>application/x-www-form-urlencoded</code> et <code>application/json</code>',
 		'method_help' => 'Les données POST supportent automatiquement <code>application/x-www-form-urlencoded</code> et <code>application/json</code>',
 		'method_postparams' => 'Données pour POST',
 		'method_postparams' => 'Données pour POST',
 		'moved_category_deleted' => 'Lors de la suppression d’une catégorie, ses flux seront automatiquement classés dans <em>%s</em>.',
 		'moved_category_deleted' => 'Lors de la suppression d’une catégorie, ses flux seront automatiquement classés dans <em>%s</em>.',
-		'mute' => 'désactivé',
+		'mute' => array(
+			'_' => 'désactivé',
+			'state_is_muted' => 'Ce flux est désactivé',
+		),
 		'no_selected' => 'Aucun flux sélectionné.',
 		'no_selected' => 'Aucun flux sélectionné.',
 		'number_entries' => '%d articles',	// IGNORE
 		'number_entries' => '%d articles',	// IGNORE
+		'open_feed' => 'Ouvrir le flux %s',
 		'priority' => array(
 		'priority' => array(
 			'_' => 'Visibilité',
 			'_' => 'Visibilité',
 			'archived' => 'Ne pas afficher (archivé)',
 			'archived' => 'Ne pas afficher (archivé)',

+ 3 - 0
app/i18n/he/gen.php

@@ -29,6 +29,9 @@ return array(
 		'load_default_shortcuts' => 'Load default shortcuts',	// TODO
 		'load_default_shortcuts' => 'Load default shortcuts',	// TODO
 		'manage' => 'ניהול',
 		'manage' => 'ניהול',
 		'mark_read' => 'סימון כנקרא',
 		'mark_read' => 'סימון כנקרא',
+		'menu' => array(
+			'open' => 'Open menu',	// TODO
+		),
 		'nav_buttons' => array(
 		'nav_buttons' => array(
 			'next' => 'Next article',	// TODO
 			'next' => 'Next article',	// TODO
 			'prev' => 'Previous article',	// TODO
 			'prev' => 'Previous article',	// TODO

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

@@ -29,7 +29,9 @@ return array(
 			'help' => 'Provide the URL to an <a href="http://opml.org/" target="_blank">OPML file</a> to dynamically populate this category with feeds',	// TODO
 			'help' => 'Provide the URL to an <a href="http://opml.org/" target="_blank">OPML file</a> to dynamically populate this category with feeds',	// TODO
 		),
 		),
 		'empty' => 'Empty category',	// TODO
 		'empty' => 'Empty category',	// TODO
+		'expand' => 'Expand category',	// TODO
 		'information' => 'מידע',
 		'information' => 'מידע',
+		'open' => 'Open category',	// TODO
 		'opml_url' => 'OPML URL',	// TODO
 		'opml_url' => 'OPML URL',	// TODO
 		'position' => 'Display position',	// TODO
 		'position' => 'Display position',	// TODO
 		'position_help' => 'To control category sort order',	// TODO
 		'position_help' => 'To control category sort order',	// TODO
@@ -183,9 +185,13 @@ return array(
 		'method_help' => 'The POST payload has automatic support for <code>application/x-www-form-urlencoded</code> and <code>application/json</code>',	// TODO
 		'method_help' => 'The POST payload has automatic support for <code>application/x-www-form-urlencoded</code> and <code>application/json</code>',	// TODO
 		'method_postparams' => 'Payload for POST',	// TODO
 		'method_postparams' => 'Payload for POST',	// TODO
 		'moved_category_deleted' => 'כאשר הקטגוריה נמחקת ההזנות שבתוכה אוטומטית מקוטלגות תחת	<em>%s</em>.',
 		'moved_category_deleted' => 'כאשר הקטגוריה נמחקת ההזנות שבתוכה אוטומטית מקוטלגות תחת	<em>%s</em>.',
-		'mute' => 'mute',	// TODO
+		'mute' => array(
+			'_' => 'mute',	// TODO
+			'state_is_muted' => 'This feed is muted',	// TODO
+		),
 		'no_selected' => 'אף הזנה לא נבחרה.',
 		'no_selected' => 'אף הזנה לא נבחרה.',
 		'number_entries' => '%d מאמרים',
 		'number_entries' => '%d מאמרים',
+		'open_feed' => 'Open feed %s',	// TODO
 		'priority' => array(
 		'priority' => array(
 			'_' => 'Visibility',	// TODO
 			'_' => 'Visibility',	// TODO
 			'archived' => 'Do not show (archived)',	// TODO
 			'archived' => 'Do not show (archived)',	// TODO

+ 3 - 0
app/i18n/hu/gen.php

@@ -29,6 +29,9 @@ return array(
 		'load_default_shortcuts' => 'Alapértelmezett gyorsgombok visszaállítása',
 		'load_default_shortcuts' => 'Alapértelmezett gyorsgombok visszaállítása',
 		'manage' => 'Kezelés',
 		'manage' => 'Kezelés',
 		'mark_read' => 'Megjelölés olvasottként',
 		'mark_read' => 'Megjelölés olvasottként',
+		'menu' => array(
+			'open' => 'Open menu',	// TODO
+		),
 		'nav_buttons' => array(
 		'nav_buttons' => array(
 			'next' => 'Next article',	// TODO
 			'next' => 'Next article',	// TODO
 			'prev' => 'Previous article',	// TODO
 			'prev' => 'Previous article',	// TODO

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

@@ -29,7 +29,9 @@ return array(
 			'help' => 'Adj meg egy URL-t az <a href="http://opml.org/" target="_blank">OPML fájlhoz</a> hogy automatikusan kitöltődjön ez a kategória hírforrásokkal',
 			'help' => 'Adj meg egy URL-t az <a href="http://opml.org/" target="_blank">OPML fájlhoz</a> hogy automatikusan kitöltődjön ez a kategória hírforrásokkal',
 		),
 		),
 		'empty' => 'Üres kategória',
 		'empty' => 'Üres kategória',
+		'expand' => 'Expand category',	// TODO
 		'information' => 'Információ',
 		'information' => 'Információ',
+		'open' => 'Open category',	// TODO
 		'opml_url' => 'OPML URL',	// IGNORE
 		'opml_url' => 'OPML URL',	// IGNORE
 		'position' => 'Megjelenítési pozíció',
 		'position' => 'Megjelenítési pozíció',
 		'position_help' => 'Kategória rendezési sorrend',
 		'position_help' => 'Kategória rendezési sorrend',
@@ -183,9 +185,13 @@ return array(
 		'method_help' => 'A POST metódus hasznos adattartalma automatikusan támogatja az <code>application/x-www-form-urlencoded</code> és <code>application/json</code>',
 		'method_help' => 'A POST metódus hasznos adattartalma automatikusan támogatja az <code>application/x-www-form-urlencoded</code> és <code>application/json</code>',
 		'method_postparams' => 'POST metódus adattartalma',
 		'method_postparams' => 'POST metódus adattartalma',
 		'moved_category_deleted' => 'Ha kitörölsz egy kategóriát, az alá tartozó hírforrások automatikusan ide kerülnek <em>%s</em>.',
 		'moved_category_deleted' => 'Ha kitörölsz egy kategóriát, az alá tartozó hírforrások automatikusan ide kerülnek <em>%s</em>.',
-		'mute' => 'némítás',
+		'mute' => array(
+			'_' => 'némítás',
+			'state_is_muted' => 'This feed is muted',	// TODO
+		),
 		'no_selected' => 'Nincsen hírforrás kiválasztva.',
 		'no_selected' => 'Nincsen hírforrás kiválasztva.',
 		'number_entries' => '%d cikkek',
 		'number_entries' => '%d cikkek',
+		'open_feed' => 'Open feed %s',	// TODO
 		'priority' => array(
 		'priority' => array(
 			'_' => 'Láthatóság',
 			'_' => 'Láthatóság',
 			'archived' => 'Ne jelenjen meg (archivált)',
 			'archived' => 'Ne jelenjen meg (archivált)',

+ 3 - 0
app/i18n/id/gen.php

@@ -29,6 +29,9 @@ return array(
 		'load_default_shortcuts' => 'Load default shortcuts',	// TODO
 		'load_default_shortcuts' => 'Load default shortcuts',	// TODO
 		'manage' => 'Manage',	// TODO
 		'manage' => 'Manage',	// TODO
 		'mark_read' => 'Mark as read',	// TODO
 		'mark_read' => 'Mark as read',	// TODO
+		'menu' => array(
+			'open' => 'Open menu',	// TODO
+		),
 		'nav_buttons' => array(
 		'nav_buttons' => array(
 			'next' => 'Next article',	// TODO
 			'next' => 'Next article',	// TODO
 			'prev' => 'Previous article',	// TODO
 			'prev' => 'Previous article',	// TODO

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

@@ -29,7 +29,9 @@ return array(
 			'help' => 'Provide the URL to an <a href="http://opml.org/" target="_blank">OPML file</a> to dynamically populate this category with feeds',	// TODO
 			'help' => 'Provide the URL to an <a href="http://opml.org/" target="_blank">OPML file</a> to dynamically populate this category with feeds',	// TODO
 		),
 		),
 		'empty' => 'Empty category',	// TODO
 		'empty' => 'Empty category',	// TODO
+		'expand' => 'Expand category',	// TODO
 		'information' => 'Information',	// TODO
 		'information' => 'Information',	// TODO
+		'open' => 'Open category',	// TODO
 		'opml_url' => 'OPML URL',	// TODO
 		'opml_url' => 'OPML URL',	// TODO
 		'position' => 'Display position',	// TODO
 		'position' => 'Display position',	// TODO
 		'position_help' => 'To control category sort order',	// TODO
 		'position_help' => 'To control category sort order',	// TODO
@@ -183,9 +185,13 @@ return array(
 		'method_help' => 'The POST payload has automatic support for <code>application/x-www-form-urlencoded</code> and <code>application/json</code>',	// TODO
 		'method_help' => 'The POST payload has automatic support for <code>application/x-www-form-urlencoded</code> and <code>application/json</code>',	// TODO
 		'method_postparams' => 'Payload for POST',	// TODO
 		'method_postparams' => 'Payload for POST',	// TODO
 		'moved_category_deleted' => 'When you delete a category, its feeds are automatically classified under <em>%s</em>.',	// TODO
 		'moved_category_deleted' => 'When you delete a category, its feeds are automatically classified under <em>%s</em>.',	// TODO
-		'mute' => 'mute',	// TODO
+		'mute' => array(
+			'_' => 'mute',	// TODO
+			'state_is_muted' => 'This feed is muted',	// TODO
+		),
 		'no_selected' => 'No feed selected.',	// TODO
 		'no_selected' => 'No feed selected.',	// TODO
 		'number_entries' => '%d articles',	// TODO
 		'number_entries' => '%d articles',	// TODO
+		'open_feed' => 'Open feed %s',	// TODO
 		'priority' => array(
 		'priority' => array(
 			'_' => 'Visibility',	// TODO
 			'_' => 'Visibility',	// TODO
 			'archived' => 'Do not show (archived)',	// TODO
 			'archived' => 'Do not show (archived)',	// TODO

+ 3 - 0
app/i18n/it/gen.php

@@ -29,6 +29,9 @@ return array(
 		'load_default_shortcuts' => 'Carica le scorciatoie di default',
 		'load_default_shortcuts' => 'Carica le scorciatoie di default',
 		'manage' => 'Gestisci',
 		'manage' => 'Gestisci',
 		'mark_read' => 'Segna come letto',
 		'mark_read' => 'Segna come letto',
+		'menu' => array(
+			'open' => 'Open menu',	// TODO
+		),
 		'nav_buttons' => array(
 		'nav_buttons' => array(
 			'next' => 'Next article',	// TODO
 			'next' => 'Next article',	// TODO
 			'prev' => 'Previous article',	// TODO
 			'prev' => 'Previous article',	// TODO

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

@@ -29,7 +29,9 @@ return array(
 			'help' => 'Fornisci l’URL ad un <a href="http://opml.org/" target="_blank">file OPML</a> per popolare dinamicamente questa categoria con i feed',
 			'help' => 'Fornisci l’URL ad un <a href="http://opml.org/" target="_blank">file OPML</a> per popolare dinamicamente questa categoria con i feed',
 		),
 		),
 		'empty' => 'Categoria vuota',
 		'empty' => 'Categoria vuota',
+		'expand' => 'Expand category',	// TODO
 		'information' => 'Informazioni',
 		'information' => 'Informazioni',
+		'open' => 'Open category',	// TODO
 		'opml_url' => 'URL OPML',
 		'opml_url' => 'URL OPML',
 		'position' => 'Mostra posizione',
 		'position' => 'Mostra posizione',
 		'position_help' => 'Per controllare l’ordinamento della categoria',
 		'position_help' => 'Per controllare l’ordinamento della categoria',
@@ -183,9 +185,13 @@ return array(
 		'method_help' => 'Il payload POST ha il supporto automatico per <code>application/x-www-form-urlencoded</code> e <code>application/json</code>',
 		'method_help' => 'Il payload POST ha il supporto automatico per <code>application/x-www-form-urlencoded</code> e <code>application/json</code>',
 		'method_postparams' => 'Payload per POST',
 		'method_postparams' => 'Payload per POST',
 		'moved_category_deleted' => 'Cancellando una categoria i feed al suo interno verranno classificati automaticamente come <em>%s</em>.',
 		'moved_category_deleted' => 'Cancellando una categoria i feed al suo interno verranno classificati automaticamente come <em>%s</em>.',
-		'mute' => 'muta',
+		'mute' => array(
+			'_' => 'muta',
+			'state_is_muted' => 'This feed is muted',	// TODO
+		),
 		'no_selected' => 'Nessun feed selezionato.',
 		'no_selected' => 'Nessun feed selezionato.',
 		'number_entries' => '%d articoli',
 		'number_entries' => '%d articoli',
+		'open_feed' => 'Open feed %s',	// TODO
 		'priority' => array(
 		'priority' => array(
 			'_' => 'Visibilità',
 			'_' => 'Visibilità',
 			'archived' => 'Non mostrare (archiviato)',
 			'archived' => 'Non mostrare (archiviato)',

+ 3 - 0
app/i18n/ja/gen.php

@@ -29,6 +29,9 @@ return array(
 		'load_default_shortcuts' => 'デフォルトのショートカットを読み込む',
 		'load_default_shortcuts' => 'デフォルトのショートカットを読み込む',
 		'manage' => '管理',
 		'manage' => '管理',
 		'mark_read' => '既読にする',
 		'mark_read' => '既読にする',
+		'menu' => array(
+			'open' => 'Open menu',	// TODO
+		),
 		'nav_buttons' => array(
 		'nav_buttons' => array(
 			'next' => '次の記事',
 			'next' => '次の記事',
 			'prev' => '前の記事',
 			'prev' => '前の記事',

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

@@ -29,7 +29,9 @@ return array(
 			'help' => '<a href="http://opml.org/" target="_blank">から提供されたOPMLファイル</a>をこのカテゴリに動的に追加します。',
 			'help' => '<a href="http://opml.org/" target="_blank">から提供されたOPMLファイル</a>をこのカテゴリに動的に追加します。',
 		),
 		),
 		'empty' => 'からのカテゴリ',
 		'empty' => 'からのカテゴリ',
+		'expand' => 'Expand category',	// TODO
 		'information' => 'インフォメーション',
 		'information' => 'インフォメーション',
+		'open' => 'Open category',	// TODO
 		'opml_url' => 'OPMLのURL',
 		'opml_url' => 'OPMLのURL',
 		'position' => '表示位置',
 		'position' => '表示位置',
 		'position_help' => 'カテゴリの表示順を操作する',
 		'position_help' => 'カテゴリの表示順を操作する',
@@ -183,9 +185,13 @@ return array(
 		'method_help' => 'POSTペイロードは <code>application/x-www-form-urlencoded</code> と <code>application/json</code> を自動的にサポートしています',
 		'method_help' => 'POSTペイロードは <code>application/x-www-form-urlencoded</code> と <code>application/json</code> を自動的にサポートしています',
 		'method_postparams' => 'POST用ペイロード',
 		'method_postparams' => 'POST用ペイロード',
 		'moved_category_deleted' => 'カテゴリを削除したとき、フィードは自動的に<em>%s</em>下に分類されます。',
 		'moved_category_deleted' => 'カテゴリを削除したとき、フィードは自動的に<em>%s</em>下に分類されます。',
-		'mute' => 'ミュート',
+		'mute' => array(
+			'_' => 'ミュート',
+			'state_is_muted' => 'This feed is muted',	// TODO
+		),
 		'no_selected' => 'どのフィードも選択されていません',
 		'no_selected' => 'どのフィードも選択されていません',
 		'number_entries' => '%d 記事数',
 		'number_entries' => '%d 記事数',
+		'open_feed' => 'Open feed %s',	// TODO
 		'priority' => array(
 		'priority' => array(
 			'_' => '表示する場所',
 			'_' => '表示する場所',
 			'archived' => '非表示にする(アーカイブ)',
 			'archived' => '非表示にする(アーカイブ)',

+ 3 - 0
app/i18n/ko/gen.php

@@ -29,6 +29,9 @@ return array(
 		'load_default_shortcuts' => '기본 단축키 불러오기',
 		'load_default_shortcuts' => '기본 단축키 불러오기',
 		'manage' => '관리',
 		'manage' => '관리',
 		'mark_read' => '읽음으로 표시',
 		'mark_read' => '읽음으로 표시',
+		'menu' => array(
+			'open' => 'Open menu',	// TODO
+		),
 		'nav_buttons' => array(
 		'nav_buttons' => array(
 			'next' => 'Next article',	// TODO
 			'next' => 'Next article',	// TODO
 			'prev' => 'Previous article',	// TODO
 			'prev' => 'Previous article',	// TODO

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

@@ -29,7 +29,9 @@ return array(
 			'help' => '이 카테코리에 피드를 동적으로 채우려면 <a href="http://opml.org/" target="_blank">OPML 파일</a> 의 URL을 제공해주세요',
 			'help' => '이 카테코리에 피드를 동적으로 채우려면 <a href="http://opml.org/" target="_blank">OPML 파일</a> 의 URL을 제공해주세요',
 		),
 		),
 		'empty' => '빈 카테고리',
 		'empty' => '빈 카테고리',
+		'expand' => 'Expand category',	// TODO
 		'information' => '정보',
 		'information' => '정보',
+		'open' => 'Open category',	// TODO
 		'opml_url' => 'OPML URL',	// IGNORE
 		'opml_url' => 'OPML URL',	// IGNORE
 		'position' => '표시 위치',
 		'position' => '표시 위치',
 		'position_help' => '정렬 순서 제어',
 		'position_help' => '정렬 순서 제어',
@@ -183,9 +185,13 @@ return array(
 		'method_help' => 'POST 페이로드는 <code>application/x-www-form-urlencoded</code> 및 <code>application/json</code>을 자동으로 지원합니다.',
 		'method_help' => 'POST 페이로드는 <code>application/x-www-form-urlencoded</code> 및 <code>application/json</code>을 자동으로 지원합니다.',
 		'method_postparams' => 'POST용 페이로드',
 		'method_postparams' => 'POST용 페이로드',
 		'moved_category_deleted' => '카테고리를 삭제하면, 해당 카테고리 아래에 있던 피드들은 자동적으로 <em>%s</em> 아래로 분류됩니다.',
 		'moved_category_deleted' => '카테고리를 삭제하면, 해당 카테고리 아래에 있던 피드들은 자동적으로 <em>%s</em> 아래로 분류됩니다.',
-		'mute' => '무기한 새로고침 금지',
+		'mute' => array(
+			'_' => '무기한 새로고침 금지',
+			'state_is_muted' => 'This feed is muted',	// TODO
+		),
 		'no_selected' => '선택된 피드가 없습니다.',
 		'no_selected' => '선택된 피드가 없습니다.',
 		'number_entries' => '%d 개의 글',
 		'number_entries' => '%d 개의 글',
+		'open_feed' => 'Open feed %s',	// TODO
 		'priority' => array(
 		'priority' => array(
 			'_' => '표시',
 			'_' => '표시',
 			'archived' => '표시하지 않음 (보관됨)',
 			'archived' => '표시하지 않음 (보관됨)',

+ 3 - 0
app/i18n/lv/gen.php

@@ -29,6 +29,9 @@ return array(
 		'load_default_shortcuts' => 'Ielādēt noklusējuma saīsnes',
 		'load_default_shortcuts' => 'Ielādēt noklusējuma saīsnes',
 		'manage' => 'Pārvaldīt',
 		'manage' => 'Pārvaldīt',
 		'mark_read' => 'Atzīmēt kā izlasītu',
 		'mark_read' => 'Atzīmēt kā izlasītu',
+		'menu' => array(
+			'open' => 'Open menu',	// TODO
+		),
 		'nav_buttons' => array(
 		'nav_buttons' => array(
 			'next' => 'Next article',	// TODO
 			'next' => 'Next article',	// TODO
 			'prev' => 'Previous article',	// TODO
 			'prev' => 'Previous article',	// TODO

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

@@ -29,7 +29,9 @@ return array(
 			'help' => 'Norādiet URL uz <a href="http://opml.org/" target="_blank">OPML failu</a>, lai dinamiski papildinātu šo kategoriju ar barotnēm.',
 			'help' => 'Norādiet URL uz <a href="http://opml.org/" target="_blank">OPML failu</a>, lai dinamiski papildinātu šo kategoriju ar barotnēm.',
 		),
 		),
 		'empty' => 'Tukša kategorija',
 		'empty' => 'Tukša kategorija',
+		'expand' => 'Expand category',	// TODO
 		'information' => 'Informācija',
 		'information' => 'Informācija',
+		'open' => 'Open category',	// TODO
 		'opml_url' => 'OPML URL',	// IGNORE
 		'opml_url' => 'OPML URL',	// IGNORE
 		'position' => 'Displeja pozīcija',
 		'position' => 'Displeja pozīcija',
 		'position_help' => 'Lai pārvaldītu kategoriju šķirošanas secību',
 		'position_help' => 'Lai pārvaldītu kategoriju šķirošanas secību',
@@ -183,9 +185,13 @@ return array(
 		'method_help' => 'The POST payload has automatic support for <code>application/x-www-form-urlencoded</code> and <code>application/json</code>',	// TODO
 		'method_help' => 'The POST payload has automatic support for <code>application/x-www-form-urlencoded</code> and <code>application/json</code>',	// TODO
 		'method_postparams' => 'Payload for POST',	// TODO
 		'method_postparams' => 'Payload for POST',	// TODO
 		'moved_category_deleted' => 'Kad dzēšat kategoriju, tās plūsmas automātiski tiek automātiski klasificētas kategorijā <em>%s</em>.',
 		'moved_category_deleted' => 'Kad dzēšat kategoriju, tās plūsmas automātiski tiek automātiski klasificētas kategorijā <em>%s</em>.',
-		'mute' => 'klusināt',
+		'mute' => array(
+			'_' => 'klusināt',
+			'state_is_muted' => 'This feed is muted',	// TODO
+		),
 		'no_selected' => 'Barotne nav izvēlēta.',
 		'no_selected' => 'Barotne nav izvēlēta.',
 		'number_entries' => '%d raksti',
 		'number_entries' => '%d raksti',
+		'open_feed' => 'Open feed %s',	// TODO
 		'priority' => array(
 		'priority' => array(
 			'_' => 'Prioritāte',
 			'_' => 'Prioritāte',
 			'archived' => 'Nerādīt (arhivēts)',
 			'archived' => 'Nerādīt (arhivēts)',

+ 3 - 0
app/i18n/nl/gen.php

@@ -29,6 +29,9 @@ return array(
 		'load_default_shortcuts' => 'Standaardshortcuts laden',
 		'load_default_shortcuts' => 'Standaardshortcuts laden',
 		'manage' => 'Beheren',
 		'manage' => 'Beheren',
 		'mark_read' => 'Markeer als gelezen',
 		'mark_read' => 'Markeer als gelezen',
+		'menu' => array(
+			'open' => 'Open menu',	// TODO
+		),
 		'nav_buttons' => array(
 		'nav_buttons' => array(
 			'next' => 'Next article',	// TODO
 			'next' => 'Next article',	// TODO
 			'prev' => 'Previous article',	// TODO
 			'prev' => 'Previous article',	// TODO

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

@@ -29,7 +29,9 @@ return array(
 			'help' => 'Geef de URL naar een <a href="http://opml.org/" target="_blank">OPML-bestand</a> om deze categorie dynamisch met feeds te vullen',
 			'help' => 'Geef de URL naar een <a href="http://opml.org/" target="_blank">OPML-bestand</a> om deze categorie dynamisch met feeds te vullen',
 		),
 		),
 		'empty' => 'Lege categorie',
 		'empty' => 'Lege categorie',
+		'expand' => 'Expand category',	// TODO
 		'information' => 'Informatie',
 		'information' => 'Informatie',
+		'open' => 'Open category',	// TODO
 		'opml_url' => 'OPML URL',	// IGNORE
 		'opml_url' => 'OPML URL',	// IGNORE
 		'position' => 'Weergavepositie',
 		'position' => 'Weergavepositie',
 		'position_help' => 'Om de categorieweergave-sorteervolgorde te controleren',
 		'position_help' => 'Om de categorieweergave-sorteervolgorde te controleren',
@@ -183,9 +185,13 @@ return array(
 		'method_help' => 'De POST-payload ondersteunt automatisch <code>application/x-www-form-urlencoded</code> en <code>application/json</code>',
 		'method_help' => 'De POST-payload ondersteunt automatisch <code>application/x-www-form-urlencoded</code> en <code>application/json</code>',
 		'method_postparams' => 'Payload voor POST',
 		'method_postparams' => 'Payload voor POST',
 		'moved_category_deleted' => 'Als u een categorie verwijderd, worden de feeds automatisch geclassificeerd onder <em>%s</em>.',
 		'moved_category_deleted' => 'Als u een categorie verwijderd, worden de feeds automatisch geclassificeerd onder <em>%s</em>.',
-		'mute' => 'demp',
+		'mute' => array(
+			'_' => 'demp',
+			'state_is_muted' => 'This feed is muted',	// TODO
+		),
 		'no_selected' => 'Geen feed geselecteerd.',
 		'no_selected' => 'Geen feed geselecteerd.',
 		'number_entries' => '%d artikelen',
 		'number_entries' => '%d artikelen',
+		'open_feed' => 'Open feed %s',	// TODO
 		'priority' => array(
 		'priority' => array(
 			'_' => 'Zichtbaarheid',
 			'_' => 'Zichtbaarheid',
 			'archived' => 'Niet weergeven (gearchiveerd)',
 			'archived' => 'Niet weergeven (gearchiveerd)',

+ 3 - 0
app/i18n/oc/gen.php

@@ -29,6 +29,9 @@ return array(
 		'load_default_shortcuts' => 'Cargar los acorchis per defaut',
 		'load_default_shortcuts' => 'Cargar los acorchis per defaut',
 		'manage' => 'Gerir',
 		'manage' => 'Gerir',
 		'mark_read' => 'Marcar coma legit',
 		'mark_read' => 'Marcar coma legit',
+		'menu' => array(
+			'open' => 'Open menu',	// TODO
+		),
 		'nav_buttons' => array(
 		'nav_buttons' => array(
 			'next' => 'Next article',	// TODO
 			'next' => 'Next article',	// TODO
 			'prev' => 'Previous article',	// TODO
 			'prev' => 'Previous article',	// TODO

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

@@ -29,7 +29,9 @@ return array(
 			'help' => 'Fornís l’URL per un <a href="http://opml.org/" target="_blank">fichièr OPML</a> per garnir automaticament aquesta categoria amb de flux',
 			'help' => 'Fornís l’URL per un <a href="http://opml.org/" target="_blank">fichièr OPML</a> per garnir automaticament aquesta categoria amb de flux',
 		),
 		),
 		'empty' => 'Categoria voida',
 		'empty' => 'Categoria voida',
+		'expand' => 'Expand category',	// TODO
 		'information' => 'Informacions',
 		'information' => 'Informacions',
+		'open' => 'Open category',	// TODO
 		'opml_url' => 'URL OPML',
 		'opml_url' => 'URL OPML',
 		'position' => 'Mostrar la posicion',
 		'position' => 'Mostrar la posicion',
 		'position_help' => 'Per contrarotlar l’òrdre de tria de la categoria',
 		'position_help' => 'Per contrarotlar l’òrdre de tria de la categoria',
@@ -183,9 +185,13 @@ return array(
 		'method_help' => 'The POST payload has automatic support for <code>application/x-www-form-urlencoded</code> and <code>application/json</code>',	// TODO
 		'method_help' => 'The POST payload has automatic support for <code>application/x-www-form-urlencoded</code> and <code>application/json</code>',	// TODO
 		'method_postparams' => 'Payload for POST',	// TODO
 		'method_postparams' => 'Payload for POST',	// TODO
 		'moved_category_deleted' => 'Quand escafatz una categoria, sos fluxes son automaticament classats dins <em>%s</em>.',
 		'moved_category_deleted' => 'Quand escafatz una categoria, sos fluxes son automaticament classats dins <em>%s</em>.',
-		'mute' => 'mut',
+		'mute' => array(
+			'_' => 'mut',
+			'state_is_muted' => 'This feed is muted',	// TODO
+		),
 		'no_selected' => 'Cap de flux pas seleccionat.',
 		'no_selected' => 'Cap de flux pas seleccionat.',
 		'number_entries' => '%d articles',	// IGNORE
 		'number_entries' => '%d articles',	// IGNORE
+		'open_feed' => 'Open feed %s',	// TODO
 		'priority' => array(
 		'priority' => array(
 			'_' => 'Visibilitat',
 			'_' => 'Visibilitat',
 			'archived' => 'Mostrar pas (archivat)',
 			'archived' => 'Mostrar pas (archivat)',

+ 3 - 0
app/i18n/pl/gen.php

@@ -29,6 +29,9 @@ return array(
 		'load_default_shortcuts' => 'Ustaw domyślne skróty',
 		'load_default_shortcuts' => 'Ustaw domyślne skróty',
 		'manage' => 'Ustawienia',
 		'manage' => 'Ustawienia',
 		'mark_read' => 'Oznacz jako przeczytane',
 		'mark_read' => 'Oznacz jako przeczytane',
+		'menu' => array(
+			'open' => 'Open menu',	// TODO
+		),
 		'nav_buttons' => array(
 		'nav_buttons' => array(
 			'next' => 'Next article',	// TODO
 			'next' => 'Next article',	// TODO
 			'prev' => 'Previous article',	// TODO
 			'prev' => 'Previous article',	// TODO

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

@@ -29,7 +29,9 @@ return array(
 			'help' => 'Podaj adres <a href="http://opml.org/" target="_blank">pliku OPML</a>, aby dynamicznie zapełnić tę kategorię kanałami',
 			'help' => 'Podaj adres <a href="http://opml.org/" target="_blank">pliku OPML</a>, aby dynamicznie zapełnić tę kategorię kanałami',
 		),
 		),
 		'empty' => 'Pusta kategoria',
 		'empty' => 'Pusta kategoria',
+		'expand' => 'Expand category',	// TODO
 		'information' => 'Informacje',
 		'information' => 'Informacje',
+		'open' => 'Open category',	// TODO
 		'opml_url' => 'Adres OPML',
 		'opml_url' => 'Adres OPML',
 		'position' => 'Miejsce wyświetlania',
 		'position' => 'Miejsce wyświetlania',
 		'position_help' => 'Kontrola porządku sortowania kategorii',
 		'position_help' => 'Kontrola porządku sortowania kategorii',
@@ -183,9 +185,13 @@ return array(
 		'method_help' => 'Ładunek w POST automatycznie wspiera <code>application/x-www-form-urlencoded</code> oraz <code>application/json</code>',
 		'method_help' => 'Ładunek w POST automatycznie wspiera <code>application/x-www-form-urlencoded</code> oraz <code>application/json</code>',
 		'method_postparams' => 'Ładunek w POST',
 		'method_postparams' => 'Ładunek w POST',
 		'moved_category_deleted' => 'Po usunięciu kategorii znajdujące się w niej kanały zostaną automatycznie przeniesione do <em>%s</em>.',
 		'moved_category_deleted' => 'Po usunięciu kategorii znajdujące się w niej kanały zostaną automatycznie przeniesione do <em>%s</em>.',
-		'mute' => 'wycisz',
+		'mute' => array(
+			'_' => 'wycisz',
+			'state_is_muted' => 'This feed is muted',	// TODO
+		),
 		'no_selected' => 'Brak kanałów.',
 		'no_selected' => 'Brak kanałów.',
 		'number_entries' => '%d wiadomości',
 		'number_entries' => '%d wiadomości',
+		'open_feed' => 'Open feed %s',	// TODO
 		'priority' => array(
 		'priority' => array(
 			'_' => 'Widoczność',
 			'_' => 'Widoczność',
 			'archived' => 'Nie pokazuj (zarchiwizowany)',
 			'archived' => 'Nie pokazuj (zarchiwizowany)',

+ 3 - 0
app/i18n/pt-br/gen.php

@@ -29,6 +29,9 @@ return array(
 		'load_default_shortcuts' => 'Carregar mais atalhos',
 		'load_default_shortcuts' => 'Carregar mais atalhos',
 		'manage' => 'Gerenciar',
 		'manage' => 'Gerenciar',
 		'mark_read' => 'Marcar como lido',
 		'mark_read' => 'Marcar como lido',
+		'menu' => array(
+			'open' => 'Open menu',	// TODO
+		),
 		'nav_buttons' => array(
 		'nav_buttons' => array(
 			'next' => 'Next article',	// TODO
 			'next' => 'Next article',	// TODO
 			'prev' => 'Previous article',	// TODO
 			'prev' => 'Previous article',	// TODO

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

@@ -29,7 +29,9 @@ return array(
 			'help' => 'Forneça uma URL para <a href="http://opml.org/" target="_blank">o arquivo OPML </a> para preencher dinamicamente esta categoria com feeds',
 			'help' => 'Forneça uma URL para <a href="http://opml.org/" target="_blank">o arquivo OPML </a> para preencher dinamicamente esta categoria com feeds',
 		),
 		),
 		'empty' => 'Categoria vazia',
 		'empty' => 'Categoria vazia',
+		'expand' => 'Expand category',	// TODO
 		'information' => 'Informações',
 		'information' => 'Informações',
+		'open' => 'Open category',	// TODO
 		'opml_url' => 'URL de OPML',
 		'opml_url' => 'URL de OPML',
 		'position' => 'Posição de exibição',
 		'position' => 'Posição de exibição',
 		'position_help' => 'Para controlar a ordem de exibição',
 		'position_help' => 'Para controlar a ordem de exibição',
@@ -183,9 +185,13 @@ return array(
 		'method_help' => 'O conteúdo do POST tem suporte automático para <code>application/x-www-form-urlencoded</code> e <code>application/json</code>',
 		'method_help' => 'O conteúdo do POST tem suporte automático para <code>application/x-www-form-urlencoded</code> e <code>application/json</code>',
 		'method_postparams' => 'Conteúdo do POST',
 		'method_postparams' => 'Conteúdo do POST',
 		'moved_category_deleted' => 'Quando você deleta uma categoria, seus feeds são automaticamente classificados como <em>%s</em>.',
 		'moved_category_deleted' => 'Quando você deleta uma categoria, seus feeds são automaticamente classificados como <em>%s</em>.',
-		'mute' => 'silenciar',
+		'mute' => array(
+			'_' => 'silenciar',
+			'state_is_muted' => 'This feed is muted',	// TODO
+		),
 		'no_selected' => 'Nenhum feed selecionado.',
 		'no_selected' => 'Nenhum feed selecionado.',
 		'number_entries' => '%d artigos',
 		'number_entries' => '%d artigos',
+		'open_feed' => 'Open feed %s',	// TODO
 		'priority' => array(
 		'priority' => array(
 			'_' => 'Visibilidade',
 			'_' => 'Visibilidade',
 			'archived' => 'Não exibir (arquivado)',
 			'archived' => 'Não exibir (arquivado)',

+ 3 - 0
app/i18n/ru/gen.php

@@ -29,6 +29,9 @@ return array(
 		'load_default_shortcuts' => 'Загрузить горячие клавиши по умолчанию',
 		'load_default_shortcuts' => 'Загрузить горячие клавиши по умолчанию',
 		'manage' => 'Настроить',
 		'manage' => 'Настроить',
 		'mark_read' => 'Отметить прочитанным',
 		'mark_read' => 'Отметить прочитанным',
+		'menu' => array(
+			'open' => 'Open menu',	// TODO
+		),
 		'nav_buttons' => array(
 		'nav_buttons' => array(
 			'next' => 'Next article',	// TODO
 			'next' => 'Next article',	// TODO
 			'prev' => 'Previous article',	// TODO
 			'prev' => 'Previous article',	// TODO

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

@@ -29,7 +29,9 @@ return array(
 			'help' => 'Предоставьте ссылку на <a href="http://opml.org/" target="_blank">OPML файл</a> чтобы динамично заполнять эту категорию лентами',
 			'help' => 'Предоставьте ссылку на <a href="http://opml.org/" target="_blank">OPML файл</a> чтобы динамично заполнять эту категорию лентами',
 		),
 		),
 		'empty' => 'Пустая категория',
 		'empty' => 'Пустая категория',
+		'expand' => 'Expand category',	// TODO
 		'information' => 'Информация',
 		'information' => 'Информация',
+		'open' => 'Open category',	// TODO
 		'opml_url' => 'OPML ссылка',
 		'opml_url' => 'OPML ссылка',
 		'position' => 'Положение отображения',
 		'position' => 'Положение отображения',
 		'position_help' => 'Влияет на порядок отображения категорий',
 		'position_help' => 'Влияет на порядок отображения категорий',
@@ -183,9 +185,13 @@ return array(
 		'method_help' => 'Полезная нагрузка POST автоматически поддерживает <code>application/x-www-form-urlencoded</code> и <code>application/json</code>',
 		'method_help' => 'Полезная нагрузка POST автоматически поддерживает <code>application/x-www-form-urlencoded</code> и <code>application/json</code>',
 		'method_postparams' => 'Полезная нагрузка POST',
 		'method_postparams' => 'Полезная нагрузка POST',
 		'moved_category_deleted' => 'Когда вы удаляете категорию, ленты категории автоматически попадают в категорию <em>%s</em>.',
 		'moved_category_deleted' => 'Когда вы удаляете категорию, ленты категории автоматически попадают в категорию <em>%s</em>.',
-		'mute' => 'заглушить',
+		'mute' => array(
+			'_' => 'заглушить',
+			'state_is_muted' => 'This feed is muted',	// TODO
+		),
 		'no_selected' => 'Ленты не выбраны.',
 		'no_selected' => 'Ленты не выбраны.',
 		'number_entries' => '%d статей',
 		'number_entries' => '%d статей',
+		'open_feed' => 'Open feed %s',	// TODO
 		'priority' => array(
 		'priority' => array(
 			'_' => 'Видимость',
 			'_' => 'Видимость',
 			'archived' => 'Не показывать (архивировано)',
 			'archived' => 'Не показывать (архивировано)',

+ 3 - 0
app/i18n/sk/gen.php

@@ -29,6 +29,9 @@ return array(
 		'load_default_shortcuts' => 'Načítať prednastavené klávesové skratky',
 		'load_default_shortcuts' => 'Načítať prednastavené klávesové skratky',
 		'manage' => 'Spravovať',
 		'manage' => 'Spravovať',
 		'mark_read' => 'Označiť ako prečítané',
 		'mark_read' => 'Označiť ako prečítané',
+		'menu' => array(
+			'open' => 'Open menu',	// TODO
+		),
 		'nav_buttons' => array(
 		'nav_buttons' => array(
 			'next' => 'Next article',	// TODO
 			'next' => 'Next article',	// TODO
 			'prev' => 'Previous article',	// TODO
 			'prev' => 'Previous article',	// TODO

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

@@ -29,7 +29,9 @@ return array(
 			'help' => 'Zadajte URL adresu k <a href="http://opml.org/" target="_blank">OPML súboru</a>, z ktorého sa táto kategória automaticky naplní kanálmi.',
 			'help' => 'Zadajte URL adresu k <a href="http://opml.org/" target="_blank">OPML súboru</a>, z ktorého sa táto kategória automaticky naplní kanálmi.',
 		),
 		),
 		'empty' => 'Prázdna kategória',
 		'empty' => 'Prázdna kategória',
+		'expand' => 'Expand category',	// TODO
 		'information' => 'Informácia',
 		'information' => 'Informácia',
+		'open' => 'Open category',	// TODO
 		'opml_url' => 'OPML URL',	// IGNORE
 		'opml_url' => 'OPML URL',	// IGNORE
 		'position' => 'Zobrazť pozíciu',
 		'position' => 'Zobrazť pozíciu',
 		'position_help' => 'Na kontrolu zoradenia kategórií',
 		'position_help' => 'Na kontrolu zoradenia kategórií',
@@ -183,9 +185,13 @@ return array(
 		'method_help' => 'Ako parametre metódy POST sú podporované <code>application/x-www-form-urlencoded</code> a <code>application/json</code>',
 		'method_help' => 'Ako parametre metódy POST sú podporované <code>application/x-www-form-urlencoded</code> a <code>application/json</code>',
 		'method_postparams' => 'Parametre metódy POST',
 		'method_postparams' => 'Parametre metódy POST',
 		'moved_category_deleted' => 'Keď vymažete kategóriu, jej kanály sa automaticky zaradia pod <em>%s</em>.',
 		'moved_category_deleted' => 'Keď vymažete kategóriu, jej kanály sa automaticky zaradia pod <em>%s</em>.',
-		'mute' => 'stíšiť',
+		'mute' => array(
+			'_' => 'stíšiť',
+			'state_is_muted' => 'This feed is muted',	// TODO
+		),
 		'no_selected' => 'Nevybrali ste kanál.',
 		'no_selected' => 'Nevybrali ste kanál.',
 		'number_entries' => 'Počet článkov: %d',
 		'number_entries' => 'Počet článkov: %d',
+		'open_feed' => 'Open feed %s',	// TODO
 		'priority' => array(
 		'priority' => array(
 			'_' => 'Viditeľnosť',
 			'_' => 'Viditeľnosť',
 			'archived' => 'Nezobrazovať (archivované)',
 			'archived' => 'Nezobrazovať (archivované)',

+ 3 - 0
app/i18n/tr/gen.php

@@ -29,6 +29,9 @@ return array(
 		'load_default_shortcuts' => 'Öntanımlı kısayolları yükle',
 		'load_default_shortcuts' => 'Öntanımlı kısayolları yükle',
 		'manage' => 'Yönet',
 		'manage' => 'Yönet',
 		'mark_read' => 'Okundu olarak işaretle',
 		'mark_read' => 'Okundu olarak işaretle',
+		'menu' => array(
+			'open' => 'Open menu',	// TODO
+		),
 		'nav_buttons' => array(
 		'nav_buttons' => array(
 			'next' => 'Next article',	// TODO
 			'next' => 'Next article',	// TODO
 			'prev' => 'Previous article',	// TODO
 			'prev' => 'Previous article',	// TODO

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

@@ -29,7 +29,9 @@ return array(
 			'help' => 'Dinamik olarak bu kategoriyi akışla doldurmak için bir link <a href="http://opml.org/" target="_blank">OPML file</a> sağla',
 			'help' => 'Dinamik olarak bu kategoriyi akışla doldurmak için bir link <a href="http://opml.org/" target="_blank">OPML file</a> sağla',
 		),
 		),
 		'empty' => 'Boş kategori',
 		'empty' => 'Boş kategori',
+		'expand' => 'Expand category',	// TODO
 		'information' => 'Bilgi',
 		'information' => 'Bilgi',
+		'open' => 'Open category',	// TODO
 		'opml_url' => 'OPML linki',
 		'opml_url' => 'OPML linki',
 		'position' => 'Konumu göster',
 		'position' => 'Konumu göster',
 		'position_help' => 'Kategori sıralama düzenini kontrol etmek için',
 		'position_help' => 'Kategori sıralama düzenini kontrol etmek için',
@@ -183,9 +185,13 @@ return array(
 		'method_help' => 'POST payload otomatik yardımı için <code>application/x-www-form-urlencoded</code> ve <code>application/json</code>',
 		'method_help' => 'POST payload otomatik yardımı için <code>application/x-www-form-urlencoded</code> ve <code>application/json</code>',
 		'method_postparams' => 'Payload for POST',	// IGNORE
 		'method_postparams' => 'Payload for POST',	// IGNORE
 		'moved_category_deleted' => 'Bir kategoriyi silerseniz, içerisindeki akışlar <em>%s</em> içerisine yerleşir.',
 		'moved_category_deleted' => 'Bir kategoriyi silerseniz, içerisindeki akışlar <em>%s</em> içerisine yerleşir.',
-		'mute' => 'sessize al',
+		'mute' => array(
+			'_' => 'sessize al',
+			'state_is_muted' => 'This feed is muted',	// TODO
+		),
 		'no_selected' => 'Hiçbir akış seçilmedi.',
 		'no_selected' => 'Hiçbir akış seçilmedi.',
 		'number_entries' => '%d makale',
 		'number_entries' => '%d makale',
+		'open_feed' => 'Open feed %s',	// TODO
 		'priority' => array(
 		'priority' => array(
 			'_' => 'Görünürlük',
 			'_' => 'Görünürlük',
 			'archived' => 'Gösterme (arşivlenmiş)',
 			'archived' => 'Gösterme (arşivlenmiş)',

+ 3 - 0
app/i18n/zh-cn/gen.php

@@ -29,6 +29,9 @@ return array(
 		'load_default_shortcuts' => '加载默认快捷键',
 		'load_default_shortcuts' => '加载默认快捷键',
 		'manage' => '管理',
 		'manage' => '管理',
 		'mark_read' => '标记已读',
 		'mark_read' => '标记已读',
+		'menu' => array(
+			'open' => 'Open menu',	// TODO
+		),
 		'nav_buttons' => array(
 		'nav_buttons' => array(
 			'next' => 'Next article',	// TODO
 			'next' => 'Next article',	// TODO
 			'prev' => 'Previous article',	// TODO
 			'prev' => 'Previous article',	// TODO

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

@@ -29,7 +29,9 @@ return array(
 			'help' => '使用 URL 上的 <a href="http://opml.org/" target="_blank">OPML 文件</a> 中的订阅源填充这一分类',
 			'help' => '使用 URL 上的 <a href="http://opml.org/" target="_blank">OPML 文件</a> 中的订阅源填充这一分类',
 		),
 		),
 		'empty' => '空分类',
 		'empty' => '空分类',
+		'expand' => 'Expand category',	// TODO
 		'information' => '信息',
 		'information' => '信息',
+		'open' => 'Open category',	// TODO
 		'opml_url' => 'OPML URL',	// IGNORE
 		'opml_url' => 'OPML URL',	// IGNORE
 		'position' => '显示位置',
 		'position' => '显示位置',
 		'position_help' => '控制分类排列顺序',
 		'position_help' => '控制分类排列顺序',
@@ -183,9 +185,13 @@ return array(
 		'method_help' => '如果荷载非空且是合法的 JSON,HTTP 请求标头将被自动设为 <code>application/json</code>,否则使用 <code>application/x-www-form-urlencoded</code>',
 		'method_help' => '如果荷载非空且是合法的 JSON,HTTP 请求标头将被自动设为 <code>application/json</code>,否则使用 <code>application/x-www-form-urlencoded</code>',
 		'method_postparams' => 'POST 荷载',
 		'method_postparams' => 'POST 荷载',
 		'moved_category_deleted' => '删除分类时,其中的订阅源会自动归类到 <em>%s</em>',
 		'moved_category_deleted' => '删除分类时,其中的订阅源会自动归类到 <em>%s</em>',
-		'mute' => '暂停',
+		'mute' => array(
+			'_' => '暂停',
+			'state_is_muted' => 'This feed is muted',	// TODO
+		),
 		'no_selected' => '未选择订阅源',
 		'no_selected' => '未选择订阅源',
 		'number_entries' => '%d 篇文章',
 		'number_entries' => '%d 篇文章',
+		'open_feed' => 'Open feed %s',	// TODO
 		'priority' => array(
 		'priority' => array(
 			'_' => '可见性',
 			'_' => '可见性',
 			'archived' => '不显示(归档)',
 			'archived' => '不显示(归档)',

+ 3 - 0
app/i18n/zh-tw/gen.php

@@ -29,6 +29,9 @@ return array(
 		'load_default_shortcuts' => '重置快捷鍵',
 		'load_default_shortcuts' => '重置快捷鍵',
 		'manage' => '管理',
 		'manage' => '管理',
 		'mark_read' => '標記已讀',
 		'mark_read' => '標記已讀',
+		'menu' => array(
+			'open' => 'Open menu',	// TODO
+		),
 		'nav_buttons' => array(
 		'nav_buttons' => array(
 			'next' => 'Next article',	// TODO
 			'next' => 'Next article',	// TODO
 			'prev' => 'Previous article',	// TODO
 			'prev' => 'Previous article',	// TODO

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

@@ -29,7 +29,9 @@ return array(
 			'help' => '使用地址上的 <a href="http://opml.org/" target="_blank">OPML 文件</a> 中的訂閱源填充這一分類',
 			'help' => '使用地址上的 <a href="http://opml.org/" target="_blank">OPML 文件</a> 中的訂閱源填充這一分類',
 		),
 		),
 		'empty' => '空分類',
 		'empty' => '空分類',
+		'expand' => 'Expand category',	// TODO
 		'information' => '信息',
 		'information' => '信息',
+		'open' => 'Open category',	// TODO
 		'opml_url' => 'OPML 地址',
 		'opml_url' => 'OPML 地址',
 		'position' => '顯示位置',
 		'position' => '顯示位置',
 		'position_help' => '控制分類排列順序',
 		'position_help' => '控制分類排列順序',
@@ -183,9 +185,13 @@ return array(
 		'method_help' => 'The POST payload has automatic support for <code>application/x-www-form-urlencoded</code> and <code>application/json</code>',	// TODO
 		'method_help' => 'The POST payload has automatic support for <code>application/x-www-form-urlencoded</code> and <code>application/json</code>',	// TODO
 		'method_postparams' => 'Payload for POST',	// TODO
 		'method_postparams' => 'Payload for POST',	// TODO
 		'moved_category_deleted' => '刪除分類時,其中的訂閱源會自動歸類到 <em>%s</em>',
 		'moved_category_deleted' => '刪除分類時,其中的訂閱源會自動歸類到 <em>%s</em>',
-		'mute' => '暫停',
+		'mute' => array(
+			'_' => '暫停',
+			'state_is_muted' => 'This feed is muted',	// TODO
+		),
 		'no_selected' => '未選擇訂閱源',
 		'no_selected' => '未選擇訂閱源',
 		'number_entries' => '%d 篇文章',
 		'number_entries' => '%d 篇文章',
+		'open_feed' => 'Open feed %s',	// TODO
 		'priority' => array(
 		'priority' => array(
 			'_' => '可見性',
 			'_' => '可見性',
 			'archived' => '不顯示(歸檔)',
 			'archived' => '不顯示(歸檔)',

+ 24 - 15
app/layout/aside_feed.phtml

@@ -57,9 +57,9 @@
 			$t_show = ($t_active && in_array(FreshRSS_Context::userConf()->display_categories, ['active', 'remember'], true)) || FreshRSS_Context::userConf()->display_categories === 'all';
 			$t_show = ($t_active && in_array(FreshRSS_Context::userConf()->display_categories, ['active', 'remember'], true)) || FreshRSS_Context::userConf()->display_categories === 'all';
 		?>
 		?>
 		<li id="tags" class="tree-folder category tags<?= $t_active ? ' active' : '' ?>" data-unread="<?= format_number($this->nbUnreadTags) ?>">
 		<li id="tags" class="tree-folder category tags<?= $t_active ? ' active' : '' ?>" data-unread="<?= format_number($this->nbUnreadTags) ?>">
-			<div class="tree-folder-title">
-				<a class="dropdown-toggle" href="#"><?= _i($t_show ? 'up' : 'down') ?></a><a class="title" data-unread="<?= format_number($this->nbUnreadTags) ?>" href="<?= _url('index', $actual_view, 'get', 'T') . $state_filter_manual ?>"><?= _t('index.menu.tags') ?></a>
-			</div>
+			<a href="<?= _url('index', $actual_view, 'get', 'T') . $state_filter_manual ?>" class="tree-folder-title">
+				<button class="dropdown-toggle" title="<?= _t('sub.category.expand') ?>"><?= _i($t_show ? 'up' : 'down') ?></button><span class="title" title="<?= _t('sub.category.open') ?>" data-unread="<?= format_number($this->nbUnreadTags) ?>"><?= _t('index.menu.tags') ?></span>
+			</a>
 			<ul class="tree-folder-items<?= $t_show ? ' active' : '' ?>">
 			<ul class="tree-folder-items<?= $t_show ? ' active' : '' ?>">
 				<?php
 				<?php
 					foreach ($this->tags as $tag):
 					foreach ($this->tags as $tag):
@@ -93,16 +93,18 @@
 		?>
 		?>
 		<li id="c_<?= $cat->id() ?>" class="tree-folder category<?= $c_active ? ' active' : '' ?>"<?=
 		<li id="c_<?= $cat->id() ?>" class="tree-folder category<?= $c_active ? ' active' : '' ?>"<?=
 			null === $position ? '' : " data-position='$position'" ?> data-unread="<?= $cat->nbNotRead() ?>">
 			null === $position ? '' : " data-position='$position'" ?> data-unread="<?= $cat->nbNotRead() ?>">
-			<div class="tree-folder-title">
-				<a class="dropdown-toggle" href="#"><?= _i($c_show ? 'up' : 'down') ?></a><a class="title<?= $cat->hasFeedsWithError() ? ' error' : '' ?>" data-unread="<?=
-					format_number($cat->nbNotRead()) ?>" href="<?= _url('index', $actual_view, 'get', 'c_' . $cat->id()) . $state_filter_manual ?>"><?=
+			<a href="<?= _url('index', $actual_view, 'get', 'c_' . $cat->id()) . $state_filter_manual ?>" class="tree-folder-title">
+				<button class="dropdown-toggle" title="<?= _t('sub.category.expand') ?>"><?= _i($c_show ? 'up' : 'down') ?></button><span title="<?= _t('sub.category.open') ?>" class="title<?= $cat->hasFeedsWithError() ? ' error' : '' ?>" data-unread="<?=
+					format_number($cat->nbNotRead()) ?>" ><?=
 						$cat->name()
 						$cat->name()
-					?><?php if ($cat->kind() == FreshRSS_Category::KIND_DYNAMIC_OPML) { echo _i('opml-dyn'); } ?></a>
-			</div>
+					?><?php if ($cat->kind() == FreshRSS_Category::KIND_DYNAMIC_OPML) { echo _i('opml-dyn'); } ?></span>
+			</a>
 
 
 			<ul class="tree-folder-items<?= $c_show ? ' active' : '' ?>">
 			<ul class="tree-folder-items<?= $c_show ? ' active' : '' ?>">
 <?php
 <?php
 	// NB: Reduce whitespace in that loop
 	// NB: Reduce whitespace in that loop
+	$show_favicon = FreshRSS_Context::userConf()->show_favicons && $nbFeedsTotal < FreshRSS_Context::userConf()->simplify_over_n_feeds;
+
 	foreach ($feeds as $feed):
 	foreach ($feeds as $feed):
 		$f_active = FreshRSS_Context::isCurrentGet('f_' . $feed->id());
 		$f_active = FreshRSS_Context::isCurrentGet('f_' . $feed->id());
 		$f_active_class = $f_active ? ' active' : '';
 		$f_active_class = $f_active ? ' active' : '';
@@ -122,16 +124,23 @@
 		}
 		}
 		$mute_class = $feed->mute() ? ' mute' : '';
 		$mute_class = $feed->mute() ? ' mute' : '';
 ?>
 ?>
-<li id="f_<?= $feed->id() ?>" class="item feed<?= $f_active_class, $mute_class, $error_class, $empty_class ?>" title="<?= $error_title, $empty_title ?>"
+<li id="f_<?= $feed->id() ?>" class="item feed<?= $f_active_class, $mute_class, $error_class, $empty_class ?>"
 		data-unread="<?= $feed->nbNotRead() ?>" data-priority="<?= $feed->priority() ?>"><?php
 		data-unread="<?= $feed->nbNotRead() ?>" data-priority="<?= $feed->priority() ?>"><?php
 		if ($f_active || $nbFeedsTotal < FreshRSS_Context::userConf()->simplify_over_n_feeds):
 		if ($f_active || $nbFeedsTotal < FreshRSS_Context::userConf()->simplify_over_n_feeds):
-	?><div class="dropdown no-mobile">
-		<div class="dropdown-target"></div><a class="dropdown-toggle" data-fweb="<?= $feed->website() ?>"><?= _i('configure') ?></a><?php /* feed_config_template */ ?>
-	</div><?php
-			if (FreshRSS_Context::userConf()->show_favicons) { ?><img class="favicon" src="<?= $feed->favicon() ?>" alt="✇" loading="lazy" /><?php }
+			?><div class="dropdown no-mobile">
+				<div id="dropdown-<?= $feed->id() ?>" class="dropdown-target"></div><a href="#dropdown-<?= $feed->id() ?>" class="dropdown-toggle" title="<?= _t('gen.action.menu.open') ?>" data-fweb="<?= $feed->website() ?>"><?= _i('configure') ?></a><?php /* feed_config_template */ ?>
+			</div><?php
 		endif;
 		endif;
-	?><a class="item-title" data-unread="<?= format_number($feed->nbNotRead()) ?>" href="<?=
-		_url('index', $actual_view, 'get', 'f_' . $feed->id()) . $state_filter_manual ?>"><?= $feed->name() ?></a></li>
+		$title = _t('sub.feed.open_feed', $feed->name());
+		$title .= $error_title !== '' ? '&#13;⚠ ' . $error_title : '';
+		$title .= $empty_title !== '' ? '&#13;' . $empty_title : '';
+		$title .= $feed->mute() ? '&#13;🔇 ' . _t('sub.feed.mute.state_is_muted') : '';
+		?><a class="item-title" title="<?= $title ?>"
+		data-unread="<?= format_number($feed->nbNotRead()) ?>" href="<?=
+		_url('index', $actual_view, 'get', 'f_' . $feed->id()) . $state_filter_manual ?>">
+		<?php
+		if ($show_favicon || $f_active) { ?><img class="favicon" src="<?= $feed->favicon() ?>" alt="✇" loading="lazy" /><?php }
+		?><span class="title"><?= $feed->name() ?></span></a></li>
 <?php
 <?php
 	endforeach;
 	endforeach;
 ?>
 ?>

+ 2 - 4
p/scripts/main.js

@@ -803,7 +803,7 @@ function openCategory(category_id) {
 	const category_element = document.getElementById(category_id);
 	const category_element = document.getElementById(category_id);
 	if (!category_element) return;
 	if (!category_element) return;
 	category_element.querySelector('.tree-folder-items').classList.add('active');
 	category_element.querySelector('.tree-folder-items').classList.add('active');
-	const img = category_element.querySelector('a.dropdown-toggle img');
+	const img = category_element.querySelector('button.dropdown-toggle img');
 	if (!img) return;
 	if (!img) return;
 	img.src = img.src.replace('/icons/down.', '/icons/up.');
 	img.src = img.src.replace('/icons/down.', '/icons/up.');
 	img.alt = '🔼';
 	img.alt = '🔼';
@@ -837,7 +837,7 @@ function init_column_categories() {
 	}
 	}
 
 
 	document.getElementById('aside_feed').onclick = function (ev) {
 	document.getElementById('aside_feed').onclick = function (ev) {
-		let a = ev.target.closest('.tree-folder > .tree-folder-title > a.dropdown-toggle');
+		let a = ev.target.closest('.tree-folder > .tree-folder-title > button.dropdown-toggle');
 		if (a) {
 		if (a) {
 			const icon = a.querySelector('.icon');
 			const icon = a.querySelector('.icon');
 			const category_id = a.closest('.category').id;
 			const category_id = a.closest('.category').id;
@@ -885,8 +885,6 @@ function init_column_categories() {
 			const template = document.getElementById(templateId)
 			const template = document.getElementById(templateId)
 				.innerHTML.replace(/------/g, id).replace('http://example.net/', feed_web);
 				.innerHTML.replace(/------/g, id).replace('http://example.net/', feed_web);
 			if (!dropdownMenu) {
 			if (!dropdownMenu) {
-				a.href = '#dropdown-' + id;
-				div.querySelector('.dropdown-target').id = 'dropdown-' + id;
 				div.insertAdjacentHTML('beforeend', template);
 				div.insertAdjacentHTML('beforeend', template);
 				if (feed_web == '') {
 				if (feed_web == '') {
 					const website = div.querySelector('.item.link.website');
 					const website = div.querySelector('.item.link.website');

+ 14 - 1
p/themes/Origine/origine.css

@@ -603,6 +603,20 @@ a:hover .icon {
 	font-size: 1rem;
 	font-size: 1rem;
 }
 }
 
 
+.aside_feed .tree-folder-title button.dropdown-toggle {
+	margin: -0.75rem 0.25rem -0.75rem -0.75rem;
+	padding: 0.75rem 0 0.75rem 0.75rem;
+}
+
+.aside_feed .tree-folder-title:hover button.dropdown-toggle .icon {
+	filter: none;
+}
+
+.aside_feed .tree-folder-title button.dropdown-toggle:hover .icon {
+	filter: brightness(1.5);
+	transition: 0.1s linear;
+}
+
 .tree-folder-title .title {
 .tree-folder-title .title {
 	background: inherit;
 	background: inherit;
 	color: var(--font-color);
 	color: var(--font-color);
@@ -632,7 +646,6 @@ a:hover .icon {
 }
 }
 
 
 .tree-folder-items > .item {
 .tree-folder-items > .item {
-	padding: 0 10px;
 	line-height: 1.7;
 	line-height: 1.7;
 	font-size: 0.8rem;
 	font-size: 0.8rem;
 }
 }

+ 14 - 1
p/themes/Origine/origine.rtl.css

@@ -603,6 +603,20 @@ a:hover .icon {
 	font-size: 1rem;
 	font-size: 1rem;
 }
 }
 
 
+.aside_feed .tree-folder-title button.dropdown-toggle {
+	margin: -0.75rem -0.75rem -0.75rem 0.25rem;
+	padding: 0.75rem 0.75rem 0.75rem 0;
+}
+
+.aside_feed .tree-folder-title:hover button.dropdown-toggle .icon {
+	filter: none;
+}
+
+.aside_feed .tree-folder-title button.dropdown-toggle:hover .icon {
+	filter: brightness(1.5);
+	transition: 0.1s linear;
+}
+
 .tree-folder-title .title {
 .tree-folder-title .title {
 	background: inherit;
 	background: inherit;
 	color: var(--font-color);
 	color: var(--font-color);
@@ -632,7 +646,6 @@ a:hover .icon {
 }
 }
 
 
 .tree-folder-items > .item {
 .tree-folder-items > .item {
-	padding: 0 10px;
 	line-height: 1.7;
 	line-height: 1.7;
 	font-size: 0.8rem;
 	font-size: 0.8rem;
 }
 }

+ 54 - 18
p/themes/base-theme/frss.css

@@ -204,8 +204,8 @@ img.favicon {
 	font-style: italic;
 	font-style: italic;
 }
 }
 
 
-.feed.mute::before {
-	content: '🔇';
+.feed.mute .item-title .title::before {
+	content: '🔇 ';
 }
 }
 
 
 /*=== Videos */
 /*=== Videos */
@@ -1046,6 +1046,7 @@ li.drag-hover {
 }
 }
 
 
 .tree-folder-title {
 .tree-folder-title {
+	display: block;
 	padding-top: var(--frss-padding-top-bottom);
 	padding-top: var(--frss-padding-top-bottom);
 	padding-bottom: var(--frss-padding-top-bottom);
 	padding-bottom: var(--frss-padding-top-bottom);
 }
 }
@@ -1064,10 +1065,10 @@ li.drag-hover {
 	white-space: nowrap;
 	white-space: nowrap;
 }
 }
 
 
-.tree-folder-items > .item > a {
+.tree-folder-items > .item > .item-title {
 	display: inline-block;
 	display: inline-block;
 	vertical-align: middle;
 	vertical-align: middle;
-	width: calc(100% - 32px);
+	width: calc(100% - 2.5rem);
 	overflow: hidden;
 	overflow: hidden;
 	white-space: nowrap;
 	white-space: nowrap;
 	text-overflow: ellipsis;
 	text-overflow: ellipsis;
@@ -1169,17 +1170,19 @@ input[type="search"] {
 	padding: 0;
 	padding: 0;
 }
 }
 
 
-.aside_feed .tree-folder-title .icon,
-.aside_feed .tree-folder-items .feed .icon {
-	margin: 0 0.5rem 0 0;
+.aside_feed .tree-folder-title button.dropdown-toggle {
+	padding: 0;
+	border: 0;
+	background-color: inherit;
+	cursor: pointer;
 }
 }
 
 
-.aside_feed .tree-folder-items .feed .favicon {
-	padding: 0;
+.aside_feed .tree-folder-title .icon {
+	margin: 0 0.25rem 0 0;
 }
 }
 
 
-.aside_feed .tree-folder-items .item.feed {
-	padding: var(--frss-padding-top-bottom) 0.75rem;
+.aside_feed .tree-folder-items .feed .favicon {
+	padding: 0;
 }
 }
 
 
 .aside_feed .tree-folder-items:not(.active) {
 .aside_feed .tree-folder-items:not(.active) {
@@ -1190,12 +1193,21 @@ input[type="search"] {
 	overflow: hidden;
 	overflow: hidden;
 }
 }
 
 
+.aside_feed .tree-folder-items .dropdown-menu {
+	left: 0;
+	margin-left: 0.75rem
+}
+
 .aside_feed .tree-folder-items .dropdown {
 .aside_feed .tree-folder-items .dropdown {
-	vertical-align: top;
+	vertical-align: baseline;
+	margin-right: 0.25rem;
 }
 }
 
 
-.aside_feed .tree-folder-items .dropdown-menu {
-	left: 0;
+.aside_feed .tree-folder-items .dropdown .dropdown-toggle {
+	padding: var(--frss-padding-top-bottom) 0.25rem var(--frss-padding-top-bottom) 0.75rem;
+	display: inline-block;
+	text-align: right;
+	opacity: 0.4;
 }
 }
 
 
 .aside_feed .tree-folder-items .item .dropdown-toggle > .icon {
 .aside_feed .tree-folder-items .item .dropdown-toggle > .icon {
@@ -1203,6 +1215,10 @@ input[type="search"] {
 	cursor: pointer;
 	cursor: pointer;
 }
 }
 
 
+.aside_feed .tree-folder-items .item .dropdown-toggle:hover {
+	opacity: 1;
+}
+
 .aside_feed .tree-folder-items .item .dropdown-target:target ~ .dropdown-toggle > .icon,
 .aside_feed .tree-folder-items .item .dropdown-target:target ~ .dropdown-toggle > .icon,
 .aside_feed .tree-folder-items .item:hover .dropdown-toggle > .icon,
 .aside_feed .tree-folder-items .item:hover .dropdown-toggle > .icon,
 .aside_feed .tree-folder-items .item.active .dropdown-toggle > .icon {
 .aside_feed .tree-folder-items .item.active .dropdown-toggle > .icon {
@@ -2031,7 +2047,7 @@ html.slider-active {
 
 
 .item.share.error a::after,
 .item.share.error a::after,
 .category .title.error::before,
 .category .title.error::before,
-.item.feed.error .item-title::before,
+.item.feed.error .item-title .title::before,
 .theme-preview-list .properties .error::before {
 .theme-preview-list .properties .error::before {
 	content: " ⚠ ";
 	content: " ⚠ ";
 	color: var(--frss-font-color-error);
 	color: var(--frss-font-color-error);
@@ -2100,9 +2116,13 @@ html.slider-active {
 	text-decoration: underline double;
 	text-decoration: underline double;
 }
 }
 
 
-.aside .category .title:not([data-unread="0"])::after,
+.aside .feed .item-title {
+	padding: var(--frss-padding-top-bottom) 3.5rem var(--frss-padding-top-bottom) 0;
+}
+
+.aside .category .tree-folder-title .title:not([data-unread="0"])::after,
 .aside .feed .item-title:not([data-unread="0"])::after {
 .aside .feed .item-title:not([data-unread="0"])::after {
-	margin: calc(0.125rem + var(--frss-padding-top-bottom)) 0 0 0;
+	margin: var(--frss-padding-top-bottom) 0 0 0;
 	padding: 0.25rem 0.5rem;
 	padding: 0.25rem 0.5rem;
 	min-width: 2rem;
 	min-width: 2rem;
 	display: block;
 	display: block;
@@ -2117,6 +2137,10 @@ html.slider-active {
 	font-weight: initial;
 	font-weight: initial;
 }
 }
 
 
+.aside .category .title:not([data-unread="0"])::after {
+	margin: calc(0.125rem + var(--frss-padding-top-bottom)) 0 0 0;
+}
+
 .global .box.category .title:not([data-unread="0"])::after {
 .global .box.category .title:not([data-unread="0"])::after {
 	margin: 0.5rem 0 0 0;
 	margin: 0.5rem 0 0 0;
 	padding: 5px 10px;
 	padding: 5px 10px;
@@ -2181,7 +2205,7 @@ html.slider-active {
 
 
 .feed .item-title:not([data-unread="0"]) {
 .feed .item-title:not([data-unread="0"]) {
 	font-weight: bold;
 	font-weight: bold;
-	width: calc(100% - 5.5rem);
+	width: calc(100% - 6rem);
 }
 }
 
 
 .state_unread .category:not(.active)[data-unread="0"],
 .state_unread .category:not(.active)[data-unread="0"],
@@ -2308,6 +2332,18 @@ html.slider-active {
 		text-align: center;
 		text-align: center;
 	}
 	}
 
 
+	.aside .feed .item-title {
+		padding-left: 0.75rem;
+		padding-right: 4rem;
+		display: block;
+		width: 100%;
+		box-sizing: border-box;
+	}
+
+	.aside .feed .item-title[data-unread="0"] {
+		padding-right: 1rem;
+	}
+
 	.flux .flux_header .item .title:has(~.date) {
 	.flux .flux_header .item .title:has(~.date) {
 		padding-right: 1rem;
 		padding-right: 1rem;
 	}
 	}

+ 54 - 18
p/themes/base-theme/frss.rtl.css

@@ -204,8 +204,8 @@ img.favicon {
 	font-style: italic;
 	font-style: italic;
 }
 }
 
 
-.feed.mute::before {
-	content: '🔇';
+.feed.mute .item-title .title::before {
+	content: '🔇 ';
 }
 }
 
 
 /*=== Videos */
 /*=== Videos */
@@ -1046,6 +1046,7 @@ li.drag-hover {
 }
 }
 
 
 .tree-folder-title {
 .tree-folder-title {
+	display: block;
 	padding-top: var(--frss-padding-top-bottom);
 	padding-top: var(--frss-padding-top-bottom);
 	padding-bottom: var(--frss-padding-top-bottom);
 	padding-bottom: var(--frss-padding-top-bottom);
 }
 }
@@ -1064,10 +1065,10 @@ li.drag-hover {
 	white-space: nowrap;
 	white-space: nowrap;
 }
 }
 
 
-.tree-folder-items > .item > a {
+.tree-folder-items > .item > .item-title {
 	display: inline-block;
 	display: inline-block;
 	vertical-align: middle;
 	vertical-align: middle;
-	width: calc(100% - 32px);
+	width: calc(100% - 2.5rem);
 	overflow: hidden;
 	overflow: hidden;
 	white-space: nowrap;
 	white-space: nowrap;
 	text-overflow: ellipsis;
 	text-overflow: ellipsis;
@@ -1169,17 +1170,19 @@ input[type="search"] {
 	padding: 0;
 	padding: 0;
 }
 }
 
 
-.aside_feed .tree-folder-title .icon,
-.aside_feed .tree-folder-items .feed .icon {
-	margin: 0 0 0 0.5rem;
+.aside_feed .tree-folder-title button.dropdown-toggle {
+	padding: 0;
+	border: 0;
+	background-color: inherit;
+	cursor: pointer;
 }
 }
 
 
-.aside_feed .tree-folder-items .feed .favicon {
-	padding: 0;
+.aside_feed .tree-folder-title .icon {
+	margin: 0 0 0 0.25rem;
 }
 }
 
 
-.aside_feed .tree-folder-items .item.feed {
-	padding: var(--frss-padding-top-bottom) 0.75rem;
+.aside_feed .tree-folder-items .feed .favicon {
+	padding: 0;
 }
 }
 
 
 .aside_feed .tree-folder-items:not(.active) {
 .aside_feed .tree-folder-items:not(.active) {
@@ -1190,12 +1193,21 @@ input[type="search"] {
 	overflow: hidden;
 	overflow: hidden;
 }
 }
 
 
+.aside_feed .tree-folder-items .dropdown-menu {
+	right: 0;
+	margin-right: 0.75rem
+}
+
 .aside_feed .tree-folder-items .dropdown {
 .aside_feed .tree-folder-items .dropdown {
-	vertical-align: top;
+	vertical-align: baseline;
+	margin-left: 0.25rem;
 }
 }
 
 
-.aside_feed .tree-folder-items .dropdown-menu {
-	right: 0;
+.aside_feed .tree-folder-items .dropdown .dropdown-toggle {
+	padding: var(--frss-padding-top-bottom) 0.75rem var(--frss-padding-top-bottom) 0.25rem;
+	display: inline-block;
+	text-align: left;
+	opacity: 0.4;
 }
 }
 
 
 .aside_feed .tree-folder-items .item .dropdown-toggle > .icon {
 .aside_feed .tree-folder-items .item .dropdown-toggle > .icon {
@@ -1203,6 +1215,10 @@ input[type="search"] {
 	cursor: pointer;
 	cursor: pointer;
 }
 }
 
 
+.aside_feed .tree-folder-items .item .dropdown-toggle:hover {
+	opacity: 1;
+}
+
 .aside_feed .tree-folder-items .item .dropdown-target:target ~ .dropdown-toggle > .icon,
 .aside_feed .tree-folder-items .item .dropdown-target:target ~ .dropdown-toggle > .icon,
 .aside_feed .tree-folder-items .item:hover .dropdown-toggle > .icon,
 .aside_feed .tree-folder-items .item:hover .dropdown-toggle > .icon,
 .aside_feed .tree-folder-items .item.active .dropdown-toggle > .icon {
 .aside_feed .tree-folder-items .item.active .dropdown-toggle > .icon {
@@ -2031,7 +2047,7 @@ html.slider-active {
 
 
 .item.share.error a::after,
 .item.share.error a::after,
 .category .title.error::before,
 .category .title.error::before,
-.item.feed.error .item-title::before,
+.item.feed.error .item-title .title::before,
 .theme-preview-list .properties .error::before {
 .theme-preview-list .properties .error::before {
 	content: " ⚠ ";
 	content: " ⚠ ";
 	color: var(--frss-font-color-error);
 	color: var(--frss-font-color-error);
@@ -2100,9 +2116,13 @@ html.slider-active {
 	text-decoration: underline double;
 	text-decoration: underline double;
 }
 }
 
 
-.aside .category .title:not([data-unread="0"])::after,
+.aside .feed .item-title {
+	padding: var(--frss-padding-top-bottom) 0 var(--frss-padding-top-bottom) 3.5rem;
+}
+
+.aside .category .tree-folder-title .title:not([data-unread="0"])::after,
 .aside .feed .item-title:not([data-unread="0"])::after {
 .aside .feed .item-title:not([data-unread="0"])::after {
-	margin: calc(0.125rem + var(--frss-padding-top-bottom)) 0 0 0;
+	margin: var(--frss-padding-top-bottom) 0 0 0;
 	padding: 0.25rem 0.5rem;
 	padding: 0.25rem 0.5rem;
 	min-width: 2rem;
 	min-width: 2rem;
 	display: block;
 	display: block;
@@ -2117,6 +2137,10 @@ html.slider-active {
 	font-weight: initial;
 	font-weight: initial;
 }
 }
 
 
+.aside .category .title:not([data-unread="0"])::after {
+	margin: calc(0.125rem + var(--frss-padding-top-bottom)) 0 0 0;
+}
+
 .global .box.category .title:not([data-unread="0"])::after {
 .global .box.category .title:not([data-unread="0"])::after {
 	margin: 0.5rem 0 0 0;
 	margin: 0.5rem 0 0 0;
 	padding: 5px 10px;
 	padding: 5px 10px;
@@ -2181,7 +2205,7 @@ html.slider-active {
 
 
 .feed .item-title:not([data-unread="0"]) {
 .feed .item-title:not([data-unread="0"]) {
 	font-weight: bold;
 	font-weight: bold;
-	width: calc(100% - 5.5rem);
+	width: calc(100% - 6rem);
 }
 }
 
 
 .state_unread .category:not(.active)[data-unread="0"],
 .state_unread .category:not(.active)[data-unread="0"],
@@ -2308,6 +2332,18 @@ html.slider-active {
 		text-align: center;
 		text-align: center;
 	}
 	}
 
 
+	.aside .feed .item-title {
+		padding-right: 0.75rem;
+		padding-left: 4rem;
+		display: block;
+		width: 100%;
+		box-sizing: border-box;
+	}
+
+	.aside .feed .item-title[data-unread="0"] {
+		padding-left: 1rem;
+	}
+
 	.flux .flux_header .item .title:has(~.date) {
 	.flux .flux_header .item .title:has(~.date) {
 		padding-left: 1rem;
 		padding-left: 1rem;
 	}
 	}