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
This commit is contained in:
Alexandre Alapetite
2025-10-15 00:08:40 +02:00
committed by GitHub
parent 1b8bc1ae8b
commit e070c3ed2b
39 changed files with 1264 additions and 58 deletions

View File

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

View File

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

View File

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

View File

@@ -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[] = '';
}
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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',

View File

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

View File

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

View File

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

View File

@@ -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 linstallation',
@@ -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 darticles',
'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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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 linstallacion',
@@ -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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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">

View File

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

View File

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

View File

@@ -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.

View File

@@ -254,7 +254,7 @@ Il est possible dutiliser le champ de recherche pour raffiner les résultats
* par nom détiquette : `label:étiquette`, `label:"mon étiquette"` ou dune é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 darticle (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 lexpression de recherche
Attention à ne pas introduire despace entre lopérateur et la valeur

View File

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

View File

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