diff options
| author | 2025-10-15 00:08:40 +0200 | |
|---|---|---|
| committer | 2025-10-15 00:08:40 +0200 | |
| commit | e070c3ed2bec4ea4a6c2a216a5c836d1e02ab381 (patch) | |
| tree | c65a238580dc5b78c6cf6a1947523ff6291eaa0a | |
| parent | 1b8bc1ae8b9810eb66ff798093b89d2ce690373f (diff) | |
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
39 files changed, 1264 insertions, 58 deletions
diff --git a/README.fr.md b/README.fr.md index 6e9142a86..7e96a0685 100644 --- a/README.fr.md +++ b/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> @@ -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> diff --git a/app/Controllers/searchController.php b/app/Controllers/searchController.php new file mode 100644 index 000000000..19ec04606 --- /dev/null +++ b/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); + } +} diff --git a/app/Models/BooleanSearch.php b/app/Models/BooleanSearch.php index 1832bd419..7b3cc0e12 100644 --- a/app/Models/BooleanSearch.php +++ b/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[] = ''; + } } } diff --git a/app/Models/View.php b/app/Models/View.php index 104afb3c0..cf5c30e15 100644 --- a/app/Models/View.php +++ b/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; diff --git a/app/i18n/cs/gen.php b/app/i18n/cs/gen.php index fe68fd80d..e61682441 100644 --- a/app/i18n/cs/gen.php +++ b/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 diff --git a/app/i18n/de/gen.php b/app/i18n/de/gen.php index 3170b7bde..6ed055259 100644 --- a/app/i18n/de/gen.php +++ b/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 diff --git a/app/i18n/el/gen.php b/app/i18n/el/gen.php index 9719e6a4f..cee4a0aea 100644 --- a/app/i18n/el/gen.php +++ b/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 diff --git a/app/i18n/en-US/gen.php b/app/i18n/en-US/gen.php index ce4c8a6fc..840241926 100644 --- a/app/i18n/en-US/gen.php +++ b/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 diff --git a/app/i18n/en/gen.php b/app/i18n/en/gen.php index 68e096416..2f888f7ee 100644 --- a/app/i18n/en/gen.php +++ b/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', diff --git a/app/i18n/es/gen.php b/app/i18n/es/gen.php index bd320df0a..ec8ce0cc8 100644 --- a/app/i18n/es/gen.php +++ b/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 diff --git a/app/i18n/fa/gen.php b/app/i18n/fa/gen.php index 34f05a62d..9674748ac 100644 --- a/app/i18n/fa/gen.php +++ b/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 diff --git a/app/i18n/fi/gen.php b/app/i18n/fi/gen.php index cdbe380e6..cad2587f1 100644 --- a/app/i18n/fi/gen.php +++ b/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 diff --git a/app/i18n/fr/gen.php b/app/i18n/fr/gen.php index 60df9d64a..caaa3291a 100644 --- a/app/i18n/fr/gen.php +++ b/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 diff --git a/app/i18n/he/gen.php b/app/i18n/he/gen.php index 68b2cbaf8..1c91e60c9 100644 --- a/app/i18n/he/gen.php +++ b/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 diff --git a/app/i18n/hu/gen.php b/app/i18n/hu/gen.php index c0cc355da..56388733f 100644 --- a/app/i18n/hu/gen.php +++ b/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 diff --git a/app/i18n/id/gen.php b/app/i18n/id/gen.php index a8f63a93d..11b55044a 100644 --- a/app/i18n/id/gen.php +++ b/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 diff --git a/app/i18n/it/gen.php b/app/i18n/it/gen.php index 063797fd3..eca46db04 100644 --- a/app/i18n/it/gen.php +++ b/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 diff --git a/app/i18n/ja/gen.php b/app/i18n/ja/gen.php index 5d67cb97a..a8d9dd1c6 100644 --- a/app/i18n/ja/gen.php +++ b/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 diff --git a/app/i18n/ko/gen.php b/app/i18n/ko/gen.php index 66a29d19d..d12422dc8 100644 --- a/app/i18n/ko/gen.php +++ b/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 diff --git a/app/i18n/lv/gen.php b/app/i18n/lv/gen.php index 7d3ae82bb..a94610be0 100644 --- a/app/i18n/lv/gen.php +++ b/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 diff --git a/app/i18n/nl/gen.php b/app/i18n/nl/gen.php index c5cc37474..02aa06a5c 100644 --- a/app/i18n/nl/gen.php +++ b/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 diff --git a/app/i18n/oc/gen.php b/app/i18n/oc/gen.php index aeb7714fc..b1382dac7 100644 --- a/app/i18n/oc/gen.php +++ b/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 diff --git a/app/i18n/pl/gen.php b/app/i18n/pl/gen.php index e5c864469..1423295b6 100644 --- a/app/i18n/pl/gen.php +++ b/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 diff --git a/app/i18n/pt-BR/gen.php b/app/i18n/pt-BR/gen.php index 598364066..664b543b1 100644 --- a/app/i18n/pt-BR/gen.php +++ b/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 diff --git a/app/i18n/pt-PT/gen.php b/app/i18n/pt-PT/gen.php index 4cc34a15e..a4d0cf5fd 100644 --- a/app/i18n/pt-PT/gen.php +++ b/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 diff --git a/app/i18n/ru/gen.php b/app/i18n/ru/gen.php index 399f0b8ac..42aec9283 100644 --- a/app/i18n/ru/gen.php +++ b/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 diff --git a/app/i18n/sk/gen.php b/app/i18n/sk/gen.php index a240ec81d..569763a18 100644 --- a/app/i18n/sk/gen.php +++ b/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 diff --git a/app/i18n/tr/gen.php b/app/i18n/tr/gen.php index 9dfa52a81..13714a004 100644 --- a/app/i18n/tr/gen.php +++ b/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 diff --git a/app/i18n/uk/gen.php b/app/i18n/uk/gen.php index 32466778c..bc7f29d37 100644 --- a/app/i18n/uk/gen.php +++ b/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 diff --git a/app/i18n/zh-CN/gen.php b/app/i18n/zh-CN/gen.php index 032bfb682..56f3292d8 100644 --- a/app/i18n/zh-CN/gen.php +++ b/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 diff --git a/app/i18n/zh-TW/gen.php b/app/i18n/zh-TW/gen.php index d7216765a..2f68c6bd8 100644 --- a/app/i18n/zh-TW/gen.php +++ b/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 diff --git a/app/layout/aside_subscription.phtml b/app/layout/aside_subscription.phtml index be414ff03..f7ed09213 100644 --- a/app/layout/aside_subscription.phtml +++ b/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"> diff --git a/app/layout/nav_menu.phtml b/app/layout/nav_menu.phtml index 0c6fc7dd2..f29d0ae00 100644 --- a/app/layout/nav_menu.phtml +++ b/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> diff --git a/app/views/search/index.phtml b/app/views/search/index.phtml new file mode 100644 index 000000000..1d9222f23 --- /dev/null +++ b/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> diff --git a/docs/en/users/10_filter.md b/docs/en/users/10_filter.md index 42e44339b..d6c8ea05e 100644 --- a/docs/en/users/10_filter.md +++ b/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. diff --git a/docs/fr/users/03_Main_view.md b/docs/fr/users/03_Main_view.md index 67f03ee93..13d33bbf9 100644 --- a/docs/fr/users/03_Main_view.md +++ b/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 diff --git a/lib/Minz/Request.php b/lib/Minz/Request.php index 4bf6fa45c..c938afd7c 100644 --- a/lib/Minz/Request.php +++ b/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]; diff --git a/tests/app/Models/SearchTest.php b/tests/app/Models/SearchTest.php index 4c66880db..19279fa65 100644 --- a/tests/app/Models/SearchTest.php +++ b/tests/app/Models/SearchTest.php @@ -225,6 +225,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 * @param array<string>|null $inurl_value |
