Sfoglia il codice sorgente

Implement search form (#8103)

* Add UI for advanced search
To help users with the seach operators.
Obviously not as powerful as a manually-written search query.
Lack in particular negation and logical *and* for now, but I might try to do something about it.

<img width="939" height="1438" alt="image" src="https://github.com/user-attachments/assets/0bcad39b-eff3-4f44-876b-a2552af2af00" />

* Consistency: allow multiple user queries like S:1,2

* Fix user query and add tests
Alexandre Alapetite 5 mesi fa
parent
commit
e070c3ed2b

+ 23 - 23
README.fr.md

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

+ 23 - 23
README.md

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

+ 184 - 0
app/Controllers/searchController.php

@@ -0,0 +1,184 @@
+<?php
+declare(strict_types=1);
+
+/**
+ * Controller to handle advanced search actions.
+ */
+class FreshRSS_search_Controller extends FreshRSS_ActionController {
+
+	#[\Override]
+	public function firstAction(): void {
+		if (!FreshRSS_Auth::hasAccess()) {
+			Minz_Error::error(403);
+		}
+	}
+
+	/**
+	 * Display the advanced search form.
+	 */
+	public function indexAction(): void {
+		FreshRSS_View::prependTitle(_t('gen.menu.advanced_search') . ' · ');
+
+		// Get categories and feeds for dropdowns
+		$catDAO = FreshRSS_Factory::createCategoryDao();
+		$this->view->categories = $catDAO->listCategories(true, true);
+
+		$feedDAO = FreshRSS_Factory::createFeedDao();
+		$this->view->feeds = $feedDAO->listFeeds();
+
+		// Get labels
+		$tagDAO = FreshRSS_Factory::createTagDao();
+		$this->view->labels = $tagDAO->listTags(true);
+
+		// Get user queries
+		$this->view->queries = [];
+		foreach (FreshRSS_Context::userConf()->queries as $key => $query) {
+			$this->view->queries[intval($key)] = new FreshRSS_UserQuery($query, FreshRSS_Context::categories(), FreshRSS_Context::labels());
+		}
+	}
+
+	/**
+	 * Build an OR-separated clause from newline delimited values.
+	 */
+	private static function buildOrClause(string $rawValue, string $prefix = ''): string {
+		$lines = preg_split('/[\r\n]+/', $rawValue);
+		if ($lines === false) {
+			$lines = [$rawValue];
+		}
+
+		$terms = [];
+		foreach ($lines as $line) {
+			$line = trim($line, " \n\r\t\v\0\"'");	// Also trim existing quotes
+			if ($line === '') {
+				continue;
+			}
+			$quoted = preg_match('/\s/', $line) === 1 ? "'$line'" : $line;
+			$terms[] = $prefix . $quoted;
+		}
+
+		if (empty($terms)) {
+			return '';
+		}
+		if (count($terms) === 1) {
+			return $terms[0];
+		}
+		return '(' . implode(' OR ', $terms) . ')';
+	}
+
+	/**
+	 * Process the advanced search form submission.
+	 */
+	public function submitAction(): void {
+		if (!Minz_Request::isPost()) {
+			Minz_Request::forward(['c' => 'search', 'a' => 'index'], true);
+			return;
+		}
+
+		// Build the search query from form parameters
+		$searchTerms = [];
+
+		$freeTextClause = self::buildOrClause(Minz_Request::paramString('free_text'));
+		if ($freeTextClause !== '') {
+			$searchTerms[] = $freeTextClause;
+		}
+
+		$titleClause = self::buildOrClause(Minz_Request::paramString('title'), 'intitle:');
+		if ($titleClause !== '') {
+			$searchTerms[] = $titleClause;
+		}
+
+		$contentClause = self::buildOrClause(Minz_Request::paramString('content'), 'intext:');
+		if ($contentClause !== '') {
+			$searchTerms[] = $contentClause;
+		}
+
+		$urlClause = self::buildOrClause(Minz_Request::paramString('url'), 'inurl:');
+		if ($urlClause !== '') {
+			$searchTerms[] = $urlClause;
+		}
+
+		$authorClause = self::buildOrClause(Minz_Request::paramString('authors'), 'author:');
+		if ($authorClause !== '') {
+			$searchTerms[] = $authorClause;
+		}
+
+		$tagsClause = self::buildOrClause(Minz_Request::paramString('tags'), '#');
+		if ($tagsClause !== '') {
+			$searchTerms[] = $tagsClause;
+		}
+
+		// Received date
+		$dateFrom = trim(Minz_Request::paramString('date_from'));
+		$dateTo = trim(Minz_Request::paramString('date_to'));
+		$dateNumber = Minz_Request::paramInt('date_number');
+		$dateUnit = trim(Minz_Request::paramString('date_unit'));
+
+		if ($dateNumber > 0 && $dateUnit !== '') {
+			// Convert to ISO 8601 duration format: P1D, P1W, P1M, PT1H, etc.
+			// Time units (H, M, S) require a T separator
+			$prefix = ($dateUnit === 'H' || $dateUnit === 'M' || $dateUnit === 'S') ? 'PT' : 'P';
+			$searchTerms[] = "date:{$prefix}{$dateNumber}{$dateUnit}";
+		} elseif ($dateFrom !== '' || $dateTo !== '') {
+			if ($dateFrom !== '' && $dateTo !== '') {
+				$searchTerms[] = "date:$dateFrom/$dateTo";
+			} elseif ($dateFrom !== '') {
+				$searchTerms[] = "date:$dateFrom/";
+			} elseif ($dateTo !== '') {
+				$searchTerms[] = "date:/$dateTo";
+			}
+		}
+
+		// Publication date
+		$pubDateFrom = trim(Minz_Request::paramString('pubdate_from'));
+		$pubDateTo = trim(Minz_Request::paramString('pubdate_to'));
+		$pubDateNumber = Minz_Request::paramInt('pubdate_number');
+		$pubDateUnit = trim(Minz_Request::paramString('pubdate_unit'));
+
+		if ($pubDateNumber > 0 && $pubDateUnit !== '') {
+			// Convert to ISO 8601 duration format: P1D, P1W, P1M, PT1H, etc.
+			// Time units (H, M, S) require a T separator
+			$prefix = ($pubDateUnit === 'H' || $pubDateUnit === 'M' || $pubDateUnit === 'S') ? 'PT' : 'P';
+			$searchTerms[] = "pubdate:{$prefix}{$pubDateNumber}{$pubDateUnit}";
+		} elseif ($pubDateFrom !== '' || $pubDateTo !== '') {
+			if ($pubDateFrom !== '' && $pubDateTo !== '') {
+				$searchTerms[] = "pubdate:$pubDateFrom/$pubDateTo";
+			} elseif ($pubDateFrom !== '') {
+				$searchTerms[] = "pubdate:$pubDateFrom/";
+			} elseif ($pubDateTo !== '') {
+				$searchTerms[] = "pubdate:/$pubDateTo";
+			}
+		}
+
+		$feedIds = Minz_Request::paramArrayInt('feed_ids');
+		if (!empty($feedIds)) {
+			$searchTerms[] = 'f:' . implode(',', $feedIds);
+		}
+
+		$categoryIds = Minz_Request::paramArrayInt('category_ids');
+		if (!empty($categoryIds)) {
+			$searchTerms[] = 'c:' . implode(',', $categoryIds);
+		}
+
+		$labelIds = Minz_Request::paramArrayInt('label_ids');
+		if (!empty($labelIds)) {
+			$searchTerms[] = 'L:' . implode(',', $labelIds);
+		}
+
+		$userQueryIds = Minz_Request::paramArrayInt('user_query_ids');
+		if (!empty($userQueryIds)) {
+			$searchTerms[] = 'S:' . implode(',', $userQueryIds);
+		}
+
+		// Combine all search terms
+		$searchQuery = implode(' ', $searchTerms);
+
+		// Redirect to the main view with the search query
+		Minz_Request::forward([
+			'c' => 'index',
+			'a' => 'index',
+			'params' => [
+				'search' => $searchQuery,
+			],
+		], redirect: true);
+	}
+}

+ 19 - 9
app/Models/BooleanSearch.php

@@ -102,7 +102,7 @@ class FreshRSS_BooleanSearch implements \Stringable {
 	private function parseUserQueryIds(string $input, bool $allowUserQueries = true): string {
 		$all_matches = [];
 
-		if (preg_match_all('/\bS:(?P<search>\d+)/', $input, $matchesFound)) {
+		if (preg_match_all('/\bS:(?P<search>[0-9,]+)/', $input, $matchesFound)) {
 			$all_matches[] = $matchesFound;
 		}
 
@@ -119,16 +119,26 @@ class FreshRSS_BooleanSearch implements \Stringable {
 					continue;
 				}
 				for ($i = count($matches['search']) - 1; $i >= 0; $i--) {
-					// Index starting from 1
-					$id = (int)(trim($matches['search'][$i])) - 1;
-					if (!empty($queries[$id])) {
-						$fromS[] = $matches[0][$i];
-						if ($allowUserQueries) {
-							$toS[] = '(' . self::escapeLiteralParentheses($queries[$id]) . ')';
-						} else {
-							$toS[] = '';
+					$ids = explode(',', $matches['search'][$i]);
+					$ids = array_map('intval', $ids);
+
+					$matchedQueries = [];
+					foreach ($ids as $id) {
+						if (!empty($queries[$id])) {
+							$matchedQueries[] = $queries[$id];
 						}
 					}
+					if (empty($matchedQueries)) {
+						continue;
+					}
+
+					$fromS[] = $matches[0][$i];
+					if ($allowUserQueries) {
+						$escapedQueries = array_map(fn(string $query): string => self::escapeLiteralParentheses($query), $matchedQueries);
+						$toS[] = '(' . implode(') OR (', $escapedQueries) . ')';
+					} else {
+						$toS[] = '';
+					}
 				}
 			}
 

+ 4 - 0
app/Models/View.php

@@ -30,6 +30,10 @@ class FreshRSS_View extends Minz_View {
 	public array $tagsForEntries;
 	public bool $excludeMutedFeeds;
 
+	// Search
+	/** @var array<int,FreshRSS_Tag> where the key is the label ID */
+	public array $labels;
+
 	// Subscriptions
 	public bool $displaySlider = false;
 	public bool $load_ok;

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

@@ -189,6 +189,7 @@ return array(
 		'about' => 'O aplikaci',
 		'account' => 'Účet',
 		'admin' => 'Administrace',
+		'advanced_search' => 'Advanced Search',	// TODO
 		'archiving' => 'Archivace',
 		'authentication' => 'Ověřování',
 		'check_install' => 'Kontrola instalace',
@@ -221,6 +222,32 @@ return array(
 		'language' => 'Language',	// IGNORE
 		'translated' => 'Progress',	// IGNORE
 	),
+	'search' => array(
+		'advanced_search_help' => 'This form helps construct search queries, but manual queries are even more powerful.',	// TODO
+		'authors' => 'Authors',	// TODO
+		'categories' => 'Categories',	// TODO
+		'content' => 'Content',	// TODO
+		'date_from' => 'From',	// TODO
+		'date_past' => 'In the past',	// TODO
+		'date_published' => 'Publication Date',	// TODO
+		'date_range' => 'Date Range',	// TODO
+		'date_received' => 'Received Date',	// TODO
+		'date_to' => 'To',	// TODO
+		'feeds' => 'Feeds',	// TODO
+		'free_text' => 'Free Text',	// TODO
+		'free_text_help' => 'Search both in title and content',	// TODO
+		'full_documentation' => 'View <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">full search documentation</a>',	// TODO
+		'labels' => 'My Labels',	// TODO
+		'multiple_help' => 'Select one or more (hold <kbd>Ctrl</kbd> or <kbd>Cmd</kbd>)',	// TODO
+		'sources' => 'Sources',	// TODO
+		'tags' => 'Article Tags',	// TODO
+		'text' => 'Text Search',	// TODO
+		'text_help' => 'Multiple lines are combined by a logical <i>or</i>. Also supports <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#regex" target="_blank">regular expressions</a>.',	// TODO
+		'text_placeholder' => 'Keyword',	// TODO
+		'title' => 'Title',	// TODO
+		'url' => 'URL',	// TODO
+		'user_queries' => 'User Queries',	// TODO
+	),
 	'share' => array(
 		'Known' => 'Známé základní stránky',
 		'archiveIS' => 'archive.is',	// IGNORE

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

@@ -189,6 +189,7 @@ return array(
 		'about' => 'Info',
 		'account' => 'Account',	// IGNORE
 		'admin' => 'Administration',	// IGNORE
+		'advanced_search' => 'Advanced Search',	// TODO
 		'archiving' => 'Archivierung',
 		'authentication' => 'Authentifizierung',
 		'check_install' => 'Installationsüberprüfung',
@@ -221,6 +222,32 @@ return array(
 		'language' => 'Language',	// IGNORE
 		'translated' => 'Progress',	// IGNORE
 	),
+	'search' => array(
+		'advanced_search_help' => 'This form helps construct search queries, but manual queries are even more powerful.',	// TODO
+		'authors' => 'Authors',	// TODO
+		'categories' => 'Categories',	// TODO
+		'content' => 'Content',	// TODO
+		'date_from' => 'From',	// TODO
+		'date_past' => 'In the past',	// TODO
+		'date_published' => 'Publication Date',	// TODO
+		'date_range' => 'Date Range',	// TODO
+		'date_received' => 'Received Date',	// TODO
+		'date_to' => 'To',	// TODO
+		'feeds' => 'Feeds',	// TODO
+		'free_text' => 'Free Text',	// TODO
+		'free_text_help' => 'Search both in title and content',	// TODO
+		'full_documentation' => 'View <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">full search documentation</a>',	// TODO
+		'labels' => 'My Labels',	// TODO
+		'multiple_help' => 'Select one or more (hold <kbd>Ctrl</kbd> or <kbd>Cmd</kbd>)',	// TODO
+		'sources' => 'Sources',	// TODO
+		'tags' => 'Article Tags',	// TODO
+		'text' => 'Text Search',	// TODO
+		'text_help' => 'Multiple lines are combined by a logical <i>or</i>. Also supports <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#regex" target="_blank">regular expressions</a>.',	// TODO
+		'text_placeholder' => 'Keyword',	// TODO
+		'title' => 'Title',	// TODO
+		'url' => 'URL',	// TODO
+		'user_queries' => 'User Queries',	// TODO
+	),
 	'share' => array(
 		'Known' => 'Known-Seite (https://withknown.com)',
 		'archiveIS' => 'archive.is',	// IGNORE

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

@@ -189,6 +189,7 @@ return array(
 		'about' => 'About',	// TODO
 		'account' => 'Account',	// TODO
 		'admin' => 'Administration',	// TODO
+		'advanced_search' => 'Advanced Search',	// TODO
 		'archiving' => 'Archiving',	// TODO
 		'authentication' => 'Authentication',	// TODO
 		'check_install' => 'Installation check',	// TODO
@@ -221,6 +222,32 @@ return array(
 		'language' => 'Language',	// IGNORE
 		'translated' => 'Progress',	// IGNORE
 	),
+	'search' => array(
+		'advanced_search_help' => 'This form helps construct search queries, but manual queries are even more powerful.',	// TODO
+		'authors' => 'Authors',	// TODO
+		'categories' => 'Categories',	// TODO
+		'content' => 'Content',	// TODO
+		'date_from' => 'From',	// TODO
+		'date_past' => 'In the past',	// TODO
+		'date_published' => 'Publication Date',	// TODO
+		'date_range' => 'Date Range',	// TODO
+		'date_received' => 'Received Date',	// TODO
+		'date_to' => 'To',	// TODO
+		'feeds' => 'Feeds',	// TODO
+		'free_text' => 'Free Text',	// TODO
+		'free_text_help' => 'Search both in title and content',	// TODO
+		'full_documentation' => 'View <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">full search documentation</a>',	// TODO
+		'labels' => 'My Labels',	// TODO
+		'multiple_help' => 'Select one or more (hold <kbd>Ctrl</kbd> or <kbd>Cmd</kbd>)',	// TODO
+		'sources' => 'Sources',	// TODO
+		'tags' => 'Article Tags',	// TODO
+		'text' => 'Text Search',	// TODO
+		'text_help' => 'Multiple lines are combined by a logical <i>or</i>. Also supports <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#regex" target="_blank">regular expressions</a>.',	// TODO
+		'text_placeholder' => 'Keyword',	// TODO
+		'title' => 'Title',	// TODO
+		'url' => 'URL',	// TODO
+		'user_queries' => 'User Queries',	// TODO
+	),
 	'share' => array(
 		'Known' => 'Known based sites',	// TODO
 		'archiveIS' => 'archive.is',	// IGNORE

+ 27 - 0
app/i18n/en-US/gen.php

@@ -189,6 +189,7 @@ return array(
 		'about' => 'About',	// IGNORE
 		'account' => 'Account',	// IGNORE
 		'admin' => 'Administration',	// IGNORE
+		'advanced_search' => 'Advanced Search',	// IGNORE
 		'archiving' => 'Archiving',	// IGNORE
 		'authentication' => 'Authentication',	// IGNORE
 		'check_install' => 'Installation check',	// IGNORE
@@ -221,6 +222,32 @@ return array(
 		'language' => 'Language',	// IGNORE
 		'translated' => 'Progress',	// IGNORE
 	),
+	'search' => array(
+		'advanced_search_help' => 'This form helps construct search queries, but manual queries are even more powerful.',	// IGNORE
+		'authors' => 'Authors',	// IGNORE
+		'categories' => 'Categories',	// IGNORE
+		'content' => 'Content',	// IGNORE
+		'date_from' => 'From',	// IGNORE
+		'date_past' => 'In the past',	// IGNORE
+		'date_published' => 'Publication Date',	// IGNORE
+		'date_range' => 'Date Range',	// IGNORE
+		'date_received' => 'Received Date',	// IGNORE
+		'date_to' => 'To',	// IGNORE
+		'feeds' => 'Feeds',	// IGNORE
+		'free_text' => 'Free Text',	// IGNORE
+		'free_text_help' => 'Search both in title and content',	// IGNORE
+		'full_documentation' => 'View <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">full search documentation</a>',	// IGNORE
+		'labels' => 'My Labels',	// IGNORE
+		'multiple_help' => 'Select one or more (hold <kbd>Ctrl</kbd> or <kbd>Cmd</kbd>)',	// IGNORE
+		'sources' => 'Sources',	// IGNORE
+		'tags' => 'Article Tags',	// IGNORE
+		'text' => 'Text Search',	// IGNORE
+		'text_help' => 'Multiple lines are combined by a logical <i>or</i>. Also supports <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#regex" target="_blank">regular expressions</a>.',	// IGNORE
+		'text_placeholder' => 'Keyword',	// IGNORE
+		'title' => 'Title',	// IGNORE
+		'url' => 'URL',	// IGNORE
+		'user_queries' => 'User Queries',	// IGNORE
+	),
 	'share' => array(
 		'Known' => 'Known based sites',	// IGNORE
 		'archiveIS' => 'archive.is',	// IGNORE

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

@@ -189,6 +189,7 @@ return array(
 		'about' => 'About',
 		'account' => 'Account',
 		'admin' => 'Administration',
+		'advanced_search' => 'Advanced Search',
 		'archiving' => 'Archiving',
 		'authentication' => 'Authentication',
 		'check_install' => 'Installation check',
@@ -221,6 +222,32 @@ return array(
 		'language' => 'Language',
 		'translated' => 'Progress',
 	),
+	'search' => array(
+		'advanced_search_help' => 'This form helps construct search queries, but manual queries are even more powerful.',
+		'authors' => 'Authors',
+		'categories' => 'Categories',
+		'content' => 'Content',
+		'date_from' => 'From',
+		'date_past' => 'In the past',
+		'date_published' => 'Publication Date',
+		'date_range' => 'Date Range',
+		'date_received' => 'Received Date',
+		'date_to' => 'To',
+		'feeds' => 'Feeds',
+		'free_text' => 'Free Text',
+		'free_text_help' => 'Search both in title and content',
+		'full_documentation' => 'View <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">full search documentation</a>',
+		'labels' => 'My Labels',
+		'multiple_help' => 'Select one or more (hold <kbd>Ctrl</kbd> or <kbd>Cmd</kbd>)',
+		'sources' => 'Sources',
+		'tags' => 'Article Tags',
+		'text' => 'Text Search',
+		'text_help' => 'Multiple lines are combined by a logical <i>or</i>. Also supports <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#regex" target="_blank">regular expressions</a>.',
+		'text_placeholder' => 'Keyword',
+		'title' => 'Title',
+		'url' => 'URL',
+		'user_queries' => 'User Queries',
+	),
 	'share' => array(
 		'Known' => 'Known based sites',
 		'archiveIS' => 'archive.is',

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

@@ -189,6 +189,7 @@ return array(
 		'about' => 'Acerca de',
 		'account' => 'Cuenta',
 		'admin' => 'Administración',
+		'advanced_search' => 'Advanced Search',	// TODO
 		'archiving' => 'Archivo',
 		'authentication' => 'Identificación',
 		'check_install' => 'Verificación de instalación',
@@ -221,6 +222,32 @@ return array(
 		'language' => 'Language',	// IGNORE
 		'translated' => 'Progress',	// IGNORE
 	),
+	'search' => array(
+		'advanced_search_help' => 'This form helps construct search queries, but manual queries are even more powerful.',	// TODO
+		'authors' => 'Authors',	// TODO
+		'categories' => 'Categories',	// TODO
+		'content' => 'Content',	// TODO
+		'date_from' => 'From',	// TODO
+		'date_past' => 'In the past',	// TODO
+		'date_published' => 'Publication Date',	// TODO
+		'date_range' => 'Date Range',	// TODO
+		'date_received' => 'Received Date',	// TODO
+		'date_to' => 'To',	// TODO
+		'feeds' => 'Feeds',	// TODO
+		'free_text' => 'Free Text',	// TODO
+		'free_text_help' => 'Search both in title and content',	// TODO
+		'full_documentation' => 'View <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">full search documentation</a>',	// TODO
+		'labels' => 'My Labels',	// TODO
+		'multiple_help' => 'Select one or more (hold <kbd>Ctrl</kbd> or <kbd>Cmd</kbd>)',	// TODO
+		'sources' => 'Sources',	// TODO
+		'tags' => 'Article Tags',	// TODO
+		'text' => 'Text Search',	// TODO
+		'text_help' => 'Multiple lines are combined by a logical <i>or</i>. Also supports <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#regex" target="_blank">regular expressions</a>.',	// TODO
+		'text_placeholder' => 'Keyword',	// TODO
+		'title' => 'Title',	// TODO
+		'url' => 'URL',	// TODO
+		'user_queries' => 'User Queries',	// TODO
+	),
 	'share' => array(
 		'Known' => 'Sitios basados en conocidos',
 		'archiveIS' => 'archive.is',	// IGNORE

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

@@ -189,6 +189,7 @@ return array(
 		'about' => ' در مورد',
 		'account' => ' حساب',
 		'admin' => ' اداره',
+		'advanced_search' => 'Advanced Search',	// TODO
 		'archiving' => ' آرشیو',
 		'authentication' => ' احراز هویت',
 		'check_install' => ' بررسی نصب',
@@ -221,6 +222,32 @@ return array(
 		'language' => 'Language',	// IGNORE
 		'translated' => 'Progress',	// IGNORE
 	),
+	'search' => array(
+		'advanced_search_help' => 'This form helps construct search queries, but manual queries are even more powerful.',	// TODO
+		'authors' => 'Authors',	// TODO
+		'categories' => 'Categories',	// TODO
+		'content' => 'Content',	// TODO
+		'date_from' => 'From',	// TODO
+		'date_past' => 'In the past',	// TODO
+		'date_published' => 'Publication Date',	// TODO
+		'date_range' => 'Date Range',	// TODO
+		'date_received' => 'Received Date',	// TODO
+		'date_to' => 'To',	// TODO
+		'feeds' => 'Feeds',	// TODO
+		'free_text' => 'Free Text',	// TODO
+		'free_text_help' => 'Search both in title and content',	// TODO
+		'full_documentation' => 'View <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">full search documentation</a>',	// TODO
+		'labels' => 'My Labels',	// TODO
+		'multiple_help' => 'Select one or more (hold <kbd>Ctrl</kbd> or <kbd>Cmd</kbd>)',	// TODO
+		'sources' => 'Sources',	// TODO
+		'tags' => 'Article Tags',	// TODO
+		'text' => 'Text Search',	// TODO
+		'text_help' => 'Multiple lines are combined by a logical <i>or</i>. Also supports <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#regex" target="_blank">regular expressions</a>.',	// TODO
+		'text_placeholder' => 'Keyword',	// TODO
+		'title' => 'Title',	// TODO
+		'url' => 'URL',	// TODO
+		'user_queries' => 'User Queries',	// TODO
+	),
 	'share' => array(
 		'Known' => ' سایت های مبتنی بر شناخته شده',
 		'archiveIS' => 'archive.is',	// IGNORE

+ 27 - 0
app/i18n/fi/gen.php

@@ -189,6 +189,7 @@ return array(
 		'about' => 'Tietoja',
 		'account' => 'Tili',
 		'admin' => 'Hallinta',
+		'advanced_search' => 'Advanced Search',	// TODO
 		'archiving' => 'Arkistointi',
 		'authentication' => 'Todentaminen',
 		'check_install' => 'Asennuksen tarkistus',
@@ -221,6 +222,32 @@ return array(
 		'language' => 'Language',	// IGNORE
 		'translated' => 'Progress',	// IGNORE
 	),
+	'search' => array(
+		'advanced_search_help' => 'This form helps construct search queries, but manual queries are even more powerful.',	// TODO
+		'authors' => 'Authors',	// TODO
+		'categories' => 'Categories',	// TODO
+		'content' => 'Content',	// TODO
+		'date_from' => 'From',	// TODO
+		'date_past' => 'In the past',	// TODO
+		'date_published' => 'Publication Date',	// TODO
+		'date_range' => 'Date Range',	// TODO
+		'date_received' => 'Received Date',	// TODO
+		'date_to' => 'To',	// TODO
+		'feeds' => 'Feeds',	// TODO
+		'free_text' => 'Free Text',	// TODO
+		'free_text_help' => 'Search both in title and content',	// TODO
+		'full_documentation' => 'View <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">full search documentation</a>',	// TODO
+		'labels' => 'My Labels',	// TODO
+		'multiple_help' => 'Select one or more (hold <kbd>Ctrl</kbd> or <kbd>Cmd</kbd>)',	// TODO
+		'sources' => 'Sources',	// TODO
+		'tags' => 'Article Tags',	// TODO
+		'text' => 'Text Search',	// TODO
+		'text_help' => 'Multiple lines are combined by a logical <i>or</i>. Also supports <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#regex" target="_blank">regular expressions</a>.',	// TODO
+		'text_placeholder' => 'Keyword',	// TODO
+		'title' => 'Title',	// TODO
+		'url' => 'URL',	// TODO
+		'user_queries' => 'User Queries',	// TODO
+	),
 	'share' => array(
 		'Known' => 'Known-sivustot',
 		'archiveIS' => 'archive.is',	// IGNORE

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

@@ -189,6 +189,7 @@ return array(
 		'about' => 'À propos',
 		'account' => 'Compte',
 		'admin' => 'Administration',	// IGNORE
+		'advanced_search' => 'Recherche avancée',
 		'archiving' => 'Archivage',
 		'authentication' => 'Authentification',
 		'check_install' => 'Vérification de l’installation',
@@ -221,6 +222,32 @@ return array(
 		'language' => 'Langage',
 		'translated' => 'Progression',
 	),
+	'search' => array(
+		'advanced_search_help' => 'Ce formulaire aide à construire des requêtes de recherche, mais les requêtes manuelles sont encore plus puissantes.',
+		'authors' => 'Auteurs',
+		'categories' => 'Catégories',
+		'content' => 'Contenu',
+		'date_from' => 'Depuis',
+		'date_past' => 'Dans le passé',
+		'date_published' => 'Date de publication',
+		'date_range' => 'Plage de dates',
+		'date_received' => 'Date de réception',
+		'date_to' => 'À',
+		'feeds' => 'Flux',
+		'free_text' => 'Texte libre',
+		'free_text_help' => 'Rechercher dans le titre et le contenu',
+		'full_documentation' => 'Voir la <a href="https://freshrss.github.io/FreshRSS/fr/users/03_Main_view.html#gr%C3%A2ce-au-champ-de-recherche" target="_blank">documentation complète de recherche</a>',
+		'labels' => 'Mes étiquettes',
+		'multiple_help' => 'Sélectionnez un ou plusieurs (maintenez <kbd>Ctrl</kbd> ou <kbd>Cmd</kbd>)',
+		'sources' => 'Sources',	// IGNORE
+		'tags' => 'Tags d’articles',
+		'text' => 'Recherche de texte',
+		'text_help' => 'Les lignes multiples sont combinées par un <i>ou</i> logique. Supporte aussi les <a href="https://freshrss.github.io/FreshRSS/fr/users/03_Main_view.html#regex" target="_blank">expressions régulières</a>.',
+		'text_placeholder' => 'Mot-clef',
+		'title' => 'Titre',
+		'url' => 'URL',	// IGNORE
+		'user_queries' => 'Requêtes utilisateur',
+	),
 	'share' => array(
 		'Known' => 'Sites basés sur Known',
 		'archiveIS' => 'archive.is',	// IGNORE

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

@@ -189,6 +189,7 @@ return array(
 		'about' => 'אודות',
 		'account' => 'Account',	// TODO
 		'admin' => 'ניהול',
+		'advanced_search' => 'Advanced Search',	// TODO
 		'archiving' => 'ארכוב',
 		'authentication' => 'Authentication',	// TODO
 		'check_install' => 'Installation check',	// TODO
@@ -221,6 +222,32 @@ return array(
 		'language' => 'Language',	// IGNORE
 		'translated' => 'Progress',	// IGNORE
 	),
+	'search' => array(
+		'advanced_search_help' => 'This form helps construct search queries, but manual queries are even more powerful.',	// TODO
+		'authors' => 'Authors',	// TODO
+		'categories' => 'Categories',	// TODO
+		'content' => 'Content',	// TODO
+		'date_from' => 'From',	// TODO
+		'date_past' => 'In the past',	// TODO
+		'date_published' => 'Publication Date',	// TODO
+		'date_range' => 'Date Range',	// TODO
+		'date_received' => 'Received Date',	// TODO
+		'date_to' => 'To',	// TODO
+		'feeds' => 'Feeds',	// TODO
+		'free_text' => 'Free Text',	// TODO
+		'free_text_help' => 'Search both in title and content',	// TODO
+		'full_documentation' => 'View <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">full search documentation</a>',	// TODO
+		'labels' => 'My Labels',	// TODO
+		'multiple_help' => 'Select one or more (hold <kbd>Ctrl</kbd> or <kbd>Cmd</kbd>)',	// TODO
+		'sources' => 'Sources',	// TODO
+		'tags' => 'Article Tags',	// TODO
+		'text' => 'Text Search',	// TODO
+		'text_help' => 'Multiple lines are combined by a logical <i>or</i>. Also supports <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#regex" target="_blank">regular expressions</a>.',	// TODO
+		'text_placeholder' => 'Keyword',	// TODO
+		'title' => 'Title',	// TODO
+		'url' => 'URL',	// TODO
+		'user_queries' => 'User Queries',	// TODO
+	),
 	'share' => array(
 		'Known' => 'Known based sites',	// TODO
 		'archiveIS' => 'archive.is',	// IGNORE

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

@@ -189,6 +189,7 @@ return array(
 		'about' => 'Névjegy',
 		'account' => 'Fiók',
 		'admin' => 'Adminisztráció',
+		'advanced_search' => 'Advanced Search',	// TODO
 		'archiving' => 'Archiválás',
 		'authentication' => 'Hitelesítés',
 		'check_install' => 'Telepítés ellenőrzése',
@@ -221,6 +222,32 @@ return array(
 		'language' => 'Language',	// IGNORE
 		'translated' => 'Progress',	// IGNORE
 	),
+	'search' => array(
+		'advanced_search_help' => 'This form helps construct search queries, but manual queries are even more powerful.',	// TODO
+		'authors' => 'Authors',	// TODO
+		'categories' => 'Categories',	// TODO
+		'content' => 'Content',	// TODO
+		'date_from' => 'From',	// TODO
+		'date_past' => 'In the past',	// TODO
+		'date_published' => 'Publication Date',	// TODO
+		'date_range' => 'Date Range',	// TODO
+		'date_received' => 'Received Date',	// TODO
+		'date_to' => 'To',	// TODO
+		'feeds' => 'Feeds',	// TODO
+		'free_text' => 'Free Text',	// TODO
+		'free_text_help' => 'Search both in title and content',	// TODO
+		'full_documentation' => 'View <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">full search documentation</a>',	// TODO
+		'labels' => 'My Labels',	// TODO
+		'multiple_help' => 'Select one or more (hold <kbd>Ctrl</kbd> or <kbd>Cmd</kbd>)',	// TODO
+		'sources' => 'Sources',	// TODO
+		'tags' => 'Article Tags',	// TODO
+		'text' => 'Text Search',	// TODO
+		'text_help' => 'Multiple lines are combined by a logical <i>or</i>. Also supports <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#regex" target="_blank">regular expressions</a>.',	// TODO
+		'text_placeholder' => 'Keyword',	// TODO
+		'title' => 'Title',	// TODO
+		'url' => 'URL',	// TODO
+		'user_queries' => 'User Queries',	// TODO
+	),
 	'share' => array(
 		'Known' => 'Ismert weboldalak',
 		'archiveIS' => 'archive.is',	// IGNORE

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

@@ -189,6 +189,7 @@ return array(
 		'about' => 'Tentang',
 		'account' => 'Akun',
 		'admin' => 'Administrasi',
+		'advanced_search' => 'Advanced Search',	// TODO
 		'archiving' => 'Pengarsipan',
 		'authentication' => 'Autentikasi',
 		'check_install' => 'Pemeriksaan pemasangan',
@@ -221,6 +222,32 @@ return array(
 		'language' => 'Language',	// IGNORE
 		'translated' => 'Progress',	// IGNORE
 	),
+	'search' => array(
+		'advanced_search_help' => 'This form helps construct search queries, but manual queries are even more powerful.',	// TODO
+		'authors' => 'Authors',	// TODO
+		'categories' => 'Categories',	// TODO
+		'content' => 'Content',	// TODO
+		'date_from' => 'From',	// TODO
+		'date_past' => 'In the past',	// TODO
+		'date_published' => 'Publication Date',	// TODO
+		'date_range' => 'Date Range',	// TODO
+		'date_received' => 'Received Date',	// TODO
+		'date_to' => 'To',	// TODO
+		'feeds' => 'Feeds',	// TODO
+		'free_text' => 'Free Text',	// TODO
+		'free_text_help' => 'Search both in title and content',	// TODO
+		'full_documentation' => 'View <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">full search documentation</a>',	// TODO
+		'labels' => 'My Labels',	// TODO
+		'multiple_help' => 'Select one or more (hold <kbd>Ctrl</kbd> or <kbd>Cmd</kbd>)',	// TODO
+		'sources' => 'Sources',	// TODO
+		'tags' => 'Article Tags',	// TODO
+		'text' => 'Text Search',	// TODO
+		'text_help' => 'Multiple lines are combined by a logical <i>or</i>. Also supports <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#regex" target="_blank">regular expressions</a>.',	// TODO
+		'text_placeholder' => 'Keyword',	// TODO
+		'title' => 'Title',	// TODO
+		'url' => 'URL',	// TODO
+		'user_queries' => 'User Queries',	// TODO
+	),
 	'share' => array(
 		'Known' => 'Situs berbasis Known',
 		'archiveIS' => 'archive.is',	// IGNORE

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

@@ -189,6 +189,7 @@ return array(
 		'about' => 'Informazioni',
 		'account' => 'Profilo',
 		'admin' => 'Amministrazione',
+		'advanced_search' => 'Advanced Search',	// TODO
 		'archiving' => 'Archiviazione',
 		'authentication' => 'Autenticazione',
 		'check_install' => 'Installazione',
@@ -221,6 +222,32 @@ return array(
 		'language' => 'Language',	// IGNORE
 		'translated' => 'Progress',	// IGNORE
 	),
+	'search' => array(
+		'advanced_search_help' => 'This form helps construct search queries, but manual queries are even more powerful.',	// TODO
+		'authors' => 'Authors',	// TODO
+		'categories' => 'Categories',	// TODO
+		'content' => 'Content',	// TODO
+		'date_from' => 'From',	// TODO
+		'date_past' => 'In the past',	// TODO
+		'date_published' => 'Publication Date',	// TODO
+		'date_range' => 'Date Range',	// TODO
+		'date_received' => 'Received Date',	// TODO
+		'date_to' => 'To',	// TODO
+		'feeds' => 'Feeds',	// TODO
+		'free_text' => 'Free Text',	// TODO
+		'free_text_help' => 'Search both in title and content',	// TODO
+		'full_documentation' => 'View <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">full search documentation</a>',	// TODO
+		'labels' => 'My Labels',	// TODO
+		'multiple_help' => 'Select one or more (hold <kbd>Ctrl</kbd> or <kbd>Cmd</kbd>)',	// TODO
+		'sources' => 'Sources',	// TODO
+		'tags' => 'Article Tags',	// TODO
+		'text' => 'Text Search',	// TODO
+		'text_help' => 'Multiple lines are combined by a logical <i>or</i>. Also supports <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#regex" target="_blank">regular expressions</a>.',	// TODO
+		'text_placeholder' => 'Keyword',	// TODO
+		'title' => 'Title',	// TODO
+		'url' => 'URL',	// TODO
+		'user_queries' => 'User Queries',	// TODO
+	),
 	'share' => array(
 		'Known' => 'Siti basati su Known',
 		'archiveIS' => 'archive.is',	// IGNORE

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

@@ -189,6 +189,7 @@ return array(
 		'about' => 'FreshRSSについて',
 		'account' => 'アカウント',
 		'admin' => '管理者',
+		'advanced_search' => 'Advanced Search',	// TODO
 		'archiving' => 'アーカイブ',
 		'authentication' => '認証',
 		'check_install' => 'インストール時のチェック',
@@ -221,6 +222,32 @@ return array(
 		'language' => 'Language',	// IGNORE
 		'translated' => 'Progress',	// IGNORE
 	),
+	'search' => array(
+		'advanced_search_help' => 'This form helps construct search queries, but manual queries are even more powerful.',	// TODO
+		'authors' => 'Authors',	// TODO
+		'categories' => 'Categories',	// TODO
+		'content' => 'Content',	// TODO
+		'date_from' => 'From',	// TODO
+		'date_past' => 'In the past',	// TODO
+		'date_published' => 'Publication Date',	// TODO
+		'date_range' => 'Date Range',	// TODO
+		'date_received' => 'Received Date',	// TODO
+		'date_to' => 'To',	// TODO
+		'feeds' => 'Feeds',	// TODO
+		'free_text' => 'Free Text',	// TODO
+		'free_text_help' => 'Search both in title and content',	// TODO
+		'full_documentation' => 'View <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">full search documentation</a>',	// TODO
+		'labels' => 'My Labels',	// TODO
+		'multiple_help' => 'Select one or more (hold <kbd>Ctrl</kbd> or <kbd>Cmd</kbd>)',	// TODO
+		'sources' => 'Sources',	// TODO
+		'tags' => 'Article Tags',	// TODO
+		'text' => 'Text Search',	// TODO
+		'text_help' => 'Multiple lines are combined by a logical <i>or</i>. Also supports <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#regex" target="_blank">regular expressions</a>.',	// TODO
+		'text_placeholder' => 'Keyword',	// TODO
+		'title' => 'Title',	// TODO
+		'url' => 'URL',	// TODO
+		'user_queries' => 'User Queries',	// TODO
+	),
 	'share' => array(
 		'Known' => 'よく使われるサイト',
 		'archiveIS' => 'archive.is',	// IGNORE

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

@@ -189,6 +189,7 @@ return array(
 		'about' => '정보',
 		'account' => '계정',
 		'admin' => '관리',
+		'advanced_search' => 'Advanced Search',	// TODO
 		'archiving' => '보관',
 		'authentication' => '인증',
 		'check_install' => '설치 요구사항 확인',
@@ -221,6 +222,32 @@ return array(
 		'language' => 'Language',	// IGNORE
 		'translated' => 'Progress',	// IGNORE
 	),
+	'search' => array(
+		'advanced_search_help' => 'This form helps construct search queries, but manual queries are even more powerful.',	// TODO
+		'authors' => 'Authors',	// TODO
+		'categories' => 'Categories',	// TODO
+		'content' => 'Content',	// TODO
+		'date_from' => 'From',	// TODO
+		'date_past' => 'In the past',	// TODO
+		'date_published' => 'Publication Date',	// TODO
+		'date_range' => 'Date Range',	// TODO
+		'date_received' => 'Received Date',	// TODO
+		'date_to' => 'To',	// TODO
+		'feeds' => 'Feeds',	// TODO
+		'free_text' => 'Free Text',	// TODO
+		'free_text_help' => 'Search both in title and content',	// TODO
+		'full_documentation' => 'View <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">full search documentation</a>',	// TODO
+		'labels' => 'My Labels',	// TODO
+		'multiple_help' => 'Select one or more (hold <kbd>Ctrl</kbd> or <kbd>Cmd</kbd>)',	// TODO
+		'sources' => 'Sources',	// TODO
+		'tags' => 'Article Tags',	// TODO
+		'text' => 'Text Search',	// TODO
+		'text_help' => 'Multiple lines are combined by a logical <i>or</i>. Also supports <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#regex" target="_blank">regular expressions</a>.',	// TODO
+		'text_placeholder' => 'Keyword',	// TODO
+		'title' => 'Title',	// TODO
+		'url' => 'URL',	// TODO
+		'user_queries' => 'User Queries',	// TODO
+	),
 	'share' => array(
 		'Known' => 'Known based sites',	// IGNORE
 		'archiveIS' => 'archive.is',	// IGNORE

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

@@ -189,6 +189,7 @@ return array(
 		'about' => 'Par',
 		'account' => 'Konts',
 		'admin' => 'Administrācija',
+		'advanced_search' => 'Advanced Search',	// TODO
 		'archiving' => 'Arhivēšana',
 		'authentication' => 'Autentifikācija',
 		'check_install' => 'Uzstādīšanas pārbaude',
@@ -221,6 +222,32 @@ return array(
 		'language' => 'Language',	// IGNORE
 		'translated' => 'Progress',	// IGNORE
 	),
+	'search' => array(
+		'advanced_search_help' => 'This form helps construct search queries, but manual queries are even more powerful.',	// TODO
+		'authors' => 'Authors',	// TODO
+		'categories' => 'Categories',	// TODO
+		'content' => 'Content',	// TODO
+		'date_from' => 'From',	// TODO
+		'date_past' => 'In the past',	// TODO
+		'date_published' => 'Publication Date',	// TODO
+		'date_range' => 'Date Range',	// TODO
+		'date_received' => 'Received Date',	// TODO
+		'date_to' => 'To',	// TODO
+		'feeds' => 'Feeds',	// TODO
+		'free_text' => 'Free Text',	// TODO
+		'free_text_help' => 'Search both in title and content',	// TODO
+		'full_documentation' => 'View <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">full search documentation</a>',	// TODO
+		'labels' => 'My Labels',	// TODO
+		'multiple_help' => 'Select one or more (hold <kbd>Ctrl</kbd> or <kbd>Cmd</kbd>)',	// TODO
+		'sources' => 'Sources',	// TODO
+		'tags' => 'Article Tags',	// TODO
+		'text' => 'Text Search',	// TODO
+		'text_help' => 'Multiple lines are combined by a logical <i>or</i>. Also supports <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#regex" target="_blank">regular expressions</a>.',	// TODO
+		'text_placeholder' => 'Keyword',	// TODO
+		'title' => 'Title',	// TODO
+		'url' => 'URL',	// TODO
+		'user_queries' => 'User Queries',	// TODO
+	),
 	'share' => array(
 		'Known' => 'Zināmas vietnes',
 		'archiveIS' => 'archive.is',	// IGNORE

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

@@ -189,6 +189,7 @@ return array(
 		'about' => 'Over',
 		'account' => 'Account',	// IGNORE
 		'admin' => 'Administratie',
+		'advanced_search' => 'Advanced Search',	// TODO
 		'archiving' => 'Archiveren',
 		'authentication' => 'Authenticatie',
 		'check_install' => 'Installatiecontrole',
@@ -221,6 +222,32 @@ return array(
 		'language' => 'Language',	// IGNORE
 		'translated' => 'Progress',	// IGNORE
 	),
+	'search' => array(
+		'advanced_search_help' => 'This form helps construct search queries, but manual queries are even more powerful.',	// TODO
+		'authors' => 'Authors',	// TODO
+		'categories' => 'Categories',	// TODO
+		'content' => 'Content',	// TODO
+		'date_from' => 'From',	// TODO
+		'date_past' => 'In the past',	// TODO
+		'date_published' => 'Publication Date',	// TODO
+		'date_range' => 'Date Range',	// TODO
+		'date_received' => 'Received Date',	// TODO
+		'date_to' => 'To',	// TODO
+		'feeds' => 'Feeds',	// TODO
+		'free_text' => 'Free Text',	// TODO
+		'free_text_help' => 'Search both in title and content',	// TODO
+		'full_documentation' => 'View <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">full search documentation</a>',	// TODO
+		'labels' => 'My Labels',	// TODO
+		'multiple_help' => 'Select one or more (hold <kbd>Ctrl</kbd> or <kbd>Cmd</kbd>)',	// TODO
+		'sources' => 'Sources',	// TODO
+		'tags' => 'Article Tags',	// TODO
+		'text' => 'Text Search',	// TODO
+		'text_help' => 'Multiple lines are combined by a logical <i>or</i>. Also supports <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#regex" target="_blank">regular expressions</a>.',	// TODO
+		'text_placeholder' => 'Keyword',	// TODO
+		'title' => 'Title',	// TODO
+		'url' => 'URL',	// TODO
+		'user_queries' => 'User Queries',	// TODO
+	),
 	'share' => array(
 		'Known' => 'Known-gebaseerde sites',
 		'archiveIS' => 'archive.is',	// IGNORE

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

@@ -189,6 +189,7 @@ return array(
 		'about' => 'A prepaus',
 		'account' => 'Compte',
 		'admin' => 'Administracion',	// IGNORE
+		'advanced_search' => 'Advanced Search',	// TODO
 		'archiving' => 'Archivar',
 		'authentication' => 'Autentificacion',
 		'check_install' => 'Verificacion de l’installacion',
@@ -221,6 +222,32 @@ return array(
 		'language' => 'Language',	// IGNORE
 		'translated' => 'Progress',	// IGNORE
 	),
+	'search' => array(
+		'advanced_search_help' => 'This form helps construct search queries, but manual queries are even more powerful.',	// TODO
+		'authors' => 'Authors',	// TODO
+		'categories' => 'Categories',	// TODO
+		'content' => 'Content',	// TODO
+		'date_from' => 'From',	// TODO
+		'date_past' => 'In the past',	// TODO
+		'date_published' => 'Publication Date',	// TODO
+		'date_range' => 'Date Range',	// TODO
+		'date_received' => 'Received Date',	// TODO
+		'date_to' => 'To',	// TODO
+		'feeds' => 'Feeds',	// TODO
+		'free_text' => 'Free Text',	// TODO
+		'free_text_help' => 'Search both in title and content',	// TODO
+		'full_documentation' => 'View <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">full search documentation</a>',	// TODO
+		'labels' => 'My Labels',	// TODO
+		'multiple_help' => 'Select one or more (hold <kbd>Ctrl</kbd> or <kbd>Cmd</kbd>)',	// TODO
+		'sources' => 'Sources',	// TODO
+		'tags' => 'Article Tags',	// TODO
+		'text' => 'Text Search',	// TODO
+		'text_help' => 'Multiple lines are combined by a logical <i>or</i>. Also supports <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#regex" target="_blank">regular expressions</a>.',	// TODO
+		'text_placeholder' => 'Keyword',	// TODO
+		'title' => 'Title',	// TODO
+		'url' => 'URL',	// TODO
+		'user_queries' => 'User Queries',	// TODO
+	),
 	'share' => array(
 		'Known' => 'Sites basats sus Known',
 		'archiveIS' => 'archive.is',	// IGNORE

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

@@ -189,6 +189,7 @@ return array(
 		'about' => 'O serwisie',
 		'account' => 'Konto',
 		'admin' => 'Administracja',
+		'advanced_search' => 'Advanced Search',	// TODO
 		'archiving' => 'Archiwizacja',
 		'authentication' => 'Uwierzytelnianie',
 		'check_install' => 'Sprawdzenie instalacji',
@@ -221,6 +222,32 @@ return array(
 		'language' => 'Language',	// IGNORE
 		'translated' => 'Progress',	// IGNORE
 	),
+	'search' => array(
+		'advanced_search_help' => 'This form helps construct search queries, but manual queries are even more powerful.',	// TODO
+		'authors' => 'Authors',	// TODO
+		'categories' => 'Categories',	// TODO
+		'content' => 'Content',	// TODO
+		'date_from' => 'From',	// TODO
+		'date_past' => 'In the past',	// TODO
+		'date_published' => 'Publication Date',	// TODO
+		'date_range' => 'Date Range',	// TODO
+		'date_received' => 'Received Date',	// TODO
+		'date_to' => 'To',	// TODO
+		'feeds' => 'Feeds',	// TODO
+		'free_text' => 'Free Text',	// TODO
+		'free_text_help' => 'Search both in title and content',	// TODO
+		'full_documentation' => 'View <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">full search documentation</a>',	// TODO
+		'labels' => 'My Labels',	// TODO
+		'multiple_help' => 'Select one or more (hold <kbd>Ctrl</kbd> or <kbd>Cmd</kbd>)',	// TODO
+		'sources' => 'Sources',	// TODO
+		'tags' => 'Article Tags',	// TODO
+		'text' => 'Text Search',	// TODO
+		'text_help' => 'Multiple lines are combined by a logical <i>or</i>. Also supports <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#regex" target="_blank">regular expressions</a>.',	// TODO
+		'text_placeholder' => 'Keyword',	// TODO
+		'title' => 'Title',	// TODO
+		'url' => 'URL',	// TODO
+		'user_queries' => 'User Queries',	// TODO
+	),
 	'share' => array(
 		'Known' => 'Strony bazujące na usłudze Known',
 		'archiveIS' => 'archive.is',	// IGNORE

+ 27 - 0
app/i18n/pt-BR/gen.php

@@ -189,6 +189,7 @@ return array(
 		'about' => 'Sobre',
 		'account' => 'Conta',
 		'admin' => 'Administração',
+		'advanced_search' => 'Advanced Search',	// TODO
 		'archiving' => 'Arquivar',
 		'authentication' => 'Autenticação',
 		'check_install' => 'Verificação de instalação',
@@ -221,6 +222,32 @@ return array(
 		'language' => 'Language',	// IGNORE
 		'translated' => 'Progress',	// IGNORE
 	),
+	'search' => array(
+		'advanced_search_help' => 'This form helps construct search queries, but manual queries are even more powerful.',	// TODO
+		'authors' => 'Authors',	// TODO
+		'categories' => 'Categories',	// TODO
+		'content' => 'Content',	// TODO
+		'date_from' => 'From',	// TODO
+		'date_past' => 'In the past',	// TODO
+		'date_published' => 'Publication Date',	// TODO
+		'date_range' => 'Date Range',	// TODO
+		'date_received' => 'Received Date',	// TODO
+		'date_to' => 'To',	// TODO
+		'feeds' => 'Feeds',	// TODO
+		'free_text' => 'Free Text',	// TODO
+		'free_text_help' => 'Search both in title and content',	// TODO
+		'full_documentation' => 'View <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">full search documentation</a>',	// TODO
+		'labels' => 'My Labels',	// TODO
+		'multiple_help' => 'Select one or more (hold <kbd>Ctrl</kbd> or <kbd>Cmd</kbd>)',	// TODO
+		'sources' => 'Sources',	// TODO
+		'tags' => 'Article Tags',	// TODO
+		'text' => 'Text Search',	// TODO
+		'text_help' => 'Multiple lines are combined by a logical <i>or</i>. Also supports <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#regex" target="_blank">regular expressions</a>.',	// TODO
+		'text_placeholder' => 'Keyword',	// TODO
+		'title' => 'Title',	// TODO
+		'url' => 'URL',	// TODO
+		'user_queries' => 'User Queries',	// TODO
+	),
 	'share' => array(
 		'Known' => 'Sites no Known',
 		'archiveIS' => 'archive.is',	// IGNORE

+ 27 - 0
app/i18n/pt-PT/gen.php

@@ -189,6 +189,7 @@ return array(
 		'about' => 'Sobre',
 		'account' => 'Conta',
 		'admin' => 'Administração',
+		'advanced_search' => 'Advanced Search',	// TODO
 		'archiving' => 'Arquivar',
 		'authentication' => 'Autenticação',
 		'check_install' => 'Verificação de instalação',
@@ -221,6 +222,32 @@ return array(
 		'language' => 'Language',	// IGNORE
 		'translated' => 'Progress',	// IGNORE
 	),
+	'search' => array(
+		'advanced_search_help' => 'This form helps construct search queries, but manual queries are even more powerful.',	// TODO
+		'authors' => 'Authors',	// TODO
+		'categories' => 'Categories',	// TODO
+		'content' => 'Content',	// TODO
+		'date_from' => 'From',	// TODO
+		'date_past' => 'In the past',	// TODO
+		'date_published' => 'Publication Date',	// TODO
+		'date_range' => 'Date Range',	// TODO
+		'date_received' => 'Received Date',	// TODO
+		'date_to' => 'To',	// TODO
+		'feeds' => 'Feeds',	// TODO
+		'free_text' => 'Free Text',	// TODO
+		'free_text_help' => 'Search both in title and content',	// TODO
+		'full_documentation' => 'View <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">full search documentation</a>',	// TODO
+		'labels' => 'My Labels',	// TODO
+		'multiple_help' => 'Select one or more (hold <kbd>Ctrl</kbd> or <kbd>Cmd</kbd>)',	// TODO
+		'sources' => 'Sources',	// TODO
+		'tags' => 'Article Tags',	// TODO
+		'text' => 'Text Search',	// TODO
+		'text_help' => 'Multiple lines are combined by a logical <i>or</i>. Also supports <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#regex" target="_blank">regular expressions</a>.',	// TODO
+		'text_placeholder' => 'Keyword',	// TODO
+		'title' => 'Title',	// TODO
+		'url' => 'URL',	// TODO
+		'user_queries' => 'User Queries',	// TODO
+	),
 	'share' => array(
 		'Known' => 'Sites no Known',
 		'archiveIS' => 'archive.is',	// IGNORE

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

@@ -189,6 +189,7 @@ return array(
 		'about' => 'О проекте',
 		'account' => 'Аккаунт',
 		'admin' => 'Администрирование',
+		'advanced_search' => 'Advanced Search',	// TODO
 		'archiving' => 'Архивирование',
 		'authentication' => 'Аутентификация',
 		'check_install' => 'Проверка установки',
@@ -221,6 +222,32 @@ return array(
 		'language' => 'Language',	// IGNORE
 		'translated' => 'Progress',	// IGNORE
 	),
+	'search' => array(
+		'advanced_search_help' => 'This form helps construct search queries, but manual queries are even more powerful.',	// TODO
+		'authors' => 'Authors',	// TODO
+		'categories' => 'Categories',	// TODO
+		'content' => 'Content',	// TODO
+		'date_from' => 'From',	// TODO
+		'date_past' => 'In the past',	// TODO
+		'date_published' => 'Publication Date',	// TODO
+		'date_range' => 'Date Range',	// TODO
+		'date_received' => 'Received Date',	// TODO
+		'date_to' => 'To',	// TODO
+		'feeds' => 'Feeds',	// TODO
+		'free_text' => 'Free Text',	// TODO
+		'free_text_help' => 'Search both in title and content',	// TODO
+		'full_documentation' => 'View <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">full search documentation</a>',	// TODO
+		'labels' => 'My Labels',	// TODO
+		'multiple_help' => 'Select one or more (hold <kbd>Ctrl</kbd> or <kbd>Cmd</kbd>)',	// TODO
+		'sources' => 'Sources',	// TODO
+		'tags' => 'Article Tags',	// TODO
+		'text' => 'Text Search',	// TODO
+		'text_help' => 'Multiple lines are combined by a logical <i>or</i>. Also supports <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#regex" target="_blank">regular expressions</a>.',	// TODO
+		'text_placeholder' => 'Keyword',	// TODO
+		'title' => 'Title',	// TODO
+		'url' => 'URL',	// TODO
+		'user_queries' => 'User Queries',	// TODO
+	),
 	'share' => array(
 		'Known' => 'Сайты на Known',
 		'archiveIS' => 'archive.is',	// IGNORE

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

@@ -189,6 +189,7 @@ return array(
 		'about' => 'O FreshRSS',
 		'account' => 'Konto',
 		'admin' => 'Administrácia',
+		'advanced_search' => 'Advanced Search',	// TODO
 		'archiving' => 'Archivácia',
 		'authentication' => 'Prihlásenie',
 		'check_install' => 'Kontrola inštalácie',
@@ -221,6 +222,32 @@ return array(
 		'language' => 'Language',	// IGNORE
 		'translated' => 'Progress',	// IGNORE
 	),
+	'search' => array(
+		'advanced_search_help' => 'This form helps construct search queries, but manual queries are even more powerful.',	// TODO
+		'authors' => 'Authors',	// TODO
+		'categories' => 'Categories',	// TODO
+		'content' => 'Content',	// TODO
+		'date_from' => 'From',	// TODO
+		'date_past' => 'In the past',	// TODO
+		'date_published' => 'Publication Date',	// TODO
+		'date_range' => 'Date Range',	// TODO
+		'date_received' => 'Received Date',	// TODO
+		'date_to' => 'To',	// TODO
+		'feeds' => 'Feeds',	// TODO
+		'free_text' => 'Free Text',	// TODO
+		'free_text_help' => 'Search both in title and content',	// TODO
+		'full_documentation' => 'View <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">full search documentation</a>',	// TODO
+		'labels' => 'My Labels',	// TODO
+		'multiple_help' => 'Select one or more (hold <kbd>Ctrl</kbd> or <kbd>Cmd</kbd>)',	// TODO
+		'sources' => 'Sources',	// TODO
+		'tags' => 'Article Tags',	// TODO
+		'text' => 'Text Search',	// TODO
+		'text_help' => 'Multiple lines are combined by a logical <i>or</i>. Also supports <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#regex" target="_blank">regular expressions</a>.',	// TODO
+		'text_placeholder' => 'Keyword',	// TODO
+		'title' => 'Title',	// TODO
+		'url' => 'URL',	// TODO
+		'user_queries' => 'User Queries',	// TODO
+	),
 	'share' => array(
 		'Known' => 'Stránky založené na Known',
 		'archiveIS' => 'archive.is',	// IGNORE

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

@@ -189,6 +189,7 @@ return array(
 		'about' => 'Hakkında',
 		'account' => 'Hesap',
 		'admin' => 'Yönetim',
+		'advanced_search' => 'Advanced Search',	// TODO
 		'archiving' => 'Arşivleme',
 		'authentication' => 'Kimlik doğrulama',
 		'check_install' => 'Kurulum kontrolü',
@@ -221,6 +222,32 @@ return array(
 		'language' => 'Language',	// IGNORE
 		'translated' => 'Progress',	// IGNORE
 	),
+	'search' => array(
+		'advanced_search_help' => 'This form helps construct search queries, but manual queries are even more powerful.',	// TODO
+		'authors' => 'Authors',	// TODO
+		'categories' => 'Categories',	// TODO
+		'content' => 'Content',	// TODO
+		'date_from' => 'From',	// TODO
+		'date_past' => 'In the past',	// TODO
+		'date_published' => 'Publication Date',	// TODO
+		'date_range' => 'Date Range',	// TODO
+		'date_received' => 'Received Date',	// TODO
+		'date_to' => 'To',	// TODO
+		'feeds' => 'Feeds',	// TODO
+		'free_text' => 'Free Text',	// TODO
+		'free_text_help' => 'Search both in title and content',	// TODO
+		'full_documentation' => 'View <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">full search documentation</a>',	// TODO
+		'labels' => 'My Labels',	// TODO
+		'multiple_help' => 'Select one or more (hold <kbd>Ctrl</kbd> or <kbd>Cmd</kbd>)',	// TODO
+		'sources' => 'Sources',	// TODO
+		'tags' => 'Article Tags',	// TODO
+		'text' => 'Text Search',	// TODO
+		'text_help' => 'Multiple lines are combined by a logical <i>or</i>. Also supports <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#regex" target="_blank">regular expressions</a>.',	// TODO
+		'text_placeholder' => 'Keyword',	// TODO
+		'title' => 'Title',	// TODO
+		'url' => 'URL',	// TODO
+		'user_queries' => 'User Queries',	// TODO
+	),
 	'share' => array(
 		'Known' => 'Bilinen tabanlı siteler',
 		'archiveIS' => 'archive.is',	// IGNORE

+ 27 - 0
app/i18n/uk/gen.php

@@ -189,6 +189,7 @@ return array(
 		'about' => 'Про програму',
 		'account' => 'Обліковий запис',
 		'admin' => 'Адміністрування',
+		'advanced_search' => 'Advanced Search',	// TODO
 		'archiving' => 'Архівування',
 		'authentication' => 'Вхід',
 		'check_install' => 'Перевірка встановлення',
@@ -221,6 +222,32 @@ return array(
 		'language' => 'Language',	// TODO
 		'translated' => 'Progress',	// TODO
 	),
+	'search' => array(
+		'advanced_search_help' => 'This form helps construct search queries, but manual queries are even more powerful.',	// TODO
+		'authors' => 'Authors',	// TODO
+		'categories' => 'Categories',	// TODO
+		'content' => 'Content',	// TODO
+		'date_from' => 'From',	// TODO
+		'date_past' => 'In the past',	// TODO
+		'date_published' => 'Publication Date',	// TODO
+		'date_range' => 'Date Range',	// TODO
+		'date_received' => 'Received Date',	// TODO
+		'date_to' => 'To',	// TODO
+		'feeds' => 'Feeds',	// TODO
+		'free_text' => 'Free Text',	// TODO
+		'free_text_help' => 'Search both in title and content',	// TODO
+		'full_documentation' => 'View <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">full search documentation</a>',	// TODO
+		'labels' => 'My Labels',	// TODO
+		'multiple_help' => 'Select one or more (hold <kbd>Ctrl</kbd> or <kbd>Cmd</kbd>)',	// TODO
+		'sources' => 'Sources',	// TODO
+		'tags' => 'Article Tags',	// TODO
+		'text' => 'Text Search',	// TODO
+		'text_help' => 'Multiple lines are combined by a logical <i>or</i>. Also supports <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#regex" target="_blank">regular expressions</a>.',	// TODO
+		'text_placeholder' => 'Keyword',	// TODO
+		'title' => 'Title',	// TODO
+		'url' => 'URL',	// TODO
+		'user_queries' => 'User Queries',	// TODO
+	),
 	'share' => array(
 		'Known' => 'Сайти на Known',
 		'archiveIS' => 'archive.is',	// IGNORE

+ 27 - 0
app/i18n/zh-CN/gen.php

@@ -189,6 +189,7 @@ return array(
 		'about' => '关于',
 		'account' => '账户',
 		'admin' => '管理',
+		'advanced_search' => 'Advanced Search',	// TODO
 		'archiving' => '归档',
 		'authentication' => '认证',
 		'check_install' => '环境检查',
@@ -221,6 +222,32 @@ return array(
 		'language' => 'Language',	// IGNORE
 		'translated' => 'Progress',	// IGNORE
 	),
+	'search' => array(
+		'advanced_search_help' => 'This form helps construct search queries, but manual queries are even more powerful.',	// TODO
+		'authors' => 'Authors',	// TODO
+		'categories' => 'Categories',	// TODO
+		'content' => 'Content',	// TODO
+		'date_from' => 'From',	// TODO
+		'date_past' => 'In the past',	// TODO
+		'date_published' => 'Publication Date',	// TODO
+		'date_range' => 'Date Range',	// TODO
+		'date_received' => 'Received Date',	// TODO
+		'date_to' => 'To',	// TODO
+		'feeds' => 'Feeds',	// TODO
+		'free_text' => 'Free Text',	// TODO
+		'free_text_help' => 'Search both in title and content',	// TODO
+		'full_documentation' => 'View <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">full search documentation</a>',	// TODO
+		'labels' => 'My Labels',	// TODO
+		'multiple_help' => 'Select one or more (hold <kbd>Ctrl</kbd> or <kbd>Cmd</kbd>)',	// TODO
+		'sources' => 'Sources',	// TODO
+		'tags' => 'Article Tags',	// TODO
+		'text' => 'Text Search',	// TODO
+		'text_help' => 'Multiple lines are combined by a logical <i>or</i>. Also supports <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#regex" target="_blank">regular expressions</a>.',	// TODO
+		'text_placeholder' => 'Keyword',	// TODO
+		'title' => 'Title',	// TODO
+		'url' => 'URL',	// TODO
+		'user_queries' => 'User Queries',	// TODO
+	),
 	'share' => array(
 		'Known' => '基于 Known 的站点',
 		'archiveIS' => 'archive.is',	// IGNORE

+ 27 - 0
app/i18n/zh-TW/gen.php

@@ -189,6 +189,7 @@ return array(
 		'about' => '關於',
 		'account' => '帳號',
 		'admin' => '管理',
+		'advanced_search' => 'Advanced Search',	// TODO
 		'archiving' => '歸檔',
 		'authentication' => '認證',
 		'check_install' => '環境檢查',
@@ -221,6 +222,32 @@ return array(
 		'language' => 'Language',	// IGNORE
 		'translated' => 'Progress',	// IGNORE
 	),
+	'search' => array(
+		'advanced_search_help' => 'This form helps construct search queries, but manual queries are even more powerful.',	// TODO
+		'authors' => 'Authors',	// TODO
+		'categories' => 'Categories',	// TODO
+		'content' => 'Content',	// TODO
+		'date_from' => 'From',	// TODO
+		'date_past' => 'In the past',	// TODO
+		'date_published' => 'Publication Date',	// TODO
+		'date_range' => 'Date Range',	// TODO
+		'date_received' => 'Received Date',	// TODO
+		'date_to' => 'To',	// TODO
+		'feeds' => 'Feeds',	// TODO
+		'free_text' => 'Free Text',	// TODO
+		'free_text_help' => 'Search both in title and content',	// TODO
+		'full_documentation' => 'View <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">full search documentation</a>',	// TODO
+		'labels' => 'My Labels',	// TODO
+		'multiple_help' => 'Select one or more (hold <kbd>Ctrl</kbd> or <kbd>Cmd</kbd>)',	// TODO
+		'sources' => 'Sources',	// TODO
+		'tags' => 'Article Tags',	// TODO
+		'text' => 'Text Search',	// TODO
+		'text_help' => 'Multiple lines are combined by a logical <i>or</i>. Also supports <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#regex" target="_blank">regular expressions</a>.',	// TODO
+		'text_placeholder' => 'Keyword',	// TODO
+		'title' => 'Title',	// TODO
+		'url' => 'URL',	// TODO
+		'user_queries' => 'User Queries',	// TODO
+	),
 	'share' => array(
 		'Known' => '基於 Known 的站點',
 		'archiveIS' => 'archive.is',	// IGNORE

+ 3 - 0
app/layout/aside_subscription.phtml

@@ -9,6 +9,9 @@
 				<li class="item">
 					<a href="<?= _url('index', 'index') ?>"><?= _t('gen.action.back_to_rss_feeds') ?></a>
 				</li>
+				<li class="item<?= Minz_Request::controllerName() === 'search' ? ' active' : '' ?>">
+					<a href="<?= _url('search', 'index') ?>"><?= _t('gen.menu.advanced_search') ?></a>
+				</li>
 			</ul>
 		</li>
 		<li class="item nav-section">

+ 1 - 1
app/layout/nav_menu.phtml

@@ -57,7 +57,7 @@
 									value="<?= htmlspecialchars(htmlspecialchars_decode(FreshRSS_Context::$search->getRawInput(), ENT_QUOTES), ENT_COMPAT, 'UTF-8'); ?>"
 									placeholder="<?= _t('gen.menu.search') ?>" title="<?= _t('gen.menu.search') ?>" /><button class="btn" type="submit" title="<?= _t('index.menu.search_short') ?>"><?= _i('search') ?></button>
 							</div>
-							<p class="help"><?= _i('help') ?> <?= _t('gen.menu.search_help') ?></a></p>
+							<p class="help"><?= _i('help') ?> <a href="<?= _url('search', 'index') ?>"><?= _t('gen.menu.advanced_search') ?></a></p>
 						</form>
 					</span>
 				</li>

+ 200 - 0
app/views/search/index.phtml

@@ -0,0 +1,200 @@
+<?php
+	declare(strict_types=1);
+	/** @var FreshRSS_View $this */
+	$this->partial('aside_subscription');
+?>
+<main class="post">
+	<h1><?= _t('gen.menu.advanced_search') ?></h1>
+	<p class="help"><?= _i('help') ?> <?= _t('gen.search.advanced_search_help') ?></p>
+	<p><?= _t('gen.search.full_documentation') ?></p>
+
+	<form method="post" action="<?= _url('search', 'submit') ?>">
+		<input type="hidden" name="_csrf" value="<?= FreshRSS_Auth::csrfToken() ?>" />
+
+		<fieldset>
+			<legend><?= _t('gen.search.text') ?></legend>
+			<p class="help"><?= _i('help') ?> <?= _t('gen.search.text_help') ?></p>
+
+			<div class="form-group">
+				<label class="group-name" for="free_text"><?= _t('gen.search.free_text') ?></label>
+				<div class="group-controls">
+					<textarea id="free_text" name="free_text" rows="2" placeholder="<?= _t('gen.search.text_placeholder') ?>"></textarea>
+					<p class="help"><?= _i('help') ?> <?= _t('gen.search.free_text_help') ?></p>
+				</div>
+			</div>
+
+			<div class="form-group">
+				<label class="group-name" for="title"><?= _t('gen.search.title') ?></label>
+				<div class="group-controls">
+					<textarea id="title" name="title" rows="2" placeholder="<?= _t('gen.search.text_placeholder') ?>"></textarea>
+				</div>
+			</div>
+
+			<div class="form-group">
+				<label class="group-name" for="content"><?= _t('gen.search.content') ?></label>
+				<div class="group-controls">
+					<textarea id="content" name="content" rows="2" placeholder="<?= _t('gen.search.text_placeholder') ?>"></textarea>
+				</div>
+			</div>
+
+			<div class="form-group">
+				<label class="group-name" for="url"><?= _t('gen.search.url') ?></label>
+				<div class="group-controls">
+					<textarea id="url" name="url" rows="2" placeholder="<?= _t('gen.search.text_placeholder') ?>"></textarea>
+				</div>
+			</div>
+
+			<div class="form-group">
+				<label class="group-name" for="authors"><?= _t('gen.search.authors') ?></label>
+				<div class="group-controls">
+					<textarea id="authors" name="authors" rows="2" placeholder="<?= _t('gen.search.text_placeholder') ?>"></textarea>
+				</div>
+			</div>
+
+			<div class="form-group">
+				<label class="group-name" for="tags"><?= _t('gen.search.tags') ?></label>
+				<div class="group-controls">
+					<textarea id="tags" name="tags" rows="2" placeholder="<?= _t('gen.search.text_placeholder') ?>"></textarea>
+				</div>
+			</div>
+		</fieldset>
+
+		<fieldset>
+			<legend><?= _t('gen.search.date_past') ?></legend>
+
+			<div class="form-group">
+				<label class="group-name"><?= _t('gen.search.date_received') ?></label>
+				<div class="group-controls">
+					<div>
+						<label for="date_number"><?= _t('gen.search.date_past') ?>
+							<input id="date_number" name="date_number" type="number" min="1" placeholder="1" />
+							<select id="date_unit" name="date_unit">
+								<option value="H"><?= _t('gen.period.hours') ?></option>
+								<option value="D"><?= _t('gen.period.days') ?></option>
+								<option value="W"><?= _t('gen.period.weeks') ?></option>
+								<option value="M"><?= _t('gen.period.months') ?></option>
+								<option value="Y"><?= _t('gen.period.years') ?></option>
+							</select>
+						</label>
+					</div>
+				</div>
+			</div>
+
+			<div class="form-group">
+				<label class="group-name"><?= _t('gen.search.date_published') ?></label>
+				<div class="group-controls">
+					<div>
+						<label for="pubdate_number"><?= _t('gen.search.date_past') ?>
+							<input id="pubdate_number" name="pubdate_number" type="number" min="1" placeholder="1" />
+							<select id="pubdate_unit" name="pubdate_unit">
+								<option value="H"><?= _t('gen.period.hours') ?></option>
+								<option value="D"><?= _t('gen.period.days') ?></option>
+								<option value="W"><?= _t('gen.period.weeks') ?></option>
+								<option value="M"><?= _t('gen.period.months') ?></option>
+								<option value="Y"><?= _t('gen.period.years') ?></option>
+							</select>
+						</label>
+					</div>
+				</div>
+			</div>
+		</fieldset>
+
+		<fieldset>
+			<legend><?= _t('gen.search.date_range') ?></legend>
+
+			<div class="form-group">
+				<label class="group-name"><?= _t('gen.search.date_received') ?></label>
+				<div class="group-controls">
+					<div>
+						<label for="date_from"><?= _t('gen.search.date_from') ?>
+							<input id="date_from" name="date_from" type="date" />
+						</label>
+						<label for="date_to"><?= _t('gen.search.date_to') ?>
+							<input id="date_to" name="date_to" type="date" />
+						</label>
+					</div>
+				</div>
+			</div>
+
+			<div class="form-group">
+				<label class="group-name"><?= _t('gen.search.date_published') ?></label>
+				<div class="group-controls">
+					<div>
+						<label for="pubdate_from"><?= _t('gen.search.date_from') ?>
+							<input id="pubdate_from" name="pubdate_from" type="date" />
+						</label>
+						<label for="pubdate_to"><?= _t('gen.search.date_to') ?>
+							<input id="pubdate_to" name="pubdate_to" type="date" />
+						</label>
+					</div>
+				</div>
+			</div>
+		</fieldset>
+
+		<fieldset>
+			<legend><?= _t('gen.search.sources') ?></legend>
+
+			<div class="form-group">
+				<label class="group-name" for="feed_ids"><?= _t('gen.search.feeds') ?></label>
+				<div class="group-controls">
+					<select name="feed_ids[]" id="feed_ids" size="<?= min(8, count($this->feeds) + 1) ?>" multiple="multiple">
+						<?php foreach ($this->feeds as $feed): ?>
+						<option value="<?= $feed->id() ?>"><?= $feed->name() ?></option>
+						<?php endforeach; ?>
+					</select>
+				</div>
+			</div>
+
+			<div class="form-group">
+				<label class="group-name" for="category_ids"><?= _t('gen.search.categories') ?></label>
+				<div class="group-controls">
+					<select name="category_ids[]" id="category_ids" size="<?= min(8, count($this->categories) + 1) ?>" multiple="multiple">
+						<?php foreach ($this->categories as $category): ?>
+						<option value="<?= $category->id() ?>"><?= $category->name() ?></option>
+						<?php endforeach; ?>
+					</select>
+					<p class="help"><?= _i('help') ?> <?= _t('gen.search.multiple_help') ?></p>
+				</div>
+			</div>
+		</fieldset>
+
+		<fieldset>
+			<legend><?= _t('gen.search.labels') ?></legend>
+
+			<div class="form-group">
+				<label class="group-name" for="label_ids"><?= _t('gen.search.labels') ?></label>
+				<div class="group-controls">
+					<select name="label_ids[]" id="label_ids" size="<?= min(8, count($this->labels) + 1) ?>" multiple="multiple">
+						<?php foreach ($this->labels as $label): ?>
+						<option value="<?= $label->id() ?>"><?= $label->name() ?></option>
+						<?php endforeach; ?>
+					</select>
+					<p class="help"><?= _i('help') ?> <?= _t('gen.search.multiple_help') ?></p>
+				</div>
+			</div>
+		</fieldset>
+
+		<fieldset>
+			<legend><?= _t('gen.search.user_queries') ?></legend>
+
+			<div class="form-group">
+				<label class="group-name" for="user_query_ids"><?= _t('gen.search.user_queries') ?></label>
+				<div class="group-controls">
+					<select name="user_query_ids[]" id="user_query_ids" size="<?= min(8, count($this->queries) + 1) ?>" multiple="multiple">
+						<?php foreach ($this->queries as $key => $query): ?>
+						<option value="<?= $key ?>"><?= $query->getName() ?></option>
+						<?php endforeach; ?>
+					</select>
+					<p class="help"><?= _i('help') ?> <?= _t('gen.search.multiple_help') ?></p>
+				</div>
+			</div>
+		</fieldset>
+
+		<div class="form-group form-actions">
+			<div class="group-controls">
+				<button type="submit" class="btn btn-important"><?= _t('gen.action.submit') ?></button>
+				<button type="reset" class="btn"><?= _t('gen.action.cancel') ?></button>
+			</div>
+		</div>
+	</form>
+</main>

+ 1 - 1
docs/en/users/10_filter.md

@@ -95,7 +95,7 @@ You can use the search field to further refine results:
 * by custom label name `label:label`, `label:"my label"` or any label name from a list (*or*): `labels:"my label,my other label"`
 * by several label names (*and*): `label:"my label" label:"my other label"`
 * by entry (article) ID: `e:1639310674957894` or multiple entry IDs  (*or*): `e:1639310674957894,1639310674957893`
-* by user query (saved search) name: `search:myQuery`, `search:"My query"` or saved search ID: `S:3`
+* by user query (saved search) name: `search:myQuery`, `search:"My query"` or saved search ID: `S:3` or multiple search IDs: `S:1,2`
 	* internally, those references are replaced by the corresponding user query in the search expression
 
 Be careful not to enter a space between the operator and the search value.

+ 1 - 1
docs/fr/users/03_Main_view.md

@@ -254,7 +254,7 @@ Il est possible d’utiliser le champ de recherche pour raffiner les résultats
 * par nom d’étiquette : `label:étiquette`, `label:"mon étiquette"` ou d’une étiquette parmi une liste (*ou*) : `labels:"mon étiquette,mon autre étiquette"`
 * par plusieurs noms d’étiquettes (*et*) : `label:"mon étiquette" label:"mon autre étiquette"`
 * par ID d’article (entrée) : `e:1639310674957894` ou de plusieurs articles (*ou*) : `e:1639310674957894,1639310674957893`
-* par nom de filtre utilisateur (recherche enregistrée) : `search:maRecherche`, `search:"Ma recherche"` ou par ID de recherche : `S:3`
+* par nom de filtre utilisateur (recherche enregistrée) : `search:maRecherche`, `search:"Ma recherche"` ou par ID de recherche : `S:3`, ou multiple IDs : `S:1,2`
 	* en interne, ces références sont remplacées par le filtre utilisateur correspondant dans l’expression de recherche
 
 Attention à ne pas introduire d’espace entre l’opérateur et la valeur

+ 12 - 0
lib/Minz/Request.php

@@ -99,6 +99,18 @@ class Minz_Request {
 		return $plaintext ? $result : Minz_Helper::htmlspecialchars_utf8($result);
 	}
 
+	/**
+	 * @return list<int>
+	 */
+	public static function paramArrayInt(string $key): array {
+		if (empty(self::$params[$key]) || !is_array(self::$params[$key])) {
+			return [];
+		}
+		$result = array_filter(self::$params[$key], 'is_numeric');
+		$result = array_map('intval', $result);
+		return array_values($result);
+	}
+
 	public static function paramTernary(string $key): ?bool {
 		if (isset(self::$params[$key])) {
 			$p = self::$params[$key];

+ 64 - 0
tests/app/Models/SearchTest.php

@@ -224,6 +224,70 @@ final class SearchTest extends \PHPUnit\Framework\TestCase {
 		];
 	}
 
+	/**
+	 * @param list<array{search:string}> $queries
+	 * @param array{0:string,1:list<string|int>} $expectedResult
+	 */
+	#[DataProvider('provideSavedQueryIdExpansion')]
+	public static function test__construct_whenInputContainsSavedQueryIds_expandsSavedSearches(array $queries, string $input, array $expectedResult): void {
+		$previousUserConf = FreshRSS_Context::hasUserConf() ? FreshRSS_Context::userConf() : null;
+		$newUserConf = $previousUserConf instanceof FreshRSS_UserConfiguration ? clone $previousUserConf : clone FreshRSS_UserConfiguration::default();
+		$newUserConf->queries = $queries;
+		FreshRSS_Context::$user_conf = $newUserConf;
+
+		try {
+			$search = new FreshRSS_BooleanSearch($input);
+			[$actualValues, $actualSql] = FreshRSS_EntryDAOPGSQL::sqlBooleanSearch('e.', $search);
+			self::assertSame($expectedResult[0], trim($actualSql));
+			self::assertSame($expectedResult[1], $actualValues);
+		} finally {
+			FreshRSS_Context::$user_conf = $previousUserConf;
+		}
+	}
+
+	/**
+	 * @return array<string,array{0:list<array{search:string}>,1:string,2:array{0:string,1:list<string|int>}}>
+	 */
+	public static function provideSavedQueryIdExpansion(): array {
+		return [
+			'expanded single group' => [
+				[
+					['search' => 'author:Alice'],
+					['search' => 'intitle:World'],
+				],
+				'S:0,1',
+				[
+					'((e.author LIKE ? )) OR ((e.title LIKE ? ))',
+					['%Alice%', '%World%'],
+				],
+			],
+			'separate groups with OR' => [
+				[
+					['search' => 'author:Alice'],
+					['search' => 'intitle:World'],
+					['search' => 'inurl:Example'],
+					['search' => 'author:Bob'],
+				],
+				'S:0,1 OR S:2,3',
+				[
+					'((e.author LIKE ? )) OR ((e.title LIKE ? )) OR ((e.link LIKE ? )) OR ((e.author LIKE ? ))',
+					['%Alice%', '%World%', '%Example%', '%Bob%'],
+				],
+			],
+			'mixed with other clauses' => [
+				[
+					['search' => 'author:Alice'],
+					['search' => 'intitle:World'],
+				],
+				'intitle:Hello S:0,1 date:2025-10',
+				[
+					'((e.title LIKE ? )) AND ((e.author LIKE ? )) OR ((e.title LIKE ? )) AND ((e.id >= ? AND e.id <= ? ))',
+					['%Hello%', '%Alice%', '%World%', strtotime('2025-10-01') . '000000', (strtotime('2025-11-01') - 1) . '000000'],
+				],
+			],
+		];
+	}
+
 	/**
 	 * @param array<string>|null $author_value
 	 * @param array<string> $intitle_value